llvm-ir分段故障

时间:2014-02-01 13:26:42

标签: llvm

任何人都可以告诉我这个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

1 个答案:

答案 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反馈:

  

type error on the gep

您应该将代码修改为合法代码:

%get2 = load %mytype*** %get
%ld = load %mytype** %get2

如果在运行这些行时在运行时遇到段错误,则表示第一次加载或第二次加载访问未分配的内存。要找出原因,您需要了解如何分配%myobj对象及其字段。