LLVM & Rubinius (2)
[quote="evanphx"]
Hi godfat,
From the english translation, it looks like you didn't have much luck getting my examples running. I'd love to help, I still have the code I used from the original experiment around somewhere.
Please contact me and we'll try again!
[/quote]
Greetings Evan,
I am very, very surprised that you have left this message for me.
Although I was talking about your examples and LLVM and Rubinius,
most of contents were written in Chinese. I didn't expect there
would be any reader who's first language wasn't Chinese.
So, I am very surprised and glad to see your message.
If you were interested in some content of that blog post,
I could translate some of them to English for you,
if you don't mind my poor, strange English sentence.
*
Let's get back to your examples. At first, I couldn't find a way to
compile the examples. After searching header files and llvm-config,
the examples ran fine. I was glad to reach here.
But I thought it's a bit strange that your "create" function which
creates JIT module, was skipping "function label", lacking a switch
case to find out which function it should call this time.
By talking about "function label", I mean the 0, 1, 2 in our source
program. 0 stands for set, 1 stands for add, and 2 stands for show.
Then I started to add the switch case in your create function,
thinking it should let me rewrite our source program to such as:
int program[] = {
0, 0, 5, // res[0] = 5
2, 0, // puts res[0]
1, 0, 0, 4, // res[0] = res[0] + 4
2, 0, // puts res[0]
1, 1, 0, 7, // res[1] = res[0] + 7
2, 1 // puts res[1]
};
Problems occurred here.
Segmentation fault, or strange result, e.g. -2153546.
blah blah blah... time passed.
I started to think perhaps there would be a bug in your examples.
The body bytecode (or bitcode?) emitted by llvm, i.e.,
define void @body(i32* %ops, i32* %registers) {
entry:
call void @set( i32* %ops, i32* %registers )
%tmp3 = getelementptr i32* %ops, i32 3 ; [#uses=1]
call void @add( i32* %tmp3, i32* %registers )
%tmp31 = getelementptr i32* %ops, i32 4 ; [#uses=1]
call void @show( i32* %tmp31, i32* %registers )
ret void
}
I thought it's very strange that the second getelementptr told
%ops to step 4, just like "ops + 4" in C. Then it passed %tmp31,
i.e. "ops + 4" to show. Shouldn't it be "ops + 3 + 4" ?
Then I took out the line:
GetElementPtrInst* ptr2 = GetElementPtrInst::Create(ops, const_4, "tmp3", bb);
and changed it to:
GetElementPtrInst* ptr2 = GetElementPtrInst::Create(ptr1, const_4, "tmp3", bb);
save, compile, and it runs fine. Of course it's not the exactly
modification I made, because I built a loop and a switch case to
create many CallInst(s). The exactly lines were:
const_n = ConstantInt::get(APInt(32, lexical_cast<std::string>(step), 10));
ptr = GetElementPtrInst::Create(params.back(), const_n, "tmp", bb);
You can find the source code at the bottom of previous post.
[LLVM & Rubinius]
Many thanks for your listening and kindness!
cheers,
Lin Jen-Shin (a.k.a. godfat 真常)
4 retries:
evanphx还有回复你吗?
沒有哩,不知道他心裡是怎麼想 XD
感覺上它只是過來打個招呼吧。
應該吧
Post a Comment
Note: Only a member of this blog may post a comment.