Hi all,
I’m a llvm beginner and using it to run my own toy-c-compiler. And I use my compiler to C-like code into following llvm IR:
C-like code:
extern void printi(int n);
int F(int n){
if(n <= 1){
return 1;
}
else{
return n * F(n-1);
}
return 0;
}
int main(){
int a = 3;
int b = F(a);
return 0;
}
llvm IR:
declare i32 @printf(ptr, ...)
declare i32 @scanf(ptr, ...)
declare void @printi(i32)
define i32 @F(i32 %n) {
entry:
%n1 = alloca i32, align 4, addrspace(4)
store i32 %n, ptr addrspace(4) %n1, align 4
%n2 = load i32, ptr addrspace(4) %n1, align 4
%letmp = icmp sle i32 %n2, 1
br i1 %letmp, label %then, label %else
then: ; preds = %entry
ret i32 1
br label %ifcont
else: ; preds = %entry
%n3 = load i32, ptr addrspace(4) %n1, align 4
%n4 = load i32, ptr addrspace(4) %n1, align 4
%subtmp = sub i32 %n4, 1
%calltmp = call i32 @F(i32 %subtmp)
%multmp = mul i32 %n3, %calltmp
ret i32 %multmp
br label %ifcont
ifcont: ; preds = %else, %then
ret i32 0
}
define i32 @main() {
entry:
%a = alloca i32, align 4, addrspace(4)
store i32 3, ptr addrspace(4) %a, align 4
%b = alloca i32, align 4, addrspace(4)
%a1 = load i32, ptr addrspace(4) %a, align 4
%calltmp = call i32 @F(i32 %a1)
store i32 %calltmp, ptr addrspace(4) %b, align 4
ret i32 0
}
But it cannot run and error with segmentation fault when I use My engine trying to run it:
llvm::ExecutionEngine* EE = llvm::EngineBuilder(std::unique_ptr<llvm::Module>(_module)).create();
EE->finalizeObject();
std::vector<llvm::GenericValue> noargs;
llvm::GenericValue v = EE->runFunction(_module->getFunction("main"), noargs);
I don’t know where the problem is and I want to find a solution to debug my function. Thank you in advance!