[Mips] Make `readAddend` a virtual member function to escape explicit
authorSimon Atanasyan <simon@atanasyan.com>
Thu, 12 Mar 2015 18:53:06 +0000 (18:53 +0000)
committerSimon Atanasyan <simon@atanasyan.com>
Thu, 12 Mar 2015 18:53:06 +0000 (18:53 +0000)
template class instantiation

No functional changes.

llvm-svn: 232081

lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h
lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
lld/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.h

index 85fd09f..f58fedd 100644 (file)
@@ -231,8 +231,10 @@ private:
 
   Reference::Addend readAddend(const Elf_Rel &ri,
                                const ArrayRef<uint8_t> content) const {
-    return MipsRelocationHandler<ELFT>::readAddend(
-        ri.getType(isMips64EL()), content.data() + ri.r_offset);
+    const auto &rh =
+        this->_ctx.template getTargetHandler<ELFT>().getRelocationHandler();
+    return static_cast<const MipsRelocationHandler &>(rh)
+        .readAddend(ri.getType(isMips64EL()), content.data() + ri.r_offset);
   }
 
   uint32_t getPairRelocation(const Elf_Rel &rel) const {
index df83421..c7f0089 100644 (file)
@@ -29,6 +29,22 @@ struct MipsRelocationParams {
   uint8_t _shift; // Relocation's addendum left shift size
   bool _shuffle;  // Relocation's addendum/result needs to be shuffled
 };
+
+template <class ELFT> class RelocationHandler : public MipsRelocationHandler {
+public:
+  RelocationHandler(MipsLinkingContext &ctx) : _ctx(ctx) {}
+
+  std::error_code applyRelocation(ELFWriter &writer,
+                                  llvm::FileOutputBuffer &buf,
+                                  const lld::AtomLayout &atom,
+                                  const Reference &ref) const override;
+
+  Reference::Addend readAddend(Reference::KindValue kind,
+                               const uint8_t *content) const override;
+
+private:
+  MipsLinkingContext &_ctx;
+};
 }
 
 static MipsRelocationParams getRelocationParams(uint32_t rType) {
@@ -416,7 +432,7 @@ static void relocWrite(uint64_t data, const MipsRelocationParams &params,
 }
 
 template <class ELFT>
-std::error_code MipsRelocationHandler<ELFT>::applyRelocation(
+std::error_code RelocationHandler<ELFT>::applyRelocation(
     ELFWriter &writer, llvm::FileOutputBuffer &buf, const lld::AtomLayout &atom,
     const Reference &ref) const {
   if (ref.kindNamespace() != lld::Reference::KindNamespace::ELF)
@@ -458,8 +474,8 @@ std::error_code MipsRelocationHandler<ELFT>::applyRelocation(
 
 template <class ELFT>
 Reference::Addend
-MipsRelocationHandler<ELFT>::readAddend(Reference::KindValue kind,
-                                        const uint8_t *content) {
+RelocationHandler<ELFT>::readAddend(Reference::KindValue kind,
+                                    const uint8_t *content) const {
   auto params = getRelocationParams(kind);
   uint64_t ins = relocRead<ELFT>(params, content);
   return (ins & params._mask) << params._shift;
@@ -468,23 +484,18 @@ MipsRelocationHandler<ELFT>::readAddend(Reference::KindValue kind,
 namespace lld {
 namespace elf {
 
-template class MipsRelocationHandler<Mips32ELType>;
-template class MipsRelocationHandler<Mips32BEType>;
-template class MipsRelocationHandler<Mips64ELType>;
-template class MipsRelocationHandler<Mips64BEType>;
-
 template <>
 std::unique_ptr<TargetRelocationHandler>
 createMipsRelocationHandler<Mips32ELType>(MipsLinkingContext &ctx) {
   return std::unique_ptr<TargetRelocationHandler>(
-      new MipsRelocationHandler<Mips32ELType>(ctx));
+      new RelocationHandler<Mips32ELType>(ctx));
 }
 
 template <>
 std::unique_ptr<TargetRelocationHandler>
 createMipsRelocationHandler<Mips64ELType>(MipsLinkingContext &ctx) {
   return std::unique_ptr<TargetRelocationHandler>(
-      new MipsRelocationHandler<Mips64ELType>(ctx));
+      new RelocationHandler<Mips64ELType>(ctx));
 }
 
 } // elf
index 18075c6..87066b2 100644 (file)
 namespace lld {
 namespace elf {
 
-class MipsLinkingContext;
-template <class ELFT> class MipsTargetLayout;
-
-template <class ELFT>
 class MipsRelocationHandler : public TargetRelocationHandler {
 public:
-  MipsRelocationHandler(MipsLinkingContext &ctx) : _ctx(ctx) {}
-
-  std::error_code applyRelocation(ELFWriter &writer,
-                                  llvm::FileOutputBuffer &buf,
-                                  const lld::AtomLayout &atom,
-                                  const Reference &ref) const override;
-
-  static Reference::Addend readAddend(Reference::KindValue kind,
-                                      const uint8_t *content);
-
-private:
-  MipsLinkingContext &_ctx;
+  virtual Reference::Addend readAddend(Reference::KindValue kind,
+                                       const uint8_t *content) const = 0;
 };
 
 template <class ELFT>