Hi! I'm trying to write LLVM Python Backend (to generate Python code out of LLVM IR) I'm still learning LLVM and for now it is very hard to me to even create simple taksk. I want you to ask 3 questions: ---------------------------------------------------------------------------------- 1) I want to base on some existing code to learn how it was build. I wanted to base on CBackend (which is no longer available from LLVM 3.0 up) and of course it does not compile with LLVM 3.2 - giving a lot of errors: (the code is taken from source of LLVM 3.0 and put into $LLVMSRC/projects/<copy of sample project>/lib/Target/CBackend - I hope this is good method to do it) http://pastebin.com/dkbJWpgP Does anybody have this example working under LLVM3.2? I have found on some old mailing lists that CBackend was never working as it should but it was working for some simple examples - I'm looking for somethingl ike that in LLVM 3.2. If not, what is the best minimal example I can base onto writing my backend? ---------------------------------------------------------------------------------- 2) Maybe this question I will answer myself by analising some examples you'll provide as answer to the first question, but maybe it will worth asking it now. So I want to know when to generate a class in Python. So far I know, that in LLVM there are no classes, only functions, but when using the online LLVM generator I can see, that when generating IR from C++ code, the "class" keyword is stored inside of name (or something like name) of function: #include <stdio.h> #include <stdlib.h> class X{ public: void f(); }; void X::f() { printf("inside f");} int main() { X x; x.f();} translates into: [...] define void @_ZN1X1fEv(%class.X* nocapture %this) nounwind uwtable align 2 { %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i64 0, i64 0)) ret void } [...] How can I access it inside of my function Pass to get know if it was class or not? ---------------------------------------------------------------------------------- 3) Is there any manual that will help me discover all these advanced LLVM features needed to write such backend? I have read LLVM Kaleidoscope tutorials, some LLVM tutorials from IBM and lot of articles, but I still feel that I have not knowledge enough. Thank you :) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121121/9ffa49d8/attachment.html>
On 20 November 2012 18:46, Wojciech Daniło <wojtek.danilo.ml at gmail.com> wrote:> Hi! > I'm trying to write LLVM Python Backend (to generate Python code out of LLVM > IR) > I'm still learning LLVM and for now it is very hard to me to even create > simple taksk. I want you to ask 3 questions: > > ---------------------------------------------------------------------------------- > 1) > I want to base on some existing code to learn how it was build. I wanted to > base on CBackend (which is no longer available from LLVM 3.0 up) and of > course it does not compile with LLVM 3.2 - giving a lot of errors: > (the code is taken from source of LLVM 3.0 and put intoYou might want to look at lib/Target/NVPTX/ for something that uses the common codegen infrastructure.> $LLVMSRC/projects/<copy of sample project>/lib/Target/CBackend - I hope this > is good method to do it) > http://pastebin.com/dkbJWpgP > Does anybody have this example working under LLVM3.2? I have found on some > old mailing lists that CBackend was never working as it should but it was > working for some simple examples - I'm looking for somethingl ike that in > LLVM 3.2. > If not, what is the best minimal example I can base onto writing my backend? > > ---------------------------------------------------------------------------------- > 2) > Maybe this question I will answer myself by analising some examples you'll > provide as answer to the first question, but maybe it will worth asking it > now. > So I want to know when to generate a class in Python. So far I know, that in > LLVM there are no classes, only functions, but when using the online LLVM > generator I can see, that when generating IR from C++ code, the "class" > keyword is stored inside of name (or something like name) of function: > > #include <stdio.h> > #include <stdlib.h> > class X{ > public: > void f(); > }; > void X::f() { printf("inside f");} > int main() { X x; x.f();} > > translates into: > > [...] > > define void @_ZN1X1fEv(%class.X* nocapture %this) nounwind uwtable align 2 { > %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x > i8]* @.str, i64 0, i64 0)) > ret void > } > > [...] > > > How can I access it inside of my function Pass to get know if it was class > or not? > > > > ---------------------------------------------------------------------------------- > > 3) > > Is there any manual that will help me discover all these advanced LLVM > features needed to write such backend? I have read LLVM Kaleidoscope > tutorials, some LLVM tutorials from IBM and lot of articles, but I still > feel that I have not knowledge enough. > > > Thank you :) > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
> ---------------------------------------------------------------------------------- > 2) > Maybe this question I will answer myself by analising some examples you'll > provide as answer to the first question, but maybe it will worth asking it > now. > So I want to know when to generate a class in Python. So far I know, that in > LLVM there are no classes, only functions, but when using the online LLVM > generator I can see, that when generating IR from C++ code, the "class" > keyword is stored inside of name (or something like name) of function: > > #include <stdio.h> > #include <stdlib.h> > class X{ > public: > void f(); > }; > void X::f() { printf("inside f");} > int main() { X x; x.f();} > > translates into: > > [...] > > define void @_ZN1X1fEv(%class.X* nocapture %this) nounwind uwtable align 2 { > %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x > i8]* @.str, i64 0, i64 0)) > ret void > } > > [...] > > > How can I access it inside of my function Pass to get know if it was class > or not?Why do you need to deconstruct C++ classes to generate Python code from LLVM IR? What will you gain from that?> 3) > > Is there any manual that will help me discover all these advanced LLVM > features needed to write such backend? I have read LLVM Kaleidoscope > tutorials, some LLVM tutorials from IBM and lot of articles, but I still > feel that I have not knowledge enough.I hope you ran into http://llvm.org/docs/WritingAnLLVMBackend.html Eli
I will take a look into NVPTX. I don't want to deconstruct C++ classes to generate Python code - I want to generate Python backend :) Its purpose is to be able to generate Python code from LLVM IR code (not C++ code! - C++ code is needed for me only to get a sample IR code). I want to write my custom compiler in the future and I want to be able to output Python code from it (of course not only Python code - I want to be able to output IR or bytecode also), so I though that writing Python Backend (as a function pass) is the best solution. Am I wrong? 2012/11/21 Eli Bendersky <eliben at google.com>> > > ---------------------------------------------------------------------------------- > > 2) > > Maybe this question I will answer myself by analising some examples > you'll > > provide as answer to the first question, but maybe it will worth asking > it > > now. > > So I want to know when to generate a class in Python. So far I know, > that in > > LLVM there are no classes, only functions, but when using the online LLVM > > generator I can see, that when generating IR from C++ code, the "class" > > keyword is stored inside of name (or something like name) of function: > > > > #include <stdio.h> > > #include <stdlib.h> > > class X{ > > public: > > void f(); > > }; > > void X::f() { printf("inside f");} > > int main() { X x; x.f();} > > > > translates into: > > > > [...] > > > > define void @_ZN1X1fEv(%class.X* nocapture %this) nounwind uwtable align > 2 { > > %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x > > i8]* @.str, i64 0, i64 0)) > > ret void > > } > > > > [...] > > > > > > How can I access it inside of my function Pass to get know if it was > class > > or not? > > Why do you need to deconstruct C++ classes to generate Python code > from LLVM IR? What will you gain from that? > > > 3) > > > > Is there any manual that will help me discover all these advanced LLVM > > features needed to write such backend? I have read LLVM Kaleidoscope > > tutorials, some LLVM tutorials from IBM and lot of articles, but I still > > feel that I have not knowledge enough. > > I hope you ran into http://llvm.org/docs/WritingAnLLVMBackend.html > > Eli >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121121/b6b2bda0/attachment.html>