关于在LLVM汇编代码中获取用户输入的快速问题。它会出现在主要功能的论点中吗?目前我的主要功能如下:
define i32 @main() nounwind {
factorial.exit:
%0 = tail call i32 @factorial(i32 3) nounwind ; <i32> [#uses=1]
%1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %0) nounwind ; <i32> [#uses0]
ret i32 0
}
它计算目前3的阶乘,或者我在3点的数字。我正在从终端执行此操作,但我最终会创建一个makefile来执行它。如何让它从终端获取用户输入,我想我会在执行它之后执行类似“lli factorial.bc 5”的操作,在我将其编译为字节码之后,它会给我5的阶乘。 / p>
感谢您的帮助!
答案 0 :(得分:0)
在llvm.org/demo上编译代码会产生以下结果:
define i32 @main(i32 %argc, i8** nocapture %argv) nounwind uwtable {
%1 = getelementptr inbounds i8** %argv, i64 1
%2 = load i8** %1, align 8, !tbaa !0
%3 = tail call i64 @strtol(i8* nocapture %2, i8** null, i32 10) nounwind
%4 = trunc i64 %3 to i32
%5 = icmp eq i32 %4, 0
br i1 %5, label %factorial.exit, label %tailrecurse.i
tailrecurse.i: ; preds = %tailrecurse.i, %0
%X.tr2.i = phi i32 [ %6, %tailrecurse.i ], [ %4, %0 ]
%accumulator.tr1.i = phi i32 [ %7, %tailrecurse.i ], [ 1, %0 ]
%6 = add nsw i32 %X.tr2.i, -1
%7 = mul nsw i32 %accumulator.tr1.i, %X.tr2.i
%8 = icmp eq i32 %6, 0
br i1 %8, label %factorial.exit, label %tailrecurse.i
factorial.exit: ; preds = %tailrecurse.i, %0
%accumulator.tr.lcssa.i = phi i32 [ 1, %0 ], [ %7, %tailrecurse.i ]
%9 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32 %accumulator.tr.lcssa.i) nounwind
ret i32 0
}
尤其应该查看%1
(即argv+1
)和%2
(即*(argv+1)
):当您调用lli factorial.bc 5
时,{{1}将包含指向字符串 %2
的指针。
答案 1 :(得分:0)
所以我能够使用“cin”语句而不是在main方法中获取参数。我用C编写它并使用LLVM网站生成程序集。