如何将 LLVM IR br 转换回 while 循环

How to convert LLVM IR br back to a while loop

我想知道如何使用高级别的 LLVM 将源代码转换为源代码。鉴于 LLVM 将 while 循环转换为使用 br 等,我想知道如何获取特定的 IR 块并将其 back 转换为 while 循环作为 JavaScript.

C while loop -> LLVM IR -> JavaScript while loop

This article 建议 Emscripten 将 LLVM 代码转换为 JavaScript,因此它可能会在某处处理此问题。

我想知道转换它的一般策略(如果有的话)。从远处看似乎有点棘手,找出从 IR 拼凑出 while 循环的语句。

在从 C 到 LLVM IR 的转换过程中,被认为必要的指令可以用元数据修饰,然后可以使用此元数据将 LLVM IR 转换为 JavaScript,例如指示是否基本之间的循环分支blocks 是否是 while 循环(此信息存在于 C 上下文中)。参见 Intrinsics & Metadata Attributes

有关 LLVM 元数据的更多信息,请参阅 LLVM-Metadata

在 Emscripten 中,重新创建高级语言结构的算法称为 Relooping 并被描述为 in this parer。不过,我不确定它是否是最新信息,但它可能会回答您的问题。