[llvm] r252099 - Define portable macros for packed struct definitions:

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 4 21:36:47 PST 2015


On Wed, Nov 4, 2015 at 8:18 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> 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))
>
>

This is used for existing runtime data structure (Coverage Map's Function
Record). Previously the structure is not explicitly declared but referenced
with manually specified layout and alignment.

New uses of the macro should be done with care -- but there might be legit
reason to use it though, let's not rule that out.

David



>
>> 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/ebd90e98/attachment.html>


More information about the llvm-commits mailing list