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

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 5 00:02:15 PST 2015


On Wed, Nov 4, 2015 at 9:36 PM, Xinliang David Li <davidxl at google.com>
wrote:

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

Not sure I quite follow this ^ sorry - could you give an example? (perhaps
this commit could've included an example of porting over an existing use to
use the new macros from whatever the code was doing previously)


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

Might be, though ideally I'd prefer to see at least a motivating use case
before adding tools like this, but I'm not strongly invested/pushing back
here.


>
> 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/20151105/932e6a5e/attachment.html>


More information about the llvm-commits mailing list