[lld] r238684 - [Mips] Collect all ABI related info in the single MipsAbiInfoHandler class

Simon Atanasyan simon at atanasyan.com
Sun May 31 13:36:11 PDT 2015


Author: atanasyan
Date: Sun May 31 15:36:11 2015
New Revision: 238684

URL: http://llvm.org/viewvc/llvm-project?rev=238684&view=rev
Log:
[Mips] Collect all ABI related info in the single MipsAbiInfoHandler class

New MipsAbiInfoHandler merges and hold both ELF header flags
and registries usage masks. In the future commits it will manage some
additional information.

Added:
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.cpp
      - copied, changed from r238683, lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h
Removed:
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.h
Modified:
    lld/trunk/lib/ReaderWriter/ELF/Mips/CMakeLists.txt
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.h
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/CMakeLists.txt?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/CMakeLists.txt (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/CMakeLists.txt Sun May 31 15:36:11 2015
@@ -1,7 +1,7 @@
 add_llvm_library(lldMipsELFTarget
+  MipsAbiInfoHandler.cpp
   MipsCtorsOrderPass.cpp
   MipsELFFile.cpp
-  MipsELFFlagsMerger.cpp
   MipsELFWriters.cpp
   MipsLinkingContext.cpp
   MipsRelocationHandler.cpp

Copied: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.cpp (from r238683, lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp)
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.cpp?p2=lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.cpp&p1=lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp&r1=238683&r2=238684&rev=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.cpp Sun May 31 15:36:11 2015
@@ -1,4 +1,4 @@
-//===- lib/ReaderWriter/ELF/MipsELFFlagsMerger.cpp ------------------------===//
+//===- lib/ReaderWriter/ELF/MipsAbiInfoHandler.cpp ------------------------===//
 //
 //                             The LLVM Linker
 //
@@ -7,14 +7,13 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "MipsELFFlagsMerger.h"
+#include "MipsAbiInfoHandler.h"
 #include "lld/Core/Error.h"
+#include "lld/ReaderWriter/ELFLinkingContext.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/ELF.h"
 #include "llvm/Support/raw_ostream.h"
 
-using namespace lld;
-using namespace lld::elf;
 using namespace llvm::ELF;
 
 struct MipsISATreeEdge {
@@ -59,16 +58,25 @@ static bool matchMipsISA(unsigned base,
   return false;
 }
 
-MipsELFFlagsMerger::MipsELFFlagsMerger(bool is64Bits)
-    : _is64Bit(is64Bits), _flags(0) {}
+namespace lld {
+namespace elf {
 
-uint32_t MipsELFFlagsMerger::getMergedELFFlags() const { return _flags; }
+template <class ELFT> uint32_t MipsAbiInfoHandler<ELFT>::getFlags() const {
+  return _flags;
+}
+
+template <class ELFT>
+const llvm::Optional<MipsReginfo> &
+MipsAbiInfoHandler<ELFT>::getRegistersMask() const {
+  return _regMask;
+}
 
-std::error_code MipsELFFlagsMerger::mergeFlags(uint32_t newFlags) {
+template <class ELFT>
+std::error_code MipsAbiInfoHandler<ELFT>::mergeFlags(uint32_t newFlags) {
   // We support two ABI: O32 and N64. The last one does not have
   // the corresponding ELF flag.
   uint32_t inAbi = newFlags & EF_MIPS_ABI;
-  uint32_t supportedAbi = _is64Bit ? 0 : uint32_t(EF_MIPS_ABI_O32);
+  uint32_t supportedAbi = ELFT::Is64Bits ? 0 : uint32_t(EF_MIPS_ABI_O32);
   if (inAbi != supportedAbi)
     return make_dynamic_error_code("Unsupported ABI");
 
@@ -141,3 +149,18 @@ std::error_code MipsELFFlagsMerger::merg
 
   return std::error_code();
 }
+
+template <class ELFT>
+void MipsAbiInfoHandler<ELFT>::mergeRegistersMask(const MipsReginfo &info) {
+  std::lock_guard<std::mutex> lock(_mutex);
+  if (_regMask.hasValue())
+    _regMask->merge(info);
+  else
+    _regMask = info;
+}
+
+template class MipsAbiInfoHandler<ELF32LE>;
+template class MipsAbiInfoHandler<ELF64LE>;
+
+}
+}

Added: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h?rev=238684&view=auto
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h (added)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h Sun May 31 15:36:11 2015
@@ -0,0 +1,42 @@
+//===- lib/ReaderWriter/ELF/MipsAbiInfoHandler.h --------------------------===//
+//
+//                             The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLD_READER_WRITER_ELF_MIPS_MIPS_ABI_INFO_HANDLER_H
+#define LLD_READER_WRITER_ELF_MIPS_MIPS_ABI_INFO_HANDLER_H
+
+#include "MipsReginfo.h"
+#include "llvm/ADT/Optional.h"
+#include <mutex>
+#include <system_error>
+
+namespace lld {
+namespace elf {
+
+template <class ELFT> class MipsAbiInfoHandler {
+public:
+  MipsAbiInfoHandler() = default;
+
+  uint32_t getFlags() const;
+  const llvm::Optional<MipsReginfo> &getRegistersMask() const;
+
+  /// \brief Merge saved ELF header flags and the new set of flags.
+  std::error_code mergeFlags(uint32_t newFlags);
+
+  /// \brief Merge saved and new sets of registers usage masks.
+  void mergeRegistersMask(const MipsReginfo &info);
+
+private:
+  std::mutex _mutex;
+  uint32_t _flags = 0;
+  llvm::Optional<MipsReginfo> _regMask;
+};
+
+} // namespace elf
+} // namespace lld
+
+#endif

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFile.cpp Sun May 31 15:36:11 2015
@@ -8,6 +8,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "MipsELFFile.h"
+#include "MipsTargetHandler.h"
 
 namespace lld {
 namespace elf {
@@ -162,18 +163,20 @@ template <class ELFT> std::error_code Mi
     _dtpOff = sec->sh_addr + DTP_OFFSET;
   }
 
-  auto &ctx = static_cast<MipsLinkingContext &>(this->_ctx);
+  auto &handler =
+      static_cast<MipsTargetHandler<ELFT> &>(this->_ctx.getTargetHandler());
+  auto &abi = handler.getAbiInfoHandler();
 
   ErrorOr<const Elf_Mips_RegInfo *> regInfoSec = findRegInfoSec();
   if (auto ec = regInfoSec.getError())
     return ec;
   if (const Elf_Mips_RegInfo *regInfo = regInfoSec.get()) {
-    ctx.mergeReginfoMask(*regInfo);
+    abi.mergeRegistersMask(*regInfo);
     _gp0 = regInfo->ri_gp_value;
   }
 
   const Elf_Ehdr *hdr = this->_objFile->getHeader();
-  if (std::error_code ec = ctx.mergeElfFlags(hdr->e_flags))
+  if (std::error_code ec = abi.mergeFlags(hdr->e_flags))
     return ec;
 
   return std::error_code();

Removed: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp?rev=238683&view=auto
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.cpp (removed)
@@ -1,143 +0,0 @@
-//===- lib/ReaderWriter/ELF/MipsELFFlagsMerger.cpp ------------------------===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "MipsELFFlagsMerger.h"
-#include "lld/Core/Error.h"
-#include "llvm/ADT/Twine.h"
-#include "llvm/Support/ELF.h"
-#include "llvm/Support/raw_ostream.h"
-
-using namespace lld;
-using namespace lld::elf;
-using namespace llvm::ELF;
-
-struct MipsISATreeEdge {
-  unsigned child;
-  unsigned parent;
-};
-
-static MipsISATreeEdge isaTree[] = {
-    // MIPS32R6 and MIPS64R6 are not compatible with other extensions
-
-    // MIPS64 extensions.
-    {EF_MIPS_ARCH_64R2, EF_MIPS_ARCH_64},
-    // MIPS V extensions.
-    {EF_MIPS_ARCH_64, EF_MIPS_ARCH_5},
-    // MIPS IV extensions.
-    {EF_MIPS_ARCH_5, EF_MIPS_ARCH_4},
-    // MIPS III extensions.
-    {EF_MIPS_ARCH_4, EF_MIPS_ARCH_3},
-    // MIPS32 extensions.
-    {EF_MIPS_ARCH_32R2, EF_MIPS_ARCH_32},
-    // MIPS II extensions.
-    {EF_MIPS_ARCH_3, EF_MIPS_ARCH_2},
-    {EF_MIPS_ARCH_32, EF_MIPS_ARCH_2},
-    // MIPS I extensions.
-    {EF_MIPS_ARCH_2, EF_MIPS_ARCH_1},
-};
-
-static bool matchMipsISA(unsigned base, unsigned ext) {
-  if (base == ext)
-    return true;
-  if (base == EF_MIPS_ARCH_32 && matchMipsISA(EF_MIPS_ARCH_64, ext))
-    return true;
-  if (base == EF_MIPS_ARCH_32R2 && matchMipsISA(EF_MIPS_ARCH_64R2, ext))
-    return true;
-  for (const auto &edge : isaTree) {
-    if (ext == edge.child) {
-      ext = edge.parent;
-      if (ext == base)
-        return true;
-    }
-  }
-  return false;
-}
-
-MipsELFFlagsMerger::MipsELFFlagsMerger(bool is64Bits)
-    : _is64Bit(is64Bits), _flags(0) {}
-
-uint32_t MipsELFFlagsMerger::getMergedELFFlags() const { return _flags; }
-
-std::error_code MipsELFFlagsMerger::mergeFlags(uint32_t newFlags) {
-  // We support two ABI: O32 and N64. The last one does not have
-  // the corresponding ELF flag.
-  uint32_t inAbi = newFlags & EF_MIPS_ABI;
-  uint32_t supportedAbi = _is64Bit ? 0 : uint32_t(EF_MIPS_ABI_O32);
-  if (inAbi != supportedAbi)
-    return make_dynamic_error_code("Unsupported ABI");
-
-  // ... and reduced set of architectures ...
-  uint32_t newArch = newFlags & EF_MIPS_ARCH;
-  switch (newArch) {
-  case EF_MIPS_ARCH_1:
-  case EF_MIPS_ARCH_2:
-  case EF_MIPS_ARCH_3:
-  case EF_MIPS_ARCH_4:
-  case EF_MIPS_ARCH_5:
-  case EF_MIPS_ARCH_32:
-  case EF_MIPS_ARCH_64:
-  case EF_MIPS_ARCH_32R2:
-  case EF_MIPS_ARCH_64R2:
-  case EF_MIPS_ARCH_32R6:
-  case EF_MIPS_ARCH_64R6:
-    break;
-  default:
-    return make_dynamic_error_code("Unsupported instruction set");
-  }
-
-  // ... and still do not support MIPS-16 extension.
-  if (newFlags & EF_MIPS_ARCH_ASE_M16)
-    return make_dynamic_error_code("Unsupported extension: MIPS16");
-
-  // PIC code is inherently CPIC and may not set CPIC flag explicitly.
-  // Ensure that this flag will exist in the linked file.
-  if (newFlags & EF_MIPS_PIC)
-    newFlags |= EF_MIPS_CPIC;
-
-  std::lock_guard<std::mutex> lock(_mutex);
-
-  // If the old set of flags is empty, use the new one as a result.
-  if (!_flags) {
-    _flags = newFlags;
-    return std::error_code();
-  }
-
-  // Check PIC / CPIC flags compatibility.
-  uint32_t newPic = newFlags & (EF_MIPS_PIC | EF_MIPS_CPIC);
-  uint32_t oldPic = _flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
-
-  if ((newPic != 0) != (oldPic != 0))
-    llvm::errs() << "lld warning: linking abicalls and non-abicalls files\n";
-
-  if (!(newPic & EF_MIPS_PIC))
-    _flags &= ~EF_MIPS_PIC;
-  if (newPic)
-    _flags |= EF_MIPS_CPIC;
-
-  // Check mixing -mnan=2008 / -mnan=legacy modules.
-  if ((newFlags & EF_MIPS_NAN2008) != (_flags & EF_MIPS_NAN2008))
-    return make_dynamic_error_code(
-        "Linking -mnan=2008 and -mnan=legacy modules");
-
-  // Check ISA compatibility and update the extension flag.
-  uint32_t oldArch = _flags & EF_MIPS_ARCH;
-  if (!matchMipsISA(newArch, oldArch)) {
-    if (!matchMipsISA(oldArch, newArch))
-      return make_dynamic_error_code("Linking modules with incompatible ISA");
-    _flags &= ~EF_MIPS_ARCH;
-    _flags |= newArch;
-  }
-
-  _flags |= newFlags & EF_MIPS_NOREORDER;
-  _flags |= newFlags & EF_MIPS_MICROMIPS;
-  _flags |= newFlags & EF_MIPS_NAN2008;
-  _flags |= newFlags & EF_MIPS_32BITMODE;
-
-  return std::error_code();
-}

Removed: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.h?rev=238683&view=auto
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFFlagsMerger.h (removed)
@@ -1,36 +0,0 @@
-//===- lib/ReaderWriter/ELF/MipsELFFlagsMerger.h --------------------------===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#ifndef LLD_READER_WRITER_ELF_MIPS_MIPS_ELF_FLAGS_MERGER_H
-#define LLD_READER_WRITER_ELF_MIPS_MIPS_ELF_FLAGS_MERGER_H
-
-#include <mutex>
-#include <system_error>
-
-namespace lld {
-namespace elf {
-
-class MipsELFFlagsMerger {
-public:
-  MipsELFFlagsMerger(bool is64Bits);
-
-  uint32_t getMergedELFFlags() const;
-
-  /// \brief Merge saved ELF header flags and the new set of flags.
-  std::error_code mergeFlags(uint32_t newFlags);
-
-private:
-  const bool _is64Bit;
-  std::mutex _mutex;
-  uint32_t _flags;
-};
-
-} // namespace elf
-} // namespace lld
-
-#endif

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.cpp?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.cpp Sun May 31 15:36:11 2015
@@ -27,8 +27,9 @@ namespace elf {
 
 template <class ELFT>
 MipsELFWriter<ELFT>::MipsELFWriter(MipsLinkingContext &ctx,
-                                   MipsTargetLayout<ELFT> &targetLayout)
-    : _ctx(ctx), _targetLayout(targetLayout) {}
+                                   MipsTargetLayout<ELFT> &targetLayout,
+                                   const MipsAbiInfoHandler<ELFT> &abiInfo)
+    : _ctx(ctx), _targetLayout(targetLayout), _abiInfo(abiInfo) {}
 
 template <class ELFT>
 void MipsELFWriter<ELFT>::setELFHeader(ELFHeader<ELFT> &elfHeader) {
@@ -40,7 +41,7 @@ void MipsELFWriter<ELFT>::setELFHeader(E
   else
     elfHeader.e_ident(llvm::ELF::EI_ABIVERSION, 0);
 
-  elfHeader.e_flags(_ctx.getMergedELFFlags());
+  elfHeader.e_flags(_abiInfo.getFlags());
 }
 
 template <class ELFT>
@@ -70,6 +71,20 @@ std::unique_ptr<RuntimeFile<ELFT>> MipsE
 }
 
 template <class ELFT>
+unique_bump_ptr<Section<ELFT>>
+MipsELFWriter<ELFT>::createOptionsSection(llvm::BumpPtrAllocator &alloc) {
+  typedef unique_bump_ptr<Section<ELFT>> Ptr;
+  const auto &regMask = _abiInfo.getRegistersMask();
+  if (!regMask.hasValue())
+    return Ptr();
+  return ELFT::Is64Bits
+             ? Ptr(new (alloc)
+                       MipsOptionsSection<ELFT>(_ctx, _targetLayout, *regMask))
+             : Ptr(new (alloc)
+                       MipsReginfoSection<ELFT>(_ctx, _targetLayout, *regMask));
+}
+
+template <class ELFT>
 void MipsELFWriter<ELFT>::setAtomValue(StringRef name, uint64_t value) {
   AtomLayout *atom = _targetLayout.findAbsoluteAtom(name);
   assert(atom);
@@ -78,9 +93,10 @@ void MipsELFWriter<ELFT>::setAtomValue(S
 
 template <class ELFT>
 MipsDynamicLibraryWriter<ELFT>::MipsDynamicLibraryWriter(
-    MipsLinkingContext &ctx, MipsTargetLayout<ELFT> &layout)
-    : DynamicLibraryWriter<ELFT>(ctx, layout), _writeHelper(ctx, layout),
-      _targetLayout(layout) {}
+    MipsLinkingContext &ctx, MipsTargetLayout<ELFT> &layout,
+    const MipsAbiInfoHandler<ELFT> &abiInfo)
+    : DynamicLibraryWriter<ELFT>(ctx, layout),
+      _writeHelper(ctx, layout, abiInfo), _targetLayout(layout) {}
 
 template <class ELFT>
 void MipsDynamicLibraryWriter<ELFT>::createImplicitFiles(
@@ -98,17 +114,9 @@ void MipsDynamicLibraryWriter<ELFT>::fin
 template <class ELFT>
 void MipsDynamicLibraryWriter<ELFT>::createDefaultSections() {
   DynamicLibraryWriter<ELFT>::createDefaultSections();
-  const auto &ctx = static_cast<const MipsLinkingContext &>(this->_ctx);
-  const auto &mask = ctx.getMergedReginfoMask();
-  if (!mask.hasValue())
-    return;
-  if (ELFT::Is64Bits)
-    _reginfo = unique_bump_ptr<Section<ELFT>>(
-        new (this->_alloc) MipsOptionsSection<ELFT>(ctx, _targetLayout, *mask));
-  else
-    _reginfo = unique_bump_ptr<Section<ELFT>>(
-        new (this->_alloc) MipsReginfoSection<ELFT>(ctx, _targetLayout, *mask));
-  this->_layout.addSection(_reginfo.get());
+  _reginfo = _writeHelper.createOptionsSection(this->_alloc);
+  if (_reginfo)
+    this->_layout.addSection(_reginfo.get());
 }
 
 template <class ELFT>
@@ -143,9 +151,10 @@ template class MipsDynamicLibraryWriter<
 template class MipsDynamicLibraryWriter<ELF64LE>;
 
 template <class ELFT>
-MipsExecutableWriter<ELFT>::MipsExecutableWriter(MipsLinkingContext &ctx,
-                                                 MipsTargetLayout<ELFT> &layout)
-    : ExecutableWriter<ELFT>(ctx, layout), _writeHelper(ctx, layout),
+MipsExecutableWriter<ELFT>::MipsExecutableWriter(
+    MipsLinkingContext &ctx, MipsTargetLayout<ELFT> &layout,
+    const MipsAbiInfoHandler<ELFT> &abiInfo)
+    : ExecutableWriter<ELFT>(ctx, layout), _writeHelper(ctx, layout, abiInfo),
       _targetLayout(layout) {}
 
 template <class ELFT>
@@ -223,17 +232,9 @@ void MipsExecutableWriter<ELFT>::finaliz
 
 template <class ELFT> void MipsExecutableWriter<ELFT>::createDefaultSections() {
   ExecutableWriter<ELFT>::createDefaultSections();
-  const auto &ctx = static_cast<const MipsLinkingContext &>(this->_ctx);
-  const auto &mask = ctx.getMergedReginfoMask();
-  if (!mask.hasValue())
-    return;
-  if (ELFT::Is64Bits)
-    _reginfo = unique_bump_ptr<Section<ELFT>>(
-        new (this->_alloc) MipsOptionsSection<ELFT>(ctx, _targetLayout, *mask));
-  else
-    _reginfo = unique_bump_ptr<Section<ELFT>>(
-        new (this->_alloc) MipsReginfoSection<ELFT>(ctx, _targetLayout, *mask));
-  this->_layout.addSection(_reginfo.get());
+  _reginfo = _writeHelper.createOptionsSection(this->_alloc);
+  if (_reginfo)
+    this->_layout.addSection(_reginfo.get());
 }
 
 template <class ELFT>

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.h?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.h Sun May 31 15:36:11 2015
@@ -11,6 +11,7 @@
 
 #include "DynamicLibraryWriter.h"
 #include "ExecutableWriter.h"
+#include "MipsAbiInfoHandler.h"
 #include "MipsLinkingContext.h"
 
 namespace lld {
@@ -20,17 +21,21 @@ template <class ELFT> class MipsTargetLa
 
 template <typename ELFT> class MipsELFWriter {
 public:
-  MipsELFWriter(MipsLinkingContext &ctx, MipsTargetLayout<ELFT> &targetLayout);
+  MipsELFWriter(MipsLinkingContext &ctx, MipsTargetLayout<ELFT> &targetLayout,
+                const MipsAbiInfoHandler<ELFT> &abiInfo);
 
   void setELFHeader(ELFHeader<ELFT> &elfHeader);
 
   void finalizeMipsRuntimeAtomValues();
 
   std::unique_ptr<RuntimeFile<ELFT>> createRuntimeFile();
+  unique_bump_ptr<Section<ELFT>>
+  createOptionsSection(llvm::BumpPtrAllocator &alloc);
 
 private:
   MipsLinkingContext &_ctx;
   MipsTargetLayout<ELFT> &_targetLayout;
+  const MipsAbiInfoHandler<ELFT> &_abiInfo;
 
   void setAtomValue(StringRef name, uint64_t value);
 };
@@ -39,7 +44,8 @@ template <class ELFT>
 class MipsDynamicLibraryWriter : public DynamicLibraryWriter<ELFT> {
 public:
   MipsDynamicLibraryWriter(MipsLinkingContext &ctx,
-                           MipsTargetLayout<ELFT> &layout);
+                           MipsTargetLayout<ELFT> &layout,
+                           const MipsAbiInfoHandler<ELFT> &abiInfo);
 
 protected:
   // Add any runtime files and their atoms to the output
@@ -63,7 +69,8 @@ private:
 template <class ELFT>
 class MipsExecutableWriter : public ExecutableWriter<ELFT> {
 public:
-  MipsExecutableWriter(MipsLinkingContext &ctx, MipsTargetLayout<ELFT> &layout);
+  MipsExecutableWriter(MipsLinkingContext &ctx, MipsTargetLayout<ELFT> &layout,
+                       const MipsAbiInfoHandler<ELFT> &abiInfo);
 
 protected:
   void buildDynamicSymbolTable(const File &file) override;

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp Sun May 31 15:36:11 2015
@@ -37,29 +37,7 @@ static std::unique_ptr<TargetHandler> cr
 }
 
 MipsLinkingContext::MipsLinkingContext(llvm::Triple triple)
-    : ELFLinkingContext(triple, createTarget(triple, *this)),
-      _flagsMerger(triple.isArch64Bit()) {}
-
-std::error_code MipsLinkingContext::mergeElfFlags(uint64_t flags) {
-  return _flagsMerger.mergeFlags(flags);
-}
-
-void MipsLinkingContext::mergeReginfoMask(const MipsReginfo &info) {
-  std::lock_guard<std::mutex> lock(_maskMutex);
-  if (_reginfoMask.hasValue())
-    _reginfoMask->merge(info);
-  else
-    _reginfoMask = info;
-}
-
-uint32_t MipsLinkingContext::getMergedELFFlags() const {
-  return _flagsMerger.getMergedELFFlags();
-}
-
-const llvm::Optional<MipsReginfo> &
-MipsLinkingContext::getMergedReginfoMask() const {
-  return _reginfoMask;
-}
+    : ELFLinkingContext(triple, createTarget(triple, *this)) {}
 
 uint64_t MipsLinkingContext::getBaseAddress() const {
   if (_baseAddress == 0 && getOutputELFType() == llvm::ELF::ET_EXEC)

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h Sun May 31 15:36:11 2015
@@ -9,10 +9,7 @@
 #ifndef LLD_READER_WRITER_ELF_MIPS_MIPS_LINKING_CONTEXT_H
 #define LLD_READER_WRITER_ELF_MIPS_MIPS_LINKING_CONTEXT_H
 
-#include "MipsELFFlagsMerger.h"
-#include "MipsReginfo.h"
 #include "lld/ReaderWriter/ELFLinkingContext.h"
-#include <mutex>
 
 namespace lld {
 namespace elf {
@@ -39,18 +36,10 @@ enum {
 
 class MipsLinkingContext final : public ELFLinkingContext {
 public:
-  int getMachineType() const override { return llvm::ELF::EM_MIPS; }
   MipsLinkingContext(llvm::Triple triple);
 
-  std::error_code mergeElfFlags(uint64_t flags);
-  void mergeReginfoMask(const MipsReginfo &info);
-
-  uint32_t getMergedELFFlags() const;
-  const llvm::Optional<MipsReginfo> &getMergedReginfoMask() const;
-
   void registerRelocationNames(Registry &r) override;
-
-  // ELFLinkingContext
+  int getMachineType() const override { return llvm::ELF::EM_MIPS; }
   uint64_t getBaseAddress() const override;
   StringRef entrySymbolName() const override;
   StringRef getDefaultInterpreter() const override;
@@ -60,11 +49,6 @@ public:
   bool isCopyRelocation(const Reference &r) const override;
   bool isPLTRelocation(const Reference &r) const override;
   bool isRelativeReloc(const Reference &r) const override;
-
-private:
-  MipsELFFlagsMerger _flagsMerger;
-  std::mutex _maskMutex;
-  llvm::Optional<MipsReginfo> _reginfoMask;
 };
 
 } // elf

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp Sun May 31 15:36:11 2015
@@ -10,6 +10,7 @@
 #include "MipsELFFile.h"
 #include "MipsLinkingContext.h"
 #include "MipsRelocationPass.h"
+#include "MipsTargetHandler.h"
 #include "llvm/ADT/DenseSet.h"
 
 using namespace lld;
@@ -310,6 +311,12 @@ private:
   /// \brief Owner of all the Atoms created by this pass.
   RelocationPassFile _file;
 
+  /// \brief Linked files contain MIPS R6 code.
+  bool _isMipsR6 = false;
+
+  /// \brief Linked files contain microMIPS code.
+  bool _isMicroMips = false;
+
   /// \brief Map Atoms and addend to local GOT entries.
   typedef std::pair<const Atom *, int64_t> LocalGotMapKeyT;
   llvm::DenseMap<LocalGotMapKeyT, GOTAtom *> _gotLocalMap;
@@ -411,8 +418,6 @@ private:
   bool mightBeDynamic(const MipsELFDefinedAtom<ELFT> &atom,
                       Reference::KindValue refKind) const;
   bool hasPLTEntry(const Atom *atom) const;
-
-  bool isR6Target() const;
 };
 
 template <typename ELFT>
@@ -425,6 +430,14 @@ RelocationPass<ELFT>::RelocationPass(Mip
 
 template <typename ELFT>
 void RelocationPass<ELFT>::perform(std::unique_ptr<SimpleFile> &mf) {
+  auto &handler =
+      static_cast<MipsTargetHandler<ELFT> &>(this->_ctx.getTargetHandler());
+
+  uint32_t elfFlags = handler.getAbiInfoHandler().getFlags();
+  _isMicroMips = elfFlags & EF_MIPS_MICROMIPS;
+  _isMipsR6 = (elfFlags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6 ||
+              (elfFlags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R6;
+
   for (const auto &atom : mf->defined())
     for (const auto &ref : *atom)
       collectReferenceInfo(*cast<MipsELFDefinedAtom<ELFT>>(atom),
@@ -696,16 +709,6 @@ bool RelocationPass<ELFT>::hasPLTEntry(c
   return _pltRegMap.count(atom) || _pltMicroMap.count(atom);
 }
 
-template <typename ELFT> bool RelocationPass<ELFT>::isR6Target() const {
-  switch (_ctx.getMergedELFFlags() & EF_MIPS_ARCH) {
-  case EF_MIPS_ARCH_32R6:
-  case EF_MIPS_ARCH_64R6:
-    return true;
-  default:
-    return false;
-  }
-}
-
 template <typename ELFT>
 bool RelocationPass<ELFT>::requirePLTEntry(const Atom *a) const {
   if (!_hasStaticRelocations.count(a))
@@ -757,10 +760,8 @@ const LA25Atom *RelocationPass<ELFT>::ge
 
 template <typename ELFT>
 const PLTAtom *RelocationPass<ELFT>::getPLTEntry(const Atom *a) {
-  bool hasMicroCode = _ctx.getMergedELFFlags() & EF_MIPS_MICROMIPS;
-
   // If file contains microMIPS code try to reuse compressed PLT entry...
-  if (hasMicroCode) {
+  if (_isMicroMips) {
     auto microPLT = _pltMicroMap.find(a);
     if (microPLT != _pltMicroMap.end())
       return microPLT->second;
@@ -772,7 +773,7 @@ const PLTAtom *RelocationPass<ELFT>::get
     return regPLT->second;
 
   // ... and finally prefer to create new compressed PLT entry.
-  return hasMicroCode ? getPLTMicroEntry(a) : getPLTRegEntry(a);
+  return _isMicroMips ? getPLTMicroEntry(a) : getPLTRegEntry(a);
 }
 
 template <typename ELFT>
@@ -1009,7 +1010,7 @@ const PLTAtom *RelocationPass<ELFT>::get
   if (plt != _pltRegMap.end())
     return plt->second;
 
-  PLTAAtom *pa = isR6Target()
+  PLTAAtom *pa = _isMipsR6
                      ? new (_file._alloc) PLTR6Atom(getGOTPLTEntry(a), _file)
                      : new (_file._alloc) PLTAAtom(getGOTPLTEntry(a), _file);
   _pltRegMap[a] = pa;

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp Sun May 31 15:36:11 2015
@@ -41,10 +41,11 @@ template <class ELFT>
 std::unique_ptr<Writer> MipsTargetHandler<ELFT>::getWriter() {
   switch (_ctx.getOutputELFType()) {
   case llvm::ELF::ET_EXEC:
-    return llvm::make_unique<MipsExecutableWriter<ELFT>>(_ctx, *_targetLayout);
+    return llvm::make_unique<MipsExecutableWriter<ELFT>>(_ctx, *_targetLayout,
+                                                         _abiInfoHandler);
   case llvm::ELF::ET_DYN:
-    return llvm::make_unique<MipsDynamicLibraryWriter<ELFT>>(_ctx,
-                                                             *_targetLayout);
+    return llvm::make_unique<MipsDynamicLibraryWriter<ELFT>>(
+        _ctx, *_targetLayout, _abiInfoHandler);
   case llvm::ELF::ET_REL:
     llvm_unreachable("TODO: support -r mode");
   default:

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h?rev=238684&r1=238683&r2=238684&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h Sun May 31 15:36:11 2015
@@ -9,6 +9,7 @@
 #ifndef LLD_READER_WRITER_ELF_MIPS_MIPS_TARGET_HANDLER_H
 #define LLD_READER_WRITER_ELF_MIPS_MIPS_TARGET_HANDLER_H
 
+#include "MipsAbiInfoHandler.h"
 #include "MipsLinkingContext.h"
 #include "MipsTargetLayout.h"
 #include "TargetHandler.h"
@@ -21,6 +22,8 @@ template <class ELFT> class MipsTargetHa
 public:
   MipsTargetHandler(MipsLinkingContext &ctx);
 
+  MipsAbiInfoHandler<ELFT> &getAbiInfoHandler() { return _abiInfoHandler; }
+
   std::unique_ptr<Reader> getObjReader() override;
   std::unique_ptr<Reader> getDSOReader() override;
   const TargetRelocationHandler &getRelocationHandler() const override;
@@ -30,6 +33,7 @@ private:
   MipsLinkingContext &_ctx;
   std::unique_ptr<MipsTargetLayout<ELFT>> _targetLayout;
   std::unique_ptr<TargetRelocationHandler> _relocationHandler;
+  MipsAbiInfoHandler<ELFT> _abiInfoHandler;
 };
 
 template <class ELFT> class MipsSymbolTable : public SymbolTable<ELFT> {





More information about the llvm-commits mailing list