[RISCV] relaxDwarfCallFrameFragment: remove unneeded relocations for relaxation
authorFangrui Song <i@maskray.me>
Fri, 16 Jun 2023 06:26:25 +0000 (23:26 -0700)
committerFangrui Song <i@maskray.me>
Fri, 16 Jun 2023 06:26:25 +0000 (23:26 -0700)
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.

llvm/lib/MC/MCAssembler.cpp
llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
llvm/test/DebugInfo/RISCV/relax-debug-frame.ll
llvm/test/MC/ELF/RISCV/gen-dwarf.s

index f1853bfe2b92f444639b9e7520fcfe6167c63c9e..69ea337e169789e9aad4783db6a017b15ff39b96 100644 (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();
 }
 
index 68dfb6852631cfb537f843696beee3653f592096..81542b2697d5fe2c6c9393e9a5857f46270059d6 100644 (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;
 
index 557986fa38b5601dd56a8d678d67eb24c31f3372..280da01567a2b9af8a454336066ea9c298ed40d1 100644 (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
index a9e9d2c730bbb763a14cffdf4343fe904bc168ab..c0c8cae61c72bad8cb85e3492cb0cf8b4a239b75 100644 (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