Skip to content
  • Sylvain Henry's avatar
    CmmToC: don't add extern decl to parsed Cmm data · 2636794d
    Sylvain Henry authored and Marge Bot's avatar Marge Bot committed
    Previously, if a .cmm file *not in the RTS* contained something like:
    
    ```cmm
    section "rodata" { msg : bits8[] "Test\n"; }
    ```
    
    It would get compiled by CmmToC into:
    
    ```c
    ERW_(msg);
    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
         ERW_(msg);
              ^
    
    /builds/hsyl20/ghc/_build/install/lib/ghc-8.11.0.20200605/lib/../lib/x86_64-linux-ghc-8.11.0.20200605/rts-1.0/include/Stg.h:253:46: 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).
    2636794d