UNREG: fix "_bytes" string literal forward declaration
authorSergei Trofimovich <siarheit@google.com>
Sun, 29 Jan 2017 18:39:48 +0000 (18:39 +0000)
committerSergei Trofimovich <siarheit@google.com>
Sun, 29 Jan 2017 18:48:09 +0000 (18:48 +0000)
Typical UNREG build failure looks like that:

  ghc-unreg/includes/Stg.h:226:46: error:
     note: in definition of macro 'EI_'
     #define EI_(X)          extern StgWordArray (X) GNU_ATTRIBUTE(aligned (8))
                                                  ^
      |
  226 | #define EI_(X)          extern StgWordArray (X) GNU_ATTRIBUTE(aligned (8))
      |                                              ^

  /tmp/ghc10489_0/ghc_3.hc:1754:6: error:
     note: previous definition of 'ghczmprim_GHCziTypes_zdtcTyCon2_bytes' was here
     char ghczmprim_GHCziTypes_zdtcTyCon2_bytes[] = "TyCon";
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       |
  1754 | char ghczmprim_GHCziTypes_zdtcTyCon2_bytes[] = "TyCon";
       |      ^

As we see here "_bytes" string literals are defined as 'char []'
array, not 'StgWord []'.

The change special-cases "_bytes" string literals to have
correct declaration type.

Signed-off-by: Sergei Trofimovich <siarheit@google.com>
compiler/cmm/CLabel.hs
compiler/cmm/PprC.hs
includes/Stg.h

index ee87ef1..2f38203 100644 (file)
@@ -89,6 +89,7 @@ module CLabel (
         addLabelSize,
 
         foreignLabelStdcallInfo,
+        isBytesLabel,
         isForeignLabel,
         mkCCLabel, mkCCSLabel,
 
@@ -573,6 +574,11 @@ addLabelSize (ForeignLabel str _ src  fod) sz
 addLabelSize label _
     = label
 
+-- | Whether label is a top-level string literal
+isBytesLabel :: CLabel -> Bool
+isBytesLabel (IdLabel _ _ Bytes) = True
+isBytesLabel _lbl = False
+
 -- | Whether label is a non-haskell label (defined in C code)
 isForeignLabel :: CLabel -> Bool
 isForeignLabel (ForeignLabel _ _ _ _) = True
index 6380451..811d908 100644 (file)
@@ -1007,7 +1007,8 @@ pprExternDecl _in_srt lbl
         hcat [ visibility, label_type lbl,
                lparen, ppr lbl, text ");" ]
  where
-  label_type lbl | isForeignLabel lbl && isCFunctionLabel lbl = text "FF_"
+  label_type lbl | isBytesLabel lbl     = text "B_"
+                 | isForeignLabel lbl && isCFunctionLabel lbl = text "FF_"
                  | isCFunctionLabel lbl = text "F_"
                  | otherwise            = text "I_"
 
index f1949b1..e3de331 100644 (file)
@@ -223,6 +223,7 @@ typedef StgInt    I_;
 typedef StgWord StgWordArray[];
 typedef StgFunPtr       F_;
 
+#define EB_(X)    extern char X[]
 #define EI_(X)          extern StgWordArray (X) GNU_ATTRIBUTE(aligned (8))
 #define II_(X)          static StgWordArray (X) GNU_ATTRIBUTE(aligned (8))
 #define IF_(f)    static StgFunPtr GNUC3_ATTRIBUTE(used) f(void)