LLVM 的 GenericValue 有什么用?
What is LLVM's GenericValue for?
我试图找出用于部分解释 LLVM 中间代码的数据结构,并注意到 GenericValue 是任意类型值的容器。但据我了解,ConstantExpr 也可以这样说。 GenericValue 到底做了什么,而 ConstantExpr 没有?我发现与现有讨论最接近的是 How to convert a genericValue to Value in LLVM? 答案描述了一些您不需要使用 GenericValue 的情况,但 none 您需要使用的情况。
ConstantExpr 是常量表达式,存在于正在编译的程序中(或者在 JIT 中,代码为 运行 的 VM)。它与编译器中的代码相去甚远——如果你想检查一个 ConstantExpr 是否≥42,你需要相当多的代码,但是发出代码来检查≥42 是非常容易的。
另一方面,GenericValue 是编译时的东西。测试它是否≥42 很容易(并且有一个三元结果),但另一方面生成代码以在 运行 时间检查≥42 是困难的。
编译中有很多这样的东西。有些东西存在于编译器中,有些东西存在于输出中,尽管两者可能相似得令人困惑,但它们之间存在天壤之别。试图在两个宇宙之间共享代码或概念总是会带来痛苦,总是有一些小细节在最后一刻破坏了一切。 (想想如果编译器的地址 space 与不受信任的 JITted 代码共享,您将如何防止沙箱逃逸。)
我试图找出用于部分解释 LLVM 中间代码的数据结构,并注意到 GenericValue 是任意类型值的容器。但据我了解,ConstantExpr 也可以这样说。 GenericValue 到底做了什么,而 ConstantExpr 没有?我发现与现有讨论最接近的是 How to convert a genericValue to Value in LLVM? 答案描述了一些您不需要使用 GenericValue 的情况,但 none 您需要使用的情况。
ConstantExpr 是常量表达式,存在于正在编译的程序中(或者在 JIT 中,代码为 运行 的 VM)。它与编译器中的代码相去甚远——如果你想检查一个 ConstantExpr 是否≥42,你需要相当多的代码,但是发出代码来检查≥42 是非常容易的。
另一方面,GenericValue 是编译时的东西。测试它是否≥42 很容易(并且有一个三元结果),但另一方面生成代码以在 运行 时间检查≥42 是困难的。
编译中有很多这样的东西。有些东西存在于编译器中,有些东西存在于输出中,尽管两者可能相似得令人困惑,但它们之间存在天壤之别。试图在两个宇宙之间共享代码或概念总是会带来痛苦,总是有一些小细节在最后一刻破坏了一切。 (想想如果编译器的地址 space 与不受信任的 JITted 代码共享,您将如何防止沙箱逃逸。)