124 lines
4.7 KiB
Diff
124 lines
4.7 KiB
Diff
|
|
From be6e5c566f49bee5efe3d710bdd321e15d8d95ea Mon Sep 17 00:00:00 2001
|
||
|
|
From: Jinyang He <hejinyang@loongson.cn>
|
||
|
|
Date: Thu, 14 Mar 2024 12:10:50 +0800
|
||
|
|
Subject: [PATCH 05/14] [MC][LoongArch] Add AlignFragment size if layout is
|
||
|
|
available and not need insert nops (#76552)
|
||
|
|
|
||
|
|
Due to delayed decision for ADD/SUB relocations, RISCV and LoongArch may
|
||
|
|
go slow fragment walk path with available layout. When RISCV (or
|
||
|
|
LoongArch in the future) don't need insert nops, that means relax is
|
||
|
|
disabled. With available layout and not needing insert nops, the size of
|
||
|
|
AlignFragment should be a constant. So we can add it to Displacement for
|
||
|
|
folding A-B.
|
||
|
|
|
||
|
|
(cherry picked from commit 0731567a31e4ade97c27801045156a88c4589704)
|
||
|
|
Change-Id: I554d6766bd7f688204e956e4a6431574b4c511c9
|
||
|
|
---
|
||
|
|
llvm/lib/MC/MCExpr.cpp | 6 +++++
|
||
|
|
llvm/test/MC/LoongArch/Misc/cfi-advance.s | 27 +++++++++++++++++++
|
||
|
|
.../MC/LoongArch/Relocations/relax-addsub.s | 17 +++---------
|
||
|
|
3 files changed, 37 insertions(+), 13 deletions(-)
|
||
|
|
create mode 100644 llvm/test/MC/LoongArch/Misc/cfi-advance.s
|
||
|
|
|
||
|
|
diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp
|
||
|
|
index 5a6596f93824..a561fed11179 100644
|
||
|
|
--- a/llvm/lib/MC/MCExpr.cpp
|
||
|
|
+++ b/llvm/lib/MC/MCExpr.cpp
|
||
|
|
@@ -707,8 +707,14 @@ static void AttemptToFoldSymbolOffsetDifference(
|
||
|
|
}
|
||
|
|
|
||
|
|
int64_t Num;
|
||
|
|
+ unsigned Count;
|
||
|
|
if (DF) {
|
||
|
|
Displacement += DF->getContents().size();
|
||
|
|
+ } else if (auto *AF = dyn_cast<MCAlignFragment>(FI);
|
||
|
|
+ AF && Layout &&
|
||
|
|
+ !Asm->getBackend().shouldInsertExtraNopBytesForCodeAlign(
|
||
|
|
+ *AF, Count)) {
|
||
|
|
+ Displacement += Asm->computeFragmentSize(*Layout, *AF);
|
||
|
|
} else if (auto *FF = dyn_cast<MCFillFragment>(FI);
|
||
|
|
FF && FF->getNumValues().evaluateAsAbsolute(Num)) {
|
||
|
|
Displacement += Num * FF->getValueSize();
|
||
|
|
diff --git a/llvm/test/MC/LoongArch/Misc/cfi-advance.s b/llvm/test/MC/LoongArch/Misc/cfi-advance.s
|
||
|
|
new file mode 100644
|
||
|
|
index 000000000000..662c43e6bcea
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/llvm/test/MC/LoongArch/Misc/cfi-advance.s
|
||
|
|
@@ -0,0 +1,27 @@
|
||
|
|
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 -mattr=-relax %s -o %t.o
|
||
|
|
+# RUN: llvm-readobj -r %t.o | FileCheck --check-prefix=RELOC %s
|
||
|
|
+# RUN: llvm-dwarfdump --debug-frame %t.o | FileCheck --check-prefix=DWARFDUMP %s
|
||
|
|
+
|
||
|
|
+# RELOC: Relocations [
|
||
|
|
+# RELOC-NEXT: .rela.eh_frame {
|
||
|
|
+# RELOC-NEXT: 0x1C R_LARCH_32_PCREL .text 0x0
|
||
|
|
+# RELOC-NEXT: }
|
||
|
|
+# RELOC-NEXT: ]
|
||
|
|
+# DWARFDUMP: DW_CFA_advance_loc: 4
|
||
|
|
+# DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
|
||
|
|
+# DWARFDUMP-NEXT: DW_CFA_advance_loc: 8
|
||
|
|
+# DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
|
||
|
|
+
|
||
|
|
+ .text
|
||
|
|
+ .globl test
|
||
|
|
+ .p2align 2
|
||
|
|
+ .type test,@function
|
||
|
|
+test:
|
||
|
|
+ .cfi_startproc
|
||
|
|
+ nop
|
||
|
|
+ .cfi_def_cfa_offset 8
|
||
|
|
+ .p2align 3
|
||
|
|
+ nop
|
||
|
|
+ .cfi_def_cfa_offset 8
|
||
|
|
+ nop
|
||
|
|
+ .cfi_endproc
|
||
|
|
diff --git a/llvm/test/MC/LoongArch/Relocations/relax-addsub.s b/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
|
||
|
|
index c4454f5bb98d..14922657ae89 100644
|
||
|
|
--- a/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
|
||
|
|
+++ b/llvm/test/MC/LoongArch/Relocations/relax-addsub.s
|
||
|
|
@@ -23,14 +23,6 @@
|
||
|
|
# RELAX-NEXT: 0x14 R_LARCH_RELAX - 0x0
|
||
|
|
# RELAX-NEXT: }
|
||
|
|
# RELAX-NEXT: Section ({{.*}}) .rela.data {
|
||
|
|
-# RELAX-NEXT: 0xF R_LARCH_ADD8 .L3 0x0
|
||
|
|
-# RELAX-NEXT: 0xF R_LARCH_SUB8 .L2 0x0
|
||
|
|
-# RELAX-NEXT: 0x10 R_LARCH_ADD16 .L3 0x0
|
||
|
|
-# RELAX-NEXT: 0x10 R_LARCH_SUB16 .L2 0x0
|
||
|
|
-# RELAX-NEXT: 0x12 R_LARCH_ADD32 .L3 0x0
|
||
|
|
-# RELAX-NEXT: 0x12 R_LARCH_SUB32 .L2 0x0
|
||
|
|
-# RELAX-NEXT: 0x16 R_LARCH_ADD64 .L3 0x0
|
||
|
|
-# RELAX-NEXT: 0x16 R_LARCH_SUB64 .L2 0x0
|
||
|
|
# RELAX-NEXT: 0x1E R_LARCH_ADD8 .L4 0x0
|
||
|
|
# RELAX-NEXT: 0x1E R_LARCH_SUB8 .L3 0x0
|
||
|
|
# RELAX-NEXT: 0x1F R_LARCH_ADD16 .L4 0x0
|
||
|
|
@@ -43,8 +35,8 @@
|
||
|
|
# RELAX-NEXT: ]
|
||
|
|
|
||
|
|
# RELAX: Hex dump of section '.data':
|
||
|
|
-# RELAX-NEXT: 0x00000000 04040004 00000004 00000000 00000000
|
||
|
|
-# RELAX-NEXT: 0x00000010 00000000 00000000 00000000 00000000
|
||
|
|
+# RELAX-NEXT: 0x00000000 04040004 00000004 00000000 0000000c
|
||
|
|
+# RELAX-NEXT: 0x00000010 0c000c00 00000c00 00000000 00000000
|
||
|
|
# RELAX-NEXT: 0x00000020 00000000 00000000 00000000 00
|
||
|
|
|
||
|
|
.text
|
||
|
|
@@ -63,13 +55,12 @@
|
||
|
|
.short .L2 - .L1
|
||
|
|
.word .L2 - .L1
|
||
|
|
.dword .L2 - .L1
|
||
|
|
-## With relaxation, emit relocs because of the .align making the diff variable.
|
||
|
|
-## TODO Handle alignment directive. Why they emit relocs now? They returns
|
||
|
|
-## without folding symbols offset in AttemptToFoldSymbolOffsetDifference().
|
||
|
|
+## TODO Handle alignment directive.
|
||
|
|
.byte .L3 - .L2
|
||
|
|
.short .L3 - .L2
|
||
|
|
.word .L3 - .L2
|
||
|
|
.dword .L3 - .L2
|
||
|
|
+## With relaxation, emit relocs because the la.pcrel makes the diff variable.
|
||
|
|
.byte .L4 - .L3
|
||
|
|
.short .L4 - .L3
|
||
|
|
.word .L4 - .L3
|
||
|
|
--
|
||
|
|
2.20.1
|
||
|
|
|