2015-06-27 165 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*, ...)