[llvm-dev] Structure Padding and GetElementPtr

Hong Hu via llvm-dev llvm-dev at lists.llvm.org
Wed Dec 28 18:51:06 PST 2016


Here is an example:

I can define two classes: A and Apad:

class A {
    bool b1, b2;
    double d1;
    int i1;
};

class Apad {
    bool b1, b2;
    bool pad1[6];
    double d1;
    int i1;
    bool pad2[4];
};

A and Apad will have the same layout, from the LLVM IR level:

%class.A = type <{ i8, i8, [6 x i8], double, i32, [4 x i8] }>
%class.Apad = type { i8, i8, [6 x i8], double, i32, [4 x i8] }

Regards,
Hu Hong

On 29 December 2016 at 10:44, Hong Hu <huhong789 at gmail.com> wrote:

> Thanks, Eli.
>
> Next question is how to get the layout of the original C++ class from LLVM
> IR?
>
> Regards,
> Hu Hong
>
> On 29 December 2016 at 01:57, Friedman, Eli <efriedma at codeaurora.org>
> wrote:
>
>> On 12/28/2016 5:41 AM, Hong Hu via llvm-dev wrote:
>>
>> Hi all,
>>
>> I'm writing a pass to understand the memory access to C++ class members.
>> For each GetElementPtr instruction, I check the second index to the class
>> pointer, to figure out which member it is intended to access.
>>
>> However, due to the structure padding, there are some fake members
>> inserted into the structure. For example, when GEP works on the 5th element
>> of the padded structure, it may in fact works on the originally 3rd one, if
>> there are two paddings before the original 3rd member.
>>
>> Is there any way to map this "5th" access to the original "3rd" one? For
>> example, some APIs to tell whether one member is a real member, or a padded
>> one?
>>
>>
>> I would suggest converting the index of the struct GEP into an offset in
>> bytes; see StructLayout::getElementOffset.  You can then compare that to
>> the layout of the original C++ class.
>>
>> -Eli
>>
>> --
>> Employee of Qualcomm Innovation Center, Inc.
>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161229/6c88824d/attachment.html>


More information about the llvm-dev mailing list