有人能告诉我,这个导致分段错误的LLVM代码有什么问题,以及如何解决它?
%mytype = type {i32 (...)**}
%mytype2 = type {i32, %mytype**}
...
%obj = load %mytype2** %myobj
%get = getelementptr inbounds %mytype2* %obj, i32 0, i32 1
%ml = mul i32 4, 4
%naj = call noalias i8* @_Znaj(i32 %ml)
%cast = bitcast i8* %naj to %mytype**
store %mytype** %cast, %mytype*** %get
%get2 = getelementptr %mytype** %get, i32 0
%ld = load %mytype** %get2发布于 2014-02-01 14:46:48
线
%get2 = getelementptr %mytype** %get, i32 0是非法的,因为%get的类型是%mytype***,而不是%mytype**。而且,由于gep something i32 0总是一个nop,我猜你真的想在这里有别的东西。
通常,我建议在您的IR上使用LLVM验证通行证 (运行opt -verify)来检查它是否合法。您也可以尝试我的用于Eclipse的IR编辑器插件,它也不起作用,但是给您一个很好的GUI反馈:

您应该将代码修改为合法的:
%get2 = load %mytype*** %get
%ld = load %mytype** %get2如果在运行时运行时得到分段错误,则意味着第一次加载或第二次加载访问了未分配的内存。要找到原因,您需要了解如何分配%myobj对象及其字段。
https://stackoverflow.com/questions/21498622
复制相似问题