2012-09-13 51 views
1

我试图修改LLVM,以便它在内存中保持某些常量和函数连续。
换句话说,我需要确保某些函数的机器代码是总是,前面加上一些~4字节的常量。 函数体本身不能被修改。如何在LLVM IR中控制全局变量的位置?

我可以简单地通过修改LLVM IR来实现吗?

  • 如果是: 我怎么会在LLVM IR状态保持变量和函数连续的内存?

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

+0

这显然适用于诸如x86之类的非哈佛架构,但是在像Atmel这样的哈佛架构中,这是没有意义的。前面的代码也是代码;数据后面的字节也是数据。我认为LLVM足够便携以支持哈佛架构。 – MSalters

+0

@ MSalters:是的......但这并不意味着它*无法为非哈佛体系结构提供这种功能。这并不是说它毕竟没有特定于平台的功能(SSE等)。 :)但如果你知道它不支持这个事实,那么请张贴它作为答案! – Mehrdad

+0

它与GHC的TNTC优化有关吗? – arrowd

回答

0

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

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