CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
75 lines
3.2 KiB
C++
75 lines
3.2 KiB
C++
//===- 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) uint32_t name##Offset;
|
|
#define _INIT_OFFSET(type, name) name##Offset = offsetof(Layout<Ptr>, name);
|
|
#define _LAYOUT_ENTRY(type, name) type name;
|
|
|
|
#define CREATE_LAYOUT_CLASS(className, FOR_EACH_FIELD) \
|
|
struct className##Layout { \
|
|
FOR_EACH_FIELD(_OFFSET_FOR_FIELD) \
|
|
uint32_t totalSize; \
|
|
\
|
|
className##Layout(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); \
|
|
totalSize = sizeof(Layout<Ptr>); \
|
|
} \
|
|
template <class Ptr> struct Layout { \
|
|
FOR_EACH_FIELD(_LAYOUT_ENTRY) \
|
|
}; \
|
|
}
|