Skip to content

Commit 0731567

Browse files
authored
[MC][RISCV][LoongArch] Add AlignFragment size if layout is available and not need insert nops (llvm#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.
1 parent 7d81e07 commit 0731567

File tree

5 files changed

+72
-13
lines changed

5 files changed

+72
-13
lines changed

llvm/lib/MC/MCExpr.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,8 +704,14 @@ static void AttemptToFoldSymbolOffsetDifference(
704704
}
705705

706706
int64_t Num;
707+
unsigned Count;
707708
if (DF) {
708709
Displacement += DF->getContents().size();
710+
} else if (auto *AF = dyn_cast<MCAlignFragment>(FI);
711+
AF && Layout &&
712+
!Asm->getBackend().shouldInsertExtraNopBytesForCodeAlign(
713+
*AF, Count)) {
714+
Displacement += Asm->computeFragmentSize(*Layout, *AF);
709715
} else if (auto *FF = dyn_cast<MCFillFragment>(FI);
710716
FF && FF->getNumValues().evaluateAsAbsolute(Num)) {
711717
Displacement += Num * FF->getValueSize();
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# RUN: llvm-mc --filetype=obj --triple=loongarch64 -mattr=-relax %s -o %t.o
2+
# RUN: llvm-readobj -r %t.o | FileCheck --check-prefix=RELOC %s
3+
# RUN: llvm-dwarfdump --debug-frame %t.o | FileCheck --check-prefix=DWARFDUMP %s
4+
5+
# RELOC: Relocations [
6+
# RELOC-NEXT: .rela.eh_frame {
7+
# RELOC-NEXT: 0x1C R_LARCH_32_PCREL .text 0x0
8+
# RELOC-NEXT: }
9+
# RELOC-NEXT: ]
10+
# DWARFDUMP: DW_CFA_advance_loc: 4
11+
# DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
12+
# DWARFDUMP-NEXT: DW_CFA_advance_loc: 8
13+
# DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
14+
15+
.text
16+
.globl test
17+
.p2align 2
18+
.type test,@function
19+
test:
20+
.cfi_startproc
21+
nop
22+
.cfi_def_cfa_offset 8
23+
.p2align 3
24+
nop
25+
.cfi_def_cfa_offset 8
26+
nop
27+
.cfi_endproc

llvm/test/MC/LoongArch/Relocations/relax-addsub.s

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,6 @@
2323
# RELAX-NEXT: 0x14 R_LARCH_RELAX - 0x0
2424
# RELAX-NEXT: }
2525
# RELAX-NEXT: Section ({{.*}}) .rela.data {
26-
# RELAX-NEXT: 0xF R_LARCH_ADD8 .L3 0x0
27-
# RELAX-NEXT: 0xF R_LARCH_SUB8 .L2 0x0
28-
# RELAX-NEXT: 0x10 R_LARCH_ADD16 .L3 0x0
29-
# RELAX-NEXT: 0x10 R_LARCH_SUB16 .L2 0x0
30-
# RELAX-NEXT: 0x12 R_LARCH_ADD32 .L3 0x0
31-
# RELAX-NEXT: 0x12 R_LARCH_SUB32 .L2 0x0
32-
# RELAX-NEXT: 0x16 R_LARCH_ADD64 .L3 0x0
33-
# RELAX-NEXT: 0x16 R_LARCH_SUB64 .L2 0x0
3426
# RELAX-NEXT: 0x1E R_LARCH_ADD8 .L4 0x0
3527
# RELAX-NEXT: 0x1E R_LARCH_SUB8 .L3 0x0
3628
# RELAX-NEXT: 0x1F R_LARCH_ADD16 .L4 0x0
@@ -43,8 +35,8 @@
4335
# RELAX-NEXT: ]
4436

4537
# RELAX: Hex dump of section '.data':
46-
# RELAX-NEXT: 0x00000000 04040004 00000004 00000000 00000000
47-
# RELAX-NEXT: 0x00000010 00000000 00000000 00000000 00000000
38+
# RELAX-NEXT: 0x00000000 04040004 00000004 00000000 0000000c
39+
# RELAX-NEXT: 0x00000010 0c000c00 00000c00 00000000 00000000
4840
# RELAX-NEXT: 0x00000020 00000000 00000000 00000000 00
4941

5042
.text
@@ -63,13 +55,12 @@
6355
.short .L2 - .L1
6456
.word .L2 - .L1
6557
.dword .L2 - .L1
66-
## With relaxation, emit relocs because of the .align making the diff variable.
67-
## TODO Handle alignment directive. Why they emit relocs now? They returns
68-
## without folding symbols offset in AttemptToFoldSymbolOffsetDifference().
58+
## TODO Handle alignment directive.
6959
.byte .L3 - .L2
7060
.short .L3 - .L2
7161
.word .L3 - .L2
7262
.dword .L3 - .L2
63+
## With relaxation, emit relocs because the la.pcrel makes the diff variable.
7364
.byte .L4 - .L3
7465
.short .L4 - .L3
7566
.word .L4 - .L3

llvm/test/MC/RISCV/cfi-advance.s

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55

66
# CHECK: .rela.eh_frame {
77
# CHECK-NEXT: 0x1C R_RISCV_32_PCREL <null> 0x0
8+
# CHECK-NEXT: 0x35 R_RISCV_SET6 <null> 0x0
9+
# CHECK-NEXT: 0x35 R_RISCV_SUB6 <null> 0x0
810
# CHECK-NEXT: }
911
# CHECK-DWARFDUMP: DW_CFA_advance_loc1: 104
1012
# CHECK-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
1113
# CHECK-DWARFDUMP-NEXT: DW_CFA_advance_loc2: 259
1214
# CHECK-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
1315
# CHECK-DWARFDUMP-NEXT: DW_CFA_advance_loc4: 65539
16+
# CHECK-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
17+
# CHECK-DWARFDUMP-NEXT: DW_CFA_advance_loc: 10
1418
# CHECK-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
1519
.text
1620
.globl test # -- Begin function test
@@ -28,4 +32,7 @@ test:
2832
.zero 65535, 0x90
2933
.cfi_def_cfa_offset 8
3034
nop
35+
.p2align 3
36+
.cfi_def_cfa_offset 8
37+
nop
3138
.cfi_endproc

llvm/test/MC/RISCV/fixups-expr.s

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@
1616

1717
.globl G1
1818
.globl G2
19+
.globl G3
1920
.L1:
2021
G1:
2122
call extern
2223
.L2:
2324
G2:
25+
.p2align 3
26+
.L3:
27+
G3:
2428

2529
.data
2630
.dword .L2-.L1
@@ -31,6 +35,14 @@ G2:
3135
.half G2-G1
3236
.byte .L2-.L1
3337
.byte G2-G1
38+
.dword .L3-.L2
39+
.dword G3-G2
40+
.word .L3-.L2
41+
.word G3-G2
42+
.half .L3-.L2
43+
.half G3-G2
44+
.byte .L3-.L2
45+
.byte G3-G2
3446
# RELAX: .rela.data {
3547
# RELAX-NEXT: 0x0 R_RISCV_ADD64 .L2 0x0
3648
# RELAX-NEXT: 0x0 R_RISCV_SUB64 .L1 0x0
@@ -48,4 +60,20 @@ G2:
4860
# RELAX-NEXT: 0x1C R_RISCV_SUB8 .L1 0x0
4961
# RELAX-NEXT: 0x1D R_RISCV_ADD8 G2 0x0
5062
# RELAX-NEXT: 0x1D R_RISCV_SUB8 G1 0x0
63+
# RELAX-NEXT: 0x1E R_RISCV_ADD64 .L3 0x0
64+
# RELAX-NEXT: 0x1E R_RISCV_SUB64 .L2 0x0
65+
# RELAX-NEXT: 0x26 R_RISCV_ADD64 G3 0x0
66+
# RELAX-NEXT: 0x26 R_RISCV_SUB64 G2 0x0
67+
# RELAX-NEXT: 0x2E R_RISCV_ADD32 .L3 0x0
68+
# RELAX-NEXT: 0x2E R_RISCV_SUB32 .L2 0x0
69+
# RELAX-NEXT: 0x32 R_RISCV_ADD32 G3 0x0
70+
# RELAX-NEXT: 0x32 R_RISCV_SUB32 G2 0x0
71+
# RELAX-NEXT: 0x36 R_RISCV_ADD16 .L3 0x0
72+
# RELAX-NEXT: 0x36 R_RISCV_SUB16 .L2 0x0
73+
# RELAX-NEXT: 0x38 R_RISCV_ADD16 G3 0x0
74+
# RELAX-NEXT: 0x38 R_RISCV_SUB16 G2 0x0
75+
# RELAX-NEXT: 0x3A R_RISCV_ADD8 .L3 0x0
76+
# RELAX-NEXT: 0x3A R_RISCV_SUB8 .L2 0x0
77+
# RELAX-NEXT: 0x3B R_RISCV_ADD8 G3 0x0
78+
# RELAX-NEXT: 0x3B R_RISCV_SUB8 G2 0x0
5179
# RELAX-NEXT: }

0 commit comments

Comments
 (0)