From dfedfb0289ca2de4bb51330bfd7d51fa975da2c3 Mon Sep 17 00:00:00 2001 From: sewardj <unknown> Date: Wed, 5 Jul 2000 14:28:50 +0000 Subject: [PATCH] [project @ 2000-07-05 14:28:49 by sewardj] Rename the marker used by Diff_Gcc_Nat.hs to ___ncg_debug_marker, to make it clear it has nothing to do with the usual object-splitting machinery. Improve Diff_Gcc_Nat: * Emit a warning, and stop, if there are no debug markers in the NCG code. * Handle .uahalf and .uaword, which appear in sparc assembly, but not x86. --- ghc/compiler/nativeGen/AsmCodeGen.lhs | 9 ++-- ghc/utils/debugNCG/Diff_Gcc_Nat.hs | 59 ++++++++++++++++++++------- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/ghc/compiler/nativeGen/AsmCodeGen.lhs b/ghc/compiler/nativeGen/AsmCodeGen.lhs index 5fca05543108..8e15db82754f 100644 --- a/ghc/compiler/nativeGen/AsmCodeGen.lhs +++ b/ghc/compiler/nativeGen/AsmCodeGen.lhs @@ -97,11 +97,10 @@ nativeCodeGen absC us # if NCG_DEBUG my_trace m x = trace m x - my_vcat sds = vcat (intersperse - (char ' ' - $$ ptext SLIT("# __debug_NCG_split_marker") - $$ char ' ') - sds) + my_vcat sds = vcat (intersperse (char ' ' + $$ ptext SLIT("# ___ncg_debug_marker") + $$ char ' ') + sds) # else my_vcat sds = vcat sds my_trace m x = x diff --git a/ghc/utils/debugNCG/Diff_Gcc_Nat.hs b/ghc/utils/debugNCG/Diff_Gcc_Nat.hs index e12775fc648f..725cf85e9e7f 100644 --- a/ghc/utils/debugNCG/Diff_Gcc_Nat.hs +++ b/ghc/utils/debugNCG/Diff_Gcc_Nat.hs @@ -5,6 +5,8 @@ import System import Char import Array +--import IOExts(trace) + type Label = String type Code = [String] @@ -14,6 +16,8 @@ pzipWith f _ _ = error "pzipWith: unbalanced list" main = getArgs >>= \args -> + --return ["/home/v-julsew/SOLARIS/NCG/fpt/ghc/tests/codeGen/should_run/cg001.s"] + -- >>= \args -> if length args /= 1 then putStr ("\ndiff_gcc_nat:\n" ++ " usage: create File.s-gcc and File.s-nat\n" ++ @@ -33,6 +37,9 @@ main let split_nat0 = breakOn is_split_line (lines f_nat) split_nat = filter (not.null.getLabels) split_nat0 + split_markers_present + = any is_split_line (lines f_nat) + labels_nat = map getLabels split_nat labels_cls = map (map breakLabel) labels_nat @@ -77,7 +84,14 @@ main ++ ["#endif" ] - putStr (unlines final) + if split_markers_present + then putStr (unlines final) + else putStr ("\ndiff_gcc_nat:\n" + ++ " fatal error: NCG output doesn't contain any\n" + ++ " ___ncg_debug_marker marks. Can't continue!\n" + ++ " To fix: enable these markers in\n" + ++ " fptools/ghc/compiler/nativeGen/AsmCodeGen.lhs,\n" + ++ " recompile the compiler, and regenerate the assembly.\n\n") pp_ok_sync :: (Label, [LabelKind], [String], [String]) @@ -133,7 +147,23 @@ find_corresponding :: Label -- root -> Maybe ([String],[String]) -- (found text, gcc leftovers) find_corresponding root kinds gcc_lines - = case kinds of + = -- Enable the following trace in order to debug pattern matching problems. + --trace ( + -- case result of + -- Nothing -> show (root,kinds) ++ "\nNothing\n\n" + -- Just (found,uu) + -- -> show (root, kinds) ++ "\n" ++ unlines found ++ "\n\n" + --) + result + where + + arr = listArray (1, length gcc_lines) gcc_lines + pfxMatch ss t + = let clean_t = filter (not.isSpace) t + in any (`isPrefixOf` clean_t) ss + + result + = case kinds of [Vtbl] -> let lbl_i = find_label arr (reconstruct_label root Vtbl) @@ -144,7 +174,8 @@ find_corresponding root kinds gcc_lines [Closure] -> let lbl_i = find_label arr (reconstruct_label root Closure) fst_i = search_back arr lbl_i (pfxMatch [".data"]) - lst_i = search_fwds arr (lbl_i+1) (not . pfxMatch [".long"]) + lst_i = search_fwds arr (lbl_i+1) + (not . pfxMatch [".long",".uaword",".uahalf"]) in splice arr fst_i (lst_i-1) @@ -188,15 +219,17 @@ find_corresponding root kinds gcc_lines [Srt] -> let lbl_i = find_label arr (reconstruct_label root Srt) - fst_i = search_back arr lbl_i (pfxMatch [".text"]) - lst_i = search_fwds arr (lbl_i+1) (not . pfxMatch [".long"]) + fst_i = search_back arr lbl_i (pfxMatch [".text",".data"]) + lst_i = search_fwds arr (lbl_i+1) + (not . pfxMatch [".long",".uaword",".uahalf"]) in splice arr fst_i (lst_i-1) [CTbl] -> let lbl_i = find_label arr (reconstruct_label root CTbl) fst_i = search_back arr lbl_i (pfxMatch [".text"]) - lst_i = search_fwds arr (lbl_i+1) (not . pfxMatch [".long"]) + lst_i = search_fwds arr (lbl_i+1) + (not . pfxMatch [".long",".uaword",".uahalf"]) in splice arr fst_i (lst_i-1) @@ -209,11 +242,6 @@ find_corresponding root kinds gcc_lines other -> error ("find_corresponding: " ++ show kinds) - where - arr = listArray (1, length gcc_lines) gcc_lines - pfxMatch ss t - = let clean_t = filter (not.isSpace) t - in any (`isPrefixOf` clean_t) ss search_back :: Array Int String -> Int -> (String -> Bool) -> Int search_back code start_ix pred @@ -232,10 +260,11 @@ search_fwds code start_ix pred find_label :: Array Int String -> Label -> Int find_label code lbl - = case [idx | (idx, lbl2) <- assocs code, lbl == lbl2] of + = --trace (unlines (map show (assocs code))) ( + case [idx | (idx, lbl2) <- assocs code, lbl == lbl2] of [idx] -> idx - other -> error ("find_label: " ++ lbl) - + other -> error ("find_label `" ++ lbl ++ "'\n") + --) reconstruct_label :: Label -> LabelKind -> Label reconstruct_label root Init @@ -330,7 +359,7 @@ reconstruct number nat_code gcc_code comment str x = str ++ x ----------------------------------------------------- -split_marker = "___stg_split_marker" +split_marker = "___ncg_debug_marker" is_split_line s = let m = split_marker -- GitLab