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 >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170518/081efcb9/attachment.html>
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/43968b07/attachment.html>
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>