[RISCV] relaxDwarfCallFrameFragment: remove unneeded relocations for relaxation

If `evaluateAsAbsolute(Value, Layout.getAssembler())` returns true, we
know the address delta is a constant and can suppress relocations
(usually SET6/SUB6).

While here, replace two evaluateKnownAbsolute calls (subtle; avoid if possible)
with evaluateAsAbsolute.
This commit is contained in:
Fangrui Song 2023-06-15 23:26:25 -07:00
parent 07b9e6ed0d
commit 11ebe3d906
4 changed files with 32 additions and 18 deletions

View File

@ -1110,16 +1110,17 @@ bool MCAssembler::relaxDwarfCallFrameFragment(MCAsmLayout &Layout,
return WasRelaxed;
MCContext &Context = Layout.getAssembler().getContext();
uint64_t OldSize = DF.getContents().size();
int64_t AddrDelta;
bool Abs = DF.getAddrDelta().evaluateKnownAbsolute(AddrDelta, Layout);
assert(Abs && "We created call frame with an invalid expression");
(void) Abs;
int64_t Value;
bool Abs = DF.getAddrDelta().evaluateAsAbsolute(Value, Layout);
assert(Abs && "CFA with invalid expression");
(void)Abs;
SmallVectorImpl<char> &Data = DF.getContents();
uint64_t OldSize = Data.size();
Data.clear();
DF.getFixups().clear();
MCDwarfFrameEmitter::encodeAdvanceLoc(Context, AddrDelta, Data);
MCDwarfFrameEmitter::encodeAdvanceLoc(Context, Value, Data);
return OldSize != Data.size();
}

View File

@ -273,14 +273,15 @@ bool RISCVAsmBackend::relaxDwarfLineAddr(MCDwarfLineAddrFragment &DF,
bool RISCVAsmBackend::relaxDwarfCFA(MCDwarfCallFrameFragment &DF,
MCAsmLayout &Layout,
bool &WasRelaxed) const {
const MCExpr &AddrDelta = DF.getAddrDelta();
SmallVectorImpl<char> &Data = DF.getContents();
SmallVectorImpl<MCFixup> &Fixups = DF.getFixups();
size_t OldSize = Data.size();
int64_t Value;
bool IsAbsolute = AddrDelta.evaluateKnownAbsolute(Value, Layout);
if (AddrDelta.evaluateAsAbsolute(Value, Layout.getAssembler()))
return false;
bool IsAbsolute = AddrDelta.evaluateAsAbsolute(Value, Layout);
assert(IsAbsolute && "CFA with invalid expression");
(void)IsAbsolute;

View File

@ -7,15 +7,29 @@
; RELAX-NEXT: 0x1C R_RISCV_32_PCREL - 0x0
; RELAX-NEXT: 0x20 R_RISCV_ADD32 - 0x0
; RELAX-NEXT: 0x20 R_RISCV_SUB32 - 0x0
; RELAX-NOT: }
; RELAX: 0x39 R_RISCV_SET6 - 0x0
; RELAX-NEXT: 0x39 R_RISCV_SUB6 - 0x0
;
; RELAX-NEXT: 0x30 R_RISCV_32_PCREL - 0x0
; RELAX-NEXT: 0x34 R_RISCV_ADD32 - 0x0
; RELAX-NEXT: 0x34 R_RISCV_SUB32 - 0x0
; RELAX-NEXT: 0x44 R_RISCV_32_PCREL - 0x0
; RELAX-NEXT: 0x48 R_RISCV_ADD32 - 0x0
; RELAX-NEXT: 0x48 R_RISCV_SUB32 - 0x0
; RELAX-NEXT: }
; RELAX-DWARFDUMP-NOT: error: failed to compute relocation
; RELAX-DWARFDUMP: CIE
; RELAX-DWARFDUMP: DW_CFA_advance_loc
; RELAX-DWARFDUMP: DW_CFA_def_cfa_offset
; RELAX-DWARFDUMP: DW_CFA_offset
; RELAX-DWARFDUMP: FDE
; RELAX-DWARFDUMP-NEXT: Format:
; RELAX-DWARFDUMP: DW_CFA_advance_loc: 4
; RELAX-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +16
; RELAX-DWARFDUMP-EMPTY:
; RELAX-DWARFDUMP: FDE
; RELAX-DWARFDUMP: Format:
; RELAX-DWARFDUMP-NEXT: DW_CFA_advance_loc: 4
; RELAX-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +16
; RELAX-DWARFDUMP-NEXT: DW_CFA_advance_loc: 4
; RELAX-DWARFDUMP-NEXT: DW_CFA_offset: X1 -4
; RELAX-DWARFDUMP-NEXT: DW_CFA_nop
; RELAX-DWARFDUMP-EMPTY:
source_filename = "frame.c"
; Function Attrs: noinline nounwind optnone

View File

@ -45,8 +45,6 @@
# RELOC-NEXT: 0x20 R_RISCV_SUB32 - 0x0
# RELOC-NEXT: 0x25 R_RISCV_SET6 - 0x0
# RELOC-NEXT: 0x25 R_RISCV_SUB6 - 0x0
# RELOC-NEXT: 0x28 R_RISCV_SET6 - 0x0
# RELOC-NEXT: 0x28 R_RISCV_SUB6 - 0x0
# RELOC-NEXT: 0x34 R_RISCV_32_PCREL - 0x0
# RELOC-NEXT: 0x38 R_RISCV_ADD32 - 0x0
# RELOC-NEXT: 0x38 R_RISCV_SUB32 - 0x0