llvm/lld/MachO/Layout.h

//===- Layout.h -----------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// Convenience macros for obtaining offsets of members in structs.
//
// Usage:
//
//   #define FOR_EACH_FOO_FIELD(DO) \
//     DO(Ptr, bar)                 \
//     DO(uint32_t, baz)            \
//   CREATE_LAYOUT_CLASS(Foo, FOR_EACH_FOO_FIELD)
//   #undef FOR_EACH_FOO_FIELD
//
// This will generate
//
//   struct FooLayout {
//     uint32_t barOffset;
//     uint32_t bazOffset;
//     uint32_t totalSize;
//
//     FooLayout(size_t wordSize) {
//       if (wordSize == 8)
//         init<uint64_t>();
//       else {
//         assert(wordSize == 4);
//         init<uint32_t>();
//       }
//     }
//
//   private:
//     template <class Ptr> void init() {
//       FOR_EACH_FIELD(_INIT_OFFSET);
//       barOffset = offsetof(Layout<Ptr>, bar);
//       bazOffset = offsetof(Layout<Ptr>, baz);
//       totalSize = sizeof(Layout<Ptr>);
//     }
//     template <class Ptr> struct Layout {
//       Ptr bar;
//       uint32_t baz;
//     };
//   };

#define _OFFSET_FOR_FIELD(_, name)
#define _INIT_OFFSET(type, name)
#define _LAYOUT_ENTRY(type, name)

#define CREATE_LAYOUT_CLASS(className, FOR_EACH_FIELD)