gpt4 book ai didi

haskell - 了解 GHC 汇编输出

转载 作者:行者123 更新时间:2023-12-02 06:25:17 26 4
gpt4 key购买 nike

使用 GHC 中的 -S 选项编译 haskell 源文件时,生成的汇编代码不清楚。汇编代码的哪些部分属于 haskell 代码的哪些部分之间没有明确的区别。与 GCC 不同的是,每个标签都是根据它对应的函数来命名的。

GHC 生成的这些名称有一定的约定吗?如何将生成的汇编代码中的某些部分与 haskell 代码中的相应部分相关联?

最佳答案

对于顶级声明来说,这并不太难。本地定义可能更难识别,因为它们的名称被破坏并且很可能被内联。

让我们看看编译这个简单模块时会发生什么。

module Example where

add :: Int -> Int -> Int
add x y = x + y
<strong>.data
.align 8
.globl Example_add_closure
.type Example_add_closure, @object
Example_add_closure:
.quad Example_add_info
.text
.align 8
.quad 8589934604
.quad 0
.quad 15
.globl Example_add_info
.type Example_add_info, @object
Example_add_info:
.LckX:
jmp base_GHCziBase_plusInt_info</strong>
.data
.align 8
_module_registered:
.quad 0
.text
.align 8
.globl __stginit_Example_
.type __stginit_Example_, @object
__stginit_Example_:
.Lcl7:
cmpq $0,_module_registered
jne .Lcl8
.Lcl9:
movq $1,_module_registered
addq $-8,%rbp
movq $__stginit_base_Prelude_,(%rbp)
.Lcl8:
addq $8,%rbp
jmp *-8(%rbp)
.text
.align 8
.globl __stginit_Example
.type __stginit_Example, @object
__stginit_Example:
.Lcld:
jmp __stginit_Example_
.section .note.GNU-stack,"",@progbits
.ident "GHC 7.0.2"

您可以看到我们的函数 Example.add 生成了 Example_add_closureExample_add_info。顾名思义,_closure 部分与闭包有关。 _info 部分包含函数的实际指令。在本例中,这只是跳转到内置函数 GHC.Base.plusInt

请注意,从 Haskell 代码生成的程序集看起来与从其他语言获得的程序集非常不同。调用约定不同,并且事情可能会被重新排序很多。

在大多数情况下,您不想直接跳到汇编。通常更容易理解 core,Haskell 的简化版本。 (编译更简单,不一定要阅读)。要了解核心,请使用 -ddump-simpl 选项进行编译。

Example.add :: GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int
[GblId, Arity=2]
Example.add =
\ (x_abt :: GHC.Types.Int) (y_abu :: GHC.Types.Int) ->
GHC.Num.+ @ GHC.Types.Int GHC.Num.$fNumInt x_abt y_abu

有关如何阅读核心的一些好资源,请参阅this question .

关于haskell - 了解 GHC 汇编输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6808867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com