Skip to content

Commit 9b83bfa

Browse files
committed
[LoongArch] Always emit symbol-based relocations regardless of relaxation
This commit changes all relocations to be relocated with symbols. Without this commit, errors may occur in some cases, such as when using `llc`, `lto+relax`, or combining relaxed and norelaxed object files using `ld -r`. Some tests updated.
1 parent 1c49935 commit 9b83bfa

File tree

11 files changed

+72
-104
lines changed

11 files changed

+72
-104
lines changed

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchAsmBackend.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,8 +498,7 @@ bool LoongArchAsmBackend::addReloc(const MCFragment &F, const MCFixup &Fixup,
498498

499499
std::unique_ptr<MCObjectTargetWriter>
500500
LoongArchAsmBackend::createObjectTargetWriter() const {
501-
return createLoongArchELFObjectWriter(
502-
OSABI, Is64Bit, STI.hasFeature(LoongArch::FeatureRelax));
501+
return createLoongArchELFObjectWriter(OSABI, Is64Bit);
503502
}
504503

505504
MCAsmBackend *llvm::createLoongArchAsmBackend(const Target &T,

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,23 @@ using namespace llvm;
2121
namespace {
2222
class LoongArchELFObjectWriter : public MCELFObjectTargetWriter {
2323
public:
24-
LoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit, bool EnableRelax);
24+
LoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit);
2525

2626
~LoongArchELFObjectWriter() override;
2727

2828
bool needsRelocateWithSymbol(const MCValue &, unsigned Type) const override {
29-
return EnableRelax;
29+
return true;
3030
}
3131

3232
protected:
3333
unsigned getRelocType(const MCFixup &, const MCValue &,
3434
bool IsPCRel) const override;
35-
bool EnableRelax;
3635
};
3736
} // end namespace
3837

39-
LoongArchELFObjectWriter::LoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit,
40-
bool EnableRelax)
38+
LoongArchELFObjectWriter::LoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit)
4139
: MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_LOONGARCH,
42-
/*HasRelocationAddend=*/true),
43-
EnableRelax(EnableRelax) {}
40+
/*HasRelocationAddend=*/true) {}
4441

4542
LoongArchELFObjectWriter::~LoongArchELFObjectWriter() {}
4643

@@ -103,6 +100,6 @@ unsigned LoongArchELFObjectWriter::getRelocType(const MCFixup &Fixup,
103100
}
104101

105102
std::unique_ptr<MCObjectTargetWriter>
106-
llvm::createLoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit, bool Relax) {
107-
return std::make_unique<LoongArchELFObjectWriter>(OSABI, Is64Bit, Relax);
103+
llvm::createLoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit) {
104+
return std::make_unique<LoongArchELFObjectWriter>(OSABI, Is64Bit);
108105
}

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ MCAsmBackend *createLoongArchAsmBackend(const Target &T,
3636
const MCTargetOptions &Options);
3737

3838
std::unique_ptr<MCObjectTargetWriter>
39-
createLoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit, bool Relax);
39+
createLoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit);
4040

4141
} // end namespace llvm
4242

