Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LLVM生成,向LLVMSetValueName C API传递字符串时出现问题_C_Llvm_Llvm Ir_Llvm C++ Api - Fatal编程技术网

LLVM生成,向LLVMSetValueName C API传递字符串时出现问题

LLVM生成,向LLVMSetValueName C API传递字符串时出现问题,c,llvm,llvm-ir,llvm-c++-api,C,Llvm,Llvm Ir,Llvm C++ Api,在使用MinGW成功构建了LLVM之后,我现在尝试使用capi来实现这个程序 作为一个初学者应用程序,为了查看构建是否成功,我已经将这里的llvmpy示例转换为(我认为是)C等价物,但是我没有从print函数获得预期的输出 我的C程序是: #include "llvm-c/Core.h" #include "stdio.h" int main(int argc, char* argv[]) { LLVMInitializeCore(LLVMGetGlobalPassRegistry()

在使用MinGW成功构建了LLVM之后,我现在尝试使用capi来实现这个程序

作为一个初学者应用程序,为了查看构建是否成功,我已经将这里的llvmpy示例转换为(我认为是)C等价物,但是我没有从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”


我只能认为这是某种内存损坏,但我不知道可能的原因。如何更改代码以使其正常工作?

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

请参阅以了解为什么%a显示为“0x1.74bb00p-1012”-也称为十六进制浮点格式。


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

实际上,它应该是
%a
,而不是
a
——同样,它们应该是
%b
%tmp
。所以不管你的问题是什么,它实际上影响了所有的当地人。是的,好的一点没有发现!