[llvm] r252099 - Define portable macros for packed struct definitions:
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 4 20:18:10 PST 2015
On Wed, Nov 4, 2015 at 3:42 PM, Xinliang David Li via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: davidxl
> Date: Wed Nov 4 17:42:56 2015
> New Revision: 252099
>
> URL: http://llvm.org/viewvc/llvm-project?rev=252099&view=rev
> Log:
> 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
>
What are we planning to use these for (I imagine there are already some
uses of packed macros/etc in various parts of LLVM that this will be used
to replace? What are they? What new uses do you have in mind?) I'm a little
concerned, because this tend to leads to non-portable code trying to parse
& then use structs with misaligned members, etc... (which, if I understand
correctly, is only a perf penalty on X86, but potentially a correctness
problem on other platforms we support/care about (not to mention the known
bits stuff we do might assume certain bits are zero when they aren't, etc))
>
> Differential Revision: http://reviews.llvm.org/D14337
>
> Modified:
> llvm/trunk/include/llvm/Support/Compiler.h
>
> Modified: llvm/trunk/include/llvm/Support/Compiler.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Compiler.h?rev=252099&r1=252098&r2=252099&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/Compiler.h (original)
> +++ llvm/trunk/include/llvm/Support/Compiler.h Wed Nov 4 17:42:56 2015
> @@ -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
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151104/357ef627/attachment.html>
More information about the llvm-commits
mailing list