[LLVMdev] getting object from BitCastInst?
John Criswell
criswell at illinois.edu
Wed Oct 12 12:03:31 PDT 2011
On 10/11/11 10:46 PM, ret val wrote:
> My pass is looking at StoreInsts acting on global variable that happen
> to be function pointers. From these StoreInsts I would like to get
> useful information(the function used if a direct assignment, function
> pointer used, etc) from the getValueOperand() method. Looking through
> several examples I see that this can return several things like:
> GlobalVariable, Function, LoadInst or BitCastInst depending on how
> much "indirection" is used.
>
> In the case of BitCastInst my dump shows "%ptr.addr = alloca i8*,
> align 8", I would like to isolate this just to "ptr". Ive tried doing
> another dyn_cast to AllocaInt, but I couldn't find any relevant
> methods. How Can I do this?
First, remember that you can strip away pointer casts by using the
stripPointerCasts() method of llvm::Value. So, instead of using the
code you have below, you can write:
if (LoadInst * load = dyn_cast<LoadInst>(rhs->stripPointerCasts()) {
...
}
Second, your question about the alloca is confusing. In the instruction:
%ptr.addr = alloca i8*, align 8
... there is no SSA value named %ptr that is an operand of the alloca.
I'm guessing that you're trying to find the name of the C variable for
which the alloca was generated when compiling from C source code to LLVM
IR. To do that, you'll need to use LLVM debug metadata.
-- John T.
>
> BitCastInst *bitcastRHS =
> dyn_cast<BitCastInst>(rhs);
> if(bitcastRHS != NULL) {
> LoadInst *load = dyn_cast<LoadInst>(bitcastRHS->getOperand(0));
> if(load != NULL) {
> rhs = load->getPointerOperand();
> rhs->dump();
> }
> }
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list