LLVMがunnamed_addrを認識しない

LLVMの機能をテストするために、私は次の簡単なプログラムを書いた。

#include 

int main()
{
    printf( "Hello World!\n" );

    return 0;
}

そして、 clang -S -emit-llvm main.c -o main.ll とタイプして、LLVM IRにコンパイルします。 main.llに生成されたコードは以下の通りです。

; 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*, ...)

Then when I tried to compile the IR code (in main.ll) to native executable binary, by typing llc main.ll -o main.s && gcc main.s -o main, I got the following error.

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の互換性のないバージョンを使用しているのでしょうか?

0

1 答え

unnamed_addr 属性は、 LLVM 2.9で導入されました

llc が2.8歳以上で、あなたの仲間が2.9以降であることがありますか?

2
追加された
はい、私はそれが問題だと思います。私のclangは確かに2.9です。だから私のLCは2.8だと思う。ちなみに、unnamed_addrのほかに、LLVM 2.9で導入されたことはありますか?
追加された 著者 MetallicPriest,
エリに感謝します。とにかく、clangが古いバージョンのLLVMのIRを生成するように知っていますか?フラグを使って、LLVM 2.8 IRコードを生成するようclang 2.9に指示することができます。
追加された 著者 MetallicPriest,
はい、私は今llvm-2.9をインストールしました。完璧に動作している:)!
追加された 著者 MetallicPriest,
@MetallicPriest:各LLVMリリースにはリリースノートが付属しています。私は答えの2.9リリースノートにリンクしました。以下は、ダウンロード、ドキュメント、リリースノートのリンクを含むすべてのリリースのリストです: llvm.org/releases
追加された 著者 Eli Bendersky,
@ MetallicPriest:私は気にしません。最新の&最大のLLVM&Clangをダウンロードしてビルドし、ローカルにインストールしてください(ルートにアクセスできない場合)。あなたのマシンが古すぎない場合は15-20分かかります
追加された 著者 Eli Bendersky,
@MetallicPriest:それは聞いて良いです。一般的な助言として、LLVMとClangはリンクされているので(LLVMのいくつかの部分ではClangリンク)、常に一緒にインストールすることをお勧めします
追加された 著者 Eli Bendersky,