summaryrefslogtreecommitdiff
path: root/0004-Backport-MC-LoongArch-Add-AlignFragment-size-if-layout-is-available-and-...
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-18 17:52:37 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-18 17:52:37 +0000
commitfc3df9d7d0ac60faa3bd55068b68a1711f467f3f (patch)
treedbab988e007f32829af4ace1f726c0f0c6c25b4b /0004-Backport-MC-LoongArch-Add-AlignFragment-size-if-layout-is-available-and-not-need-insert-nops.patch
parentc017c1889f2a79f52676011db04bcbf5aba4e177 (diff)
automatic import of llvmopeneuler23.09
Diffstat (limited to '0004-Backport-MC-LoongArch-Add-AlignFragment-size-if-layout-is-available-and-not-need-insert-nops.patch')
-rw-r--r--0004-Backport-MC-LoongArch-Add-AlignFragment-size-if-layout-is-available-and-not-need-insert-nops.patch123
1 files changed, 123 insertions, 0 deletions
diff --git a/0004-Backport-MC-LoongArch-Add-AlignFragment-size-if-layout-is-available-and-not-need-insert-nops.patch b/0004-Backport-MC-LoongArch-Add-AlignFragment-size-if-layout-is-available-and-not-need-insert-nops.patch
new file mode 100644
index 0000000..72b7924
--- /dev/null
+++ b/0004-Backport-MC-LoongArch-Add-AlignFragment-size-if-layout-is-available-and-not-need-insert-nops.patch
@@ -0,0 +1,123 @@
+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
+