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

答えて

2

unnamed_addrの属性はintroduced in LLVM 2.9でした。

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

+0

はい私はそれが問題だと思います。私のclangは確かに2.9です。だから私のLCは2.8だと思う。ところで、unnamed_addr以外にLLVM 2.9で導入されたことはありますか? – MetallicPriest

+2

@ MetallicPriest:各LLVMリリースにはリリースノートが付属しています。私は答えの2.9リリースノートにリンクしました。以下は、ダウンロード、ドキュメント、リリースノートのリンクを含むすべてのリリースの一覧です。http://llvm.org/releases/ –

+0

ありがとうございます。とにかく、clangがLLVMの古いバージョンのIRを生成するように知っていますか?フラグを使って、LLVM 2.8 IRコードを生成するようclang 2.9に指示することができます。 – MetallicPriest

関連する問題