llvm/test/CodeGen/LoongArch/linker-relaxation.ll

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; RUN: llc --mtriple=loongarch64 --filetype=obj -mattr=-relax \
22
; RUN: --relocation-model=pic --code-model=medium < %s \
3-
; RUN: | llvm-readobj -r - | FileCheck --check-prefixes=CHECK-RELOC,PCALA-RELOC %s
3+
; RUN: | llvm-readobj -r - | FileCheck --check-prefix=CHECK-RELOC %s
44
; RUN: llc --mtriple=loongarch64 --filetype=obj -mattr=+relax \
55
; RUN: --relocation-model=pic --code-model=medium < %s \
66
; RUN: | llvm-readobj -r - | FileCheck --check-prefixes=CHECK-RELOC,RELAX %s
@@ -35,10 +35,8 @@ define ptr @caller() nounwind {
3535
; RELAX-NEXT: R_LARCH_RELAX - 0x0
3636
; CHECK-RELOC-NEXT: R_LARCH_GOT_PC_LO12 g_e 0x0
3737
; RELAX-NEXT: R_LARCH_RELAX - 0x0
38-
; PCALA-RELOC: R_LARCH_PCALA_HI20 .bss 0x0
39-
; RELAX-NEXT: R_LARCH_PCALA_HI20 g_i 0x0
40-
; PCALA-RELOC: R_LARCH_PCALA_LO12 .bss 0x0
41-
; RELAX-NEXT: R_LARCH_PCALA_LO12 g_i 0x0
38+
; CHECK-RELOC-NEXT: R_LARCH_PCALA_HI20 g_i 0x0
39+
; CHECK-RELOC-NEXT: R_LARCH_PCALA_LO12 g_i 0x0
4240
; CHECK-RELOC: R_LARCH_TLS_GD_PC_HI20 t_un 0x0
4341
; RELAX-NEXT: R_LARCH_RELAX - 0x0
4442
; CHECK-RELOC-NEXT: R_LARCH_GOT_PC_LO12 t_un 0x0
@@ -83,11 +81,9 @@ define ptr @caller() nounwind {
8381
; RELAX-NEXT: R_LARCH_RELAX - 0x0
8482
; CHECK-RELOC-NEXT: R_LARCH_CALL36 callee3 0x0
8583
; RELAX-NEXT: R_LARCH_RELAX - 0x0
86-
; PCALA-RELOC: R_LARCH_PCALA_HI20 .data 0x0
87-
; RELAX-NEXT: R_LARCH_PCALA_HI20 g_i1 0x0
84+
; CHECK-RELOC-NEXT: R_LARCH_PCALA_HI20 g_i1 0x0
8885
; RELAX-NEXT: R_LARCH_RELAX - 0x0
89-
; PCALA-RELOC: R_LARCH_PCALA_LO12 .data 0x0
90-
; RELAX-NEXT: R_LARCH_PCALA_LO12 g_i1 0x0
86+
; CHECK-RELOC-NEXT: R_LARCH_PCALA_LO12 g_i1 0x0
9187
; RELAX-NEXT: R_LARCH_RELAX - 0x0
9288
%a = load volatile i32, ptr @g_e
9389
%b = load volatile i32, ptr @g_i

llvm/test/CodeGen/LoongArch/xray-attribute-instrumentation.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ define i32 @foo() nounwind noinline uwtable "function-instrument"="xray-always"
4343
; CHECK-NEXT: .dword 2
4444

4545
; RELOC: Section ([[#]]) .relaxray_instr_map {
46-
; RELOC-NEXT: 0x0 R_LARCH_64_PCREL .text 0x0
47-
; RELOC-NEXT: 0x8 R_LARCH_64_PCREL .text 0x0
48-
; RELOC-NEXT: 0x20 R_LARCH_64_PCREL .text 0x34
49-
; RELOC-NEXT: 0x28 R_LARCH_64_PCREL .text 0x0
46+
; RELOC-NEXT: 0x0 R_LARCH_64_PCREL .L{{.*}} 0x0
47+
; RELOC-NEXT: 0x8 R_LARCH_64_PCREL .L{{.*}} 0x0
48+
; RELOC-NEXT: 0x20 R_LARCH_64_PCREL .L{{.*}} 0x0
49+
; RELOC-NEXT: 0x28 R_LARCH_64_PCREL .L{{.*}} 0x0
5050
; RELOC-NEXT: }
5151
; RELOC-NEXT: Section ([[#]]) .relaxray_fn_idx {
52-
; RELOC-NEXT: 0x0 R_LARCH_64_PCREL xray_instr_map 0x0
52+
; RELOC-NEXT: 0x0 R_LARCH_64_PCREL .Lxray_sleds_start0 0x0
5353
; RELOC-NEXT: }
5454
; RELOC-NEXT: Section ([[#]]) .rela.eh_frame {
55-
; RELOC-NEXT: 0x1C R_LARCH_32_PCREL .text 0x0
55+
; RELOC-NEXT: 0x1C R_LARCH_32_PCREL .L{{.*}} 0x0
5656
; RELOC-NEXT: }

llvm/test/MC/LoongArch/Misc/cfi-advance.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
# RELOC: Relocations [
88
# RELOC-NEXT: .rela.eh_frame {
9-
# RELOC-NEXT: 0x1C R_LARCH_32_PCREL .text 0x0
9+
# RELOC-NEXT: 0x1C R_LARCH_32_PCREL .L{{.*}} 0x0
1010
# RELOC-NEXT: }
1111
# RELOC-NEXT: ]
1212
# DWARFDUMP: DW_CFA_advance_loc: 4
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=-relax < %s \
22
# RUN: | llvm-readobj -r - | FileCheck %s
33
# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax < %s \
4-
# RUN: | llvm-readobj -r - | FileCheck %s --check-prefix=RELAX
4+
# RUN: | llvm-readobj -r - | FileCheck %s
55

66
## Ensure that the eh_frame records the symbolic difference with
77
## the R_LARCH_32_PCREL relocation.
@@ -11,9 +11,6 @@ func:
1111
ret
1212
.cfi_endproc
1313

14-
# CHECK: Section (4) .rela.eh_frame {
15-
# CHECK-NEXT: 0x1C R_LARCH_32_PCREL .text 0x0
14+
# CHECK: Section ({{.*}}) .rela.eh_frame {
15+
# CHECK-NEXT: 0x1C R_LARCH_32_PCREL .L{{.*}} 0x0
1616
# CHECK-NEXT: }
17-
# RELAX: Section ({{.*}}) .rela.eh_frame {
18-
# RELAX-NEXT: 0x1C R_LARCH_32_PCREL .L{{.*}} 0x0
19-
# RELAX-NEXT: }

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55

66
# NORELAX: Relocations [
77
# NORELAX-NEXT: Section ({{.*}}) .rela.text {
8-
# NORELAX-NEXT: 0x10 R_LARCH_PCALA_HI20 .text 0x0
9-
# NORELAX-NEXT: 0x14 R_LARCH_PCALA_LO12 .text 0x0
8+
# NORELAX-NEXT: 0x10 R_LARCH_PCALA_HI20 .L1 0x0
9+
# NORELAX-NEXT: 0x14 R_LARCH_PCALA_LO12 .L1 0x0
1010
# NORELAX-NEXT: }
1111
# NORELAX-NEXT: Section ({{.*}}) .rela.data {
1212
# NORELAX-NEXT: 0x30 R_LARCH_ADD8 foo 0x0
13-
# NORELAX-NEXT: 0x30 R_LARCH_SUB8 .text 0x10
13+
# NORELAX-NEXT: 0x30 R_LARCH_SUB8 .L3 0x0
1414
# NORELAX-NEXT: 0x31 R_LARCH_ADD16 foo 0x0
15-
# NORELAX-NEXT: 0x31 R_LARCH_SUB16 .text 0x10
15+
# NORELAX-NEXT: 0x31 R_LARCH_SUB16 .L3 0x0
1616
# NORELAX-NEXT: 0x33 R_LARCH_ADD32 foo 0x0
17-
# NORELAX-NEXT: 0x33 R_LARCH_SUB32 .text 0x10
17+
# NORELAX-NEXT: 0x33 R_LARCH_SUB32 .L3 0x0
1818
# NORELAX-NEXT: 0x37 R_LARCH_ADD64 foo 0x0
19-
# NORELAX-NEXT: 0x37 R_LARCH_SUB64 .text 0x10
19+
# NORELAX-NEXT: 0x37 R_LARCH_SUB64 .L3 0x0
2020
# NORELAX-NEXT: }
2121
# NORELAX-NEXT: ]
2222

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
# CHECK: Relocations [
77
# CHECK-NEXT: Section ({{.*}}) .rela.data {
8-
# CHECK-NEXT: 0x0 R_LARCH_64 .text 0x4
8+
# CHECK-NEXT: 0x0 R_LARCH_64 .L1 0x0
99
# CHECK-NEXT: }
1010
# CHECK-NEXT: ]
1111

llvm/test/MC/LoongArch/Relocations/relocation-specifier.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
## This test is similar to test/MC/CSKY/relocation-specifier.s.
77

88
# RELOC32: '.rela.data'
9-
# RELOC32: R_LARCH_32 00000000 .data + 0
9+
# RELOC32: R_LARCH_32 00000000 local
1010

1111
# RELOC64: '.rela.data'
12-
# RELOC64: R_LARCH_32 0000000000000000 .data + 0
12+
# RELOC64: R_LARCH_32 0000000000000000 local
1313

1414
# CHECK: TLS GLOBAL DEFAULT UND gd
1515
# CHECK: TLS GLOBAL DEFAULT UND ld

0 commit comments

Comments
 (0)