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 읽어야 "%를에"
나는 그저 그런 종류의 메모리 손상이라고 생각할 수 있지만 그럴만한 이유는 모른다. 어떻게 작동합니까?
사실 그것은 'a'가 아니라'% a'를 읽어야하며 마찬가지로'% b'와'% tmp'이어야합니다. 그래서 당신의 문제가 무엇이든 그것은 실제로 모든 지역 주민에게 영향을줍니다. – Oak
그래, 좋은 점은 그 점을 발견하지 못했다! – ceorron