diff options
author | Zejun Wu <watashi@fb.com> | 2018-10-28 12:22:25 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2018-10-28 13:32:38 -0400 |
commit | 38618f7474d803b1f89cbc3ea50c0a5528484585 (patch) | |
tree | 8c4972df33bda5bc1b0c2b3d80d9c153f3161955 | |
parent | 2e23e1c7de01c92b038e55ce53d11bf9db993dd4 (diff) | |
download | haskell-38618f7474d803b1f89cbc3ea50c0a5528484585.tar.gz |
Fix rare undefined asm temp end label error in x86
Summary:
Encountered assembly error due to undefined label `.LcaDcU_info_end` for
following code generated by `pprFrameProc`:
```
.Lsat_sa8fp{v}_info_fde_end:
.long .Lblock{v caDcU}_info_fde_end-.Lblock{v caDcU}_info_fde
.Lblock{v caDcU}_info_fde:
.long _nbHlD-.Lsection_frame
.quad block{v caDcU}_info-1
.quad .Lblock{v caDcU}_info_end-block{v caDcU}_info+1
.byte 1
```
This diff fixed the error.
Test Plan:
./validate
Also the case where we used to have assembly error is now fixed.
Unfortunately, I have limited insight here and cannot get a small enough repro
or test case for this.
Ben says:
> I think I see: Previously we only produced end symbols for the info
> tables of top-level procedures. However, blocks within a procedure may
> also have info tables, we will dutifully generate debug information for
> and consequently we get undefined symbols.
Reviewers: simonmar, scpmw, last_g, bgamari
Reviewed By: bgamari
Subscribers: rwbarton, carter
Differential Revision: https://phabricator.haskell.org/D5246
(cherry picked from commit cf961dcf5ebc26cbd960196ba387736334088303)
-rw-r--r-- | compiler/nativeGen/X86/Ppr.hs | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/compiler/nativeGen/X86/Ppr.hs b/compiler/nativeGen/X86/Ppr.hs index c5fbeb544e..287ba031db 100644 --- a/compiler/nativeGen/X86/Ppr.hs +++ b/compiler/nativeGen/X86/Ppr.hs @@ -115,8 +115,6 @@ pprNatCmmDecl proc@(CmmProc top_info lbl _ (ListGraph blocks)) = <+> char '-' <+> ppr (mkDeadStripPreventer info_lbl) else empty) $$ - (if debugLevel dflags > 0 - then ppr (mkAsmTempEndLabel info_lbl) <> char ':' else empty) $$ pprSizeDecl info_lbl -- | Output the ELF .size directive. @@ -130,20 +128,23 @@ pprSizeDecl lbl pprBasicBlock :: LabelMap CmmStatics -> NatBasicBlock Instr -> SDoc pprBasicBlock info_env (BasicBlock blockid instrs) = sdocWithDynFlags $ \dflags -> - maybe_infotable $$ + maybe_infotable dflags $ pprLabel asmLbl $$ vcat (map pprInstr instrs) $$ (if debugLevel dflags > 0 then ppr (mkAsmTempEndLabel asmLbl) <> char ':' else empty) where asmLbl = blockLbl blockid - maybe_infotable = case mapLookup blockid info_env of - Nothing -> empty - Just (Statics info_lbl info) -> + maybe_infotable dflags c = case mapLookup blockid info_env of + Nothing -> c + Just (Statics infoLbl info) -> pprAlignForSection Text $$ infoTableLoc $$ vcat (map pprData info) $$ - pprLabel info_lbl + pprLabel infoLbl $$ + c $$ + (if debugLevel dflags > 0 + then ppr (mkAsmTempEndLabel infoLbl) <> char ':' else empty) -- Make sure the info table has the right .loc for the block -- coming right after it. See [Note: Info Offset] infoTableLoc = case instrs of |