2014-07-01 6 views
4

J'ai un code c qui calcule la factorielle d'un int "factorial.c". Je le compile à llvm code lisible "factorial.ll" et je modifie dans le code llvm compilé. L'objectif est d'exécuter le code llvm modifié et de voir sa sortie, Comment puis-je faire cela?Comment exécuter le code llvm

Répondre

3

Cela dépendra de la façon dont votre émis LLVM est assemblé et quelles bibliothèques il lie contre, mais par exemple l'exécution de la factorial.ll suivante avec la commande shell lli

$ lli factorial.ll 
Factorial of 10 = 3628800 

exécutera la fonction main avec le JIT et l'utilisation la norme printf pour afficher le résultat sur stdout.

@.str = private unnamed_addr constant [22 x i8] c"Factorial of %d = %d\0A\00", align 1 
declare i32 @printf(i8*, ...) 

define i32 @factorial(i32 %n) nounwind uwtable { 
entry: 
    %n.addr = alloca i32, align 4 
    store i32 %n, i32* %n.addr, align 4 
    %0 = load i32* %n.addr, align 4 
    %cmp = icmp sle i32 %0, 1 
    br i1 %cmp, label %cond.true, label %cond.false 

cond.true:          ; preds = %entry 
    br label %cond.end 

cond.false:          ; preds = %entry 
    %1 = load i32* %n.addr, align 4 
    %2 = load i32* %n.addr, align 4 
    %sub = sub nsw i32 %2, 1 
    %call = call i32 @factorial(i32 %sub) 
    %mul = mul nsw i32 %1, %call 
    br label %cond.end 

cond.end:           ; preds = %cond.false, %cond.true 
    %cond = phi i32 [ 1, %cond.true ], [ %mul, %cond.false ] 
    ret i32 %cond 
} 

define i32 @main(i32 %argc, i8** %argv) nounwind uwtable { 
entry: 
    %retval = alloca i32, align 4 
    %argc.addr = alloca i32, align 4 
    %argv.addr = alloca i8**, align 8 
    store i32 0, i32* %retval 
    store i32 %argc, i32* %argc.addr, align 4 
    store i8** %argv, i8*** %argv.addr, align 8 
    %call = call i32 @factorial(i32 10) 
    %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([22 x i8]* @.str, i32 0, i32 0), i32 10, i32 %call) 
    ret i32 0 
} 
+0

Nice, c'est ce que je cherche :) merci – user3794683