[llvm-dev] DICompositeType to Type

Henri Rosten via llvm-dev llvm-dev at lists.llvm.org
Fri Oct 30 01:51:20 PDT 2020


On Thu, Oct 29, 2020 at 12:06:15PM -0700, David Blaikie wrote:
> On Thu, Oct 29, 2020 at 6:39 AM Henri Rosten via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
> 
> > Given a DICompositeType, is there a convenient way to map the
> > DICompositeType to llvm::Type?
> >
> 
> No there isn't - that's not usually a thing that folks need to do. What use
> case do you have in mind?
> 

I need to know what is the actual type of an object when it is 
referenced through a global base pointer variable.

For instance, in the example from the previous mail, when 
baseptr->base_pure_virtual() is called, I would need to know that the 
global variable baseptr was actually initialized using class.Child*.

I'm currently iterating all GlobalVariables to find out what values they 
were initialized with. Something like:

```
for (Module::global_iterator gi = M->global_begin(); gi != M->global_end(); ++gi) {
  GlobalVariable *GV = &*gi;
  if (!GV->hasInitializer()) {
    continue;
  }
  Constant *Ini = GV->getInitializer();
  Type *FromTy = Ini->stripPointerCasts()->getType();
  Type *ToTy = Ini->getType();
  if (ToTy->isPointerTy()) {
    ToTy = ToTy->getPointerElementType();
  }
  if (FromTy->isPointerTy()) {
    FromTy = FromTy->getPointerElementType();
  }
}
```

In the example case from the previous mail for the baseptr, ToTy would 
be (%class.Base) and FromTy would be { i8** }. I'm trying to figure out 
a way to deduce that the actual type the baseptr is initialized with is 
a pointer to (%class.Child).

> 
> >
> > As an example:
> >
> > ```
> > class Base {
> > public:
> >     virtual void base_pure_virtual() = 0;
> > };
> >
> > class Child : public Base {
> > public:
> >     void base_pure_virtual() {
> >         std::cout << __PRETTY_FUNCTION__ << "\n";
> >     }
> > };
> >
> > Child child;
> > Base *baseptr = &child;
> > ```
> >
> > Relevant IR snippets:
> >
> > ```
> > @child = dso_local global { i8** } { i8** getelementptr inbounds ({ [3 x
> > i8*] }, { [3 x i8*] }* @_ZTV5Child, i32 0, inrange i32 0, i32 2) }, align
> > 8, !dbg !19
> > @baseptr = dso_local global %class.Base* bitcast ({ i8** }* @child to
> > %class.Base*), align 8, !dbg !25
> > ...
> > !914 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "Child",
> > file: !22, line: 8, size: 64, flags: DIFlagTypePassByReference |
> > DIFlagNonTrivial, elements: !915, vtableHolder: !28, identifier:
> > "_ZTS5Child")
> > ```
> >
> > I would like to know the Type of the value assigned to baseptr.
> >
> > I figured global variable has a link to DIGlobalVariable, which has a
> > link to DICompositeType. However, it seems there is no way to get to the
> > llvm::Type from DICompositeType. Is this the case or did I overlook
> > something?
> >
> > Alternatively, if there's a simpler way to get the Type of the value
> > assigned to baseptr (class.Child*), I would welcome your suggestion.
> >
> 
> if you have the baseptr llvm::Value* you shuold be able to ask that
> llvm::Value for its type directly
> https://llvm.org/doxygen/classllvm_1_1Value.html#a6393a2d4fe7e10b28a0dcc35f881567b


More information about the llvm-dev mailing list