Python Backend

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:

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

You might want to look at lib/Target/NVPTX/ for something that uses
the common codegen infrastructure.

----------------------------------------------------------------------------------
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 :slight_smile:
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@google.com>

And of course I will tak a look into http://llvm.org/docs/WritingAnLLVMBackend.html - I have somehow overlooked that document.

2012/11/21 Wojciech Daniło <wojtek.danilo.ml@gmail.com>

What I was trying to say is that I don't see why you need Python
classes in the generated code. LLVM IR is much lower than the concept
of classes, so if you want to translate it to some executable form
(such as Python) you don't need classes there. Functions to represent
IR functions should be enough.

Eli

You are of course right. I wanted to output “good looking” Python code though.
(if its possible)

I see that NVPTX backend is really big project. Is there any hello world “common codegen infrastructure”?

2012/11/21 Eli Bendersky <eliben@google.com>

Good looking Python code means no classes when you don't need classes,
but this is getting off-topic. Putting that aside for a moment, I'm
not sure why you would want to generate Python source from LLVM IR at
all. But if you want to go that way, looking at the defunct C backend
will be useful even as a code reference (I mean, if you can't get it
to actually work with trunk LLVM).

Eli

Maybe you’re right with the Python code generation without classes.
I need this because I want to write compiler with multi output language support (LLVM has got the javascript backend, so why not Python one?)
It seems that http://llvm.org/docs/WritingAnLLVMBackend.html is strongly focused on hardware backend writing (registers, target machine architecture, assembly instructions etc) - so it will be not suitable for writing Python backend.
I know that this code could be usefull as code reference, but I stuck on the beginning, so I would love to have a really “minimal working version of it” to mess with it :slight_smile:

2012/11/21 Eli Bendersky <eliben@google.com>