gpt4 book ai didi

llvm - 函数指针作为要调用的参数

转载 作者:行者123 更新时间:2023-12-04 23:37:04 29 4
gpt4 key购买 nike

我正在尝试创建对函数 foo 的调用,该函数接收函数指针(带有签名 void bar(void))作为参数。来自 This发布我得到了完成这个的基本想法。首先我注册了 Foo 函数。 Bar 实际上是一个由 LLVM 编译的函数,因此不需要注册。

FunctionType* BarType =  FunctionType::get(Type::getVoidTy(getGlobalContext()), false);

Type* FooType[1];
FooType[0] = static_cast<Type*>(BarType)->getPointerTo();
ArrayRef<Type*> FooTypeARef(FooType, 1);

FunctionType* signature = FunctionType::get(Type::getInt32Ty(getGlobalContext()), FooTypeARef, false);
Function* func = Function::Create(signature, Function::ExternalLinkage, "Foo", TheModule);
LLVM_ExecutionEngine()->addGlobalMapping(func, const_cast<void*>(&Foo));

这是插入实际调用的方式(案例 I)

std::vector<Value*> ArgsV_Foo;
Function *FooFun= LLVM_Module()->getFunction("Foo");
Function* BarFun = LLVM_Module()->getFunction("Bar");

ArgsV_Foo.push_back( BarFun );

LLVM_Builder()->CreateCall(FooFun, ArgsV, "calltmp")

但是,这会在 CreateCall 内部中止,原因是“调用带有错误签名的函数”。我不确定 ArgsV_Foo.push_back( BarFun ) 行是否正确。

另一种对我来说似乎可行的方法是使用 ExecutionEngine 获取指向 Bar 的指针,但我不明白如何将生成的函数指针转换为 llvm::Value* (< strong>案例二)

std::vector<Value*> ArgsV_Foo;
Function *FooFun= LLVM_Module()->getFunction("Foo");
Function* BarFun = LLVM_Module()->getFunction("Bar");

void* BarFunPtr = LLVM_ExecutionEngine()->getPointerToFunction(BarFun);
Value* val = ??
ArgsV_FEFork.push_back(val);

LLVM_Builder()->CreateCall(FooFun, ArgsV, "calltmp")

也许有人知道如何完成第二种情况或确认第一种情况中的分配是正确的(问题出在其他地方)。

最佳答案

关于第一种情况:

我不太确定那里发生了什么。例如,为什么要向上转换 BarType?在任何情况下,检查它的简单方法是对所有涉及的类型调用 ->dump() 并亲自检查有什么区别。

此外,避免在 LLVM 对象上使用 static_cast - there are more canonical ways to cast .

解决第二种情况:

  1. 将函数指针 (BarFunPtr) 转换为整数。
  2. Create a constant integer in LLVM使用(1)的结果作为值。请记住 - 就该代码而言,您在 JITted 代码之外计算的任何内容都是常量。
  3. 通过 inttoptr 将 (2) 中的常量整数转换为指针。指针的类型应该是与 bar 的类型匹配的函数指针。
  4. 将(3)的结果作为调用目标。

关于ArrayRef

最后,仅供引用,有更简单的方法来创建 ArrayRef 实例……您可能特别感兴趣 its implicit single-element constructor :-)

关于llvm - 函数指针作为要调用的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24429378/

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