c++
  • c
  • linux
  • llvm
  • clang
  • 2012-02-06 70 views 0 likes 
    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中生成的代碼如下。

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

    然後,當我試圖編譯的IR代碼(main.ll)到本機的可執行二進制文件,通過鍵入llc main.ll -o main.s && gcc main.s -o main,我得到了下面的錯誤。

    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

    難道你的叮噹是從2.9或更新,而你的llc是從2.8或更高?

    +0

    是的我認爲這是問題所在。我的叮噹聲肯定是2.9。所以我懷疑我的公司是2.8。順便說一下,除了unnamed_addr之外,LLVM 2.9中還有其他的東西嗎? – MetallicPriest 2012-02-06 17:33:31

    +2

    @MetallicPriest:每個LLVM版本都附帶發行說明。我在答案中鏈接了2.9版的發行註記。以下是所有版本的列表,其中包含有關其下載,文檔和發行說明的鏈接:http://llvm.org/releases/ – 2012-02-06 17:36:48

    +0

    謝謝Eli。您是否知道爲clang生成舊版LLVM的IR,所以通過標記,我可以指示clang 2.9生成LLVM 2.8 IR代碼。 – MetallicPriest 2012-02-06 17:47:35

    相關問題