{- ---------------------------------------------------------------------------
Write SRIDTable into assembler file.
-}
module DbgDumpSRIDTable(dbgDumpSRIDTable) where
import Char
import IO
import System
import PackedString(PackedString, unpackPS, packString)
import IntState
import Extra(strStr, dropJust, trace)
import Flags
import Syntax(ImpDecl(..), ImpSpec(..), Entity(..), InfixClass(..))
import TokenId(TokenId(..))
import DbgTrans(SRIDTable)
#if defined(__HASKELL98__)
#define isAlphanum isAlphaNum
#endif
dbgDumpSRIDTable :: Handle -> IntState -> Flags -> SRIDTable -> IO ()
dbgDumpSRIDTable handle state flags Nothing = return ()
dbgDumpSRIDTable handle state flags (Just ((_, srs), idt, impdecls, modid)) =
output (showString "DL(" . showString modpre . showString ")\n" .
chopString filename .
showString " AL\n EX L(NM_" . showString srcid .
showString ")\n DL(NM_" . showString srcid . showString ")\n") >>
mapM_ (dumpId state (sProfile flags) modinfo output trust) idtlabs >>
output (showString " DW 0\n") >>
mapM_ (dumpNs state (sProfile flags) modpre output trust) idtlabs >>
output (showString " AL\nDL(D_srstart)\n") >>
mapM_ (dumpSR state (sProfile flags) modinfo output) (reverse srs) >>
output (showString " DL(N_IMPORTS)\n") >>
-- mapM_ (dumpImport output) impdecls >>
output (showString " DW 0\n EX L(" . showString modinfo .
showString ")\n DL(" . showString modinfo .
showString ")\n DW L(" . showString modpre .
showString "), L(NM_" . showString srcid .
showString "), L(N_IMPORTS), L(NMODN)\n" .
showString " DW 0\n" .
showString (if trust then " DW 1\n" else " DW 0\n") .
showString " DL(NMODN)\n" . chopString modid .
showString " AL\n") >>
if modid == "Main" then
output (showString " EX L(MODULE_Main)\n DL(MODULE_Main)\n DW L(" .
showString modinfo . showString ")\n")
else
return ()
where modpre = "D_" ++ srcid
modinfo = "NMOD_" ++ srcid
trust = sDbgTrusted flags
idtlabs = zip [(p, i, (tidI . dropJust . lookupIS state) i)
| (p, i) <- idt
]
[0..]
output sf = catch (hPutStr handle (sf "")) outputerr
outputerr ioerror = hPutStr stderr ("Failed appending debug tables to"
++sObjectFile flags++":" ++
show ioerror ++ "\n")
>> exitWith (ExitFailure (-1))
filename = let ms = sSourceFile flags
in reverse (takeWhile ('/' /=) (reverse ms))
srcid = let ms = sSourceFile flags
ms' = case break ('.'==) (reverse ms) of
("sh", rf) -> reverse (tail rf)
("shl", rf) -> reverse (tail rf)
_ -> ms
in reverse (takeWhile ('/' /=) (reverse ms'))
dumpId state profile modinfo output trust ((pos, i, tid), lab) =
output (showString " EX L(D_" . showString idnhc .
showString ")\nDL(D_" . showString idnhc .
-- The 6 below is the constructor number of NTId
-- 22 (16+6) is used if the function is trusted
-- See getconstr.h in the runtime system.
(if trust && isVar then
showString ")\n DW CONSTR(22,5,5)\n DW "
else
showString ")\n DW CONSTR(6,5,5)\n DW ") .
(if profile then showString "L(prof_NTId), 0, 0, 0, " else id) .
showString "L(" . showString modinfo .
showString "), " . shows pos .
showString ", L(L_" . shows lab . showString "), " .
shows (priority pri) . showString"\n" .
showString " DW 0\n")
where idnhc = fixStr (show tid) ""
(isVar, pri) =
case lookupIS state i of
Just (i@(InfoConstr _ _ _ _ _ _)) -> (False, fixityI i)
Just (i@(InfoIMethod _ _ _ _ m)) ->
case lookupIS state m of
Just im -> (True, fixityI im)
Just i -> (True, fixityI i)
_ -> (True, (InfixL, 9))
fixStr [] = id
fixStr (c:cs) =
if isAlphanum c then
showChar c . fixStr cs
else
showChar '_' . shows (fromEnum c) . fixStr cs
priority :: (InfixClass TokenId, Int) -> Int
priority (InfixDef, _) = 3
priority (InfixL, n) = 2 + shiftPri n
priority (InfixR, n) = 1 + shiftPri n
priority (Infix, n) = 0 + shiftPri n
priority (InfixPre _, n) = 0 + shiftPri n
shiftPri :: Int -> Int
shiftPri n = n * 4
dumpNs state profile modpre output trust ((pos, _, tid), lab) =
output (showString "DL(L_" . shows lab . showString ")\n" .
chopString (untoken tid))
dumpSR state profile modinfo output sr =
-- (2, 2, 2) -> (Tag 2 (SR3), size 2, 2 non-pointers)
output (showString " DW CONSTR(2,2,2)\n DW "
. (if profile then showString "L(prof_SR3), 0, 0, 0, " else id)
. shows sr . showString ", L(" . showString modinfo
. showString ")\n DW 0\n")
dumpImport output impdecl =
{-
if modname == "DPrelude" || take 7 (modname ++ " ") == "Prelude" then
return ()
else
-}
output (showString " DW L(NMOD_" . showString modname . showString ")\n")
where modname = untoken (imptokid impdecl)
imptokid (Import (_,i) _) = i
imptokid (ImportQ (_,i) _) = i
imptokid (ImportQas (_,i) _ _) = i
imptokid (Importas (_,i) _ _) = i
untoken (TupleId 0) = ""
untoken (TupleId n) = take (n-1) (repeat ',')
untoken (Visible ps) = reverse (unpackPS ps)
untoken (Qualified _ ps) = reverse (unpackPS ps)
untoken (Qualified2 _ tid) = untoken tid
untoken (Qualified3 _ _ tid) = untoken tid
chopString "" = showString " DB 0\n"
chopString x =
case splitAt (40::Int) x of
(x,xs) -> showString " DS " . showString (strStr x) .
showString "\n" . chopString xs
{- End DbgDumpSRIDTable ------------------------------------------------------}