Hi, All good points and jokes in your email :) My final goal is the get the value of %8 at runtime. So considering the program is called argv I would like to execute something like ./argv 22 and get the value of argv[0]. Is it possible? So far I have the address where the parameter at position 0 in store but I'd like to read the value and print it. I hope it is clear now Thanks again On Fri, Jan 25, 2019, 06:23 Doerfert, Johannes Rudolf <jdoerfert at anl.gov wrote:> On 01/20, Alberto Barbaro via llvm-dev wrote: > > Hi all, > > I have the following C code: > > > > #include<stdio.h> > > > > int main(int argc, char *argv[]) { > > > > printf("%s\n", argv[0]); > > return argc; > > } > > > > that generates the following IR for the main function: > > > > ; Function Attrs: noinline nounwind optnone uwtable > > define i32 @main(i32, i8**) #0 { > > %3 = alloca i32, align 4 > > %4 = alloca i32, align 4 > > %5 = alloca i8**, align 8 > > store i32 0, i32* %3, align 4 > > store i32 %0, i32* %4, align 4 > > store i8** %1, i8*** %5, align 8 > > %6 = load i8**, i8*** %5, align 8 > > %7 = getelementptr inbounds i8*, i8** %6, i64 0 > > %8 = load i8*, i8** %7, align 8 > > %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], > [4 > > x i8]* @.str, i32 0, i32 0), i8* %8) > > %10 = load i32, i32* %4, align 4 > > ret i32 %10 > > } > > You should really run -mem2reg (without the optnone though). Also > -instcombine is afterwards often helpful to clean up clang generated > code, or maybe just run it with -O1. > > > I think %8 will contain the address of argv[0], so %7 was storing a > pointer > > to pointer to argv? I'm not sure of that. > > Let's see: argc is %0 and argv == &argv[0] is %1. The latter is stored > in %5, which is loaded as %6. The GEP (%7) is a no-op, thus %6 == %7. > Finally, %8 is the value argv[0] of type char/i8. > > > Considering that I can access the GenericValue set by > > visitGetElementPtrInst. How can I obtain the value of argv[0] at runtime > > using the Interpreter class? > > Sorry can't help with that. I don't know the Interpreter class and I > guess "GenericValue" and "visitGetElementPtrInst" are somehow related to > it. > > > Thanks > > > _______________________________________________ > > LLVM Developers mailing list > > llvm-dev at lists.llvm.org > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > > -- > > Johannes Doerfert > Researcher > > Argonne National Laboratory > Lemont, IL 60439, USA > > jdoerfert at anl.gov >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190127/f84593b3/attachment.html>
I now get your intent but can't really help you. You need to ask interpreter folks. I'd suggest you send another email, state clearly what you want, and put a summary in the subject line. You can also try the IRC, though during the week you might have more luck. ________________________________ From: Alberto Barbaro <barbaro.alberto at gmail.com> Sent: Saturday, January 26, 2019 7:07:26 PM To: Doerfert, Johannes Rudolf Cc: llvm-dev Subject: Re: [llvm-dev] (no subject) Hi, All good points and jokes in your email :) My final goal is the get the value of %8 at runtime. So considering the program is called argv I would like to execute something like ./argv 22 and get the value of argv[0]. Is it possible? So far I have the address where the parameter at position 0 in store but I'd like to read the value and print it. I hope it is clear now Thanks again On Fri, Jan 25, 2019, 06:23 Doerfert, Johannes Rudolf <jdoerfert at anl.gov<mailto:jdoerfert at anl.gov> wrote: On 01/20, Alberto Barbaro via llvm-dev wrote:> Hi all, > I have the following C code: > > #include<stdio.h> > > int main(int argc, char *argv[]) { > > printf("%s\n", argv[0]); > return argc; > } > > that generates the following IR for the main function: > > ; Function Attrs: noinline nounwind optnone uwtable > define i32 @main(i32, i8**) #0 { > %3 = alloca i32, align 4 > %4 = alloca i32, align 4 > %5 = alloca i8**, align 8 > store i32 0, i32* %3, align 4 > store i32 %0, i32* %4, align 4 > store i8** %1, i8*** %5, align 8 > %6 = load i8**, i8*** %5, align 8 > %7 = getelementptr inbounds i8*, i8** %6, i64 0 > %8 = load i8*, i8** %7, align 8 > %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 > x i8]* @.str, i32 0, i32 0), i8* %8) > %10 = load i32, i32* %4, align 4 > ret i32 %10 > }You should really run -mem2reg (without the optnone though). Also -instcombine is afterwards often helpful to clean up clang generated code, or maybe just run it with -O1.> I think %8 will contain the address of argv[0], so %7 was storing a pointer > to pointer to argv? I'm not sure of that.Let's see: argc is %0 and argv == &argv[0] is %1. The latter is stored in %5, which is loaded as %6. The GEP (%7) is a no-op, thus %6 == %7. Finally, %8 is the value argv[0] of type char/i8.> Considering that I can access the GenericValue set by > visitGetElementPtrInst. How can I obtain the value of argv[0] at runtime > using the Interpreter class?Sorry can't help with that. I don't know the Interpreter class and I guess "GenericValue" and "visitGetElementPtrInst" are somehow related to it.> Thanks> _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-- Johannes Doerfert Researcher Argonne National Laboratory Lemont, IL 60439, USA jdoerfert at anl.gov<mailto:jdoerfert at anl.gov> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190127/22cef4aa/attachment.html>
Hi, No problem at all. Yes I think a good subject would help. I didn't know about the IRC channel :) Thanks again, really appreciated On Sun, Jan 27, 2019, 01:25 Doerfert, Johannes Rudolf <jdoerfert at anl.gov wrote:> I now get your intent but can't really help you. You need to ask > interpreter folks. > > > I'd suggest you send another email, state clearly what you want, and put a > summary in the subject line. > > You can also try the IRC, though during the week you might have more luck. > ------------------------------ > *From:* Alberto Barbaro <barbaro.alberto at gmail.com> > *Sent:* Saturday, January 26, 2019 7:07:26 PM > *To:* Doerfert, Johannes Rudolf > *Cc:* llvm-dev > *Subject:* Re: [llvm-dev] (no subject) > > Hi, > All good points and jokes in your email :) > > My final goal is the get the value of %8 at runtime. So considering the > program is called argv I would like to execute something like ./argv 22 and > get the value of argv[0]. Is it possible? So far I have the address where > the parameter at position 0 in store but I'd like to read the value and > print it. > > I hope it is clear now > > Thanks again > > > On Fri, Jan 25, 2019, 06:23 Doerfert, Johannes Rudolf <jdoerfert at anl.gov > wrote: > > On 01/20, Alberto Barbaro via llvm-dev wrote: > > Hi all, > > I have the following C code: > > > > #include<stdio.h> > > > > int main(int argc, char *argv[]) { > > > > printf("%s\n", argv[0]); > > return argc; > > } > > > > that generates the following IR for the main function: > > > > ; Function Attrs: noinline nounwind optnone uwtable > > define i32 @main(i32, i8**) #0 { > > %3 = alloca i32, align 4 > > %4 = alloca i32, align 4 > > %5 = alloca i8**, align 8 > > store i32 0, i32* %3, align 4 > > store i32 %0, i32* %4, align 4 > > store i8** %1, i8*** %5, align 8 > > %6 = load i8**, i8*** %5, align 8 > > %7 = getelementptr inbounds i8*, i8** %6, i64 0 > > %8 = load i8*, i8** %7, align 8 > > %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], > [4 > > x i8]* @.str, i32 0, i32 0), i8* %8) > > %10 = load i32, i32* %4, align 4 > > ret i32 %10 > > } > > You should really run -mem2reg (without the optnone though). Also > -instcombine is afterwards often helpful to clean up clang generated > code, or maybe just run it with -O1. > > > I think %8 will contain the address of argv[0], so %7 was storing a > pointer > > to pointer to argv? I'm not sure of that. > > Let's see: argc is %0 and argv == &argv[0] is %1. The latter is stored > in %5, which is loaded as %6. The GEP (%7) is a no-op, thus %6 == %7. > Finally, %8 is the value argv[0] of type char/i8. > > > Considering that I can access the GenericValue set by > > visitGetElementPtrInst. How can I obtain the value of argv[0] at runtime > > using the Interpreter class? > > Sorry can't help with that. I don't know the Interpreter class and I > guess "GenericValue" and "visitGetElementPtrInst" are somehow related to > it. > > > Thanks > > > _______________________________________________ > > LLVM Developers mailing list > > llvm-dev at lists.llvm.org > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > > -- > > Johannes Doerfert > Researcher > > Argonne National Laboratory > Lemont, IL 60439, USA > > jdoerfert at anl.gov > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190127/952f9e17/attachment.html>