[project @ 2004-08-20 11:20:16 by simonmar]
authorsimonmar <unknown>
Fri, 20 Aug 2004 11:20:17 +0000 (11:20 +0000)
committersimonmar <unknown>
Fri, 20 Aug 2004 11:20:17 +0000 (11:20 +0000)
Give literal string labels a _str suffix, to make it less likely that
they'll clash with a symbol in scope in a C file.

ghc/compiler/cmm/CLabel.hs
ghc/compiler/codeGen/CgUtils.hs
ghc/driver/mangler/ghc-asm.lprl

index ae470ca..81f5eca 100644 (file)
@@ -28,6 +28,7 @@ module CLabel (
        mkAltLabel,
        mkDefaultLabel,
        mkBitmapLabel,
+       mkStringLitLabel,
 
        mkClosureTblLabel,
 
@@ -136,6 +137,9 @@ data CLabel
   | AsmTempLabel 
        {-# UNPACK #-} !Unique
 
+  | StringLitLabel
+       {-# UNPACK #-} !Unique
+
   | ModuleInitLabel 
        Module                  -- the module name
        String                  -- its "way"
@@ -249,6 +253,7 @@ mkReturnInfoLabel uniq              = CaseLabel uniq CaseReturnInfo
 mkAltLabel      uniq tag       = CaseLabel uniq (CaseAlt tag)
 mkDefaultLabel  uniq           = CaseLabel uniq CaseDefault
 
+mkStringLitLabel               = StringLitLabel
 mkAsmTempLabel                         = AsmTempLabel
 
 mkModuleInitLabel              = ModuleInitLabel
@@ -351,6 +356,7 @@ needsCDecl (PlainModuleInitLabel _) = True
 needsCDecl ModuleRegdLabel             = False
 
 needsCDecl (CaseLabel _ _)             = False
+needsCDecl (StringLitLabel _)          = False
 needsCDecl (AsmTempLabel _)            = False
 needsCDecl (RtsLabel _)                        = False
 needsCDecl (ForeignLabel _ _ _)                = False
@@ -372,6 +378,7 @@ isAsmTemp _                    = False
 
 externallyVisibleCLabel :: CLabel -> Bool -- not C "static"
 externallyVisibleCLabel (CaseLabel _ _)           = False
+externallyVisibleCLabel (StringLitLabel _) = False
 externallyVisibleCLabel (AsmTempLabel _)   = False
 externallyVisibleCLabel (ModuleInitLabel _ _)= True
 externallyVisibleCLabel (PlainModuleInitLabel _)= True
@@ -536,6 +543,9 @@ pprAsmCLbl (ForeignLabel fs (Just sz) _)
 pprAsmCLbl lbl
    = pprCLbl lbl
 
+pprCLbl (StringLitLabel u)
+  = pprUnique u <> ptext SLIT("_str")
+
 pprCLbl (CaseLabel u CaseReturnPt)
   = hcat [pprUnique u, ptext SLIT("_ret")]
 pprCLbl (CaseLabel u CaseReturnInfo)
index 9d789be..ffd25eb 100644 (file)
@@ -48,7 +48,7 @@ import MachOp         ( MachRep(..), wordRep, MachOp(..),  MachHint(..),
                          mo_wordULt, machRepByteWidth )
 import ForeignCall     ( CCallConv(..) )
 import Literal         ( Literal(..) )
-import CLabel          ( CLabel, mkAsmTempLabel )
+import CLabel          ( CLabel, mkStringLitLabel )
 import Digraph         ( SCC(..), stronglyConnComp )
 import ListSetOps      ( assocDefault )
 import Util            ( filterOut, sortLe )
@@ -302,7 +302,7 @@ mkStringCLit :: String -> FCode CmmLit
 -- and return its label
 mkStringCLit str 
   = do         { uniq <- newUnique
-       ; let lbl = mkAsmTempLabel uniq
+       ; let lbl = mkStringLitLabel uniq
        ; emitData ReadOnlyData [CmmDataLabel lbl, CmmString str]
        ; return (CmmLabel lbl) }
 
index fbcd934..ec3fe59 100644 (file)
@@ -494,8 +494,8 @@ sub mangle_asm {
            $chkcat[$i]  = 'data';
            $chksymb[$i] = '';
 
-       # Labels beginning "_c": these are literal strings.
-       } elsif ( /^${T_US}_c.*$/ ) {
+       # Labels ending "_str": these are literal strings.
+       } elsif ( /^${T_US}([A-Za-z0-9_]+)_str${T_POST_LBL}$/ ) {
            $chk[++$i]   = $_;
            $chkcat[$i]  = 'rodata';
            $chksymb[$i] = '';