Haskell 查找函数的GHC程序集
我想确定GHC为给定函数生成的程序集 例如,这里有一些代码(应该)在一个字中旋转位-它将位0移到位12,位12移到位14,位14移回0,类似地,位置1、18、13和6 在由Haskell 查找函数的GHC程序集,haskell,assembly,ghc,Haskell,Assembly,Ghc,我想确定GHC为给定函数生成的程序集 例如,这里有一些代码(应该)在一个字中旋转位-它将位0移到位12,位12移到位14,位14移回0,类似地,位置1、18、13和6 在由ghc-O2-s…生成的.s文件中查找为rot0cw生成的程序集的最佳方法是什么 我已经阅读了,但在程序集输出中没有看到任何…\u rot0cw\u闭包 import Data.Bits import Data.Int (Int64) import Text.Printf import System.Environment
ghc-O2-s…
生成的.s
文件中查找为rot0cw
生成的程序集的最佳方法是什么
我已经阅读了,但在程序集输出中没有看到任何…\u rot0cw\u闭包
import Data.Bits
import Data.Int (Int64)
import Text.Printf
import System.Environment
{-# INLINE maskbits #-}
-- set in word v the bits of b corresponding to the mask m
-- assume a bit in b is zero if not in the mask
maskbits v m b = (v .&. (complement m) .|. b)
{-# INLINE tb #-}
-- transfer bit i of word v to bit j of word m; assume bit j of m is 0
tb v i j m = m .|. (rotate (v .&. (bit i)) (j-i))
rot0cw :: Int64 -> Int64
rot0cw v = maskbits (maskbits v m1 b1) m2 b2
where
m1 = 0x0000005005
b1 = tb v 0 2 . tb v 2 14 . tb v 14 12 . tb v 12 0 $ 0
m2 = 0x0000002142
b2 = tb v 1 8 . tb v 8 13 . tb v 13 6 . tb v 6 1 $ 0
showBits v =
let set = [ i | i <- [0..35], testBit v i ]
in "bits set: " ++ (unwords $ map show set)
main = do
(arg0:_) <- getArgs
let v = read arg0
-- let v = 0x0000000005
let v' = rot0cw v
putStrLn $ printf "v = 0x%010x = %12d %s" v v (showBits v)
putStrLn $ printf "v' = 0x%010x = %12d %s" v' v' (showBits v')
导入数据.位
导入Data.Int(Int64)
导入文本.Printf
导入系统。环境
{-#内联掩码}
--在字v中设置与掩码m对应的b位
--如果不在掩码中,则假定b中的位为零
maskbits v m b=(v.和(补码m)。|.b)
{-#内联tb}
--将字v的位i转换为字m的位j;假设m的j位为0
tb v i j m=m.|。(旋转(v.和(位i))(j-i))
rot0cw::Int64->Int64
rot0cw v=掩体(掩体v m1 b1)m2 b2
哪里
m1=0x0000005005
b1=tb v 0 2。结核病毒2 14。结核病病毒14 12。tb v 120$0
m2=0x0000002142
b2=tb v 1 8。结核病毒8 13。结核病毒13 6。tb v 6 1美元0
显示位v=
设set=[i | i
我已经阅读了这个答案,但在汇编输出中没有看到任何…\u rot0cw\u闭包
import Data.Bits
import Data.Int (Int64)
import Text.Printf
import System.Environment
{-# INLINE maskbits #-}
-- set in word v the bits of b corresponding to the mask m
-- assume a bit in b is zero if not in the mask
maskbits v m b = (v .&. (complement m) .|. b)
{-# INLINE tb #-}
-- transfer bit i of word v to bit j of word m; assume bit j of m is 0
tb v i j m = m .|. (rotate (v .&. (bit i)) (j-i))
rot0cw :: Int64 -> Int64
rot0cw v = maskbits (maskbits v m1 b1) m2 b2
where
m1 = 0x0000005005
b1 = tb v 0 2 . tb v 2 14 . tb v 14 12 . tb v 12 0 $ 0
m2 = 0x0000002142
b2 = tb v 1 8 . tb v 8 13 . tb v 13 6 . tb v 6 1 $ 0
showBits v =
let set = [ i | i <- [0..35], testBit v i ]
in "bits set: " ++ (unwords $ map show set)
main = do
(arg0:_) <- getArgs
let v = read arg0
-- let v = 0x0000000005
let v' = rot0cw v
putStrLn $ printf "v = 0x%010x = %12d %s" v v (showBits v)
putStrLn $ printf "v' = 0x%010x = %12d %s" v' v' (showBits v')
您需要命名模块。例如,在开始处添加module Main,以在生成的程序集中获取Main\u rot0cw\u closure
*严格地说,您的模块需要导出函数。您需要从模块导出函数rot0cw
,否则它实际上是死代码。因此,在模块顶部添加如下内容:
module Asm(rot0cw) where
它生成的程序集相当大,如果您转储Cmm-ddump Cmm
,您可以查看标有您感兴趣的函数名称的每个proc块。GHC在此生成的基本块大致对应于结果程序集中的一个标签。例如,rot0cw\u closure
ma的输入代码请注意以下事项:
cB2:
if (Sp - 32 < SpLim) goto cB4;
Hp = Hp + 16;
if (Hp > HpLim) goto cB6;
I64[Sp - 16] = stg_upd_frame_info;
I64[Sp - 8] = R1;
I64[Hp - 8] = S#_con_info;
I64[Hp + 0] = 0;
I64[Sp - 24] = Hp - 7;
I64[Sp - 32] = stg_ap_p_info;
R2 = $fNumInt64_closure;
Sp = Sp - 32;
jump fromInteger_info; // [R2]
cB4: jump stg_gc_enter_1; // [R1]
cB6:
HpAlloc = 16;
goto cB4;
所有GC函数和各种运行时调用以及不透明的预定义闭包对象总是会给您带来很多“噪音”。但是如果您真的想深入研究生成的闭包,那么首先查看Cmm是一个不错的选择