• Sylvain Henry's avatar
    CmmToC: don't add extern decl to parsed Cmm data · 2636794d
    Sylvain Henry authored
    Previously, if a .cmm file *not in the RTS* contained something like:
    section "rodata" { msg : bits8[] "Test\n"; }
    It would get compiled by CmmToC into:
    const char msg[] = "Test\012";
    and fail with:
    /tmp/ghc32129_0/ghc_4.hc:5:12: error:
         error: conflicting types for \u2018msg\u2019
         const char msg[] = "Test\012";
    In file included from /tmp/ghc32129_0/ghc_4.hc:3:0: error:
    /tmp/ghc32129_0/ghc_4.hc:4:6: error:
         note: previous declaration of \u2018msg\u2019 was here
    /builds/hsyl20/ghc/_build/install/lib/ghc- error:
         note: in definition of macro \u2018ERW_\u2019
         #define ERW_(X)   extern       StgWordArray (X)
    See the rationale for this on https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/compiler/backends/ppr-c#prototypes
    Now we don't generate these extern declarations (ERW_, etc.) for
    top-level data. It shouldn't change anything for the RTS (the only place
    we use .cmm files) as it is already special cased in
    `GHC.Cmm.CLabel.needsCDecl`. And hand-written Cmm can use explicit
    extern declarations when needed.
    Note that it allows `cgrun069` test to pass with CmmToC (cf #15467).
Code owners : Ömer Sinan Ağacan and Simon Marlow
Parser.y 55.9 KB