expected top-level entity
フレームワークで実行lli
しているときに、どのようにしてエラーをパススルーできましたllvm
か?
2 に答える
このエラーは通常、トップレベルのエンティティとしてカウントされない一部のIRコードの一部をコピーして貼り付けたことを意味します。つまり、関数でも、型でも、グローバル変数でもありません。比較のために、Cでも同じエラーが発生する可能性があります。
x = 8;
割り当てステートメントは有効な最上位エンティティではないため、Cファイルの有効なコンテンツではありません。それを有効にするには、関数に入れます。
void foo() {
x = 8; /* assuming x is global and visible here */
}
同じエラーがLLVMIRでも発生します。
私の問題:.llファイル形式は「BOMなしのUTF-8」ではなく「BOM付きのUTF-8」でした。
修正: notepad ++の場合、エンコードメニューで[BOMなしのUTF-8]を選択し、保存します。
クイックセットアップ: (Windows上のllvm3.4.0.llファイルの場合)
https://notepad-plus-plus.org/の高度なテキストエディタ
https://github.com/CRogers/LLVM-Windows-Binariesのllvmバイナリ
hello.ll as "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上のllvm3.8.0.llファイルの場合)
https://notepad-plus-plus.org/の高度なテキストエディタ
clangバイナリ: http: //llvm.org/releases/download.html#3.8.0
hello.ll as "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