Skip to content

Commit 8f671a6

Browse files
authored
[LoongArch] Always emit symbol-based relocations regardless of relaxation (#153943)
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 c6fe567 commit 8f671a6

File tree

12 files changed

+79
-114
lines changed

12 files changed

+79
-114
lines changed

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

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

497497
std::unique_ptr<MCObjectTargetWriter>
498498
LoongArchAsmBackend::createObjectTargetWriter() const {
499-
return createLoongArchELFObjectWriter(
500-
OSABI, Is64Bit, STI.hasFeature(LoongArch::FeatureRelax));
499+
return createLoongArchELFObjectWriter(OSABI, Is64Bit);
501500
}
502501

503502
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
@@ -33,10 +33,8 @@ declare dso_local void @callee3() nounwind
3333
; RELAX: R_LARCH_RELAX - 0x0
3434
; CHECK-RELOC-NEXT: R_LARCH_GOT_PC_LO12 g_e 0x0
3535
; RELAX-NEXT: R_LARCH_RELAX - 0x0
36-
; PCALA-RELOC: R_LARCH_PCALA_HI20 .bss 0x0
37-
; RELAX-NEXT: R_LARCH_PCALA_HI20 g_i 0x0
38-
; PCALA-RELOC: R_LARCH_PCALA_LO12 .bss 0x0
39-
; RELAX-NEXT: R_LARCH_PCALA_LO12 g_i 0x0
36+
; CHECK-RELOC-NEXT: R_LARCH_PCALA_HI20 g_i 0x0
37+
; CHECK-RELOC-NEXT: R_LARCH_PCALA_LO12 g_i 0x0
4038
; CHECK-RELOC: R_LARCH_TLS_GD_PC_HI20 t_un 0x0
4139
; RELAX-NEXT: R_LARCH_RELAX - 0x0
4240
; CHECK-RELOC-NEXT: R_LARCH_GOT_PC_LO12 t_un 0x0
@@ -75,11 +73,9 @@ declare dso_local void @callee3() nounwind
7573
; RELAX-NEXT: R_LARCH_RELAX - 0x0
7674
; CHECK-RELOC-NEXT: R_LARCH_TLS_LE_LO12_R t_le 0x0
7775
; RELAX-NEXT: R_LARCH_RELAX - 0x0
78-
; PCALA-RELOC: R_LARCH_PCALA_HI20 .data 0x0
79-
; RELAX-NEXT: R_LARCH_PCALA_HI20 g_i1 0x0
76+
; CHECK-RELOC-NEXT: R_LARCH_PCALA_HI20 g_i1 0x0
8077
; RELAX-NEXT: R_LARCH_RELAX - 0x0
81-
; PCALA-RELOC: R_LARCH_PCALA_LO12 .data 0x0
82-
; RELAX-NEXT: R_LARCH_PCALA_LO12 g_i1 0x0
78+
; CHECK-RELOC-NEXT: R_LARCH_PCALA_LO12 g_i1 0x0
8379
; RELAX-NEXT: R_LARCH_RELAX - 0x0
8480
; RELAX-NEXT: R_LARCH_ALIGN - 0x1C
8581
; CHECK-RELOC-NEXT: R_LARCH_CALL36 callee1 0x0

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/DebugInfo/LoongArch/dwarf-loongarch-relocs.ll

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; RUN: llc --filetype=obj --mtriple=loongarch64 --mattr=-relax %s -o %t.o
2-
; RUN: llvm-readobj -r %t.o | FileCheck --check-prefixes=RELOCS-BOTH,RELOCS-NORL %s
2+
; RUN: llvm-readobj -r %t.o | FileCheck --check-prefix=RELOCS-BOTH %s
33
; RUN: llvm-objdump --source %t.o | FileCheck --check-prefix=SOURCE %s
44
; RUN: llvm-dwarfdump --debug-info --debug-line %t.o | FileCheck --check-prefix=DWARF %s
55

@@ -16,10 +16,8 @@
1616
; RELOCS-ENRL-NEXT: 0x18 R_LARCH_RELAX - 0x0
1717
; RELOCS-BOTH-NEXT: }
1818
; RELOCS-BOTH: Section ({{.*}}) .rela.debug_frame {
19-
; RELOCS-NORL-NEXT: 0x1C R_LARCH_32 .debug_frame 0x0
20-
; RELOCS-NORL-NEXT: 0x20 R_LARCH_64 .text 0x0
21-
; RELOCS-ENRL-NEXT: 0x1C R_LARCH_32 .L0 0x0
22-
; RELOCS-ENRL-NEXT: 0x20 R_LARCH_64 .L0 0x0
19+
; RELOCS-BOTH-NEXT: 0x1C R_LARCH_32 .L0 0x0
20+
; RELOCS-BOTH-NEXT: 0x20 R_LARCH_64 .L0 0x0
2321
; RELOCS-ENRL-NEXT: 0x28 R_LARCH_ADD64 .L0 0x0
2422
; RELOCS-ENRL-NEXT: 0x28 R_LARCH_SUB64 .L0 0x0
2523
; RELOCS-ENRL-NEXT: 0x3F R_LARCH_ADD6 .L0 0x0
@@ -29,8 +27,7 @@
2927
; RELOCS-BOTH-NEXT: 0x22 R_LARCH_32 .debug_line_str 0x0
3028
; RELOCS-BOTH-NEXT: 0x31 R_LARCH_32 .debug_line_str 0x2
3129
; RELOCS-BOTH-NEXT: 0x46 R_LARCH_32 .debug_line_str 0x1B
32-
; RELOCS-NORL-NEXT: 0x4F R_LARCH_64 .text 0x0
33-
; RELOCS-ENRL-NEXT: 0x4F R_LARCH_64 .L0 0x0
30+
; RELOCS-BOTH-NEXT: 0x4F R_LARCH_64 .L0 0x0
3431
; RELOCS-ENRL-NEXT: 0x5F R_LARCH_ADD16 .L0 0x0
3532
; RELOCS-ENRL-NEXT: 0x5F R_LARCH_SUB16 .L0 0x0
3633
; RELOCS-BOTH-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: .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: 8
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
@@ -6,18 +6,18 @@
66
# NORELAX: Relocations [
77
# NORELAX-NEXT: Section ({{.*}}) .rela.text {
88
# NORELAX-NEXT: 0x0 R_LARCH_CALL36 foo 0x0
9-
# NORELAX-NEXT: 0x10 R_LARCH_PCALA_HI20 .text 0x8
10-
# NORELAX-NEXT: 0x14 R_LARCH_PCALA_LO12 .text 0x8
9+
# NORELAX-NEXT: 0x10 R_LARCH_PCALA_HI20 .L1 0x0
10+
# NORELAX-NEXT: 0x14 R_LARCH_PCALA_LO12 .L1 0x0
1111
# NORELAX-NEXT: }
1212
# NORELAX-NEXT: Section ({{.*}}) .rela.data {
1313
# NORELAX-NEXT: 0x30 R_LARCH_ADD8 foo 0x0
14-
# NORELAX-NEXT: 0x30 R_LARCH_SUB8 .text 0x10
14+
# NORELAX-NEXT: 0x30 R_LARCH_SUB8 .L3 0x0
1515
# NORELAX-NEXT: 0x31 R_LARCH_ADD16 foo 0x0
16-
# NORELAX-NEXT: 0x31 R_LARCH_SUB16 .text 0x10
16+
# NORELAX-NEXT: 0x31 R_LARCH_SUB16 .L3 0x0
1717
# NORELAX-NEXT: 0x33 R_LARCH_ADD32 foo 0x0
18-
# NORELAX-NEXT: 0x33 R_LARCH_SUB32 .text 0x10
18+
# NORELAX-NEXT: 0x33 R_LARCH_SUB32 .L3 0x0
1919
# NORELAX-NEXT: 0x37 R_LARCH_ADD64 foo 0x0
20-
# NORELAX-NEXT: 0x37 R_LARCH_SUB64 .text 0x10
20+
# NORELAX-NEXT: 0x37 R_LARCH_SUB64 .L3 0x0
2121
# NORELAX-NEXT: }
2222
# NORELAX-NEXT: ]
2323

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# CHECK-NEXT: 0x4 R_LARCH_CALL36 foo 0x0
99
# CHECK-NEXT: }
1010
# CHECK-NEXT: Section ({{.*}}) .rela.data {
11-
# CHECK-NEXT: 0x0 R_LARCH_64 .text 0xC
11+
# CHECK-NEXT: 0x0 R_LARCH_64 .L1 0x0
1212
# CHECK-NEXT: }
1313
# CHECK-NEXT: ]
1414

0 commit comments

Comments
 (0)