任何人都可以告诉我这个LLVM-IR代码导致分段错误以及如何解决它的问题是什么?
%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
答案 0 :(得分:2)
该行
%get2 = getelementptr %mytype** %get, i32 0
是非法的,因为%get
的类型是%mytype***
,而不是%mytype**
。此外,由于gep something i32 0
总是一个小鸟,我猜你还是想要别的东西。
一般情况下,我建议您在IR上使用LLVM's verify pass(运行opt -verify
)来检查它是否合法。您也可以尝试我的IR editor plugin for Eclipse,它不能正常工作,但会给您一个很好的GUI反馈:
您应该将代码修改为合法代码:
%get2 = load %mytype*** %get
%ld = load %mytype** %get2
如果在运行这些行时在运行时遇到段错误,则表示第一次加载或第二次加载访问未分配的内存。要找出原因,您需要了解如何分配%myobj
对象及其字段。