Place static closures in their own section.
authorEdward Z. Yang <ezyang@mit.edu>
Mon, 26 Aug 2013 20:34:15 +0000 (13:34 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Thu, 2 Oct 2014 05:26:38 +0000 (22:26 -0700)
Summary:
The primary reason for doing this is assisting debuggability:
if static closures are all in the same section, they are
guaranteed to be adjacent to one another.  This will help
later when we add some code that takes section start/end and
uses this to sanity-check the sections.

Part of remove HEAP_ALLOCED patch set (#8199)

Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
Test Plan: validate

Reviewers: simonmar, austin

Subscribers: simonmar, ezyang, carter, thomie

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

GHC Trac Issues: #8199

compiler/cmm/Cmm.hs
compiler/cmm/CmmParse.y
compiler/cmm/PprCmmDecl.hs
compiler/codeGen/StgCmmBind.hs
compiler/codeGen/StgCmmCon.hs
compiler/codeGen/StgCmmUtils.hs
compiler/llvmGen/LlvmCodeGen/Data.hs
compiler/nativeGen/PPC/Ppr.hs
compiler/nativeGen/SPARC/Ppr.hs
compiler/nativeGen/X86/Ppr.hs

index 9e9bae9..98c5b59 100644 (file)
@@ -170,6 +170,7 @@ data Section
   | RelocatableReadOnlyData
   | UninitialisedData
   | ReadOnlyData16      -- .rodata.cst16 on x86_64, 16-byte aligned
+  | StaticClosures
   | OtherSection String
 
 data CmmStatic
index 8033330..db6cc49 100644 (file)
@@ -1105,7 +1105,7 @@ staticClosure :: PackageKey -> FastString -> FastString -> [CmmLit] -> CmmParse
 staticClosure pkg cl_label info payload
   = do dflags <- getDynFlags
        let lits = mkStaticClosure dflags (mkCmmInfoLabel pkg info) dontCareCCS payload [] [] []
-       code $ emitDataLits (mkCmmDataLabel pkg cl_label) lits
+       code $ emitStaticClosure (mkCmmDataLabel pkg cl_label) lits
 
 foreignCall
         :: String
index dd80f5c..417f90d 100644 (file)
@@ -162,6 +162,7 @@ pprSection s = case s of
     RelocatableReadOnlyData
                       -> section <+> doubleQuotes (ptext (sLit "relreadonly"))
     UninitialisedData -> section <+> doubleQuotes (ptext (sLit "uninitialised"))
+    StaticClosures    -> section <+> doubleQuotes (ptext (sLit "staticclosures"))
     OtherSection s'   -> section <+> doubleQuotes (text s')
  where
     section = ptext (sLit "section")
index 444112f..a253b11 100644 (file)
@@ -98,7 +98,7 @@ cgTopRhsClosure dflags rec id ccs _ upd_flag args body =
          let closure_rep   = mkStaticClosureFields dflags
                                     indStaticInfoTable ccs MayHaveCafRefs
                                     [unLit (idInfoToAmode cg_info)]
-         emitDataLits closure_label closure_rep
+         emitStaticClosure closure_label closure_rep
          return ()
 
   gen_code dflags lf_info closure_label
@@ -113,7 +113,7 @@ cgTopRhsClosure dflags rec id ccs _ upd_flag args body =
               closure_rep   = mkStaticClosureFields dflags info_tbl ccs caffy []
 
                  -- BUILD THE OBJECT, AND GENERATE INFO TABLE (IF NECESSARY)
-        ; emitDataLits closure_label closure_rep
+        ; emitStaticClosure closure_label closure_rep
         ; let fv_details :: [(NonVoid Id, VirtualHpOffset)]
               (_, _, fv_details) = mkVirtHeapOffsets dflags (isLFThunk lf_info)
                                                (addIdReps [])
index edd0648..93bfaf0 100644 (file)
@@ -101,7 +101,7 @@ cgTopRhsCon dflags id con args =
                              payload
 
                 -- BUILD THE OBJECT
-        ; emitDataLits closure_label closure_rep
+        ; emitStaticClosure closure_label closure_rep
 
         ; return () }
 
