mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-27 05:50:12 +00:00
[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:
parent
07b9e6ed0d
commit
11ebe3d906
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user