Pře*_*ala 5 c++ compiler-construction llvm
我想问你在LLVM中调用/绑定自己的c++函数的正确方法。
我编写了简单的函数:
void writeSomething() {
std::cout << "Awesome" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在 LLVM 中,我试图注册该函数。我已经创建了它的外部链接。
// Void type
llvm::FunctionType* fccType =
llvm::FunctionType::get(
llvm::Type::getVoidTy(getGlobalContext()), false
);
// External - c++
Function *fcc = (Function*) module->getOrInsertFunction("writeSomething",
fccType
);
// Call
std::vector<Value*> emptyArgs;
CallInst::Create(fcc, makeArrayRef(emptyArgs));
Run Code Online (Sandbox Code Playgroud)
仅调用此函数的 LLVM 输出是(// 注释是我的输入,我如何理解输出)
// External linkage
declare void @writeSomething()
define internal void @main() {
entry:
// Call my function
call void @writeSomething()
ret void
}
Run Code Online (Sandbox Code Playgroud)
程序以消息结束:LLVM 错误:程序使用了无法解析的外部函数“writeSomething”!
由于C++ name mangling,该函数的名称实际上类似于_Z14writeSomethingv- C++ 通过在函数名称中编码类型信息来支持重载。
您可以通过将函数声明为 来禁用它extern "C" void writeSomething() { ... },或者找出在编译器的名称重整方案下应该调用什么并使用它。