Skip to content

Commit ad7199f

Browse files
committed
[PowerPC] Support .reloc *, R_PPC{,64}_NONE, *
This can be used to create references among sections. When --gc-sections is used, the referenced section will be retained if the origin section is retained. llvm-svn: 360990
1 parent ec6dc30 commit ad7199f

File tree

4 files changed

+103
-28
lines changed

4 files changed

+103
-28
lines changed

llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ static uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) {
2828
switch (Kind) {
2929
default:
3030
llvm_unreachable("Unknown fixup kind!");
31+
case FK_NONE:
3132
case FK_Data_1:
3233
case FK_Data_2:
3334
case FK_Data_4:
@@ -51,6 +52,8 @@ static unsigned getFixupKindNumBytes(unsigned Kind) {
5152
switch (Kind) {
5253
default:
5354
llvm_unreachable("Unknown fixup kind!");
55+
case FK_NONE:
56+
return 0;
5457
case FK_Data_1:
5558
return 1;
5659
case FK_Data_2:
@@ -137,9 +140,11 @@ class PPCAsmBackend : public MCAsmBackend {
137140

138141
bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup,
139142
const MCValue &Target) override {
140-
switch ((PPC::Fixups)Fixup.getKind()) {
143+
switch ((unsigned)Fixup.getKind()) {
141144
default:
142145
return false;
146+
case FK_NONE:
147+
return true;
143148
case PPC::fixup_ppc_br24:
144149
case PPC::fixup_ppc_br24abs:
145150
// If the target symbol has a local entry point we must not attempt
@@ -194,36 +199,49 @@ class PPCAsmBackend : public MCAsmBackend {
194199

195200
// FIXME: This should be in a separate file.
196201
namespace {
197-
class DarwinPPCAsmBackend : public PPCAsmBackend {
198-
public:
199-
DarwinPPCAsmBackend(const Target &T, const Triple &TT)
200-
: PPCAsmBackend(T, TT) {}
201-
202-
std::unique_ptr<MCObjectTargetWriter>
203-
createObjectTargetWriter() const override {
204-
bool Is64 = TT.isPPC64();
205-
return createPPCMachObjectWriter(
206-
/*Is64Bit=*/Is64,
207-
(Is64 ? MachO::CPU_TYPE_POWERPC64 : MachO::CPU_TYPE_POWERPC),
208-
MachO::CPU_SUBTYPE_POWERPC_ALL);
209-
}
210-
};
211-
212-
class ELFPPCAsmBackend : public PPCAsmBackend {
213-
public:
214-
ELFPPCAsmBackend(const Target &T, const Triple &TT)
215-
: PPCAsmBackend(T, TT) {}
216-
217-
std::unique_ptr<MCObjectTargetWriter>
218-
createObjectTargetWriter() const override {
219-
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS());
220-
bool Is64 = TT.isPPC64();
221-
return createPPCELFObjectWriter(Is64, OSABI);
222-
}
223-
};
202+
203+
class DarwinPPCAsmBackend : public PPCAsmBackend {
204+
public:
205+
DarwinPPCAsmBackend(const Target &T, const Triple &TT)
206+
: PPCAsmBackend(T, TT) {}
207+
208+
std::unique_ptr<MCObjectTargetWriter>
209+
createObjectTargetWriter() const override {
210+
bool Is64 = TT.isPPC64();
211+
return createPPCMachObjectWriter(
212+
/*Is64Bit=*/Is64,
213+
(Is64 ? MachO::CPU_TYPE_POWERPC64 : MachO::CPU_TYPE_POWERPC),
214+
MachO::CPU_SUBTYPE_POWERPC_ALL);
215+
}
216+
};
217+
218+
class ELFPPCAsmBackend : public PPCAsmBackend {
219+
public:
220+
ELFPPCAsmBackend(const Target &T, const Triple &TT) : PPCAsmBackend(T, TT) {}
221+
222+
std::unique_ptr<MCObjectTargetWriter>
223+
createObjectTargetWriter() const override {
224+
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS());
225+
bool Is64 = TT.isPPC64();
226+
return createPPCELFObjectWriter(Is64, OSABI);
227+
}
228+
229+
Optional<MCFixupKind> getFixupKind(StringRef Name) const override;
230+
};
224231

225232
} // end anonymous namespace
226233

234+
Optional<MCFixupKind> ELFPPCAsmBackend::getFixupKind(StringRef Name) const {
235+
if (TT.isPPC64()) {
236+
if (Name == "R_PPC64_NONE")
237+
return FK_NONE;
238+
} else {
239+
if (Name == "R_PPC_NONE")
240+
return FK_NONE;
241+
}
242+
return MCAsmBackend::getFixupKind(Name);
243+
}
244+
227245
MCAsmBackend *llvm::createPPCAsmBackend(const Target &T,
228246
const MCSubtargetInfo &STI,
229247
const MCRegisterInfo &MRI,

llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
133133
} else {
134134
switch ((unsigned)Fixup.getKind()) {
135135
default: llvm_unreachable("invalid fixup kind!");
136+
case FK_NONE:
137+
Type = ELF::R_PPC_NONE;
138+
break;
136139
case PPC::fixup_ppc_br24abs:
137140
Type = ELF::R_PPC_ADDR24;
138141
break;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# RUN: llvm-mc -triple=powerpc-linux-musl %s | FileCheck --check-prefix=PRINT %s
2+
3+
# RUN: llvm-mc -filetype=obj -triple=powerpc-linux-musl %s | llvm-readobj -r | FileCheck %s
4+
5+
# PRINT: .reloc 8, R_PPC_NONE, .data
6+
# PRINT: .reloc 4, R_PPC_NONE, foo+4
7+
# PRINT: .reloc 0, R_PPC_NONE, 8
8+
9+
# CHECK: 0x8 R_PPC_NONE .data 0x0
10+
# CHECK-NEXT: 0x4 R_PPC_NONE foo 0x4
11+
# CHECK-NEXT: 0x0 R_PPC_NONE - 0x8
12+
13+
.text
14+
blr
15+
nop
16+
nop
17+
.reloc 8, R_PPC_NONE, .data
18+
.reloc 4, R_PPC_NONE, foo+4
19+
.reloc 0, R_PPC_NONE, 8
20+
21+
.data
22+
.globl foo
23+
foo:
24+
.word 0
25+
.word 0
26+
.word 0
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# RUN: llvm-mc -triple=powerpc64-linux-musl %s | FileCheck --check-prefix=PRINT %s
2+
# RUN: llvm-mc -triple=powerpc64le-linux-musl %s | FileCheck --check-prefix=PRINT %s
3+
4+
# RUN: llvm-mc -filetype=obj -triple=powerpc64-linux-musl %s | llvm-readobj -r | FileCheck %s
5+
# RUN: llvm-mc -filetype=obj -triple=powerpc64le-linux-musl %s | llvm-readobj -r | FileCheck %s
6+
7+
# PRINT: .reloc 8, R_PPC64_NONE, .data
8+
# PRINT: .reloc 4, R_PPC64_NONE, foo+4
9+
# PRINT: .reloc 0, R_PPC64_NONE, 8
10+
11+
# CHECK: 0x8 R_PPC64_NONE .data 0x0
12+
# CHECK-NEXT: 0x4 R_PPC64_NONE foo 0x4
13+
# CHECK-NEXT: 0x0 R_PPC64_NONE - 0x8
14+
15+
.text
16+
blr
17+
nop
18+
nop
19+
.reloc 8, R_PPC64_NONE, .data
20+
.reloc 4, R_PPC64_NONE, foo+4
21+
.reloc 0, R_PPC64_NONE, 8
22+
23+
.data
24+
.globl foo
25+
foo:
26+
.word 0
27+
.word 0
28+
.word 0

0 commit comments

Comments
 (0)