@donghanyuan0609
2022-10-18T18:57:08.000000Z
字数 1281
阅读 183
LLVM 提交说明:
评测机提供了以下函数用于 IO,请在输出的 LLVM IR 头部显式声明这些函数(没有实际使用的函数可以不声明):
declare i32 @getint() ; 读取一个整数
declare void @putint(i32) ; 输出一个整数
declare void @putch(i32) ; 输出一个字符
declare void @putstr(i8*) ; 输出字符串
测试时,首先用 C 语言实现上述四个函数,然后用以下命令编译为 LLVM 链接库(假设 C 语言实现文件为 lib.c
)
clang -emit-llvm -S -o lib.ll lib.c
将输出的 llvm_ir.txt
与上一步编译好的链接库 lib.ll
放置于同一目录下,用以下命令链接并解释执行 IR :
llvm-link -S -o run.ll llvm_ir.txt lib.ll
lli run.ll
样例输入 testfile.txt
int main() {
int res;
res = getint();
printf("res = %d\n", res);
return 0;
}
样例输出1 llvm_ir.txt
(采用单个字符方式输出)
declare i32 @getint()
declare void @putint(i32)
declare void @putch(i32)
define i32 @main() {
%1 = call i32 @getint()
call void @putch(i32 114) ; 'r'
call void @putch(i32 101) ; 'e'
call void @putch(i32 115) ; 's'
call void @putch(i32 32) ; ' '
call void @putch(i32 61) ; '='
call void @putch(i32 32) ; ' '
call void @putint(i32 %1)
call void @putch(i32 10) ; '\n'
ret i32 0
}
样例输出2 llvm_ir.txt
(采用字符串方式输出)
declare i32 @getint()
declare void @putint(i32)
declare void @putstr(i8*)
@_str_1 = constant [7 x i8] c"res = \00"
@_str_2 = constant [2 x i8] c"\0a\00"
define i32 @main() {
%1 = call i32 @getint()
%2 = getelementptr inbounds [7 x i8], [7 x i8]* @_str_1, i32 0, i32 0
call void @putstr(i8* %2)
call void @putint(i32 %1)
%3 = getelementptr inbounds [2 x i8], [2 x i8]* @_str_2, i32 0, i32 0
call void @putstr(i8* %3)
ret i32 0
}