LLVM无法识别unnamed_addr

时间:2012-02-06 16:09:22

标签: c++ c linux llvm clang

为了测试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的不兼容版本吗?

1 个答案:

答案 0 :(得分:2)

unnamed_addr属性为introduced in LLVM 2.9

你的铿锵声是2.9还是更新,而llc是2.8还是更老?