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? Regards, Hu Hong -------------- next part -------------- An HTML attachment was scrubbed... URL: <lists.llvm.org/pipermail/llvm-dev/attachments/20161228/df34ab5b/attachment.html>
Friedman, Eli via llvm-dev
2016-Dec-28 17:57 UTC
[llvm-dev] Structure Padding and GetElementPtr
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: <lists.llvm.org/pipermail/llvm-dev/attachments/20161228/1e3afc32/attachment.html>
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: <lists.llvm.org/pipermail/llvm-dev/attachments/20161229/d782fa4c/attachment.html>