[llvm] r360990 - [PowerPC] Support .reloc *, R_PPC{,64}_NONE, *

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu May 16 23:04:12 PDT 2019


Author: maskray
Date: Thu May 16 23:04:11 2019
New Revision: 360990

URL: http://llvm.org/viewvc/llvm-project?rev=360990&view=rev
Log:
[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.

Added:
    llvm/trunk/test/MC/PowerPC/ppc32-reloc-directive.s
    llvm/trunk/test/MC/PowerPC/ppc64-reloc-directive.s
Modified:
    llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
    llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp

Modified: llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp?rev=360990&r1=360989&r2=360990&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp (original)
+++ llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp Thu May 16 23:04:11 2019
@@ -28,6 +28,7 @@ static uint64_t adjustFixupValue(unsigne
   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(uns
   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,

Modified: llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp?rev=360990&r1=360989&r2=360990&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp Thu May 16 23:04:11 2019
@@ -133,6 +133,9 @@ unsigned PPCELFObjectWriter::getRelocTyp
   } 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;

Added: llvm/trunk/test/MC/PowerPC/ppc32-reloc-directive.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/PowerPC/ppc32-reloc-directive.s?rev=360990&view=auto
==============================================================================
--- llvm/trunk/test/MC/PowerPC/ppc32-reloc-directive.s (added)
+++ llvm/trunk/test/MC/PowerPC/ppc32-reloc-directive.s Thu May 16 23:04:11 2019
@@ -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

Added: llvm/trunk/test/MC/PowerPC/ppc64-reloc-directive.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/PowerPC/ppc64-reloc-directive.s?rev=360990&view=auto
==============================================================================
--- llvm/trunk/test/MC/PowerPC/ppc64-reloc-directive.s (added)
+++ llvm/trunk/test/MC/PowerPC/ppc64-reloc-directive.s Thu May 16 23:04:11 2019
@@ -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




More information about the llvm-commits mailing list