gpt4 book ai didi

c - LLVM 构建,将字符串传递给 LLVMSetValueName C API 时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:05 25 4
gpt4 key购买 nike

在使用 MinGW 成功构建 LLVM 之后,我现在尝试使用 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”

我只能认为这是某种内存损坏,但我不知道可能的原因。我怎样才能更改代码以使其有效?

最佳答案

事实证明,这是 LLVMPrintModuleToStringNw 的问题,它使用 C printf 函数打印到字符串,因此百分比要么被删除,要么从堆栈中的任何内容中喷出错误值。

了解为什么 %a 以“0x1.74bb00p-1012”的形式出现——也就是十六进制浮点格式。 http://www.cplusplus.com/reference/cstdio/printf/

最后,LLVMPrintModuleToString 应该替换为不使用 C 打印函数系列的函数。

关于c - LLVM 构建,将字符串传递给 LLVMSetValueName C API 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23637570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com