2015-06-27 4 views
0

Я пытаюсь напечатать номер, но я получаю сообщение об ошибке сказав моя функция печати неправильно:LLVM IR печать номер

define i32 @main() { 
entry: 
    %d = shl i32 2, 3 
    %call = call i32 (i8*, ...)* @printf(i8* %d) 
    ret i32 1 
} 

declare i32 @printf(i8*, ...) 

А вот ошибка:

Error in compilation: /bin/this.program: llvm.ll:4:44: error: '%d' defined with type 'i8' 
    %call = call i32 (i8*, ...)* @printf(i8* %d) 
            ^

ли есть ли другая функция печати, которая фиксирует это?

ответ

3

LLVM IR не имеет неявных следов (и явные отведения являются отдельными инструкциями). переменная типа %d имеет тип i32, из первой инструкции (странно, что сообщение об ошибке '%d' defined with type 'i8', вероятно, ваш пример не является вашим реальным кодом?).

Что касается printf функция, это точно C printf. И вы должны передать точно такие же аргументы - строку формата (i8*, указывающую на завершение нулевого "%d") и номер.

Для строки, вы должны определить глобальный

@formatString = private constant [2 x i8] c"%d" 

И передать его в качестве первого аргумента printf:

%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8]* @formatString , i32 0, i32 0), i32 %d) 

Полный код:

@formatString = private constant [2 x i8] c"%d" 

define i32 @main() { 
entry: 
    %d = shl i32 2, 3 
    %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8]* @formatString , i32 0, i32 0), i32 %d) 
    ret i32 1 
} 

declare i32 @printf(i8*, ...) 
Смежные вопросы