【问题标题】:How to execute llvm code如何执行llvm代码
【发布时间】:2014-07-01 16:55:20
【问题描述】:

我有一个计算 int "factorial.c" 的阶乘的 c 代码。我将它编译为 llvm 可读代码“factorial.ll”,并在编译后的 llvm 代码中进行修改。 目标是执行修改后的 llvm 代码并查看其输出,我该怎么做?

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    这将取决于您输出的 LLVM 的组装方式以及它链接的库,但例如使用 shell 命令 lli 执行以下 factorial.ll

    $ lli factorial.ll
    Factorial of 10 = 3628800
    

    将使用 JIT 执行 main 函数,并使用标准 printf 将结果输出到标准输出。

    @.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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多