Чтобы проверить функциональность 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?