在框架中执行时,您是如何设法通过expected top-level entity
错误的?lli
llvm
2 回答
此错误通常意味着您复制粘贴了一些不属于顶级实体的 IR 代码的一部分。换句话说,它不是函数,不是类型,不是全局变量等。同样的错误在 C 中也可能发生,只是为了比较:
x = 8;
不是 C 文件的有效内容,因为赋值语句不是有效的顶级实体。为了使它有效,你把它放在一个函数中:
void foo() {
x = 8; /* assuming x is global and visible here */
}
LLVM IR 中也会发生同样的错误。
我的问题: .ll 文件格式是“UTF-8 with BOM”而不是“UTF-8 without BOM”。
修复:使用notepad++,在编码菜单中,选择“UTF-8 without BOM”,然后保存。
快速设置:(适用于 windows 上的 llvm 3.4.0 .ll 文件)
来自https://notepad-plus-plus.org/的高级文本编辑器
来自https://github.com/CRogers/LLVM-Windows-Binaries的 llvm 二进制文件
hello.ll 为“UTF-8 without BOM”(此代码采用 llvm 3.4.0 格式):
@msg = internal constant [13 x i8] c"Hello World!\00"
declare i32 @puts(i8*)
define i32 @main() {
call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @msg, i32 0, i32 0))
ret i32 0
}
在命令提示符下:
lli hello.ll
快速设置:(适用于 windows 上的 llvm 3.8.0 .ll 文件)
来自https://notepad-plus-plus.org/的高级文本编辑器
clang 二进制文件来自: http: //llvm.org/releases/download.html#3.8.0
hello.ll 为“UTF-8 without BOM”(此代码采用 llvm 3.8.0 格式):
@msg = internal constant [13 x i8] c"Hello World!\00"
declare i32 @puts(i8*)
define i32 @main() {
call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @msg, i32 0, i32 0))
ret i32 0
}
在命令提示符下:
clang hello.ll -o hello.exe
hello.exe
关于 char16_t、u16String 等的错误意味着 clang 需要:-fms-compatibility-version=19