From f5aff03630215115b98c9a1864e0b085da9a7e05 Mon Sep 17 00:00:00 2001 From: Xinliang David Li Date: Wed, 4 Nov 2015 23:42:56 +0000 Subject: [PATCH] Define portable macros for packed struct definitions: 1. A macro with argument: LLVM_PACKED(StructDefinition) 2. A pair of macros defining scope of region with packing: LLVM_PACKED_START struct A { ... }; struct B { ... }; LLVM_PACKED_END Differential Revision: http://reviews.llvm.org/D14337 llvm-svn: 252099 --- llvm/include/llvm/Support/Compiler.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h index f744237e583f..99a02f7ada03 100644 --- a/llvm/include/llvm/Support/Compiler.h +++ b/llvm/include/llvm/Support/Compiler.h @@ -293,6 +293,34 @@ # define LLVM_ALIGNAS(x) alignas(x) #endif +/// \macro LLVM_PACKED +/// \brief Used to specify a packed structure. +/// LLVM_PACKED( +/// struct A { +/// int i; +/// int j; +/// int k; +/// long long l; +/// }); +/// +/// LLVM_PACKED_START +/// struct B { +/// int i; +/// int j; +/// int k; +/// long long l; +/// }; +/// LLVM_PACKED_END +#ifdef _MSC_VER +# define LLVM_PACKED(d) __pragma(pack(push, 1)) d __pragma(pack(pop)) +# define LLVM_PACKED_START __pragma(pack(push, 1)) +# define LLVM_PACKED_END __pragma(pack(pop)) +#else +# define LLVM_PACKED(d) d __attribute__((packed)) +# define LLVM_PACKED_START _Pragma("pack(push, 1)") +# define LLVM_PACKED_END _Pragma("pack(pop)") +#endif + /// \macro LLVM_PTR_SIZE /// \brief A constant integer equivalent to the value of sizeof(void*). /// Generally used in combination with LLVM_ALIGNAS or when doing computation in