Сборка LLVM, проблемы с передачей строки в API C LLVMSetValueName
После успешной сборки LLVM с использованием MinGW я сейчас пытаюсь использовать 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 должны читать "%a"
Я могу только думать, что это какое-то повреждение памяти, но я не знаю вероятной причины. Как я могу изменить код, чтобы это работало?
1 ответ
Как выясняется, это проблема с LLVMPrintModuleToStringNw, он использует функцию C printf для печати в строку и поэтому проценты либо удаляются, либо выбрасывают ложные значения из того, что находится в стеке.
Посмотрите, почему%a вышло в формате "0x1.74bb00p-1012", то есть в шестнадцатеричном формате с плавающей запятой. http://www.cplusplus.com/reference/cstdio/printf/
В конце LLVMPrintModuleToString должен быть заменен функцией, которая не использует семейство функций печати C.