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
>