[LLVMdev] Queries regarding function's arguments data type

John Criswell criswell at illinois.edu
Mon Feb 25 11:54:08 PST 2013


On 2/25/13 1:44 PM, teja tamboli wrote:
> Hi all,
>
> I am working on my Master's project in security and I am trying to 
> iterate over the argument list of the function. Basically I need to do 
> following things :

Interesting.  Just out of curiosity, can you tell us what your project 
is about?

>
> 1. Check data type of each argument of the argument list of the function.
> 2. Based on its data type like character array or integer array, 
> pointer, int, char, take different action.
> 3. I have added following code to check its data type.

There is one caveat when working with LLVM types: the type indicates 
what the function *expects* to get as an argument; it does not represent 
what the type of the actual memory object passed into the function will 
be.  A caller can cast a pointer of one structure type to a different 
structure type and pass that into a function.

>
> // F is any function basically of type function *
>  FunctionType *FTy = F->getFunctionType();
> unsigned int numArgs = FTy->getNumParams();
>
> //Currently just checking data type of the 0th argument. Eventually 
> will be running it in the loop from 0 to numArgs.
> errs() << "\n1 Argument type int 32 : " << 
> FTy->getParamType(0)->isIntegerTy(32);
>   errs() << "\n2 Argument type char : " << 
> FTy->getParamType(0)->isIntegerTy(8);
>   errs() << "\n4 Argument type pointer : " << 
> FTy->getParamType(0)->isPointerTy();
>   errs() << "\n5 Argument type array : " << 
> FTy->getParamType(0)->isArrayTy();
>   errs() << "\n6 Argument type structure : " << 
> FTy->getParamType(0)->isStructTy();
>
> I can just find these many data types for integer and characters. This 
> just tells me that parameter is of type pointer or array or structure.
>
> My question is if function's parameter type is pointer / array, how 
> can I figure it out whether its character pointer or integer pointer?

You need to use dyn_cast<SequentialType> to convert the Type * into a 
SequentialType *.  With that, you can use 
SequentialType::getElementType() to see what type of pointer type/array 
type it is.

You can also use dyn_cast<> to cast to an ArrayType to get the declared 
size of the array, or to a StructType so that you can examine the 
structure type's fields.

You should be familiar with how to use dyn_cast<>(), and you should be 
familiar with the LLVM type classes.  The former is documented in the 
LLVM Programmer's Manual, and the latter can be found within the doxygen 
documentation.

-- John T.

> Also if it is a array then how can I find size of the array?
> In case of structure how to check exact structure definition I mean 
> exactly it is instance of which structure?
>
> Please let me know.
>
> Thanks,
> --Teja
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130225/328f0bf0/attachment.html>


More information about the llvm-dev mailing list