summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2019-05-17 06:04:11 +0000
committerFangrui Song <maskray@google.com>2019-05-17 06:04:11 +0000
commitad7199f3e60a49db023099dcb879fcc9cdf94a2e (patch)
treec8d15c78434007dc2336e3bc2b192e1a12c1e9d9
parentec6dc3089e7fa0d0dfcd66024b7e1c07a43c85ac (diff)
downloadbcm5719-llvm-ad7199f3e60a49db023099dcb879fcc9cdf94a2e.tar.gz
bcm5719-llvm-ad7199f3e60a49db023099dcb879fcc9cdf94a2e.zip
[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
-rw-r--r--llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp74
-rw-r--r--llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp3
-rw-r--r--llvm/test/MC/PowerPC/ppc32-reloc-directive.s26
-rw-r--r--llvm/test/MC/PowerPC/ppc64-reloc-directive.s28
4 files changed, 103 insertions, 28 deletions
diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
index 8ceae987fe9..ec4eb700563 100644
--- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
+++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
@@ -28,6 +28,7 @@ static uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) {
switch (Kind) {
default:
llvm_unreachable("Unknown fixup kind!");
+ case FK_NONE:
case FK_Data_1:
case FK_Data_2:
case FK_Data_4:
@@ -51,6 +52,8 @@ static unsigned getFixupKindNumBytes(unsigned Kind) {
switch (Kind) {
default:
llvm_unreachable("Unknown fixup kind!");
+ case FK_NONE:
+ return 0;
case FK_Data_1:
return 1;
case FK_Data_2:
@@ -137,9 +140,11 @@ public:
bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup,
const MCValue &Target) override {
- switch ((PPC::Fixups)Fixup.getKind()) {
+ switch ((unsigned)Fixup.getKind()) {
default:
return false;
+ case FK_NONE:
+ return true;
case PPC::fixup_ppc_br24:
case PPC::fixup_ppc_br24abs:
// If the target symbol has a local entry point we must not attempt
@@ -194,36 +199,49 @@ public:
// FIXME: This should be in a separate file.
namespace {
- class DarwinPPCAsmBackend : public PPCAsmBackend {
- public:
- DarwinPPCAsmBackend(const Target &T, const Triple &TT)
- : PPCAsmBackend(T, TT) {}
-
- std::unique_ptr<MCObjectTargetWriter>
- createObjectTargetWriter() const override {
- bool Is64 = TT.isPPC64();
- return createPPCMachObjectWriter(
- /*Is64Bit=*/Is64,
- (Is64 ? MachO::CPU_TYPE_POWERPC64 : MachO::CPU_TYPE_POWERPC),
- MachO::CPU_SUBTYPE_POWERPC_ALL);
- }
- };
-
- class ELFPPCAsmBackend : public PPCAsmBackend {
- public:
- ELFPPCAsmBackend(const Target &T, const Triple &TT)
- : PPCAsmBackend(T, TT) {}
-
- std::unique_ptr<MCObjectTargetWriter>
- createObjectTargetWriter() const override {
- uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS());
- bool Is64 = TT.isPPC64();
- return createPPCELFObjectWriter(Is64, OSABI);
- }
- };
+
+class DarwinPPCAsmBackend : public PPCAsmBackend {
+public:
+ DarwinPPCAsmBackend(const Target &T, const Triple &TT)
+ : PPCAsmBackend(T, TT) {}
+
+ std::unique_ptr<MCObjectTargetWriter>
+ createObjectTargetWriter() const override {
+ bool Is64 = TT.isPPC64();
+ return createPPCMachObjectWriter(
+ /*Is64Bit=*/Is64,
+ (Is64 ? MachO::CPU_TYPE_POWERPC64 : MachO::CPU_TYPE_POWERPC),
+ MachO::CPU_SUBTYPE_POWERPC_ALL);
+ }
+};
+
+class ELFPPCAsmBackend : public PPCAsmBackend {
+public:
+ ELFPPCAsmBackend(const Target &T, const Triple &TT) : PPCAsmBackend(T, TT) {}
+
+ std::unique_ptr<MCObjectTargetWriter>
+ createObjectTargetWriter() const override {
+ uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS());
+ bool Is64 = TT.isPPC64();
+ return createPPCELFObjectWriter(Is64, OSABI);
+ }
+
+ Optional<MCFixupKind> getFixupKind(StringRef Name) const override;
+};
} // end anonymous namespace
+Optional<MCFixupKind> ELFPPCAsmBackend::getFixupKind(StringRef Name) const {
+ if (TT.isPPC64()) {
+ if (Name == "R_PPC64_NONE")
+ return FK_NONE;
+ } else {
+ if (Name == "R_PPC_NONE")
+ return FK_NONE;
+ }
+ return MCAsmBackend::getFixupKind(Name);
+}
+
MCAsmBackend *llvm::createPPCAsmBackend(const Target &T,
const MCSubtargetInfo &STI,
const MCRegisterInfo &MRI,
diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp
index aa7b05b0198..042ddf48d5d 100644
--- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp
+++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp
@@ -133,6 +133,9 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
} else {
switch ((unsigned)Fixup.getKind()) {
default: llvm_unreachable("invalid fixup kind!");
+ case FK_NONE:
+ Type = ELF::R_PPC_NONE;
+ break;
case PPC::fixup_ppc_br24abs:
Type = ELF::R_PPC_ADDR24;
break;
diff --git a/llvm/test/MC/PowerPC/ppc32-reloc-directive.s b/llvm/test/MC/PowerPC/ppc32-reloc-directive.s
new file mode 100644
index 00000000000..1563dd2c065
--- /dev/null
+++ b/llvm/test/MC/PowerPC/ppc32-reloc-directive.s
@@ -0,0 +1,26 @@
+# RUN: llvm-mc -triple=powerpc-linux-musl %s | FileCheck --check-prefix=PRINT %s
+
+# RUN: llvm-mc -filetype=obj -triple=powerpc-linux-musl %s | llvm-readobj -r | FileCheck %s
+
+# PRINT: .reloc 8, R_PPC_NONE, .data
+# PRINT: .reloc 4, R_PPC_NONE, foo+4
+# PRINT: .reloc 0, R_PPC_NONE, 8
+
+# CHECK: 0x8 R_PPC_NONE .data 0x0
+# CHECK-NEXT: 0x4 R_PPC_NONE foo 0x4
+# CHECK-NEXT: 0x0 R_PPC_NONE - 0x8
+
+.text
+ blr
+ nop
+ nop
+ .reloc 8, R_PPC_NONE, .data
+ .reloc 4, R_PPC_NONE, foo+4
+ .reloc 0, R_PPC_NONE, 8
+
+.data
+.globl foo
+foo:
+ .word 0
+ .word 0
+ .word 0
diff --git a/llvm/test/MC/PowerPC/ppc64-reloc-directive.s b/llvm/test/MC/PowerPC/ppc64-reloc-directive.s
new file mode 100644
index 00000000000..2442b085b0d
--- /dev/null
+++ b/llvm/test/MC/PowerPC/ppc64-reloc-directive.s
@@ -0,0 +1,28 @@
+# RUN: llvm-mc -triple=powerpc64-linux-musl %s | FileCheck --check-prefix=PRINT %s
+# RUN: llvm-mc -triple=powerpc64le-linux-musl %s | FileCheck --check-prefix=PRINT %s
+
+# RUN: llvm-mc -filetype=obj -triple=powerpc64-linux-musl %s | llvm-readobj -r | FileCheck %s
+# RUN: llvm-mc -filetype=obj -triple=powerpc64le-linux-musl %s | llvm-readobj -r | FileCheck %s
+
+# PRINT: .reloc 8, R_PPC64_NONE, .data
+# PRINT: .reloc 4, R_PPC64_NONE, foo+4
+# PRINT: .reloc 0, R_PPC64_NONE, 8
+
+# CHECK: 0x8 R_PPC64_NONE .data 0x0
+# CHECK-NEXT: 0x4 R_PPC64_NONE foo 0x4
+# CHECK-NEXT: 0x0 R_PPC64_NONE - 0x8
+
+.text
+ blr
+ nop
+ nop
+ .reloc 8, R_PPC64_NONE, .data
+ .reloc 4, R_PPC64_NONE, foo+4
+ .reloc 0, R_PPC64_NONE, 8
+
+.data
+.globl foo
+foo:
+ .word 0
+ .word 0
+ .word 0
OpenPOWER on IntegriCloud