问题标签 [llvm-codegen]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 为什么 clang 为 64 位 double 的绝对值发出 32 位 float ps 指令?
为什么clangfabs(double)
变成vandps
而不是vandpd
(像GCC一样)?
来自编译器资源管理器的示例:
铿锵声12.0.1-std=gnu++11 -Wall -O3 -march=znver3
海合会 11.2-std=gnu++11 -Wall -O3 -march=znver3
(具有讽刺意味的是,GCC 使用vandpd
but 将常量定义为 32 位.long
块(有趣的是上半部分为零),而 clang 使用vandps
but 将常量定义为两.quad
半。
llvm - x86_64 调用函数时调用约定不正确
我对 LLVM 比较陌生,我正在尝试生成调用 C 函数 ( growDictionary
) 的 LLVM IR。这是在 x86_64 Linux 上,使用 llvm 12:
该函数(在 C++ 中定义为extern "C"
,用 clang 12 编译):
该函数按值获取 StringDictionary 对象,但是根据 x86_64 ABI(https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf,第 3.2.3 节, “参数传递”)应该让它在堆栈上传递。(对象的大小大于 2 个八字节,并且八字节都不属于 SSE 或 SSEUP 类,因此根据“合并后清理”部分它变成了 MEMORY 类。)粗略查看反汇编确认这确实是案子:
%rdi
是将写入返回值的地址,%esi
是 uint32_t 需要的WordsCapacity 参数,不使用其他参数传递寄存器。
到目前为止一切都很好,但我现在正试图从我生成的 IR 中调用这个函数,它试图在寄存器中传递所有参数。以下是相关的代码部分:
请注意,调用约定是默认的(未更改为 fastcc 之类的)。
生成的代码(我尝试使用的 JIT 和 llc 产生相同的结果)操作系统试图在寄存器中传递参数,这是来自的输出llc -O0
;-O3
很相似:
不出所料,我的代码段错误。
我很惊讶 llc 生成的代码与 ABI 不匹配。我需要在函数声明或类型定义上添加任何属性,还是我还缺少其他任何属性?
c - 核心对象的 LLVM C-API 生命周期
我已经开始玩 LLVM,制作一种宠物语言。我正在使用 C-API。我有一个解析器和基本的 AST,但我在 LLVM 方面遇到了一些障碍。
以下是我的代码的缩小版本,用于说明我当前的问题:
我可以使用以下命令编译它:
或者,我也尝试过:
无论哪种方式,我都会得到这个结果:
我也尝试过使用 clang 来衡量。
显然我在滥用 LLVM C-API。我主要是在努力了解何时可以安全调用 API 函数,以及何时可以安全地释放/删除 LLVM 引用的内存。例如LLVMTypeRef args[2]
参数,我在 LLVM C-API 源代码中LLVMFunctionType
看到它正在为 args 参数创建一个 ArrayRef。这意味着我必须坚持使用 args 参数,直到 LLVM 完成它。我真的不知道那是什么时候。(我打算在堆上分配这块内存)
简单地说, 如果有人不能在这个例子中解释我做错了什么,而是更根本地解释我应该如何找出我做错了什么,我会喜欢它。
LLVM C-API 文档对API 中可用的函数进行了很好的细分,但我没有发现它对应该如何调用 API 函数给出太多描述,即。什么顺序是安全的/预期的。
我还发现这个文档很有帮助,因为它可以很容易地搜索到单个函数原型。但同样它没有给出如何使用 C-API 的上下文或示例。
最后我不得不参考Paul Smith 的博客,它现在有点过时了,但绝对是我能走到这一步的原因。
PS我不希望一切都为我拼写出来,我只是想建议如何自学LLVM