[LLVMdev] newbie question for type comparison
John Criswell
criswell at cs.uiuc.edu
Mon Apr 21 07:08:54 PDT 2008
Lu Zhao wrote:
> Hi,
>
> I want to extract all instruction of the form "alloca %struct.S", where
> $struct.S is defined as a struct
>
> %struct.S = type { i32, i32 }
>
> I'm using the following loop:
>
> for(inst_iterator i = inst_begin(F), e = inst_end(F); i!= e; i++)
> {
> AllocaInst* ai;
> if( (ai = dyn_cast<AllocaInst>(&*i))){
> if(ai->getOperand(0)->getType()->getTypeID() ==
> Type::StructTyID)
> allocs.push_back(ai);
> }
> }
>
I might be misunderstanding something, but the above code finds all
alloca instructions that allocate structure types. This is not quite
what you want if you're looking specifically for type {i32, i32}.
To search specifically for that type, do the following:
1) Create a "new" structure type representing {i32. i32} using the
static StructType::get() method. I think the code would look something
like this:
Type * MyStructType = StructType::get (Type::Int32Ty, Type::Int32Ty, 0);
2) Compare the pointer of MyStructType to the pointer for the alloca's
allocation type:
if (ai->getOperand(0)->getType() == MyStructType)
The above works because LLVM will only create one instance of each type
(i.e. if there's already a {i32, i32}, StructType::get() returns a
pointer to that instead of creating a new object). This is what allows
the pointer comparison to work.
> However, I had the impression that the type comparison can be done by a
> pointer comparison. Can anyone please suggest me a better way to do it?
>
> Also, I want to get the size of %struct.S, should I use the following
> code?
>
> const TargetData &TD = getAnalysis<TargetData>();
> unsigned StructSize =
> TD.getABITypeSizeInBits(ai->getOperand(0)->getType());
>
There are different interpretations of "size" that TargetData supports,
but without knowing what you're trying to do, I'd have to guess that
this is probably what you want.
-- John T.
> Thanks a lot.
> Lu
> _______________________________________________
> 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