[llvm-dev] Structure Padding and GetElementPtr

Hong Hu via llvm-dev llvm-dev at lists.llvm.org
Wed Dec 28 21:48:40 PST 2016


Thanks all. Finally find a way to do the mapping.

In the metadata, each element (member in C++) has the offset field, which
is the offset in the new layout. With this field, I can match each index
used by GetElementPtr with the original member.

Regards,
Hu Hong

On 29 December 2016 at 11:00, Daniel Berlin <dberlin at dberlin.org> wrote:

> Yes.
> LLVM types != C++ types.
> There is no mapping except that produced if you add debug info.
>
>
> On Wed, Dec 28, 2016 at 6:51 PM, Hong Hu via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> 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
>>>>
>>>>
>>>
>>
>> _______________________________________________
>> 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/20161229/a306c4b3/attachment.html>


More information about the llvm-dev mailing list