2014-05-13 5 views
2

MinGW를 사용하여 LLVM을 성공적으로 작성했습니다. 이제 C API를 사용하여 프로그램을 구현하려고합니다.LLVM 빌드, LLVMSetValueName 문자열을 전달하는 문제 C API

빌드가 성공했는지 확인하는 데 필요한 초보자 용 응용 프로그램으로 여기에서 찾은 llvmpy 예제를 http://www.llvmpy.org/llvmpy-doc/0.9/doc/firstexample.html (내가 생각하는 것)으로 변환했습니다. 그러나 print 함수에서 기대하는 출력을 얻지 못했습니다. .

내 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"- 16 진수 부동 소수점 형식으로 나타나는 이유를 확인하십시오. http://www.cplusplus.com/reference/cstdio/printf/

결국 LLVMPrintModuleToString은 C 인쇄 기능 군을 사용하지 않는 함수로 대체되어야합니다.