使用 LLVM 编写编译器后端:return value for statements

Writing a compiler backend using LLVM: return value for statements

我正在为 C 语言的一个子集编写一个基本的编译器,我正在使用 LLVM C++ api 编写后端。我主要关注 this tutorial。我知道 AST 中的每个节点都必须 return 一个 llvm::Value,它适用于 表达式 ,但是我 return 对于 C 陈述?

例如,对于 if-else 块,我需要创建一个 phi 节点。构造函数 Builder.CreatePHI 采用此 if-else 块应该评估的值的类型,但该类型应该是什么?

For example, for an if-else block, I am required to create a phi node.

您不需要这样做。 LLVM还有br指令,可以用来实现条件分支和无条件分支。

C 语句经常 return 一个 undefined value of a void type.

Phi节点表示从几个前导块的联合中获取一个值的操作。 if/else 中确定的每个值都需要一个 phi 节点,例如有条件分配的寄存器变量。

如果您不使用寄存器变量或在基本块之间携带它们,那么您将不需要任何 phi 节点。

你不需要 phi 节点只是为了实现一个什么都不做的 if/else,正是因为非表达式语句没有值。正如@arnt 提到的,您可能想使用 void 类型。