CmmToC: don't add extern decl to parsed Cmm data
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).
parent
54b595c1
No related branches found
No related tags found
Showing
- compiler/GHC/Cmm/CLabel.hs 95 additions, 63 deletionscompiler/GHC/Cmm/CLabel.hs
- compiler/GHC/Cmm/Parser.y 2 additions, 2 deletionscompiler/GHC/Cmm/Parser.y
- compiler/GHC/StgToCmm/Prof.hs 1 addition, 1 deletioncompiler/GHC/StgToCmm/Prof.hs
- compiler/GHC/StgToCmm/Ticky.hs 7 additions, 8 deletionscompiler/GHC/StgToCmm/Ticky.hs
- testsuite/tests/codeGen/should_run/all.T 1 addition, 2 deletionstestsuite/tests/codeGen/should_run/all.T
Loading