为了测试LLVM的功能,我编写了以下简单程序。
#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的不兼容版本吗?