使用 clang 生成 LLVM IR
Generating LLVM IR using clang
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
我只是写了一个简单的hello.c
。
当我输入时
$ clang -O3 -emit-llvm hello.c -c -o hello.bc
和 $ lli hello.bc
在终端中它运行良好。
但是,当我输入时
$ clang -O3 -emit-llvm hello.c -S -o hello.ll
和 lli hello.ll
.
出现错误,显示在第 21 行发现错误:
!0 = metadata !{metadata !"Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)"}
在我删除那 2 个 metadata
后,它就可以工作了。为什么?
这是 clang 还是 LLVM 的问题?
关于我的 LLVM 版本的信息:
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
//我上面使用的所有命令都来自http://llvm.org/docs/CommandGuide/index.html
这似乎是 Apple lli 版本中的错误。我无法使用直接从 svn(3.5 版)编译的 clang/lli 版本重现此行为。
发射的红外线是:
; ModuleID = 'hello.cpp'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@.str = private unnamed_addr constant [13 x i8] c"hello world[=10=]A[=10=]", align 1
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
%1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i64 0, i64 0))
ret i32 0
}
; Function Attrs: nounwind
declare i32 @printf(i8* nocapture readonly, ...) #1
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"clang version 3.5.0 "}
和 lli hello.ll
打印 hello world
。如果我将 metadata
字符串替换为您发布的字符串,它还会打印 hello world
。
您可能应该为 Apple lli
.
提交错误报告
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
我只是写了一个简单的hello.c
。
当我输入时
$ clang -O3 -emit-llvm hello.c -c -o hello.bc
和 $ lli hello.bc
在终端中它运行良好。
但是,当我输入时
$ clang -O3 -emit-llvm hello.c -S -o hello.ll
和 lli hello.ll
.
出现错误,显示在第 21 行发现错误:
!0 = metadata !{metadata !"Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)"}
在我删除那 2 个 metadata
后,它就可以工作了。为什么?
这是 clang 还是 LLVM 的问题?
关于我的 LLVM 版本的信息:
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
//我上面使用的所有命令都来自http://llvm.org/docs/CommandGuide/index.html
这似乎是 Apple lli 版本中的错误。我无法使用直接从 svn(3.5 版)编译的 clang/lli 版本重现此行为。
发射的红外线是:
; ModuleID = 'hello.cpp'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@.str = private unnamed_addr constant [13 x i8] c"hello world[=10=]A[=10=]", align 1
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
%1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i64 0, i64 0))
ret i32 0
}
; Function Attrs: nounwind
declare i32 @printf(i8* nocapture readonly, ...) #1
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"clang version 3.5.0 "}
和 lli hello.ll
打印 hello world
。如果我将 metadata
字符串替换为您发布的字符串,它还会打印 hello world
。
您可能应该为 Apple lli
.