【问题标题】:how to backpatch basic blocks in LLVM如何回补 LLVM 中的基本块
【发布时间】:2019-08-05 01:55:20
【问题描述】:

我正在编写c编译器,不知道如何在我的一次编译器中使用llvm实现goto语句,例如:

int main() {
  goto label;
label:
  return 0 
}

由于解析器是一次通过,当我分析goto label; 时,我无法获得代表label 的llvm::BasicBlock,因为它还不存在,所以如果我创建一个br 来实现这个goto语句,BasicBlock的参数未知。

那么我怎样才能使用 llvm 来回补一个基本块呢?

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    您需要做的是保留从标签名称到基本块的映射,并在看到标签时创建条目,无论第一次提及是使用还是定义都没有关系。

    【讨论】:

    • 你的意思是只要我看到一个标签,不管是定义还是声明,我都创建一个基本块并保存在符号表中,然后再添加指令?
    • 对。这很简单,不会造成太大伤害。它创建了一些超出需要的备用块(label1: label2: label3: 的三个块,即使其中两个刚刚通过)。您可能会发现同样的方法对 if/then/else 有益:当您看到 if 时创建一个 else 块,然后将缺少的 else 子句视为 else {}
    • 哇,我真的该换个思维模式了,我一直认为基本块应该是看到块才创建,创建后立即添加指令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多