From 34a0205587c8c6017a26ddf7023e91789da2e81b Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich Date: Sun, 29 Jan 2017 18:39:48 +0000 Subject: UNREG: fix "_bytes" string literal forward declaration 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 --- compiler/cmm/CLabel.hs | 6 ++++++ compiler/cmm/PprC.hs | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'compiler/cmm') diff --git a/compiler/cmm/CLabel.hs b/compiler/cmm/CLabel.hs index ee87ef1b37..2f382039be 100644 --- a/compiler/cmm/CLabel.hs +++ b/compiler/cmm/CLabel.hs @@ -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 diff --git a/compiler/cmm/PprC.hs b/compiler/cmm/PprC.hs index 6380451cc9..811d9083f3 100644 --- a/compiler/cmm/PprC.hs +++ b/compiler/cmm/PprC.hs @@ -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_" -- cgit v1.2.1