【问题标题】:How to control the location of a global variable in LLVM IR?如何控制 LLVM IR 中全局变量的位置?
【发布时间】:2012-09-07 01:38:27
【问题描述】:

我正在尝试修改 LLVM,以使某些常量和函数在内存中保持连续。
换句话说,我需要确保某些函数的机器代码总是在内存中以大约 4 字节的常量开头。 函数体本身不能修改。

我可以通过以某种方式修改 LLVM IR 来实现这一点吗?

  • 如果是: 我将如何在 LLVM IR 中声明以使变量和函数在内存中保持连续?

  • 如果不是: 为了实现这一点,我应该修改代码生成过程的哪一部分(即哪个 pass(es))?任何指向我应该查看的项目/文件的链接都会有所帮助,因为我还不确定从哪里开始。

【问题讨论】:

  • 这显然适用于 x86 等非哈佛架构,但在 Atmel 等哈佛架构上则没有意义。代码前面的字节也是代码;数据后面的字节也是数据。而且我认为 LLVM 的可移植性足以支持哈佛架构。
  • @MSalters:是的...但这并不意味着它不能具有非哈佛架构的功能。毕竟它并不是没有特定于平台的功能(SSE 等)。 :) 但是,如果您知道它不支持这一点,那么请将其发布为答案!
  • 是否与 GHC 的 TNTC 优化有关?
  • @arrowdodger:不……这是我正在做的一个项目。
  • 此链接中的想法可能会有所帮助:hackage.haskell.org/trac/ghc/ticket/4213

标签: c++ code-generation llvm llvm-ir


【解决方案1】:

据我所知,我认为您不能仅通过修改 IR 来做到这一点;你必须自己写一些东西来处理它。它也不应该是通过——它太低级了,它应该在target-specific code generation 期间运行。您可以捎带现有的目标,只需修改这方面,当然,您不必从头开始编写新目标。不过,我不知道哪个位置对这个有好处。

我认为在代码生成期间将此信息从 IR 级别传递到 DAG 的一种好方法是使用元数据:将元数据附加到将它们相互链接的函数或关联常量,然后再使用该链接用于将它们一起发射。见this thread on llvm-dev for information how to transfer the metadata

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多