LLVM не распознает unnamed_addr - PullRequest
1 голос
/ 06 февраля 2012

Чтобы проверить функциональность LLVM, я написал следующую простую программу:

#include <stdio.h>

int main()
{
    printf( "Hello World!\n" );

    return 0;
}

И затем скомпилировал ее в LLVM IR, набрав clang -S -emit-llvm main.c -o main.ll.Сгенерированный код в 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"

Однако, если я удаляю unnamed_addr из main.ll, он компилируется.Поэтому мой вопрос в том, что не так с unnamed_addr.Почему это не компилируется с этим?Возможно, это потому, что я использую несовместимые версии clang и llvm?

1 Ответ

2 голосов
/ 06 февраля 2012

Атрибут unnamed_addr был введен в LLVM 2.9 .

Может быть, ваш кланг от 2.9 или новее, а ваш llc от 2.8 или старше?

...