2014-05-13 82 views
2

使用MinGW成功構建LLVM我現在試圖使用C API來實現該程序。LLVM構建,將字符串傳遞給LLVMSetValueName的問題C API

作爲一個初學者的應用程序,看看構建是否成功我已經將這裏發現的llvmpy例子http://www.llvmpy.org/llvmpy-doc/0.9/doc/firstexample.html轉換成(我認爲是)C等價物,但是我沒有得到我期望從打印函數得到的輸出。

我的C程序是:

#include "llvm-c/Core.h" 
#include "stdio.h" 

int main(int argc, char* argv[]) 
{ 
    LLVMInitializeCore(LLVMGetGlobalPassRegistry()); 

    LLVMModuleRef my_module = LLVMModuleCreateWithName("my_module"); 

    LLVMTypeRef ty_int = LLVMInt32Type(); 

    LLVMTypeRef* ParamTypes = new LLVMTypeRef[2]; 
    ParamTypes[0] = ty_int; 
    ParamTypes[1] = ty_int; 
    LLVMTypeRef ty_func = LLVMFunctionType(ty_int, ParamTypes, 2, false); 
    delete[] ParamTypes; 

    LLVMValueRef f_sum = LLVMAddFunction(my_module, "sum", ty_func); 

    LLVMValueRef* Params = new LLVMValueRef[2]; 
    LLVMGetParams(f_sum, Params); 
    LLVMSetValueName(Params[0], "a"); 
    LLVMSetValueName(Params[1], "b"); 

    LLVMBasicBlockRef bb = LLVMAppendBasicBlock(f_sum, "entry"); 

    LLVMBuilderRef builder = LLVMCreateBuilder(); 
    LLVMPositionBuilderAtEnd(builder, bb); 

    LLVMValueRef tmp = LLVMBuildAdd(builder, Params[0], Params[1], "tmp"); 
    delete[] Params; 
    LLVMBuildRet(builder, tmp); 

    printf(LLVMPrintModuleToString(my_module)); 

    //do shutdown 
    LLVMDisposeBuilder(builder); 
    LLVMDisposeModule(my_module); 
    LLVMShutdown(); 

    return 0; 
} 

我得到的輸出是:

; ModuleID = 'my_module' 

define i32 @sum(i32 0x1.74bb00p-1012, i32 b) { 
entry: 
    tmp = add i32 0x1.95bc40p+876, b 
    ret i32 tmp 
} 

注意0x1.74bb00p-1012和0x1.95bc40p + 876應改爲 「%一個」

我只能認爲這是某種內存腐敗,但我不知道可能的原因。我怎麼能改變代碼,所以這個工作?

+0

實際上它應該讀取'%a',而不是'a' - 同樣這些應該是'%b'和'%tmp'。所以無論你的問題是什麼,它實際上影響到所有當地人。 – Oak

+0

是的好點沒有發現! – ceorron

回答

0

事實證明,這是LLVMPrintModuleToStringNw的一個問題,它使用C printf函數打印到字符串,因此百分比或者被刪除,或者從堆棧中的任何內容中輸出錯誤值。

查看爲什麼%a出現爲「0x1.74bb00p-1012」 - 也就是十六進制浮點格式。 http://www.cplusplus.com/reference/cstdio/printf/

最後,應將LLVMPrintModuleToString替換爲不使用C print系列函數的函數。

相關問題