@donghanyuan0609
2022-10-18T10:57:08.000000Z
字数 1281
阅读 384
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.lllli 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 0call void @putstr(i8* %2)call void @putint(i32 %1)%3 = getelementptr inbounds [2 x i8], [2 x i8]* @_str_2, i32 0, i32 0call void @putstr(i8* %3)ret i32 0}