[LLVMdev] How to get the string value?

Duncan Sands baldrick at free.fr
Sun Jan 29 04:52:22 PST 2012


Hi Welson,

> Thanks! I figured out this piece of code finally:
>
>              Value *gep = call->getArgOperand(0);
>              if ( ConstantExpr *pCE = dyn_cast<ConstantExpr>(gep) ) {
>                Value *firstop = pCE->getOperand(0);
>                if (GlobalVariable *GV = dyn_cast<GlobalVariable>(firstop)){
>                  Constant *v = GV->getInitializer();
>                  if (ConstantArray *CA = dyn_cast<ConstantArray>(v)) {
>                    StringRef portName(CA->getAsString());

you can use stripPointerCasts to get rid of the GEP and similar pointer casts.

Ciao, Duncan.

>
> That's some learning experience :-)
>
> Regards,
> Welson
>
>
>
> On Sat, Jan 28, 2012 at 6:41 AM, Duncan Sands <baldrick at free.fr
> <mailto:baldrick at free.fr>> wrote:
>
>     Hi Welson,
>
>
>         Yes, it is a ConstantExpr! Thank you!
>
>         Now trying to find a clue in ConstantExpr's functions to get that string :-)
>
>
>     you can get the pointer operand by doing: getOperand(0)
>     The i'th index is getOperand(i+1).
>
>     Ciao, Duncan.
>
>
>         Regards,
>         Welson
>
>         On Thu, Jan 26, 2012 at 9:04 PM, Duncan Sands <baldrick at free.fr
>         <mailto:baldrick at free.fr>
>         <mailto:baldrick at free.fr <mailto:baldrick at free.fr>>> wrote:
>
>             Hi Welson Sun,
>
>          > Hi, if I have some LLVM code like this:
>          >
>          > @.str = private unnamed_addr constant [7 x i8] c"in_arr\00", align 1
>          > @.str1 = private unnamed_addr constant [8 x i8] c"in_arr2\00", align 1
>          > @.str2 = private unnamed_addr constant [8 x i8] c"out_arr\00", align 1
>          > ...
>          > ...
>          >
>          >    call void (...)* @_Z16fooz(i8* *getelementptr inbounds ([7 x i8]*
>             @.str, i64
>          > 0, i64 0)*, i32 0, i32 1024)
>          > ...
>          >
>          > I would like to get the string value of the bold argument, but how? I
>             know it's
>          > a llvm::Value pointer, but it is not a llvm::GetElementPtrInst?
>
>             it is a ConstantExpr getelementptr.  Whenever you see something that
>         looks like
>             an instruction but is printed inline inside another instruction then
>         that means
>             it is actually a constant, a ConstantExpr.
>
>             Ciao, Duncan.
>
>          >
>          >
>          > Thanks,
>          >
>          >
>          >
>          >
>          >
>          >
>          >
>          >
>          > ______________________________ _________________
>          > LLVM Developers mailing list
>          > LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>         <mailto:LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>>
>         http://llvm.cs.uiuc.edu
>
>          > http://lists.cs.uiuc.edu/ mailman/listinfo/llvmdev
>         <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>
>             ______________________________ _________________
>             LLVM Developers mailing list
>         LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>         <mailto:LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>>
>         http://llvm.cs.uiuc.edu
>
>         http://lists.cs.uiuc.edu/ mailman/listinfo/llvmdev
>         <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>
>
>
>
>         --
>         Welson
>
>         Phone: (408) 418-8385 <tel:%28408%29%20418-8385>
>         Email: welson.sun at gmail.com <mailto:welson.sun at gmail.com>
>         <mailto:welson.sun at gmail.com <mailto:welson.sun at gmail.com>>
>
>
>
>
>
>
> --
> Welson
>
> Phone: (408) 418-8385
> Email: welson.sun at gmail.com <mailto:welson.sun at gmail.com>
>
>




More information about the llvm-dev mailing list