首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么带解释器的LLVMRunFunction对不同的函数返回相同的值?

为什么带解释器的LLVMRunFunction对不同的函数返回相同的值?
EN

Stack Overflow用户
提问于 2019-01-13 06:52:44
回答 1查看 149关注 0票数 1

我使用LLVM构建了两个函数。每个函数返回一个指向全局字符串的不同指针("first“和"second")。然而,当我使用LLVM解释器在LLVMRunFunction中运行每个函数时,它们都返回一个指向字符串"first“的指针。

当我返回整数或函数指针时,问题不会发生。我尝试查看生成的llvm代码,它是正确的,每个函数返回一个不同的指针。

这是一个重现问题的示例(在LLVM 7.0.1上)

代码语言:javascript
运行
复制
#include <llvm-c/Core.h>
#include <llvm-c/ExecutionEngine.h>
#include <stdio.h>

int main() {
    auto module = LLVMModuleCreateWithName("test");
    LLVMExecutionEngineRef interpreter;
    LLVMCreateInterpreterForModule(&interpreter, module, nullptr);
    auto funType = LLVMFunctionType(LLVMPointerType(LLVMInt8Type(), 0), nullptr, 0, 0);
    auto fun = LLVMAddFunction(module, "fun1", funType);
    auto builder = LLVMCreateBuilder();
    auto entry = LLVMAppendBasicBlock(fun, "entry");
    LLVMPositionBuilderAtEnd(builder, entry);
    LLVMBuildRet(builder, LLVMBuildGlobalStringPtr(builder, "first", ""));
    auto generic = LLVMRunFunction(interpreter, fun, 0, nullptr);
    printf("%s\n", (const char*)LLVMGenericValueToPointer(generic));
    fun = LLVMAddFunction(module, "fun2", funType);
    entry = LLVMAppendBasicBlock(fun, "entry");
    LLVMPositionBuilderAtEnd(builder, entry);
    LLVMBuildRet(builder, LLVMBuildGlobalStringPtr(builder, "second", ""));
    generic = LLVMRunFunction(interpreter, fun, 0, nullptr);
    printf("%s\n", (const char*)LLVMGenericValueToPointer(generic));
    return 0;
}

我希望输出结果

代码语言:javascript
运行
复制
first
second

相反,它输出

代码语言:javascript
运行
复制
first
first
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-27 06:21:10

在仔细查看生成的LLVM之后,我注意到使用LLVMBuildGlobalStringPtr构建的全局字符串具有unnamed_addr修饰符。当手动构建全局字符串而不是使用LLVMBuildGlobalStringPtr时,解释器实际上返回正确的字符串指针,并且输出如预期:

代码语言:javascript
运行
复制
auto glbstr = LLVMAddGlobal(mBuilder.module_, llvmType, "glbstr");
LLVMSetInitializer(glbstr, LLVMConstString(toStringz(arg.value), cast(uint) arg.value.length, 0));
auto firstCharPtr = LLVMBuildGEP(builder, glbstr, [LLVMConstInt(LLVMInt8Type(), 0, 0), LLVMConstInt(LLVMInt8Type(), 0, 0)].ptr, 2, "");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54164604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档