teja tamboli
2013-Feb-25 19:44 UTC
[LLVMdev] Queries regarding function's arguments data type
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 : 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. // 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? 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 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130225/0721377b/attachment.html>
John Criswell
2013-Feb-25 19:54 UTC
[LLVMdev] Queries regarding function's arguments data type
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>
teja tamboli
2013-Mar-05 04:17 UTC
[LLVMdev] Queries regarding function's arguments data type
Hi John, Thanks John. I tried using SequentialType::getElementType() function and it worked. I have one more question how can we do function permutation at intermediate representation byte code level? If I have lets say C program having three functions and its corresponding IR bytecode. void findLen(char a[10]) { int tmp = strlen(a); printf("Len is : %d\n", tmp); } void muladd(int a, int b, int c) { int tmp = a + b; int tmp1 = tmp * c; printf("Addition is : %d Multiplication is : %d\n", tmp, tmp1); char d[10] = "abhd"; findLen(d); } void main() { int x = 8, y = 5, z = 3; muladd(x, y, z); } In its corresponding .s / .ll IR bytecode file function sequence will be same first findLen() then muladd() and then main(). Suppose I want to change this sequence i.e. swap findLen() and muladd() function's positions. I am expecting to have IR bytecode of first muladd() then findLen() and then main() in the output file. Can you please tell me how can I achieve it ? Thanks, Teja On Mon, Feb 25, 2013 at 11:54 AM, John Criswell <criswell at illinois.edu>wrote:> 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 listLLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130304/be6a5baa/attachment.html>