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

Interesting. Just out of curiosity, can you tell us what your project is about? 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. You need to use dyn_cast 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.

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