[llvm-dev] [cfe-dev] Struct padding
Hongbin Zheng via llvm-dev
llvm-dev at lists.llvm.org
Thu May 18 01:14:28 PDT 2017
Hi Mats,
When the struct is packed, explicit byte array is introduced to pad the
struct. (I saw this happened in clang 3.9.)
I want to check if a byte or byte array in an LLVM struct is introduce for
explicit padding or not.
I don't need to worry about this problem in case the newest clang do not
introduce byte array anymore.
Thanks
Hongbin
On Thu, May 18, 2017 at 1:03 AM, mats petersson <mats at planetcatfish.com>
wrote:
> What are you actually trying to achieve? LLVM knows the alignment and size
> of each component. You could iterate over the different types and identify
> when there is a difference in "calculated total size and the current
> alignment requirement", but LLVM does automatically pad structures [unless
> you specifically ask it not to].
>
> Note that there is no actual field added for padding, it's just the size
> and alignment itself.
>
> --
> Mats
>
> On 18 May 2017 at 08:51, Hongbin Zheng via cfe-dev <cfe-dev at lists.llvm.org
> > wrote:
>
>> Hi Jonas,
>>
>> Thanks a lot.
>> In an LLVM pass, how can I check the related information? will clang emit
>> some metadata table?
>>
>> Thanks
>> Hongbin
>>
>> On Thu, May 18, 2017 at 12:47 AM, Jonas Devlieghere <
>> jonas at devlieghere.com> wrote:
>>
>>> Hi Hongbin,
>>>
>>> You can pass `-Wpadded` to clang. For your particular example it will
>>> print something along the lines of
>>>
>>> ```
>>> warning: padding struct 'foo1' with 7 bytes to align 'x' [-Wpadded]
>>> long x;
>>> ```
>>>
>>> Jonas
>>>
>>> On Thu, May 18, 2017 at 9:15 AM, Hongbin Zheng via llvm-dev <
>>> llvm-dev at lists.llvm.org> wrote:
>>>
>>>> Hi,
>>>>
>>>> I am wondering how I can tell whether a field of a struct is introduced
>>>> by padding or not.
>>>>
>>>> For example, if I have a struct:
>>>>
>>>> struct foo1 {
>>>> char *p; /* 8 bytes */
>>>> char c; /* 1 byte
>>>> long x; /* 8 bytes */
>>>> };
>>>>
>>>> clang may generate:
>>>>
>>>> struct foo1 {
>>>> char *p; /* 8 bytes */
>>>> char c; /* 1 byte
>>>> char pad[7]; /* 7 bytes */
>>>> long x; /* 8 bytes */
>>>> };
>>>>
>>>> Is there any way that I can tell the "pad" array is generated by
>>>> padding?
>>>>
>>>> Thanks a lot
>>>> Hongbin
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>>
>>>>
>>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170518/e4f37c13/attachment.html>
More information about the llvm-dev
mailing list