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.9。所以我懷疑我的公司是2.8。順便說一下,除了unnamed_addr之外,LLVM 2.9中還有其他的東西嗎? – MetallicPriest 2012-02-06 17:33:31
@MetallicPriest:每個LLVM版本都附帶發行說明。我在答案中鏈接了2.9版的發行註記。以下是所有版本的列表,其中包含有關其下載,文檔和發行說明的鏈接:http://llvm.org/releases/ – 2012-02-06 17:36:48
謝謝Eli。您是否知道爲clang生成舊版LLVM的IR,所以通過標記,我可以指示clang 2.9生成LLVM 2.8 IR代碼。 – MetallicPriest 2012-02-06 17:47:35