assembly - 如何在 LLVM 中生成使用非常量值初始化全局变量的代码?

标签 assembly compiler-construction linker llvm llvmlite

在 LLVM(特别是 llvmlite)中,如何声明全局变量并使用任意(运行时)表达式的结果初始化其内容?

我发现我可以创建一个 GlobalVariable 对象,但看起来它的initializer 参数需要一个Constant。如果我必须在启动/加载时运行任意代码来确定其值怎么办?该代码去哪里了?我应该向谁的 Builder 添加指令?我是否声明一个专门命名的函数和/或向其添加魔法属性,以便在运行时将模块加载到内存中时自动执行?

最佳答案

这完全取决于您的设置。在使用 Visual Studio 的 C 或 C++ 中,C 和 C++ 初始化函数最终会放入 .CRT 部分的一个小节中,并由标准运行时库执行。

如果您在没有 CRT 的情况下进行编译并具有这些初始化函数,它们将不会触发,因为运行时会处理该问题。

更正编辑:出现@llvm.global_ctors存在。

我不确定这些是否会在没有帮助执行初始化程序的运行时库的环境中正确触发,但你已经有了。

关于assembly - 如何在 LLVM 中生成使用非常量值初始化全局变量的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471470/

相关文章:

c - ARM 汇编上的浮点指令

assembly - 汇编 cmp 指令到底比较什么?

为简单 VM 编译 switch 语句

go - 遇到错误 - 在 golang 中实现词法分析器时,所有 go 例程都处于休眠状态

windows - 将 exe 与//MT 标志链接

c - 快速 x86 asm 问题

c - 使用 GCC 编译时出现汇编错误

c++ - 编译器 : how to check a user function returns properly?

c++ - Qt cross-platform issue : compiles fine on Windows, linker error on Linux

c - FreeType 库和 "Undefined reference to FT_Init_FreeType"