LLVM - 什么是'!NodePtr-> isKnownSentinel(),函数运算符*'手段?

时间:2017-04-06 12:52:01

标签: llvm

当我执行以下IR时:

declare void @_puts(i32, ...)

define void @main() {
entry:
  %name = alloca i32
  br i1 true, label %then, label %else

then:                                             ; preds = %entry
  call void (i32, ...) @_puts(i32 1, i32 1234)
  br label %end

else:                                             ; preds = %entry
  br label %end

end:                                              ; preds = %else, %then
  %if_val = phi i32 [ 1234, %then ], [ 0, %else ]

entry1:                                           ; No predecessors!
  store i32 %if_val, i32* %name
  %name2 = load i32, i32* %name
  call void (i32, ...) @_puts(i32 1, i32 %name2)
  ret void
}

我收到以下错误消息:

断言失败:(!NodePtr-> isKnownSentinel()),函数运算符*,文件/Users/Mac/llvm-source/llvm/include/llvm/ADT/ilist_iterator.h,第139行。

中止陷阱:6

此消息的含义是什么?

有人可以帮我解释一下吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

消息引用sentinel nodesimple_ilist,这是一个数据结构,用于表示模块中的函数列表,函数中的基本块,基本块中的指令等等。上。 sentinel节点表示列表的结尾,并且是此类列表的唯一数据成员 - 其余部分位于构成列表的对象内(“i”表示“侵入”)。

我猜这个消息是由simple_ilist的末尾迭代引起的。很可能是持有end块中的指令的那个,因为这是唯一一个格式错误的块。您可以通过添加终结符来修复它:

end:                                              ; preds = %else, %then
  %if_val = phi i32 [ 1234, %then ], [ 0, %else ]
  br label %entry1