index d47a016..8b3616f 100644 (file)
@@ -12,6 +12,7 @@ module StgCmmUtils (
         cgLit, mkSimpleLit,
         emitDataLits, mkDataLits,
         emitRODataLits, mkRODataLits,
+        emitStaticClosure,
         emitRtsCall, emitRtsCallWithResult, emitRtsCallGen,
         assignTemp, newTemp,
 
@@ -320,6 +321,11 @@ emitRODataLits :: CLabel -> [CmmLit] -> FCode ()
 -- Emit a read-only data block
 emitRODataLits lbl lits = emitDecl (mkRODataLits lbl lits)
 
+emitStaticClosure :: CLabel -> [CmmLit] -> FCode ()
+-- Emit a static closure data block, which is only used at startup time.
+-- Eventually make this READ ONLY(?)
+emitStaticClosure lbl lits = emitDecl (mkDataLits StaticClosures lbl lits)
+
 newStringCLit :: String -> FCode CmmLit
 -- Make a global definition for the string,
 -- and return its label
index 1dbfb4b..6115b88 100644 (file)
@@ -56,6 +56,7 @@ isSecConstant ReadOnlyData            = True
 isSecConstant RelocatableReadOnlyData = True
 isSecConstant ReadOnlyData16          = True
 isSecConstant Data                    = False
+isSecConstant StaticClosures          = False
 isSecConstant UninitialisedData       = False
 isSecConstant (OtherSection _)        = False
 
index 8fe8276..4f297fa 100644 (file)
@@ -291,6 +291,7 @@ pprSectionHeader seg
         ReadOnlyData16
          | osDarwin             -> ptext (sLit ".const\n.align 4")
          | otherwise            -> ptext (sLit ".section .rodata\n\t.align 4")
+        StaticClosures          -> ptext (sLit ".section staticclosures,\"aw\"\n\t.align 2")
         OtherSection _          ->
             panic "PprMach.pprSectionHeader: unknown section"
 
index 654179e..e33c97e 100644 (file)
@@ -334,6 +334,7 @@ pprSectionHeader seg
         RelocatableReadOnlyData -> ptext (sLit ".text\n\t.align 8")
         UninitialisedData       -> ptext (sLit ".bss\n\t.align 8")
         ReadOnlyData16          -> ptext (sLit ".data\n\t.align 16")
+        StaticClosures          -> ptext (sLit ".section staticclosures,\"aw\"\n\t.align 8")
         OtherSection _          -> panic "PprMach.pprSectionHeader: unknown section"
 
 
index 7c65195..7f8f296 100644 (file)
@@ -388,6 +388,7 @@ pprSectionHeader seg
            RelocatableReadOnlyData -> ptext (sLit ".const_data\n.align 2")
            UninitialisedData       -> ptext (sLit ".data\n\t.align 2")
            ReadOnlyData16          -> ptext (sLit ".const\n.align 4")
+           StaticClosures          -> ptext (sLit ".section staticclosures,\"aw\"\n\t.align 2")
            OtherSection _          -> panic "X86.Ppr.pprSectionHeader: unknown section"
     | otherwise ->
        case seg of
@@ -397,6 +398,7 @@ pprSectionHeader seg
            RelocatableReadOnlyData -> ptext (sLit ".const_data\n.align 3")
            UninitialisedData       -> ptext (sLit ".data\n\t.align 3")
            ReadOnlyData16          -> ptext (sLit ".const\n.align 4")
+           StaticClosures          -> ptext (sLit ".section staticclosures,\"aw\"\n\t.align 3")
            OtherSection _          -> panic "PprMach.pprSectionHeader: unknown section"
    _
     | target32Bit platform ->
@@ -407,6 +409,7 @@ pprSectionHeader seg
            RelocatableReadOnlyData -> ptext (sLit ".section .data\n\t.align 4")
            UninitialisedData       -> ptext (sLit ".section .bss\n\t.align 4")
            ReadOnlyData16          -> ptext (sLit ".section .rodata\n\t.align 16")
+           StaticClosures          -> ptext (sLit ".section staticclosures,\"aw\"\n\t.align 4")
            OtherSection _          -> panic "X86.Ppr.pprSectionHeader: unknown section"
     | otherwise ->
        case seg of
@@ -416,6 +419,7 @@ pprSectionHeader seg
            RelocatableReadOnlyData -> ptext (sLit ".section .data\n\t.align 8")
            UninitialisedData       -> ptext (sLit ".section .bss\n\t.align 8")
            ReadOnlyData16          -> ptext (sLit ".section .rodata.cst16\n\t.align 16")
+           StaticClosures          -> ptext (sLit ".section staticclosures,\"aw\"\n\t.align 8")
            OtherSection _          -> panic "PprMach.pprSectionHeader: unknown section"