【发布时间】:2021-12-29 21:18:19
【问题描述】:
我读到here 做了类似的事情
Llvm.set_value_name n p
将 llvalue "p" 的名称设置为 "n" 中的任何字符串。但我对这实际上意味着什么感到困惑?
如果我有一个像 1 这样的整数值,这意味着我可以将 1 命名为任何字符串?这些名称存储在哪里?这个名字的范围是什么?
【问题讨论】:
标签: compiler-construction ocaml llvm llvm-ir
我读到here 做了类似的事情
Llvm.set_value_name n p
将 llvalue "p" 的名称设置为 "n" 中的任何字符串。但我对这实际上意味着什么感到困惑?
如果我有一个像 1 这样的整数值,这意味着我可以将 1 命名为任何字符串?这些名称存储在哪里?这个名字的范围是什么?
【问题讨论】:
标签: compiler-construction ocaml llvm llvm-ir
这是Value::setName() 的包装器,可用于设置大多数值的名称。甚至可能全部,但该名称并未用于所有值。在我见过的所有 IR 中,32 位常量 33 被称为 i32 33,即使 API 允许为其设置名称。
名称用于指令和全局值,例如函数和全局变量,这三个都是值。当您请求 IR 代码的人类可读表示时,会打印指令名称,函数和全局变量名称被传递给链接器,链接器使用它们将多个编译单元链接在一起。以下调用名为 foo 并引用名为 malloc 的值:%foo = call %malloc(i32 33),这说明了这两种用途。
您可以为其他类型的值设置名称可能被视为无害的副作用。
【讨论】: