LLVM IR,简单的程序给出segfault
LLVM IR, simple program gives segfault
我在运行时生成了以下llvm ir,我希望立即执行函数
;other declarations/functions
define %gen__struct__81ty_struct.catch_val @gen__fun__115(void**) {
entry:
%1 = getelementptr void*, void** %0, i32 0
%2 = load void*, void** %1, align 8
%3 = bitcast void* %2 to i64*
store i64 1, i64* %3, align 8
%4 = load i64, i64* %3, align 8
%5 = getelementptr void*, void** %0, i32 1
%6 = load void*, void** %5, align 8
%7 = bitcast void* %6 to i64*
store i64 1, i64* %7, align 8
%8 = load i64, i64* %7, align 8
%9 = getelementptr void*, void** %0, i32 2
%10 = load void*, void** %9, align 8
%11 = bitcast void* %10 to i64*
store i64 1, i64* %11, align 8
ret %gen__struct__81ty_struct.catch_val zeroinitializer
}
然后,我使用万花筒jit和下面的C++代码编译并执行上面的函数,但我一直得到segfault。
Function* out = 0;
//code that generates the function ...
runFunc fptr = 0;
jit->addModule(std::move(gblDevice->lmod));
fptr = (runFunc)jit->getPointerToFunction(out);
vector<void*> params;
uint64_t a = 0;
uint64_t b = 0;
uint64_t c = 0;
params.push_back(&a);
params.push_back(&b);
params.push_back(&c);
catch_val_pt cval = fptr(¶ms[0]);
我已经试了几个小时来找出上面的代码有什么问题,但似乎一切都解决了。
getPointerToFunction函数为.
class OrcJIT {
// ...
JITSymbol findSymbol(const std::string Name) {
std::string MangledName;
raw_string_ostream MangledNameStream(MangledName);
Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
return CODLayer.findSymbol(MangledNameStream.str(), true);
}
inline void* getPointerToFunction(Function* F) {
return (void*)findSymbol(F->getName().data()).getAddress();
}
//...
}
最终的答案非常简单。
llvm返回值和gcc返回值的方式之间必须存在二进制不兼容。简短的回答是gen__struct__81ty_struct.catch_val
返回值导致segfault。
简单地说,在生成的函数中,您需要通过传递给生成函数的指针将其复制到结构中。除了最简单的情况(也称为int)外,您不能依赖生成的函数的返回值进行匹配。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- 简单链接列表程序中的Destructor segfault
- LLVM IR,简单的程序给出segfault
- 当一个对象试图访问它的某个属性时,程序是否可能发送Segfault
- 每次运行此程序时,我都会不断获得Segfault,但我不明白为什么
- 是否可以在异常(SEGFAULT)错误后自动重新启动程序
- 在数据流处理程序中获取segfault
- 安卓系统:使用静态libgnustl的本机C++程序的SEGFAULT
- 与文件i/o相关的c++程序末尾的Segfault
- 将字符串变量传递给boost::ASIO读取器/处理程序会导致segfault
- 应用程序退出时出现SegFault
- Itk:ImageRegionIterator GetIndex()调用使程序成为segfault