[LLVMdev] Retrieving Underlying Type from AllocaInst

Reid Kleckner rnk at mit.edu
Fri May 28 07:22:32 PDT 2010


You should be able to use the second alternative that Nick proposed:
cast<PointerType*>(pointer_value->getType())->getElementType()

Reid

On Fri, May 28, 2010 at 9:37 AM, Curtis Faith <curtis at curtisfaith.com> wrote:
> Thanks Nick,
> Unfortunately, that is indeed what I asked for but not what I really am
> looking for.
> My naive approach is to store symbol table entries as Value* objects so I
> can allocate global variables and alloca variables and place them into the
> symbol table and the rest of the code didn't need to know which kind they
> were, in general. Loads and Stores of these types (as well as other
> instructions) seem to work fine as long as the types being pointed to match
> the type of the value being stored.
> So what I was really looking for, I suppose, was
> a Value class virtual member function something like getLoadStoreType or
> perhaps getReferencedType which returned the type as it would be used in a
> load or store. It appears that both load and store do handle the pointer
> dereferencing automatically for both types,
> i.e. AllocaInst and GlobalVariable both dereference the pointers
> automatically.
> I can cast the value I get from the symbol table to a AllocaInst, of course,
> in the case where it is one, but this requires a test for one and is just as
> messy as first getting the type and then testing it for being
> a PointerType and less general since a GlobalVariable also store its type as
> a PointerType which point to the actual type. They, unfortunately, do not
> share a common superclass other than Value itself.
> - Curtis
>
> On May 28, 2010, at 1:06 AM, Nick Lewycky wrote:
>
> Curtis Faith wrote:
>
> Is there a recommended way to retrieve the original type from an
>
> AllocaInst object?
>
> For example, I am creating alloca instructions using the IRBuilder
>
> interface like:
>
> alloca = builder.CreateAlloca( Type::getDoubleTy( context ), 0,
>
> variableName.c_str() );
>
> and I place the alloca into a symbol table.
>
> Later when I am generating instructions for an assignment operation, I
>
> want to check the type of the variable allocated with the CreateAlloca
>
> instruction so I can see if I need to do type conversion before the
>
> store instruction, However, I cannot simply use:
>
> alloca->getType()->isDoubleTy() etc.
>
> because this doesn't return true in the above case. The ID of the Ty
>
> member of the VTy member of the alloca is PointerTyID instead of
>
> DoubleTyID as the construction for AllocaInst::AllocaInst seems to
>
> create a PointerType pointing to the original type.
>
> I was hoping for a member function of the alloca that would return the
>
> original type that was passed to CreateAlloca. I can test for a
>
> PointerTyID and then perform a cast to PointerType and then call the
>
> getElementType() function on the PointerType but that seems a bit messy.
>
> There's alloca->getAllocatedType() which merely calls
> getType()->getElementType() for you.
>
> http://llvm.org/doxygen/classllvm_1_1AllocaInst.html .
>
> Nick
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>




More information about the llvm-dev mailing list