1

我在这个 llvm-IR 代码的最后一行得到“无效的 getelementptr 索引”:

%alc = alloca %mytype*
store %mytype* %obj, %mytype** %alc
%ldc = load %mytype** %alc
%gcs = getelementptr inbounds %mytype* %ldc, i32 0, i32 1

其中 mytype 定义如下:

%mytype = type {i32, %tp1**, %tp1}

我有另一种类似的类型,对其进行索引不会导致上述错误,并定义为:

%mytype2 = type {i32, i16*, %tp1}

任何解决此问题的帮助将不胜感激。

4

1 回答 1

1

该错误是由于%mytype未定义有效类型而引起的。通常 LLVM 会报告类型本身的错误,但如果类型定义出现在 getelementptr (GEP) 使用之后,那么您只会从 GEP 而不是类型中收到错误。

如果您将 的定义移动%mytype到 IR 文件中的 GEP 之前,您将看到更合适的错误消息。

在这种情况下,我猜问题是%mytype不完整的 - 要么%tp1缺少定义,要么缺少它使用的类型的定义(例如%tp2,我在你的评论中看到它使用的),或者类似的东西.

顺便说一句,您可能想使用我的IR 编辑器,它可以帮助您快速找到这些类型的错误。

于 2013-04-02T07:37:35.740 回答