Debug: Use local symbols for unwind points (#13278)
authorBen Gamari <bgamari.foss@gmail.com>
Tue, 14 Feb 2017 13:43:40 +0000 (08:43 -0500)
committerBen Gamari <ben@smart-cactus.org>
Tue, 14 Feb 2017 15:53:01 +0000 (10:53 -0500)
While this apparently didn't matter on Linux, the OS X toolchain seems
to treat local and external symbols differently during linking. Namely,
the linker assumes that an external symbol marks the beginning of a new,
unused procedure, and consequently drops it.

Fixes regression introduced in D2741.

Test Plan: `debug` testcase on OS X

Reviewers: austin, simonmar, rwbarton

Reviewed By: rwbarton

Subscribers: rwbarton, thomie

Differential Revision: https://phabricator.haskell.org/D3135

compiler/cmm/Debug.hs
compiler/nativeGen/X86/CodeGen.hs
compiler/nativeGen/X86/Instr.hs

index 7902694..428721a 100644 (file)
@@ -393,7 +393,7 @@ See also: Note [Unwinding information in the NCG] in AsmCodeGen.
 -}
 
 -- | A label associated with an 'UnwindTable'
-data UnwindPoint = UnwindPoint !Label !UnwindTable
+data UnwindPoint = UnwindPoint !CLabel !UnwindTable
 
 instance Outputable UnwindPoint where
   ppr (UnwindPoint lbl uws) =
index a0a8f9d..72f8290 100644 (file)
@@ -68,6 +68,7 @@ import Unique
 import FastString
 import DynFlags
 import Util
+import UniqSupply       ( getUniqueM )
 
 import Control.Monad
 import Data.Bits
@@ -162,7 +163,7 @@ addSpUnwindings :: Instr -> NatM (OrdList Instr)
 addSpUnwindings instr@(DELTA d) = do
     dflags <- getDynFlags
     if debugLevel dflags >= 1
-        then do lbl <- newBlockId
+        then do lbl <- mkAsmTempLabel <$> getUniqueM
                 let unwind = M.singleton MachSp (Just $ UwReg MachSp $ negate d)
                 return $ toOL [ instr, UNWIND lbl unwind ]
         else return (unitOL instr)
@@ -188,7 +189,7 @@ stmtToInstrs stmt = do
       case foldMap to_unwind_entry regs of
         tbl | M.null tbl -> return nilOL
             | otherwise  -> do
-                lbl <- newBlockId
+                lbl <- mkAsmTempLabel <$> getUniqueM
                 return $ unitOL $ UNWIND lbl tbl
 
     CmmAssign reg src
index 4b43a1c..f4ac55c 100644 (file)
@@ -182,7 +182,7 @@ data Instr
 
         -- unwinding information
         -- See Note [Unwinding information in the NCG].
-        | UNWIND BlockId UnwindTable
+        | UNWIND CLabel UnwindTable
 
         -- specify current stack offset for benefit of subsequent passes.
         -- This carries a BlockId so it can be used in unwinding information.