0
LLVMの機能をテストするために、以下の簡単なプログラムを書きました。LLVMがunnamed_addrを認識しない
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
そして、clang -S -emit-llvm main.c -o main.ll
と入力してLLVM IRにコンパイルします。 main.llに生成されたコードは以下の通りです。私はllc main.ll -o main.s && gcc main.s -o main
を入力して、ネイティブ実行可能バイナリに(main.llにおける)IRコードをコンパイルしようとしたとき
; ModuleID = 'main.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-pc-linux-gnu"
@.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00"
define i32 @main() nounwind {
%1 = alloca i32, align 4
store i32 0, i32* %1
%2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0))
ret i32 0
}
declare i32 @printf(i8*, ...)
そして、私は、次のエラーが発生しました。
llc: main.ll:5:17: error: expected 'global' or 'constant'
@.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00"
ただし、main.llからunnamed_addr
を削除すると、コンパイルされます。だから私の質問unnamed_addr
と間違っているです。なぜそれでコンパイルされていないのですか?私はclangとllvmの互換性のないバージョンを使用しているのでしょうか?
はい私はそれが問題だと思います。私のclangは確かに2.9です。だから私のLCは2.8だと思う。ところで、unnamed_addr以外にLLVM 2.9で導入されたことはありますか? – MetallicPriest
@ MetallicPriest:各LLVMリリースにはリリースノートが付属しています。私は答えの2.9リリースノートにリンクしました。以下は、ダウンロード、ドキュメント、リリースノートのリンクを含むすべてのリリースの一覧です。http://llvm.org/releases/ –
ありがとうございます。とにかく、clangがLLVMの古いバージョンのIRを生成するように知っていますか?フラグを使って、LLVM 2.8 IRコードを生成するようclang 2.9に指示することができます。 – MetallicPriest