Zhen Zhang
2015-Jul-29 01:21 UTC
[LLVMdev] How to get the const argument data from Function?
Hi, I am doing a project involving checking a called specific function’s argument. Suppose that the function is int f(const char* str). When I am analyzing such a snippet: f("hello") , then compiled by Clang, I will have the “hello” as a *Constant Array* in the IR code. My goal is to call APIs of LLVM to get the “hello” from IR code. Now suppose the I got the llvm::Function* fn from some Module, so I can get the access the ArgumentList by iterator const_arg_iterator it. However, the iterator now I got is of type llvm::ilist_iterator<const llvm::Argument>::const_iterator. When I am trying to cast it into `llvm::ilist_iterator<const llvm::ConstantArray>::const_iterator, it can’t success. But if I get the raw pointer out of it, the program will simply crash. While Argument inherits Value, ConstantArray inherits Value as well. But *how should I cast one into another*? It is worth nothing that, hen I used getType()->getTypeID(), it is ConstantArrayVal, and that seems to be the right direction. Thanks for any help! - Zhen -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150729/9535c88a/attachment.html>
Sanjoy Das
2015-Jul-29 01:42 UTC
[LLVMdev] How to get the const argument data from Function?
llvm::Argument represents the formal parameter passed to its parent function. In other words, if you have int f(int x) { } then, within the body of `f`, `x` will be represented using an llvm::Argument. This is independent of any specific calls to `f`. Now every call / invoke to `f` will be represented using an llvm::CallInst / llvm::InvokeInst. These structures will contain the call target, and the set of actual parameter values passed to that call target in that call which you can access using getArgumentNo. So f(42) will be represented using a llvm::CallInst which has 42 as the 0th argument. At runtime, of course, the actual parameter values will be bound to formal parameter values in the usual sense during the control transfer corresponding to the call. -- Sanjoy On Tue, Jul 28, 2015 at 6:21 PM, Zhen Zhang <izgzhen at gmail.com> wrote:> Hi, > > I am doing a project involving checking a called specific function’s > argument. Suppose that the function is int f(const char* str). > > When I am analyzing such a snippet: > > f("hello") > > , then compiled by Clang, I will have the “hello” as a Constant Array in the > IR code. My goal is to call APIs of LLVM to get the “hello” from IR code. > > Now suppose the I got the llvm::Function* fn from some Module, so I can get > the access the ArgumentList by iterator const_arg_iterator it. > > However, the iterator now I got is of type llvm::ilist_iterator<const > llvm::Argument>::const_iterator. When I am trying to cast it into > `llvm::ilist_iterator<const llvm::ConstantArray>::const_iterator, it can’t > success. But if I get the raw pointer out of it, the program will simply > crash. > > While Argument inherits Value, ConstantArray inherits Value as well. But how > should I cast one into another? It is worth nothing that, hen I used > getType()->getTypeID(), it is ConstantArrayVal, and that seems to be the > right direction. > > Thanks for any help! > > > - Zhen > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >