Skip to content

[MC][RISCV][LoongArch] Add AlignFragment size if layout is available and not need insert nops #76552

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions llvm/lib/MC/MCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -704,8 +704,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();
Expand Down
27 changes: 27 additions & 0 deletions llvm/test/MC/LoongArch/Misc/cfi-advance.s
Original file line number Diff line number Diff line change
@@ -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
17 changes: 4 additions & 13 deletions llvm/test/MC/LoongArch/Relocations/relax-addsub.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
7 changes: 7 additions & 0 deletions llvm/test/MC/RISCV/cfi-advance.s
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,16 @@

# CHECK: .rela.eh_frame {
# CHECK-NEXT: 0x1C R_RISCV_32_PCREL <null> 0x0
# CHECK-NEXT: 0x35 R_RISCV_SET6 <null> 0x0
# CHECK-NEXT: 0x35 R_RISCV_SUB6 <null> 0x0
# CHECK-NEXT: }
# CHECK-DWARFDUMP: DW_CFA_advance_loc1: 104
# CHECK-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
# CHECK-DWARFDUMP-NEXT: DW_CFA_advance_loc2: 259
# CHECK-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
# CHECK-DWARFDUMP-NEXT: DW_CFA_advance_loc4: 65539
# CHECK-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
# CHECK-DWARFDUMP-NEXT: DW_CFA_advance_loc: 10
# CHECK-DWARFDUMP-NEXT: DW_CFA_def_cfa_offset: +8
.text
.globl test # -- Begin function test
Expand All @@ -28,4 +32,7 @@ test:
.zero 65535, 0x90
.cfi_def_cfa_offset 8
nop
.p2align 3
.cfi_def_cfa_offset 8
nop
.cfi_endproc
28 changes: 28 additions & 0 deletions llvm/test/MC/RISCV/fixups-expr.s
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@

.globl G1
.globl G2
.globl G3
.L1:
G1:
call extern
.L2:
G2:
.p2align 3
.L3:
G3:

.data
.dword .L2-.L1
Expand All @@ -31,6 +35,14 @@ G2:
.half G2-G1
.byte .L2-.L1
.byte G2-G1
.dword .L3-.L2
.dword G3-G2
.word .L3-.L2
.word G3-G2
.half .L3-.L2
.half G3-G2
.byte .L3-.L2
.byte G3-G2
# RELAX: .rela.data {
# RELAX-NEXT: 0x0 R_RISCV_ADD64 .L2 0x0
# RELAX-NEXT: 0x0 R_RISCV_SUB64 .L1 0x0
Expand All @@ -48,4 +60,20 @@ G2:
# RELAX-NEXT: 0x1C R_RISCV_SUB8 .L1 0x0
# RELAX-NEXT: 0x1D R_RISCV_ADD8 G2 0x0
# RELAX-NEXT: 0x1D R_RISCV_SUB8 G1 0x0
# RELAX-NEXT: 0x1E R_RISCV_ADD64 .L3 0x0
# RELAX-NEXT: 0x1E R_RISCV_SUB64 .L2 0x0
# RELAX-NEXT: 0x26 R_RISCV_ADD64 G3 0x0
# RELAX-NEXT: 0x26 R_RISCV_SUB64 G2 0x0
# RELAX-NEXT: 0x2E R_RISCV_ADD32 .L3 0x0
# RELAX-NEXT: 0x2E R_RISCV_SUB32 .L2 0x0
# RELAX-NEXT: 0x32 R_RISCV_ADD32 G3 0x0
# RELAX-NEXT: 0x32 R_RISCV_SUB32 G2 0x0
# RELAX-NEXT: 0x36 R_RISCV_ADD16 .L3 0x0
# RELAX-NEXT: 0x36 R_RISCV_SUB16 .L2 0x0
# RELAX-NEXT: 0x38 R_RISCV_ADD16 G3 0x0
# RELAX-NEXT: 0x38 R_RISCV_SUB16 G2 0x0
# RELAX-NEXT: 0x3A R_RISCV_ADD8 .L3 0x0
# RELAX-NEXT: 0x3A R_RISCV_SUB8 .L2 0x0
# RELAX-NEXT: 0x3B R_RISCV_ADD8 G3 0x0
# RELAX-NEXT: 0x3B R_RISCV_SUB8 G2 0x0
# RELAX-NEXT: }