Alberto Barbaro via llvm-dev
2019-Mar-09 06:26 UTC
[llvm-dev] Cast a function parameter to GEP
Thanks Tim, I'll try to solve my problem ASAP, if I cannot maybe I'll some other clarifications. Thanks again On Sat, Mar 9, 2019, 06:03 Tim Northover <t.p.northover at gmail.com> wrote:> Hi Alberto, > > On Sat, 9 Mar 2019 at 05:50, Alberto Barbaro via llvm-dev > <llvm-dev at lists.llvm.org> wrote: > > i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str1, i32 0, i32 0) > > Because all of its inputs are Constants, this is actually a > GetElementPtrConstantExpr instead of a GetElementPtrInst (the easiest > way to tell on sight without context is the extra parens, which the > instruction variant never has). > > The main practical difference between the two is that instances of > Constant don't live in a BasicBlock independently, but are referenced > directly by each user. When printing the IR this is shown by > "inlining" them into the parent Instruction. > > LLVM has a GEPOperator class to help deal with this issue; it can be > used to access the common features of Instructions and Constants. > There are similar Operators for other operations because this is quite > a common situation. > > > I think it does not work because str1 is a "private constant". Is there > a way to solve it? > > Broadly true, but the same would apply to any global, not just ones > declared constant. > > Cheers. > > Tim. >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190309/024e404f/attachment.html>
Alberto Barbaro via llvm-dev
2019-Mar-09 07:22 UTC
[llvm-dev] Cast a function parameter to GEP
Sorry Tim, I now need to find the value of the constant expression and I found online a solution like: string value cast<ConstantDataArray>(cast<GlobalVariable>(CallInstruction->getOperand(0))->getInitializer())->getAsCString(); This one works but I feel the GEPOperator should be used based on your comments, so I tried to cast the operator and get the value but I'm not able to do it. I cast using GEPOperator *op = dyn_cast<GEPOperator>(CI->getOperand(0)); Could you tell me if it is correct and how to extract the value please? Thanks Il giorno sab 9 mar 2019 alle ore 06:26 Alberto Barbaro < barbaro.alberto at gmail.com> ha scritto:> Thanks Tim, > I'll try to solve my problem ASAP, if I cannot maybe I'll some other > clarifications. > > Thanks again > > On Sat, Mar 9, 2019, 06:03 Tim Northover <t.p.northover at gmail.com> wrote: > >> Hi Alberto, >> >> On Sat, 9 Mar 2019 at 05:50, Alberto Barbaro via llvm-dev >> <llvm-dev at lists.llvm.org> wrote: >> > i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str1, i32 0, i32 0) >> >> Because all of its inputs are Constants, this is actually a >> GetElementPtrConstantExpr instead of a GetElementPtrInst (the easiest >> way to tell on sight without context is the extra parens, which the >> instruction variant never has). >> >> The main practical difference between the two is that instances of >> Constant don't live in a BasicBlock independently, but are referenced >> directly by each user. When printing the IR this is shown by >> "inlining" them into the parent Instruction. >> >> LLVM has a GEPOperator class to help deal with this issue; it can be >> used to access the common features of Instructions and Constants. >> There are similar Operators for other operations because this is quite >> a common situation. >> >> > I think it does not work because str1 is a "private constant". Is there >> a way to solve it? >> >> Broadly true, but the same would apply to any global, not just ones >> declared constant. >> >> Cheers. >> >> Tim. >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190309/6fb8b79e/attachment.html>
Tim Northover via llvm-dev
2019-Mar-09 07:41 UTC
[llvm-dev] Cast a function parameter to GEP
On Sat, 9 Mar 2019 at 07:22, Alberto Barbaro <barbaro.alberto at gmail.com> wrote:> I now need to find the value of the constant expression and I found online a solution like: string value = cast<ConstantDataArray>(cast<GlobalVariable>(CallInstruction->getOperand(0))->getInitializer())->getAsCString();> This one works but I feel the GEPOperator should be used based on your comments, so I tried to cast the operator and get the value but I'm not able to do it.If that one works it sounds like you don't have any kind of GEP at that point. Otherwise the cast to GlobalVariable would fail. Have you tried calling Module::dump while that code is executing to see what you're really dealing with?> I cast using GEPOperator *op = dyn_cast<GEPOperator>(CI->getOperand(0));That looks right to me if you have a GEP. Once you've got that you'd have to carefully check the operands of the GEP to make sure no-one is doing anything tricksy like printf(LocalVariable); // cast<GlobalVariable>(MyGEP->getPointerOperand) will fail so use dyn_cast and check the result. printf(&"MwahahahaHello world\n"[9]); // The GEP will have non-zero index operands. They may not even be constant. Cheers. Tim.