David Majnemer
2014-Nov-22 20:08 UTC
[LLVMdev] How to get the indices in an getelementptr Value?
On Sat, Nov 22, 2014 at 11:09 AM, Sanjoy Das <sanjoy at playingwithpointers.com> wrote:> Hi Qiuping, > > If I'm reading the IR correctly, what you have is a > GetElementPtrConstantExpr [1]. It subclasses from llvm::Constant. >If you want the same code to handle GetElementPtrConstantExpr *and* GetElementPtrInst, you can use GEPOperator.> > Thanks, > -- Sanjoy > > [1]: > http://llvm.org/docs/doxygen/html/classllvm_1_1GetElementPtrConstantExpr.html > > On Sat, Nov 22, 2014 at 1:10 AM, Qiuping Yi <yiqiuping at gmail.com> wrote: > > Hi Michael, > > > > Thank you very much. > > > > But idx_begin/idx_end iterators can only be used through a getelementptr > > instruction, right? However, I think value "i32* getelementptr inbounds > > (%struct.Args* @globalArg, i64 0, i32 2)" itself is not a getelementptr > > instruction, so? Or could you tell me how can I get a getelementptr > > instruction first from this value? > > > > > > -------------------------------------------- > > Qiuping Yi > > Institute Of Software > > Chinese Academy of Sciences > > > > On Sat, Nov 22, 2014 at 4:49 PM, Michael Zolotukhin < > mzolotukhin at apple.com> > > wrote: > >> > >> Hi Qiuping, > >> > >> I guess you need to use getPointerOperand to access the pointer operand > >> (@globalArg in your example) and idx_begin/idx_end iterators to access > >> indexes. You can find a short description of these functions in > >> documentation [1], or look at examples of their uses in the code, e.g. > in > >> lib/Transforms/InstCombine/*.cpp. > >> > >> [1] http://llvm.org/doxygen/classllvm_1_1GetElementPtrInst.html > >> > >> Best regards, > >> Michael > >> > >> On Nov 22, 2014, at 12:32 AM, Qiuping Yi <yiqiuping at gmail.com> wrote: > >> > >> Hi, all > >> > >> I am a LLVM user. I want to get every element in the next instruction: > >> > >> %0 = load i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, > >> i32 2), align 4, !dbg !85, !clap !86 > >> > >> Now I can only get value "i32* getelementptr inbounds (%struct.Args* > >> @globalArg, i64 0, i32 2)" through "getOperand(0)", > >> but I can not get "%struct.Args* @globalArg", "i64 0", and "i32 2" in > this > >> instruction. > >> > >> I know I can get the indices of getelementptr instructions through > >> "getOperand()", but now in the previous example, > >> I want to get the indices from a getlementptr value. How should I do? > >> Thank you in advance. > >> > >> > >> Best Regards! > >> > >> -------------------------------------------- > >> Qiuping Yi > >> Institute Of Software > >> Chinese Academy of Sciences > >> _______________________________________________ > >> LLVM Developers mailing list > >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >> > >> > > > > > > _______________________________________________ > > LLVM Developers mailing list > > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141122/df3cc94a/attachment.html>
Qiuping Yi
2014-Nov-23 04:37 UTC
[LLVMdev] How to get the indices in an getelementptr Value?
Thank you very much for your useful information. As you say, it is a subclass llvm::ConstantExpr. Now I cast value "i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, i32 2)" to its subclass llvm::Constant and then subclass llvm::ConstantExpr, and then I can access its indices through for (unsigned i=0; i<constExpr->getNumOperands(); ++i) v = constExpr->getOperand(i); *However, I have another question.* The invoking of getNumOperands() on value "i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, i32 2)" returns 3, but it returns 1 on value "i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, i32 0)", and furthermore, through value "i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, i32 2)" is subclass llvm::Constant, but it is not subclass llvm::ConstantExpr, why? -------------------------------------------- Qiuping Yi Institute Of Software Chinese Academy of Sciences On Sun, Nov 23, 2014 at 4:08 AM, David Majnemer <david.majnemer at gmail.com> wrote:> On Sat, Nov 22, 2014 at 11:09 AM, Sanjoy Das < > sanjoy at playingwithpointers.com> wrote: > >> Hi Qiuping, >> >> If I'm reading the IR correctly, what you have is a >> GetElementPtrConstantExpr [1]. It subclasses from llvm::Constant. >> > > If you want the same code to handle GetElementPtrConstantExpr *and* > GetElementPtrInst, you can use GEPOperator. > > >> >> Thanks, >> -- Sanjoy >> >> [1]: >> http://llvm.org/docs/doxygen/html/classllvm_1_1GetElementPtrConstantExpr.html >> >> On Sat, Nov 22, 2014 at 1:10 AM, Qiuping Yi <yiqiuping at gmail.com> wrote: >> > Hi Michael, >> > >> > Thank you very much. >> > >> > But idx_begin/idx_end iterators can only be used through a getelementptr >> > instruction, right? However, I think value "i32* getelementptr inbounds >> > (%struct.Args* @globalArg, i64 0, i32 2)" itself is not a getelementptr >> > instruction, so? Or could you tell me how can I get a getelementptr >> > instruction first from this value? >> > >> > >> > -------------------------------------------- >> > Qiuping Yi >> > Institute Of Software >> > Chinese Academy of Sciences >> > >> > On Sat, Nov 22, 2014 at 4:49 PM, Michael Zolotukhin < >> mzolotukhin at apple.com> >> > wrote: >> >> >> >> Hi Qiuping, >> >> >> >> I guess you need to use getPointerOperand to access the pointer operand >> >> (@globalArg in your example) and idx_begin/idx_end iterators to access >> >> indexes. You can find a short description of these functions in >> >> documentation [1], or look at examples of their uses in the code, e.g. >> in >> >> lib/Transforms/InstCombine/*.cpp. >> >> >> >> [1] http://llvm.org/doxygen/classllvm_1_1GetElementPtrInst.html >> >> >> >> Best regards, >> >> Michael >> >> >> >> On Nov 22, 2014, at 12:32 AM, Qiuping Yi <yiqiuping at gmail.com> wrote: >> >> >> >> Hi, all >> >> >> >> I am a LLVM user. I want to get every element in the next instruction: >> >> >> >> %0 = load i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, >> >> i32 2), align 4, !dbg !85, !clap !86 >> >> >> >> Now I can only get value "i32* getelementptr inbounds (%struct.Args* >> >> @globalArg, i64 0, i32 2)" through "getOperand(0)", >> >> but I can not get "%struct.Args* @globalArg", "i64 0", and "i32 2" in >> this >> >> instruction. >> >> >> >> I know I can get the indices of getelementptr instructions through >> >> "getOperand()", but now in the previous example, >> >> I want to get the indices from a getlementptr value. How should I do? >> >> Thank you in advance. >> >> >> >> >> >> Best Regards! >> >> >> >> -------------------------------------------- >> >> Qiuping Yi >> >> Institute Of Software >> >> Chinese Academy of Sciences >> >> _______________________________________________ >> >> LLVM Developers mailing list >> >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> >> >> >> > >> > >> > _______________________________________________ >> > LLVM Developers mailing list >> > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> > >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141123/6a805a07/attachment.html>
Qiuping Yi
2014-Nov-23 07:17 UTC
[LLVMdev] How to get the indices in an getelementptr Value?
Hi David Majnemer, I found I can cast value "i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, i32 2)" to class GEPOperator, but failed on value "i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, i32 0)". As my previous email described, I found that the later value is a class llvm::Constant but not a subclass llvm::ConstantExpr. I find it is very strange. -------------------------------------------- Qiuping Yi Institute Of Software Chinese Academy of Sciences On Sun, Nov 23, 2014 at 4:08 AM, David Majnemer <david.majnemer at gmail.com> wrote:> On Sat, Nov 22, 2014 at 11:09 AM, Sanjoy Das < > sanjoy at playingwithpointers.com> wrote: > >> Hi Qiuping, >> >> If I'm reading the IR correctly, what you have is a >> GetElementPtrConstantExpr [1]. It subclasses from llvm::Constant. >> > > If you want the same code to handle GetElementPtrConstantExpr *and* > GetElementPtrInst, you can use GEPOperator. > > >> >> Thanks, >> -- Sanjoy >> >> [1]: >> http://llvm.org/docs/doxygen/html/classllvm_1_1GetElementPtrConstantExpr.html >> >> On Sat, Nov 22, 2014 at 1:10 AM, Qiuping Yi <yiqiuping at gmail.com> wrote: >> > Hi Michael, >> > >> > Thank you very much. >> > >> > But idx_begin/idx_end iterators can only be used through a getelementptr >> > instruction, right? However, I think value "i32* getelementptr inbounds >> > (%struct.Args* @globalArg, i64 0, i32 2)" itself is not a getelementptr >> > instruction, so? Or could you tell me how can I get a getelementptr >> > instruction first from this value? >> > >> > >> > -------------------------------------------- >> > Qiuping Yi >> > Institute Of Software >> > Chinese Academy of Sciences >> > >> > On Sat, Nov 22, 2014 at 4:49 PM, Michael Zolotukhin < >> mzolotukhin at apple.com> >> > wrote: >> >> >> >> Hi Qiuping, >> >> >> >> I guess you need to use getPointerOperand to access the pointer operand >> >> (@globalArg in your example) and idx_begin/idx_end iterators to access >> >> indexes. You can find a short description of these functions in >> >> documentation [1], or look at examples of their uses in the code, e.g. >> in >> >> lib/Transforms/InstCombine/*.cpp. >> >> >> >> [1] http://llvm.org/doxygen/classllvm_1_1GetElementPtrInst.html >> >> >> >> Best regards, >> >> Michael >> >> >> >> On Nov 22, 2014, at 12:32 AM, Qiuping Yi <yiqiuping at gmail.com> wrote: >> >> >> >> Hi, all >> >> >> >> I am a LLVM user. I want to get every element in the next instruction: >> >> >> >> %0 = load i32* getelementptr inbounds (%struct.Args* @globalArg, i64 0, >> >> i32 2), align 4, !dbg !85, !clap !86 >> >> >> >> Now I can only get value "i32* getelementptr inbounds (%struct.Args* >> >> @globalArg, i64 0, i32 2)" through "getOperand(0)", >> >> but I can not get "%struct.Args* @globalArg", "i64 0", and "i32 2" in >> this >> >> instruction. >> >> >> >> I know I can get the indices of getelementptr instructions through >> >> "getOperand()", but now in the previous example, >> >> I want to get the indices from a getlementptr value. How should I do? >> >> Thank you in advance. >> >> >> >> >> >> Best Regards! >> >> >> >> -------------------------------------------- >> >> Qiuping Yi >> >> Institute Of Software >> >> Chinese Academy of Sciences >> >> _______________________________________________ >> >> LLVM Developers mailing list >> >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> >> >> >> > >> > >> > _______________________________________________ >> > LLVM Developers mailing list >> > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> > >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141123/3362d7ed/attachment.html>
Qiuping Yi
2014-Nov-23 07:41 UTC
[LLVMdev] How to get the indices in an getelementptr Value?
I find the root of my problem. I mistakenly invoking stripPointerCasts() before casting. Now I can access these elements by casting the related value to subclass llvm::constantExpr or GEPOperator. Thank you all. -------------------------------------------- Qiuping Yi Institute Of Software Chinese Academy of Sciences On Sun, Nov 23, 2014 at 3:17 PM, Qiuping Yi <yiqiuping at gmail.com> wrote:> Hi David Majnemer, > > I found I can cast value "i32* getelementptr inbounds (%struct.Args* > @globalArg, i64 0, i32 2)" to class GEPOperator, but failed on value "i32* > getelementptr inbounds (%struct.Args* @globalArg, i64 0, i32 0)". As my > previous email described, I found that the later value is a class > llvm::Constant but not a subclass llvm::ConstantExpr. I find it is very > strange. > > > -------------------------------------------- > Qiuping Yi > Institute Of Software > Chinese Academy of Sciences > > On Sun, Nov 23, 2014 at 4:08 AM, David Majnemer <david.majnemer at gmail.com> > wrote: > >> On Sat, Nov 22, 2014 at 11:09 AM, Sanjoy Das < >> sanjoy at playingwithpointers.com> wrote: >> >>> Hi Qiuping, >>> >>> If I'm reading the IR correctly, what you have is a >>> GetElementPtrConstantExpr [1]. It subclasses from llvm::Constant. >>> >> >> If you want the same code to handle GetElementPtrConstantExpr *and* >> GetElementPtrInst, you can use GEPOperator. >> >> >>> >>> Thanks, >>> -- Sanjoy >>> >>> [1]: >>> http://llvm.org/docs/doxygen/html/classllvm_1_1GetElementPtrConstantExpr.html >>> >>> On Sat, Nov 22, 2014 at 1:10 AM, Qiuping Yi <yiqiuping at gmail.com> wrote: >>> > Hi Michael, >>> > >>> > Thank you very much. >>> > >>> > But idx_begin/idx_end iterators can only be used through a >>> getelementptr >>> > instruction, right? However, I think value "i32* getelementptr inbounds >>> > (%struct.Args* @globalArg, i64 0, i32 2)" itself is not a getelementptr >>> > instruction, so? Or could you tell me how can I get a getelementptr >>> > instruction first from this value? >>> > >>> > >>> > -------------------------------------------- >>> > Qiuping Yi >>> > Institute Of Software >>> > Chinese Academy of Sciences >>> > >>> > On Sat, Nov 22, 2014 at 4:49 PM, Michael Zolotukhin < >>> mzolotukhin at apple.com> >>> > wrote: >>> >> >>> >> Hi Qiuping, >>> >> >>> >> I guess you need to use getPointerOperand to access the pointer >>> operand >>> >> (@globalArg in your example) and idx_begin/idx_end iterators to access >>> >> indexes. You can find a short description of these functions in >>> >> documentation [1], or look at examples of their uses in the code, >>> e.g. in >>> >> lib/Transforms/InstCombine/*.cpp. >>> >> >>> >> [1] http://llvm.org/doxygen/classllvm_1_1GetElementPtrInst.html >>> >> >>> >> Best regards, >>> >> Michael >>> >> >>> >> On Nov 22, 2014, at 12:32 AM, Qiuping Yi <yiqiuping at gmail.com> wrote: >>> >> >>> >> Hi, all >>> >> >>> >> I am a LLVM user. I want to get every element in the next instruction: >>> >> >>> >> %0 = load i32* getelementptr inbounds (%struct.Args* @globalArg, i64 >>> 0, >>> >> i32 2), align 4, !dbg !85, !clap !86 >>> >> >>> >> Now I can only get value "i32* getelementptr inbounds (%struct.Args* >>> >> @globalArg, i64 0, i32 2)" through "getOperand(0)", >>> >> but I can not get "%struct.Args* @globalArg", "i64 0", and "i32 2" in >>> this >>> >> instruction. >>> >> >>> >> I know I can get the indices of getelementptr instructions through >>> >> "getOperand()", but now in the previous example, >>> >> I want to get the indices from a getlementptr value. How should I do? >>> >> Thank you in advance. >>> >> >>> >> >>> >> Best Regards! >>> >> >>> >> -------------------------------------------- >>> >> Qiuping Yi >>> >> Institute Of Software >>> >> Chinese Academy of Sciences >>> >> _______________________________________________ >>> >> LLVM Developers mailing list >>> >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>> >> >>> >> >>> > >>> > >>> > _______________________________________________ >>> > LLVM Developers mailing list >>> > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>> > >>> _______________________________________________ >>> LLVM Developers mailing list >>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >>> >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141123/898156cd/attachment.html>