[llvm-commits] [lld] r173217 - in /lld/trunk: include/lld/Core/ include/lld/Driver/ include/lld/ReaderWriter/ lib/Driver/ lib/ReaderWriter/ lib/ReaderWriter/ELF/ lib/ReaderWriter/MachO/ lib/ReaderWriter/Native/ lib/ReaderWriter/PECOFF/ lib/ReaderWriter/YAML/ test/elf/ tools/lld-core/

Michael J. Spencer bigcheesegs at gmail.com
Tue Jan 22 17:18:44 PST 2013


Author: mspencer
Date: Tue Jan 22 19:18:43 2013
New Revision: 173217

URL: http://llvm.org/viewvc/llvm-project?rev=173217&view=rev
Log:
Move everything over to TargetInfo.

I really would have liked to split this patch up, but it would greatly
complicate the lld-core and lld drivers having to deal with both
{Reader,Writer}Option and TargetInfo.

Removed:
    lld/trunk/include/lld/ReaderWriter/ReaderELF.h
    lld/trunk/include/lld/ReaderWriter/ReaderMachO.h
    lld/trunk/include/lld/ReaderWriter/ReaderNative.h
    lld/trunk/include/lld/ReaderWriter/ReaderPECOFF.h
    lld/trunk/include/lld/ReaderWriter/ReaderYAML.h
    lld/trunk/include/lld/ReaderWriter/WriterELF.h
    lld/trunk/include/lld/ReaderWriter/WriterMachO.h
    lld/trunk/include/lld/ReaderWriter/WriterNative.h
    lld/trunk/include/lld/ReaderWriter/WriterPECOFF.h
    lld/trunk/include/lld/ReaderWriter/WriterYAML.h
    lld/trunk/lib/ReaderWriter/ELF/WriterOptionsELF.cpp
    lld/trunk/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp
Modified:
    lld/trunk/include/lld/Core/LinkerOptions.h
    lld/trunk/include/lld/Core/Pass.h
    lld/trunk/include/lld/Core/TargetInfo.h
    lld/trunk/include/lld/Driver/Target.h
    lld/trunk/include/lld/ReaderWriter/MachOTargetInfo.h
    lld/trunk/include/lld/ReaderWriter/Reader.h
    lld/trunk/include/lld/ReaderWriter/ReaderArchive.h
    lld/trunk/include/lld/ReaderWriter/Writer.h
    lld/trunk/lib/Driver/Drivers.cpp
    lld/trunk/lib/Driver/LinkerInvocation.cpp
    lld/trunk/lib/Driver/Targets.cpp
    lld/trunk/lib/ReaderWriter/ELF/CMakeLists.txt
    lld/trunk/lib/ReaderWriter/ELF/DefaultELFLayout.h
    lld/trunk/lib/ReaderWriter/ELF/ELFSegmentChunks.h
    lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
    lld/trunk/lib/ReaderWriter/ELF/ELFWriter.h
    lld/trunk/lib/ReaderWriter/ELF/ExecutableAtoms.h
    lld/trunk/lib/ReaderWriter/ELF/ReaderELF.cpp
    lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.cpp
    lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.h
    lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp
    lld/trunk/lib/ReaderWriter/MachO/CMakeLists.txt
    lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
    lld/trunk/lib/ReaderWriter/MachO/GOTPass.hpp
    lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp
    lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp
    lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h
    lld/trunk/lib/ReaderWriter/MachO/StubsPass.hpp
    lld/trunk/lib/ReaderWriter/MachO/WriterMachO.cpp
    lld/trunk/lib/ReaderWriter/Native/ReaderNative.cpp
    lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp
    lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
    lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
    lld/trunk/lib/ReaderWriter/Reader.cpp
    lld/trunk/lib/ReaderWriter/ReaderArchive.cpp
    lld/trunk/lib/ReaderWriter/Writer.cpp
    lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
    lld/trunk/test/elf/reloc.objtxt
    lld/trunk/tools/lld-core/TestingHelpers.hpp
    lld/trunk/tools/lld-core/lld-core.cpp

Modified: lld/trunk/include/lld/Core/LinkerOptions.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/LinkerOptions.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/LinkerOptions.h (original)
+++ lld/trunk/include/lld/Core/LinkerOptions.h Tue Jan 22 19:18:43 2013
@@ -121,6 +121,11 @@
   Executable,
   Relocatable,
   Shared,
+  SharedStubs,
+  Core,
+  DebugSymbols,
+  Bundle,
+  Preload,
 };
 
 struct LinkerOptions {

Modified: lld/trunk/include/lld/Core/Pass.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Pass.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/Pass.h (original)
+++ lld/trunk/include/lld/Core/Pass.h Tue Jan 22 19:18:43 2013
@@ -61,7 +61,7 @@
 
   /// Returns whether the Reference kind is for a call site.  The pass
   /// uses this to find calls that need to be indirected through a stub.
-  virtual bool isCallSite(Reference::Kind) = 0;
+  virtual bool isCallSite(int32_t) = 0;
 
   /// Returns a file format specific atom for a stub/PLT entry which contains
   /// instructions which jump to the specified atom.  May be called multiple
@@ -96,7 +96,7 @@
   /// Returns whether the Reference kind is a pre-instantiated GOT access.
   /// The default implementation of perform() uses this to figure out
   /// what GOT entries to instantiate.
-  virtual bool isGOTAccess(Reference::Kind, bool &canBypassGOT) = 0;
+  virtual bool isGOTAccess(int32_t, bool &canBypassGOT) = 0;
 
   /// The file format Writer needs to alter the reference kind from a
   /// pre-instantiated GOT access to an actual access.  If targetIsNowGOT is

Modified: lld/trunk/include/lld/Core/TargetInfo.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/TargetInfo.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/TargetInfo.h (original)
+++ lld/trunk/include/lld/Core/TargetInfo.h Tue Jan 22 19:18:43 2013
@@ -56,14 +56,14 @@
   virtual GOTPass *getGOTPass() const { return nullptr; }
 
   // TODO: Split out to TargetRelocationInfo.
-  virtual ErrorOr<uint32_t> relocKindFromString(StringRef str) const {
-    uint32_t val;
+  virtual ErrorOr<int32_t> relocKindFromString(StringRef str) const {
+    int32_t val;
     if (str.getAsInteger(10, val))
       return llvm::make_error_code(llvm::errc::invalid_argument);
     return val;
   }
 
-  virtual ErrorOr<std::string> stringFromRelocKind(uint32_t kind) const {
+  virtual ErrorOr<std::string> stringFromRelocKind(int32_t kind) const {
     std::string s;
     llvm::raw_string_ostream str(s);
     str << kind;

Modified: lld/trunk/include/lld/Driver/Target.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Driver/Target.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/include/lld/Driver/Target.h (original)
+++ lld/trunk/include/lld/Driver/Target.h Tue Jan 22 19:18:43 2013
@@ -17,17 +17,29 @@
 #ifndef LLD_DRIVER_TARGET_H
 #define LLD_DRIVER_TARGET_H
 
-#include "lld/Core/LinkerOptions.h"
-#include "lld/ReaderWriter/Reader.h"
-#include "lld/ReaderWriter/Writer.h"
+#include "lld/Core/TargetInfo.h"
+
+#include "llvm/Support/ErrorOr.h"
+
+#include <memory>
 
 namespace lld {
+class LinkerInput;
+struct LinkerOptions;
+class Reader;
+class TargetInfo;
+class Writer;
+
 /// \brief Represents a specific target.
 class Target {
+protected:
+  Target(std::unique_ptr<TargetInfo> ti) : _targetInfo(std::move(ti)) {}
+
 public:
-  Target(const LinkerOptions &lo) : _options(lo) {}
   virtual ~Target();
 
+  const TargetInfo &getTargetInfo() const { return *_targetInfo; };
+
   /// \brief Get a reference to a Reader for the given input.
   ///
   /// Will always return the same object for the same input.
@@ -39,7 +51,7 @@
   static std::unique_ptr<Target> create(const LinkerOptions&);
 
 protected:
-  const LinkerOptions &_options;
+  std::unique_ptr<TargetInfo> _targetInfo;
 };
 }
 

Modified: lld/trunk/include/lld/ReaderWriter/MachOTargetInfo.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/MachOTargetInfo.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/MachOTargetInfo.h (original)
+++ lld/trunk/include/lld/ReaderWriter/MachOTargetInfo.h Tue Jan 22 19:18:43 2013
@@ -23,6 +23,9 @@
   uint32_t getCPUType() const;
   uint32_t getCPUSubType() const;
 
+  bool addEntryPointLoadCommand() const;
+  bool addUnixThreadLoadCommand() const;
+
   virtual uint64_t getPageZeroSize() const = 0;
 
   static std::unique_ptr<MachOTargetInfo> create(const LinkerOptions &lo);

Modified: lld/trunk/include/lld/ReaderWriter/Reader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/Reader.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/Reader.h (original)
+++ lld/trunk/include/lld/ReaderWriter/Reader.h Tue Jan 22 19:18:43 2013
@@ -1,4 +1,4 @@
-//===- ReaderWriter/Reader.h - Abstract File Format Reading Interface -----===//
+//===- lld/ReaderWriter/Reader.h - Abstract File Format Reading Interface -===//
 //
 //                             The LLVM Linker
 //
@@ -7,68 +7,60 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLD_READERWRITER_READER_H_
-#define LLD_READERWRITER_READER_H_
+#ifndef LLD_READERWRITER_READER_H
+#define LLD_READERWRITER_READER_H
 
 #include "lld/Core/LLVM.h"
+#include "lld/Core/TargetInfo.h"
+
+#include <functional>
 #include <memory>
 #include <vector>
 
 namespace lld {
 class File;
+class LinkerInput;
+struct LinkerOptions;
 
+/// \brief An abstract class for reading object files, library files, and
+/// executable files.
 ///
-/// The Reader is an abstract class for reading object files, 
-/// library files, and executable files.  Each file format
-/// (e.g. ELF, mach-o, PECOFF, native, etc) have a concrete subclass
-/// of Reader.  
-///
+/// Each file format (e.g. ELF, mach-o, PECOFF, native, etc) have a concrete
+/// subclass of Reader.  
 class Reader {
 public:
   virtual ~Reader();
-  
  
-  /// Parse a file given its file system path and create a File object. 
+  /// \brief Parse a file given its file system path and create a File object.
   virtual error_code readFile(StringRef path,
                               std::vector<std::unique_ptr<File>> &result);
 
-  /// Parse a supplied buffer (already filled with the contents of a file)
-  /// and create a File object. 
-  /// On success, the resulting File object takes ownership of 
-  /// the MemoryBuffer.
+  /// \brief Parse a supplied buffer (already filled with the contents of a
+  /// file) and create a File object. 
+  ///
+  /// On success, the resulting File object takes ownership of the MemoryBuffer.
   virtual error_code parseFile(std::unique_ptr<MemoryBuffer> mb,
                                std::vector<std::unique_ptr<File>> &result) = 0;
   
 protected:
   // only concrete subclasses can be instantiated
-  Reader();
-};
-
-
-
-///
-/// The ReaderOptions encapsulates the options used by all Readers.  
-/// Each file format defines a subclass of ReaderOptions
-/// to hold file format specific options.  The option objects are the only
-/// way to control the behaviour of Readers.
-///
-class ReaderOptions {
-public:
-  // Any options common to all file format Readers will go here.
+  Reader(const TargetInfo &ti)
+      : _targetInfo(ti), _options(ti.getLinkerOptions()) {}
 
-protected:
-  // only concrete subclasses can be instantiated
-  ReaderOptions();
+  const TargetInfo &_targetInfo;
+  const LinkerOptions &_options;
 };
 
+typedef ErrorOr<Reader&> ReaderFunc(const LinkerInput &);
 
+std::unique_ptr<Reader> createReaderELF(const TargetInfo &,
+                                        std::function<ReaderFunc>);
+std::unique_ptr<Reader> createReaderMachO(const TargetInfo &,
+                                          std::function<ReaderFunc>);
+std::unique_ptr<Reader> createReaderNative(const TargetInfo &);
+std::unique_ptr<Reader> createReaderPECOFF(const TargetInfo &,
+                                           std::function<ReaderFunc>);
+std::unique_ptr<Reader> createReaderYAML(const TargetInfo &);
+} // end namespace lld
 
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_READER_H_
-
-
-
-
+#endif

Modified: lld/trunk/include/lld/ReaderWriter/ReaderArchive.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ReaderArchive.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ReaderArchive.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ReaderArchive.h Tue Jan 22 19:18:43 2013
@@ -1,66 +1,38 @@
-//===- ReaderWriter/ReaderArchive.h - Archive Library Reader ------------===//
+//===- lld/ReaderWriter/ReaderArchive.h - Archive Library Reader ----------===//
 //
 //                             The LLVM Linker
 //
 // This file is distributed under the University of Illinois Open Source
 // License. See LICENSE.TXT for details.
 //
-//===--------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
 
 #ifndef LLD_READER_ARCHIVE_H
 #define LLD_READER_ARCHIVE_H
 
-#include "lld/Core/ArchiveLibraryFile.h"
-#include "lld/Core/File.h"
 #include "lld/Core/LLVM.h"
 #include "lld/ReaderWriter/Reader.h"
-#include "lld/ReaderWriter/ReaderArchive.h"
 
-#include "llvm/ADT/OwningPtr.h"
-#include "llvm/ADT/StringRef.h"
 #include "llvm/Object/Archive.h"
-#include "llvm/Object/ObjectFile.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/system_error.h"
 
+#include <functional>
 #include <memory>
 #include <vector>
 
 namespace lld {
-
-/// \brief The ReaderOptionsArchive encapsulates the options used by the
-///        ReaderArchive. The option objects are the only way to control the
-///        behaviour of Readers.
-class ReaderOptionsArchive {
-public:
-  ReaderOptionsArchive(bool isForceLoad = false)
-    : _isForceLoad(isForceLoad)
-    , _reader(nullptr)
-  { }
-  
-  bool isForceLoad() const {
-    return _isForceLoad;
-  }
-  
-  Reader *reader() const {
-    return _reader;
-  }
-
-  void setReader(Reader *r) {
-    _reader = r;
-  }
-  
-private:
-  bool _isForceLoad;
-  Reader *_reader;
-};
+class File;
+class LinkerInput;
+class TargetInfo;
 
 /// \brief ReaderArchive is a class for reading archive libraries
 class ReaderArchive : public Reader {
 public:
-  ReaderArchive(const ReaderOptionsArchive &options)
-    : _options(options)
-  { }
+  ReaderArchive(const TargetInfo &ti,
+                std::function<ErrorOr<Reader&> (const LinkerInput &)> getReader)
+      : Reader(ti),
+        _getReader(getReader) {}
 
   /// \brief Returns a vector of Files that are contained in the archive file 
   ///        pointed to by the Memorybuffer
@@ -68,10 +40,9 @@
                        std::vector<std::unique_ptr<File>> &result);
 
 private:
-  const ReaderOptionsArchive &_options;
+  std::function<ErrorOr<Reader&> (const LinkerInput &)> _getReader;
   std::unique_ptr<llvm::object::Archive> _archive;
 };
+} // end namespace lld
 
-} // namespace lld
-
-#endif // LLD_READER_ARCHIVE_H
+#endif

Removed: lld/trunk/include/lld/ReaderWriter/ReaderELF.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ReaderELF.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ReaderELF.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ReaderELF.h (removed)
@@ -1,67 +0,0 @@
-//===- ReaderWriter/ReaderELF.h - ELF File Format Reading Interface -------===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_READER_ELF_H_
-#define LLD_READERWRITER_READER_ELF_H_
-
-#include "lld/ReaderWriter/Reader.h"
-#include "lld/ReaderWriter/ReaderArchive.h"
-#include "lld/Core/LLVM.h"
-
-
-namespace lld {
-
-/// 
-/// The ReaderOptionsELF class encapsulates options needed 
-/// to process mach-o files.  You can create an ReaderOptionsELF 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class ReaderOptionsELF : public ReaderOptions {
-public:
-  virtual ~ReaderOptionsELF();
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  ReaderOptionsELF(int argc, const char* argv[]);
-  
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  ReaderOptionsELF();
-
-
-  
-protected:
-};
- 
-
-
-
-///
-/// The only way to instantiate a ReaderELF object  
-/// is via this createReaderELF function.  The is no public 
-/// ReaderELF class that you might be tempted to subclass.
-/// Support for all variants must be represented in the ReaderOptionsELF
-/// object.
-/// The Reader object created retains a reference to the 
-/// ReaderOptionsELF object supplied, so the objects object must not be  
-/// destroyed before the Reader object. 
-///
-Reader* createReaderELF(const ReaderOptionsELF &options, 
-                        ReaderOptionsArchive &optionsArchive);
-
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_READER_ELF_H_

Removed: lld/trunk/include/lld/ReaderWriter/ReaderMachO.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ReaderMachO.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ReaderMachO.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ReaderMachO.h (removed)
@@ -1,68 +0,0 @@
-//===- ReaderWriter/ReaderMachO.h - MachO File Format Reading Interface ---===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READER_WRITER_READER_MACHO_H_
-#define LLD_READER_WRITER_READER_MACHO_H_
-
-#include "lld/ReaderWriter/Reader.h"
-#include "lld/Core/LLVM.h"
-#include "llvm/ADT/StringRef.h"
-
-
-namespace lld {
-
-/// 
-/// The ReaderOptionsMachO class encapsulates options needed 
-/// to process mach-o files.  You can create an ReaderOptionsMachO 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class ReaderOptionsMachO : public ReaderOptions {
-public:
-  virtual ~ReaderOptionsMachO()  { }
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  ReaderOptionsMachO(int argc, const char* argv[]);
-  
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  ReaderOptionsMachO();
-
-
-  StringRef archName() const    { return _archName; }
-  
-protected:
-  StringRef       _archName;
-};
- 
-
-
-
-///
-/// The only way to instantiate a ReaderMachO object  
-/// is via this createReaderMachO function.  The is no public 
-/// ReaderMachO class that you might be tempted to subclass.
-/// Support for all variants must be represented in the ReaderOptionsMachO
-/// object.
-/// The Reader object created retains a reference to the 
-/// ReaderOptionsMachO object supplied, so the objects object must not be  
-/// destroyed before the Reader object. 
-///
-Reader* createReaderMachO(const ReaderOptionsMachO &options);
-
-
-
-} // namespace lld
-
-#endif // LLD_READER_WRITER_READER_MACHO_H_

Removed: lld/trunk/include/lld/ReaderWriter/ReaderNative.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ReaderNative.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ReaderNative.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ReaderNative.h (removed)
@@ -1,63 +0,0 @@
-//===- ReaderWriter/ReaderNative.h - Native File Format Reading Interface ---===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_READER_NATIVE_H_
-#define LLD_READERWRITER_READER_NATIVE_H_
-
-#include "lld/ReaderWriter/Reader.h"
-#include "lld/Core/LLVM.h"
-
-
-namespace lld {
-
-/// 
-/// The ReaderOptionsNative class encapsulates options needed 
-/// to process mach-o files.  You can create an ReaderOptionsNative 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class ReaderOptionsNative : public ReaderOptions {
-public:
-  virtual ~ReaderOptionsNative();
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  ReaderOptionsNative(int argc, const char* argv[]);
-  
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  ReaderOptionsNative();
-  
-protected:
-};
- 
-
-
-
-///
-/// The only way to instantiate a ReaderNative object  
-/// is via this createReaderNative function.  The is no public 
-/// ReaderNative class that you might be tempted to subclass.
-/// Support for all variants must be represented in the ReaderOptionsNative
-/// object.
-/// The Reader object created retains a reference to the 
-/// ReaderOptionsNative object supplied, so the objects object must not be  
-/// destroyed before the Reader object. 
-///
-Reader* createReaderNative(const ReaderOptionsNative &options);
-
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_READER_NATIVE_H_

Removed: lld/trunk/include/lld/ReaderWriter/ReaderPECOFF.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ReaderPECOFF.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ReaderPECOFF.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ReaderPECOFF.h (removed)
@@ -1,64 +0,0 @@
-//===- ReaderWriter/ReaderPECOFF.h - PECOFF File Format Reading Interface ---===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_READER_PECOFF_H_
-#define LLD_READERWRITER_READER_PECOFF_H_
-
-#include "lld/ReaderWriter/Reader.h"
-#include "lld/Core/LLVM.h"
-
-
-namespace lld {
-
-/// 
-/// The ReaderOptionsPECOFF class encapsulates options needed 
-/// to process mach-o files.  You can create an ReaderOptionsPECOFF 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class ReaderOptionsPECOFF : public ReaderOptions {
-public:
-  virtual ~ReaderOptionsPECOFF();
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  ReaderOptionsPECOFF(int argc, const char* argv[]);
-  
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  ReaderOptionsPECOFF();
-
-  
-protected:
-};
- 
-
-
-
-///
-/// The only way to instantiate a ReaderPECOFF object  
-/// is via this createReaderPECOFF function.  The is no public 
-/// ReaderPECOFF class that you might be tempted to subclass.
-/// Support for all variants must be represented in the ReaderOptionsPECOFF
-/// object.
-/// The Reader object created retains a reference to the 
-/// ReaderOptionsPECOFF object supplied, so the objects object must not be  
-/// destroyed before the Reader object. 
-///
-Reader* createReaderPECOFF(const ReaderOptionsPECOFF &options);
-
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_READER_PECOFF_H_

Removed: lld/trunk/include/lld/ReaderWriter/ReaderYAML.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ReaderYAML.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ReaderYAML.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ReaderYAML.h (removed)
@@ -1,73 +0,0 @@
-//===- ReaderWriter/ReaderYAML.h - YAML File Format Reading Interface -----===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_READER_YAML_H_
-#define LLD_READERWRITER_READER_YAML_H_
-
-#include "lld/ReaderWriter/Reader.h"
-#include "lld/Core/LLVM.h"
-#include "lld/Core/Reference.h"
-#include "llvm/ADT/StringRef.h"
-
-
-namespace lld {
-
-/// 
-/// The ReaderOptionsYAML class encapsulates options needed 
-/// to process mach-o files.  You can create an ReaderOptionsYAML 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class ReaderOptionsYAML : public ReaderOptions {
-public:
-  virtual ~ReaderOptionsYAML();
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  ReaderOptionsYAML(int argc, const char* argv[]);
-  
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  ReaderOptionsYAML();
-
-
-  /// Converts a reference kind string to a in-memory numeric value.
-  /// Used when parsing YAML encoded object files.
-  virtual Reference::Kind kindFromString(StringRef) const = 0;
-
-  
-protected:
-};
- 
-
-
-
-///
-/// The only way to instantiate a ReaderYAML object  
-/// is via this createReaderYAML function.  The is no public 
-/// ReaderYAML class that you might be tempted to subclass.
-/// Support for all variants must be represented in the ReaderOptionsYAML
-/// object.
-/// The Reader object created retains a reference to the 
-/// ReaderOptionsYAML object supplied, so the objects object must not be  
-/// destroyed before the Reader object. 
-///
-Reader* createReaderYAML(const ReaderOptionsYAML &options);
-
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_READER_YAML_H_
-
-

Modified: lld/trunk/include/lld/ReaderWriter/Writer.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/Writer.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/Writer.h (original)
+++ lld/trunk/include/lld/ReaderWriter/Writer.h Tue Jan 22 19:18:43 2013
@@ -1,4 +1,4 @@
-//===- ReaderWriter/Writer.h - Abstract File Format Interface -------===//
+//===- lld/ReaderWriter/Writer.h - Abstract File Format Interface ---------===//
 //
 //                             The LLVM Linker
 //
@@ -7,80 +7,57 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLD_READERWRITER_WRITER_H_
-#define LLD_READERWRITER_WRITER_H_
+#ifndef LLD_READERWRITER_WRITER_H
+#define LLD_READERWRITER_WRITER_H
 
 #include "lld/Core/LLVM.h"
+
 #include <memory>
-#include <vector>
 
 namespace lld {
+class ELFTargetInfo;
 class File;
+class GOTPass;
 class InputFiles;
+class MachOTargetInfo;
 class StubsPass;
-class GOTPass;
+class TargetInfo;
 
-
-///
-/// The Writer is an abstract class for writing object files, 
-/// shared library files, and executable files.  Each file format
-/// (e.g. ELF, mach-o, PECOFF, native, etc) have a concrete subclass
-/// of Writer.  
-///
+/// \brief The Writer is an abstract class for writing object files, shared
+/// library files, and executable files.  Each file format (e.g. ELF, mach-o,
+/// PECOFF, native, etc) have a concrete subclass of Writer.
 class Writer {
 public:
   virtual ~Writer();
   
-  /// Write a file from the supplied File object 
-  virtual error_code writeFile(const lld::File &linkedFile, StringRef path) = 0;
+  /// \brief Write a file from the supplied File object 
+  virtual error_code writeFile(const File &linkedFile, StringRef path) = 0;
   
-  /// Return a Pass object for creating stubs/PLT entries
+  /// \brief Return a Pass object for creating stubs/PLT entries
   virtual StubsPass *stubPass() {
     return nullptr;
   }
   
-  /// Return a Pass object for creating GOT entries
+  /// \brief Return a Pass object for creating GOT entries
   virtual GOTPass *gotPass() {
     return nullptr;
   }
   
-  /// This method is called by Core Linking to give the Writer a chance to
-  /// add file format specific "files" to set of files to be linked.
-  /// This is how file format specific atoms can be added to the link.
-  virtual void addFiles(InputFiles&) {
-  }
-  
+  /// \brief This method is called by Core Linking to give the Writer a chance
+  /// to add file format specific "files" to set of files to be linked. This is
+  /// how file format specific atoms can be added to the link.
+  virtual void addFiles(InputFiles&) {}
   
 protected:
   // only concrete subclasses can be instantiated
   Writer();
 };
 
+std::unique_ptr<Writer> createWriterELF(const ELFTargetInfo &);
+std::unique_ptr<Writer> createWriterMachO(const MachOTargetInfo &);
+std::unique_ptr<Writer> createWriterNative(const TargetInfo &);
+std::unique_ptr<Writer> createWriterPECOFF(const TargetInfo &);
+std::unique_ptr<Writer> createWriterYAML(const TargetInfo &);
+} // end namespace lld
 
-
-///
-/// The WriterOptions encapsulates the options used by Writers.  
-/// Each file format defines a subclass of WriterOptions
-/// to hold file format specific options.  The option objects are the only
-/// way to control the behaviour of Writers.
-///
-class WriterOptions {
-public:
-  // Any options common to all file formats will go here.
-
-protected:
-  // only concrete subclasses can be instantiated
-  WriterOptions();
-};
-
-
-
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_WRITER_H_
-
-
-
-
+#endif

Removed: lld/trunk/include/lld/ReaderWriter/WriterELF.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/WriterELF.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/WriterELF.h (original)
+++ lld/trunk/include/lld/ReaderWriter/WriterELF.h (removed)
@@ -1,94 +0,0 @@
-//===- ReaderWriter/WriterELF.h - ELF File Format Writing Interface -------===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_WRITER_ELF_H_
-#define LLD_READERWRITER_WRITER_ELF_H_
-
-#include "lld/ReaderWriter/Writer.h"
-
-#include "lld/Core/LLVM.h"
-
-#include "llvm/Support/ELF.h"
-#include "llvm/Support/Endian.h"
-
-namespace lld {
-
-/// \brief The WriterOptionsELF class encapsulates options needed to process ELF
-/// files.
-///
-/// You can create an WriterOptionsELF instance from command line arguments or
-/// by subclassing and setting the instance variables in the subclass's
-/// constructor.
-class WriterOptionsELF {
-public:
-  WriterOptionsELF()
-    : _is64Bit(false)
-    , _endianness(llvm::support::little)
-    , _type(llvm::ELF::ET_EXEC)
-    , _pointerWidth(4)
-    , _machine(llvm::ELF::EM_386)
-    , _baseAddress(0x400000)
-    , _pageSize(0x1000)
-    , _entryPoint("start") {}
-
-  /// \brief Create a specific instance of an architecture.
-  ///
-  /// \param[in] Is64Bit Is this a ELF64 file or ELF32 file.
-  /// \param[in] Endianness Is this an ELFDATA2LSB or ELFDATA2MSB file.
-  /// \param[in] Type The e_type of the file. (Relocatable, Executable, etc...).
-  /// \param[in] Machine The e_machine of the file. (EM_386, EM_X86_86, etc...).
-  WriterOptionsELF(const bool Is64Bit,
-                   const llvm::support::endianness endian,
-                   const uint16_t Type,
-                   const uint16_t Machine,
-                   uint64_t pointerWidth = 4,
-                   uint64_t baseAddress = 0,
-                   uint64_t pageSize = 0x1000)
-  : _is64Bit(Is64Bit)
-  , _endianness(endian)
-  , _type(Type)
-  , _pointerWidth(pointerWidth)
-  , _machine(Machine)
-  , _baseAddress(baseAddress)
-  , _pageSize(pageSize)
-  , _entryPoint("start") {}
-
-  bool is64Bit() const { return _is64Bit; }
-  llvm::support::endianness endianness() const { return _endianness; }
-  uint16_t type() const { return _type; }
-  uint16_t machine() const { return _machine; }
-  uint16_t pointerWidth() const { return _pointerWidth; }
-  uint64_t baseAddress() const { return _baseAddress; }
-  uint64_t pageSize() const { return _pageSize; }
-  void setEntryPoint(StringRef name) { _entryPoint = name; }
-
-  /// \brief Get the entry point if type() is ET_EXEC. Empty otherwise.
-  StringRef entryPoint() const;
-
-protected:
-  bool                      _is64Bit;
-  llvm::support::endianness _endianness;
-  uint16_t                  _type;
-  uint16_t                  _pointerWidth;
-  uint16_t                  _machine;
-  uint64_t                  _baseAddress;
-  uint64_t                  _pageSize;
-  StringRef                 _entryPoint;
-};
-
-/// \brief Create a WriterELF using the given options.
-///
-/// The only way to instantiate a WriterELF object is via this function. The
-/// Writer object created retains a reference to the WriterOptionsELF object
-/// supplied, so it must not be destroyed before the Writer object. 
-Writer *createWriterELF(const WriterOptionsELF &Options);
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_WRITER_ELF_H_

Removed: lld/trunk/include/lld/ReaderWriter/WriterMachO.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/WriterMachO.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/WriterMachO.h (original)
+++ lld/trunk/include/lld/ReaderWriter/WriterMachO.h (removed)
@@ -1,111 +0,0 @@
-//===- ReaderWriter/WriterMachO.h - MachO File Format Reading Interface ---===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_WRITER_MACHO_H_
-#define LLD_READERWRITER_WRITER_MACHO_H_
-
-#include "lld/ReaderWriter/Writer.h"
-#include "lld/Core/LLVM.h"
-#include "llvm/ADT/StringRef.h"
-
-
-namespace lld {
-
-/// 
-/// The WriterOptionsMachO class encapsulates options needed 
-/// to process mach-o files.  You can create an WriterOptionsMachO 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class WriterOptionsMachO : public WriterOptions {
-public:
-  virtual ~WriterOptionsMachO();
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  WriterOptionsMachO(int argc, const char* argv[]);
-  
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  WriterOptionsMachO();
-
-
-
-  enum OutputKind {
-    outputDynamicExecutable,
-    outputDylib,
-    outputBundle,
-    outputObjectFile
-  };
-  
-  enum Architecture {
-    arch_x86_64,
-    arch_x86,
-    arch_armv6,
-    arch_armv7,
-  };
-  
-  OutputKind   outputKind() const       { return _outputkind; }
-  Architecture architecture() const     { return _architecture; }
-  StringRef    archName() const;
-  uint32_t     cpuType() const;
-  uint32_t     cpuSubtype() const;
-  uint64_t     pageZeroSize() const;
-  bool         noTextRelocations() const { return _noTextRelocations; }
-  bool         addEntryPointLoadCommand() const;
-  bool         addUnixThreadLoadCommand() const;
-  StringRef    entryPointName() const;
-
-protected:
-  OutputKind      _outputkind;
-  Architecture    _architecture;
-  uint64_t        _pageZeroSize;
-  bool            _noTextRelocations;
-  StringRef       _customEntryPointName;
-};
- 
-
-
-
-///
-/// The only way to instantiate a WriterMachO object  
-/// is via this createWriterMachO function.  The is no public 
-/// WriterMachO class that you might be tempted to subclass.
-/// Support for all variants must be represented in the 
-/// WriterOptionsMachO object.
-/// The Writer object created retains a reference to the 
-/// WriterOptionsMachO object supplied, so it must not be destroyed 
-/// before the Writer object. 
-///
-Writer* createWriterMachO(const WriterOptionsMachO &options);
-
-
-///
-/// Returns an options object that can be used with the 
-/// WriterYAML to write mach-o object files as YAML.
-///
-const class WriterOptionsYAML& writerOptionsMachOAsYAML(); 
-
-
-///
-/// Returns an options object that can be used with the 
-/// ReaderYAML to reader YAML encoded mach-o files.
-///
-const class ReaderOptionsYAML& readerOptionsMachOAsYAML(); 
- 
-
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_WRITER_MACHO_H_

Removed: lld/trunk/include/lld/ReaderWriter/WriterNative.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/WriterNative.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/WriterNative.h (original)
+++ lld/trunk/include/lld/ReaderWriter/WriterNative.h (removed)
@@ -1,63 +0,0 @@
-//===- ReaderWriter/WriterNative.h - Native File Format Reading Interface ---===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_WRITER_NATIVE_H_
-#define LLD_READERWRITER_WRITER_NATIVE_H_
-
-#include "lld/ReaderWriter/Writer.h"
-#include "lld/Core/LLVM.h"
-
-
-namespace lld {
-
-/// 
-/// The WriterOptionsNative class encapsulates options needed 
-/// to process mach-o files.  You can create an WriterOptionsNative 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class WriterOptionsNative : public WriterOptions {
-public:
-  virtual ~WriterOptionsNative();
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  WriterOptionsNative(int argc, const char* argv[]);
-  
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  WriterOptionsNative();
-  
-protected:
-};
- 
-
-
-
-///
-/// The only way to instantiate a WriterNative object  
-/// is via this createWriterNative function.  The is no public 
-/// WriterNative class that you might be tempted to subclass.
-/// Support for all variants must be represented in the WriterOptionsNative
-/// object.
-/// The Writer object created retains a reference to the 
-/// WriterOptionsNative object supplied, so it must not be destroyed 
-/// before the Writer object. 
-///
-Writer* createWriterNative(const WriterOptionsNative &options);
-
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_WRITER_NATIVE_H_

Removed: lld/trunk/include/lld/ReaderWriter/WriterPECOFF.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/WriterPECOFF.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/WriterPECOFF.h (original)
+++ lld/trunk/include/lld/ReaderWriter/WriterPECOFF.h (removed)
@@ -1,63 +0,0 @@
-//===- ReaderWriter/WriterPECOFF.h - PECOFF File Format Writing Interface -===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_WRITER_PECOFF_H_
-#define LLD_READERWRITER_WRITER_PECOFF_H_
-
-#include "lld/ReaderWriter/Writer.h"
-#include "lld/Core/LLVM.h"
-#include "llvm/ADT/StringRef.h"
-
-
-namespace lld {
-
-/// 
-/// The WriterOptionsPECOFF class encapsulates options needed 
-/// to process mach-o files.  You can create an WriterOptionsPECOFF 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class WriterOptionsPECOFF : public WriterOptions {
-public:
-  virtual ~WriterOptionsPECOFF();
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  WriterOptionsPECOFF(int argc, const char* argv[]);
-
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  WriterOptionsPECOFF();
-
-protected:
-};
-
-
-
-///
-/// The only way to instantiate a WriterPECOFF object  
-/// is via this createWriterPECOFF function.  The is no public 
-/// WriterPECOFF class that you might be tempted to subclass.
-/// Support for all variants must be represented in the WriterOptionsPECOFF
-/// object.
-/// The Writer object created retains a reference to the 
-/// WriterOptionsPECOFF object supplied, so it must not be destroyed 
-/// before the Writer object. 
-///
-Writer* createWriterPECOFF(const WriterOptionsPECOFF &options);
-
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_WRITER_PECOFF_H_

Removed: lld/trunk/include/lld/ReaderWriter/WriterYAML.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/WriterYAML.h?rev=173216&view=auto
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/WriterYAML.h (original)
+++ lld/trunk/include/lld/ReaderWriter/WriterYAML.h (removed)
@@ -1,82 +0,0 @@
-//===- ReaderWriter/WriterYAML.h - YAML File Format Writing Interface -----===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLD_READERWRITER_WRITER_YAML_H_
-#define LLD_READERWRITER_WRITER_YAML_H_
-
-#include "lld/ReaderWriter/Writer.h"
-
-#include "lld/Core/LLVM.h"
-#include "lld/Core/Reference.h"
-#include "lld/Core/Pass.h"
-
-#include "llvm/ADT/StringRef.h"
-
-
-namespace lld {
-
-/// 
-/// The WriterOptionsYAML class encapsulates options needed 
-/// to process mach-o files.  You can create an WriterOptionsYAML 
-/// instance from command line arguments or by subclassing and setting the 
-/// instance variables in the subclass's constructor.
-///
-class WriterOptionsYAML : public WriterOptions {
-public:
-  virtual ~WriterOptionsYAML();
-
-  ///
-  /// Creates a Options object from darwin linker command line arguments.
-  /// FIXME: to be replaced with new option processing mechanism.
-  ///
-  WriterOptionsYAML(int argc, const char* argv[]);
-  
-  ///
-  /// Creates a Options object with default settings. For use when 
-  /// programmatically constructing options.
-  ///
-  WriterOptionsYAML();
-  
-  
-  /// Converts an in-memory reference kind value to a string.
-  /// Used when writing YAML encoded object files.
-  virtual StringRef kindToString(Reference::Kind) const = 0;
-
-
-  /// Enable Stubs pass to be run
-  virtual StubsPass *stubPass() const {
-    return nullptr;
-  }
-  
-  /// Enable GOT pass to be run
-  virtual GOTPass *gotPass() const {
-    return nullptr;
-  }
-  
-};
- 
-
-
-
-///
-/// The only way to instantiate a WriterYAML object  
-/// is via this createWriterYAML function.  The is no public 
-/// WriterYAML class that you might be tempted to subclass.
-/// Support for all variants must be represented in the WriterOptionsYAML
-/// object.
-/// The Writer object created retains a reference to the 
-/// WriterOptionsYAML object supplied, so it must not be destroyed 
-/// before the Writer object. 
-///
-Writer* createWriterYAML(const WriterOptionsYAML &options);
-
-
-} // namespace lld
-
-#endif // LLD_READERWRITER_WRITER_YAML_H_

Modified: lld/trunk/lib/Driver/Drivers.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Drivers.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/Driver/Drivers.cpp (original)
+++ lld/trunk/lib/Driver/Drivers.cpp Tue Jan 22 19:18:43 2013
@@ -228,7 +228,8 @@
   ret._target = llvm::Triple::normalize(args.getLastArgValue(core::OPT_target));
   ret._outputPath = args.getLastArgValue(core::OPT_output);
   ret._entrySymbol = args.getLastArgValue(core::OPT_entry);
-  ret._relocatable = args.hasArg(core::OPT_relocatable);
+  if (args.hasArg(core::OPT_relocatable))
+    ret._outputKind = OutputKind::Relocatable;
   ret._outputCommands = args.hasArg(core::OPT_OCTOTHORPE_OCTOTHORPE_OCTOTHORPE);
   ret._outputYAML = args.hasArg(core::OPT_emit_yaml);
   ret._noInhibitExec = args.hasArg(core::OPT_noinhibit_exec);

Modified: lld/trunk/lib/Driver/LinkerInvocation.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/LinkerInvocation.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/Driver/LinkerInvocation.cpp (original)
+++ lld/trunk/lib/Driver/LinkerInvocation.cpp Tue Jan 22 19:18:43 2013
@@ -11,8 +11,9 @@
 
 #include "lld/Core/InputFiles.h"
 #include "lld/Core/Resolver.h"
-#include "lld/Core/TargetInfo.h"
 #include "lld/Driver/Target.h"
+#include "lld/ReaderWriter/Reader.h"
+#include "lld/ReaderWriter/Writer.h"
 
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/raw_ostream.h"
@@ -67,19 +68,12 @@
     inputs.appendFiles(files);
   }
 
-  class TestingTargetInfo LLVM_FINAL : public TargetInfo {
-  public:
-    TestingTargetInfo(const LinkerOptions &lo) : TargetInfo(lo) {}
-
-    virtual uint64_t getPageSize() const { return 0x1000; }
-  } tti(_options);
-
   auto writer = target->getWriter();
 
   // Give writer a chance to add files
   writer->addFiles(inputs);
 
-  Resolver resolver(tti, inputs);
+  Resolver resolver(target->getTargetInfo(), inputs);
   resolver.resolve();
   File &merged = resolver.resultFile();
 

Modified: lld/trunk/lib/Driver/Targets.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Targets.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/Driver/Targets.cpp (original)
+++ lld/trunk/lib/Driver/Targets.cpp Tue Jan 22 19:18:43 2013
@@ -16,11 +16,10 @@
 #include "lld/Driver/Target.h"
 
 #include "lld/Core/LinkerOptions.h"
-#include "lld/ReaderWriter/ReaderArchive.h"
-#include "lld/ReaderWriter/ReaderELF.h"
-#include "lld/ReaderWriter/ReaderYAML.h"
-#include "lld/ReaderWriter/WriterELF.h"
-#include "lld/ReaderWriter/WriterYAML.h"
+#include "lld/Core/TargetInfo.h"
+#include "lld/ReaderWriter/Reader.h"
+#include "lld/ReaderWriter/Writer.h"
+#include "lld/ReaderWriter/ELFTargetInfo.h"
 
 #include "llvm/ADT/Triple.h"
 #include "llvm/Support/raw_ostream.h"
@@ -28,15 +27,18 @@
 #include <set>
 
 using namespace lld;
+using namespace std::placeholders;
 
-class X86LinuxTarget LLVM_FINAL : public Target {
+class ELFTarget : public Target {
 public:
-  X86LinuxTarget(const LinkerOptions &lo) : Target(lo), _woe(lo._entrySymbol) {
-    _readerELF.reset(createReaderELF(_roe, _roa));
-    _readerYAML.reset(createReaderYAML(_roy));
-    _writer.reset(createWriterELF(_woe));
-    _writerYAML.reset(createWriterYAML(_woy));
-  }
+  ELFTarget(std::unique_ptr<ELFTargetInfo> ti)
+      : Target(std::unique_ptr<TargetInfo>(ti.get())),
+        _elfTargetInfo(*ti.release()),
+        _readerELF(createReaderELF(
+            *_targetInfo, std::bind(&ELFTarget::getReader, this, _1))),
+        _readerYAML(createReaderYAML(*_targetInfo)),
+        _writer(createWriterELF(_elfTargetInfo)),
+        _writerYAML(createWriterYAML(*_targetInfo)) {}
 
   virtual ErrorOr<lld::Reader&> getReader(const LinkerInput &input) {
     auto kind = input.getKind();
@@ -53,188 +55,38 @@
   }
 
   virtual ErrorOr<lld::Writer&> getWriter() {
-    return _options._outputYAML ? *_writerYAML : *_writer;
+    return _targetInfo->getLinkerOptions()._outputYAML ? *_writerYAML
+                                                       : *_writer;
   }
 
-private:
-  lld::ReaderOptionsELF _roe;
-  lld::ReaderOptionsArchive _roa;
-  struct : lld::ReaderOptionsYAML {
-    virtual Reference::Kind kindFromString(StringRef kindName) const {
-      int k;
-      if (kindName.getAsInteger(0, k))
-        k = 0;
-      return k;
-    }
-  } _roy;
-
-  struct WOpts : lld::WriterOptionsELF {
-    WOpts(StringRef entry) {
-      _endianness = llvm::support::little;
-      _is64Bit = false;
-      _type = llvm::ELF::ET_EXEC;
-      _machine = llvm::ELF::EM_386;
-      _entryPoint = entry;
-    }
-  } _woe;
-
-  struct WYOpts : lld::WriterOptionsYAML {
-    virtual StringRef kindToString(Reference::Kind k) const {
-      std::string str;
-      llvm::raw_string_ostream rso(str);
-      rso << (unsigned)k;
-      rso.flush();
-      return *_strings.insert(str).first;
-    }
-
-    mutable std::set<std::string> _strings;
-  } _woy;
-
+protected:
+  const ELFTargetInfo &_elfTargetInfo;
   std::unique_ptr<lld::Reader> _readerELF, _readerYAML;
   std::unique_ptr<lld::Writer> _writer, _writerYAML;
 };
 
-class X86_64LinuxTarget LLVM_FINAL : public Target {
+class X86LinuxTarget LLVM_FINAL : public ELFTarget {
 public:
-  X86_64LinuxTarget(const LinkerOptions &lo)
-    : Target(lo), _woe(lo._entrySymbol) {
-    _readerELF.reset(createReaderELF(_roe, _roa));
-    _readerYAML.reset(createReaderYAML(_roy));
-    _writer.reset(createWriterELF(_woe));
-    _writerYAML.reset(createWriterYAML(_woy));
-  }
-
-  virtual ErrorOr<lld::Reader&> getReader(const LinkerInput &input) {
-    auto kind = input.getKind();
-    if (!kind)
-      return error_code(kind);
-
-    if (*kind == InputKind::YAML)
-      return *_readerYAML;
-
-    if (*kind == InputKind::Object)
-      return *_readerELF;
-
-    return llvm::make_error_code(llvm::errc::invalid_argument);
-  }
-
-  virtual ErrorOr<lld::Writer&> getWriter() {
-    return _options._outputYAML ? *_writerYAML : *_writer;
-  }
-
-private:
-  lld::ReaderOptionsELF _roe;
-  lld::ReaderOptionsArchive _roa;
-  struct : lld::ReaderOptionsYAML {
-    virtual Reference::Kind kindFromString(StringRef kindName) const {
-      int k;
-      if (kindName.getAsInteger(0, k))
-        k = 0;
-      return k;
-    }
-  } _roy;
-
-  struct WOpts : lld::WriterOptionsELF {
-    WOpts(StringRef entry) {
-      _endianness = llvm::support::little;
-      _is64Bit = true;
-      _type = llvm::ELF::ET_EXEC;
-      _machine = llvm::ELF::EM_X86_64;
-      _entryPoint = entry;
-    }
-  } _woe;
-
-  struct WYOpts : lld::WriterOptionsYAML {
-    virtual StringRef kindToString(Reference::Kind k) const {
-      std::string str;
-      llvm::raw_string_ostream rso(str);
-      rso << (unsigned)k;
-      rso.flush();
-      return *_strings.insert(str).first;
-    }
-
-    mutable std::set<std::string> _strings;
-  } _woy;
-
-  std::unique_ptr<lld::Reader> _readerELF, _readerYAML;
-  std::unique_ptr<lld::Writer> _writer, _writerYAML;
+  X86LinuxTarget(std::unique_ptr<ELFTargetInfo> ti)
+      : ELFTarget(std::move(ti)) {}
 };
 
-class HexagonTarget LLVM_FINAL : public Target {
+class HexagonTarget LLVM_FINAL : public ELFTarget {
 public:
-  HexagonTarget(const LinkerOptions &lo)
-    : Target(lo), _woe(lo._entrySymbol) {
-    _readerELF.reset(createReaderELF(_roe, _roa));
-    _readerYAML.reset(createReaderYAML(_roy));
-    _writer.reset(createWriterELF(_woe));
-    _writerYAML.reset(createWriterYAML(_woy));
-  }
-
-  virtual ErrorOr<lld::Reader&> getReader(const LinkerInput &input) {
-    auto kind = input.getKind();
-    if (!kind)
-      return error_code(kind);
-
-    if (*kind == InputKind::YAML)
-      return *_readerYAML;
-
-    if (*kind == InputKind::Object)
-      return *_readerELF;
-
-    return llvm::make_error_code(llvm::errc::invalid_argument);
-  }
-
-  virtual ErrorOr<lld::Writer&> getWriter() {
-    return _options._outputYAML ? *_writerYAML : *_writer;
-  }
-
-private:
-  lld::ReaderOptionsELF _roe;
-  lld::ReaderOptionsArchive _roa;
-  struct : lld::ReaderOptionsYAML {
-    virtual Reference::Kind kindFromString(StringRef kindName) const {
-      int k;
-      if (kindName.getAsInteger(0, k))
-        k = 0;
-      return k;
-    }
-  } _roy;
-
-  struct WOpts : lld::WriterOptionsELF {
-    WOpts(StringRef entry) {
-      _endianness = llvm::support::little;
-      _is64Bit = false;
-      _type = llvm::ELF::ET_EXEC;
-      _machine = llvm::ELF::EM_HEXAGON;
-      _entryPoint = entry;
-    }
-  } _woe;
-
-  struct WYOpts : lld::WriterOptionsYAML {
-    virtual StringRef kindToString(Reference::Kind k) const {
-      std::string str;
-      llvm::raw_string_ostream rso(str);
-      rso << (unsigned)k;
-      rso.flush();
-      return *_strings.insert(str).first;
-    }
-
-    mutable std::set<std::string> _strings;
-  } _woy;
-
-  std::unique_ptr<lld::Reader> _readerELF, _readerYAML;
-  std::unique_ptr<lld::Writer> _writer, _writerYAML;
+  HexagonTarget(std::unique_ptr<ELFTargetInfo> ti)
+      : ELFTarget(std::move(ti)) {}
 };
 
 std::unique_ptr<Target> Target::create(const LinkerOptions &lo) {
   llvm::Triple t(lo._target);
-  if (t.getOS() == llvm::Triple::Linux && t.getArch() == llvm::Triple::x86)
-    return std::unique_ptr<Target>(new X86LinuxTarget(lo));
-  else if (t.getOS() == llvm::Triple::Linux &&
-           t.getArch() == llvm::Triple::x86_64)
-    return std::unique_ptr<Target>(new X86_64LinuxTarget(lo));
+  // Create a TargetInfo.
+  std::unique_ptr<ELFTargetInfo> ti(ELFTargetInfo::create(lo));
+
+  // Create the Target
+  if (t.getOS() == llvm::Triple::Linux && (t.getArch() == llvm::Triple::x86 ||
+                                           t.getArch() == llvm::Triple::x86_64))
+    return std::unique_ptr<Target>(new X86LinuxTarget(std::move(ti)));
   else if (t.getArch() == llvm::Triple::hexagon) 
-    return std::unique_ptr<Target>(new HexagonTarget(lo));
+    return std::unique_ptr<Target>(new HexagonTarget(std::move(ti)));
   return std::unique_ptr<Target>();
 }
-

Modified: lld/trunk/lib/ReaderWriter/ELF/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/CMakeLists.txt?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/CMakeLists.txt (original)
+++ lld/trunk/lib/ReaderWriter/ELF/CMakeLists.txt Tue Jan 22 19:18:43 2013
@@ -5,7 +5,6 @@
   ReaderELF.cpp
   ReferenceKinds.cpp
   WriterELF.cpp
-  WriterOptionsELF.cpp
   X86Reference.cpp
   X86_64Reference.cpp
   )

Modified: lld/trunk/lib/ReaderWriter/ELF/DefaultELFLayout.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultELFLayout.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DefaultELFLayout.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DefaultELFLayout.h Tue Jan 22 19:18:43 2013
@@ -10,6 +10,8 @@
 #ifndef LLD_READER_WRITER_DEFAULT_ELF_LAYOUT_H_
 #define LLD_READER_WRITER_DEFAULT_ELF_LAYOUT_H_
 
+#include "lld/Core/LinkerOptions.h"
+
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/Hashing.h"
@@ -150,7 +152,7 @@
 
   typedef typename std::vector<AbsoluteAtomPair>::iterator AbsoluteAtomIterT;
 
-  DefaultELFLayout(const WriterOptionsELF &options) : _options(options) {}
+  DefaultELFLayout(const ELFTargetInfo &ti) : _targetInfo(ti) {}
 
   /// \brief Return the section order for a input section
   virtual SectionOrder getSectionOrder
@@ -250,7 +252,7 @@
   ELFProgramHeader<ELFT> *_programHeader;
   std::vector<AbsoluteAtomPair> _absoluteAtoms;
   llvm::BumpPtrAllocator _allocator;
-  const WriterOptionsELF _options;
+  const ELFTargetInfo &_targetInfo;
 };
 
 template<class ELFT>
@@ -483,7 +485,7 @@
           segment = segmentInsert.first->second;
         } else {
           segment = new (_allocator.Allocate<Segment<ELFT>>()) Segment<ELFT>(
-            segmentName, getSegmentType(section), _options);
+            segmentName, getSegmentType(section), _targetInfo);
           segmentInsert.first->second = segment;
           _segments.push_back(segment);
         }
@@ -516,7 +518,7 @@
   if (_segments.empty())
     return;
   
-  uint64_t virtualAddress = _options.baseAddress();
+  uint64_t virtualAddress = _targetInfo.getLinkerOptions()._baseAddress;
   
   // HACK: This is a super dirty hack. The elf header and program header are
   // not part of a section, but we need them to be loaded at the base address
@@ -539,7 +541,7 @@
     for (auto &si : _segments) {
       // Align the segment to a page boundary
       fileoffset = llvm::RoundUpToAlignment(fileoffset,
-                                            _options.pageSize());
+                                            _targetInfo.getPageSize());
       si->assignOffsets(fileoffset);
       fileoffset = si->fileOffset() + si->fileSize();
     }
@@ -552,7 +554,7 @@
       (*si)->assignVirtualAddress(address);
       (*si)->setMemSize(address - virtualAddress);
       virtualAddress = llvm::RoundUpToAlignment(address,
-                                                _options.pageSize());
+                                                _targetInfo.getPageSize());
     }
     _programHeader->resetProgramHeaders();
   }

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFSegmentChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFSegmentChunks.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFSegmentChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFSegmentChunks.h Tue Jan 22 19:18:43 2013
@@ -11,7 +11,7 @@
 #define LLD_READER_WRITER_ELF_SEGMENT_CHUNKS_H_
 
 #include "lld/Core/range.h"
-#include "lld/ReaderWriter/WriterELF.h"
+#include "lld/ReaderWriter/Writer.h"
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/OwningPtr.h"
@@ -113,7 +113,7 @@
 
   Segment(const StringRef name,
           const ELFLayout::SegmentType type,
-          const WriterOptionsELF &options);
+          const ELFTargetInfo &ti);
 
   /// append a section to a segment
   void append(Section<ELFT> *section);
@@ -168,7 +168,7 @@
 
   inline ELFLayout::SegmentType segmentType() { return _segmentType; }
 
-  inline int pageSize() const { return _options.pageSize(); }
+  inline int pageSize() const { return _targetInfo.getPageSize(); }
 
   inline int64_t atomflags() const { return _atomflags; }
 
@@ -195,19 +195,19 @@
   ELFLayout::SegmentType _segmentType;
   int64_t _flags;
   int64_t _atomflags;
-  const WriterOptionsELF _options;
+  const ELFTargetInfo &_targetInfo;
   llvm::BumpPtrAllocator _segmentAllocate;
 };
 
 template<class ELFT>
 Segment<ELFT>::Segment(const StringRef name,
                        const ELFLayout::SegmentType type,
-                       const WriterOptionsELF &options)
+                       const ELFTargetInfo &ti)
   : Chunk<ELFT>(name, Chunk<ELFT>::K_ELFSegment)
   , _segmentType(type)
   , _flags(0)
   , _atomflags(0)
-  , _options(options) {
+  , _targetInfo(ti) {
   this->_align2 = 0;
   this->_fsize = 0;
 }
@@ -268,7 +268,7 @@
       SegmentSlice<ELFT> *slice = nullptr;
       // If the newOffset computed is more than a page away, lets create
       // a seperate segment, so that memory is not used up while running
-      if ((newOffset - curOffset) > _options.pageSize()) {
+      if ((newOffset - curOffset) > _targetInfo.getPageSize()) {
         // TODO: use std::find here
         for (auto s : slices()) {
           if (s->startSection() == startSection) {
@@ -286,7 +286,7 @@
         slice->setSize(curSliceSize);
         slice->setAlign(sliceAlign);
         uint64_t newPageOffset =
-          llvm::RoundUpToAlignment(curOffset, _options.pageSize());
+          llvm::RoundUpToAlignment(curOffset, _targetInfo.getPageSize());
         newOffset = llvm::RoundUpToAlignment(newPageOffset, (*si)->align2());
         curSliceFileOffset = newOffset;
         startSectionIter = endSectionIter;
@@ -332,7 +332,7 @@
 Segment<ELFT>::assignVirtualAddress(uint64_t &addr) {
   for (auto slice : slices()) {
     // Align to a page
-    addr = llvm::RoundUpToAlignment(addr, _options.pageSize());
+    addr = llvm::RoundUpToAlignment(addr, _targetInfo.getPageSize());
     // Align to the slice alignment
     addr = llvm::RoundUpToAlignment(addr, slice->align2());
 

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFTargetInfo.cpp Tue Jan 22 19:18:43 2013
@@ -23,6 +23,13 @@
     return llvm::ELF::ET_REL;
   case OutputKind::Shared:
     return llvm::ELF::ET_DYN;
+  case OutputKind::Core:
+    return llvm::ELF::ET_CORE;
+  case OutputKind::SharedStubs:
+  case OutputKind::DebugSymbols:
+  case OutputKind::Bundle:
+  case OutputKind::Preload:
+    break;
   }
   llvm_unreachable("Unhandled OutputKind");
 }
@@ -42,21 +49,21 @@
   }
 }
 
-class X86ELFTargetInfo final : public ELFTargetInfo {
+class X86ELFTargetInfo LLVM_FINAL : public ELFTargetInfo {
 public:
   X86ELFTargetInfo(const LinkerOptions &lo) : ELFTargetInfo(lo) {}
 
   virtual uint64_t getPageSize() const { return 0x1000; }
 };
 
-class HexagonELFTargetInfo final : public ELFTargetInfo {
+class HexagonELFTargetInfo LLVM_FINAL : public ELFTargetInfo {
 public:
   HexagonELFTargetInfo(const LinkerOptions &lo) : ELFTargetInfo(lo) {}
 
   virtual uint64_t getPageSize() const { return 0x1000; }
 };
 
-class PPCELFTargetInfo final : public ELFTargetInfo {
+class PPCELFTargetInfo LLVM_FINAL : public ELFTargetInfo {
 public:
   PPCELFTargetInfo(const LinkerOptions &lo) : ELFTargetInfo(lo) {}
 

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFWriter.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFWriter.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFWriter.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFWriter.h Tue Jan 22 19:18:43 2013
@@ -12,7 +12,7 @@
 
 #include "lld/Core/File.h"
 #include "lld/Core/InputFiles.h"
-#include "lld/ReaderWriter/WriterELF.h"
+#include "lld/ReaderWriter/Writer.h"
 #include "ReferenceKinds.h"
 
 namespace lld {

Modified: lld/trunk/lib/ReaderWriter/ELF/ExecutableAtoms.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ExecutableAtoms.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ExecutableAtoms.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ExecutableAtoms.h Tue Jan 22 19:18:43 2013
@@ -15,7 +15,7 @@
 #include "lld/Core/UndefinedAtom.h"
 #include "lld/Core/File.h"
 #include "lld/Core/Reference.h"
-#include "lld/ReaderWriter/WriterELF.h"
+#include "lld/ReaderWriter/Writer.h"
 #include "AtomsELF.h"
 
 namespace lld {
@@ -30,9 +30,7 @@
 class CRuntimeFile : public File {
 public:
   typedef llvm::object::Elf_Sym_Impl<ELFT> Elf_Sym;
-  CRuntimeFile(const WriterOptionsELF &options) 
-    : File("C runtime") 
-  { }
+  CRuntimeFile(const ELFTargetInfo &) : File("C runtime") {}
   
   /// \brief add a global absolute atom
   void addAbsoluteAtom(const StringRef symbolName) {

Modified: lld/trunk/lib/ReaderWriter/ELF/ReaderELF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ReaderELF.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ReaderELF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ReaderELF.cpp Tue Jan 22 19:18:43 2013
@@ -13,10 +13,12 @@
 ///
 //===----------------------------------------------------------------------===//
 
-#include "lld/ReaderWriter/ReaderELF.h"
-#include "lld/ReaderWriter/ReaderArchive.h"
+#include "lld/ReaderWriter/Reader.h"
+
 #include "lld/Core/File.h"
 #include "lld/Core/Reference.h"
+#include "lld/ReaderWriter/ELFTargetInfo.h"
+#include "lld/ReaderWriter/ReaderArchive.h"
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/SmallString.h"
@@ -326,12 +328,9 @@
 /// memory buffer for ELF class and bit width
 class ReaderELF : public Reader {
 public:
-  ReaderELF(const ReaderOptionsELF &,
-            ReaderOptionsArchive &readerOptionsArchive)
-      : _readerOptionsArchive(readerOptionsArchive),
-        _readerArchive(_readerOptionsArchive) {
-    _readerOptionsArchive.setReader(this);
-  }
+  ReaderELF(const TargetInfo & ti, std::function<ReaderFunc> read)
+      : Reader(ti),
+        _readerArchive(ti, read) {}
 
   error_code parseFile(std::unique_ptr<MemoryBuffer> mb,
                        std::vector<std::unique_ptr<File>> &result) {
@@ -411,18 +410,13 @@
   }
 
 private:
-  ReaderOptionsArchive &_readerOptionsArchive;
   ReaderArchive _readerArchive;
 };
 } // end anon namespace.
 
 namespace lld {
-ReaderOptionsELF::ReaderOptionsELF() {}
-
-ReaderOptionsELF::~ReaderOptionsELF() {}
-
-Reader *createReaderELF(const ReaderOptionsELF &options,
-                        ReaderOptionsArchive &optionsArchive) {
-  return new ReaderELF(options, optionsArchive);
+std::unique_ptr<Reader> createReaderELF(const TargetInfo & ti,
+                                        std::function<ReaderFunc> read) {
+  return std::unique_ptr<Reader>(new ReaderELF(ti, std::move(read)));
 }
 } // end namespace lld

Modified: lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.cpp Tue Jan 22 19:18:43 2013
@@ -11,29 +11,30 @@
 
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/Triple.h"
 
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/ELF.h"
 
 namespace lld {
 namespace elf {
-KindHandler::KindHandler() {
-}
+KindHandler::KindHandler() {}
 
-KindHandler::~KindHandler() {
-}
+KindHandler::~KindHandler() {}
 
 std::unique_ptr<KindHandler>
-KindHandler::makeHandler(uint16_t arch, llvm::support::endianness endian) {
+KindHandler::makeHandler(llvm::Triple::ArchType arch, bool isLittleEndian) {
   switch(arch) {
-  case llvm::ELF::EM_HEXAGON:
+  case llvm::Triple::hexagon:
     return std::unique_ptr<KindHandler>(new HexagonKindHandler());
-  case llvm::ELF::EM_386:
+  case llvm::Triple::x86:
     return std::unique_ptr<KindHandler>(new X86KindHandler());
-  case llvm::ELF::EM_X86_64:
+  case llvm::Triple::x86_64:
     return std::unique_ptr<KindHandler>(new X86_64KindHandler());
-  case llvm::ELF::EM_PPC:
-    return std::unique_ptr<KindHandler>(new PPCKindHandler(endian));
+  case llvm::Triple::ppc:
+    return std::unique_ptr<KindHandler>(
+        new PPCKindHandler(isLittleEndian ? llvm::support::little
+                                          : llvm::support::big));
   default:
     llvm_unreachable("arch not supported");
   }

Modified: lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ReferenceKinds.h Tue Jan 22 19:18:43 2013
@@ -9,9 +9,12 @@
 
 #include "lld/Core/LLVM.h"
 #include "lld/Core/Reference.h"
-#include "lld/ReaderWriter/WriterELF.h"
+#include "lld/ReaderWriter/Writer.h"
 
 #include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/Support/ELF.h"
+#include "llvm/Support/Endian.h"
 
 #include <functional>
 #include <map>
@@ -32,8 +35,8 @@
 public:
   typedef Reference::Kind Kind;
 
-  static std::unique_ptr<KindHandler> makeHandler(uint16_t arch,
-                                      llvm::support::endianness endian);
+  static std::unique_ptr<KindHandler> makeHandler(llvm::Triple::ArchType arch,
+                                                  bool isLittleEndian);
   virtual             ~KindHandler();
   virtual Kind        stringToKind(StringRef str) = 0;
   virtual StringRef   kindToString(Kind) = 0;

Modified: lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/WriterELF.cpp Tue Jan 22 19:18:43 2013
@@ -7,6 +7,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "lld/ReaderWriter/ELFTargetInfo.h"
+
 #include "DefaultELFLayout.h"
 #include "ExecutableAtoms.h"
 
@@ -26,7 +28,7 @@
   typedef Elf_Shdr_Impl<ELFT> Elf_Shdr;
   typedef Elf_Sym_Impl<ELFT> Elf_Sym;
 
-  ELFExecutableWriter(const WriterOptionsELF &options);
+  ELFExecutableWriter(const ELFTargetInfo &ti);
 
 private:
   // build the sections that need to be created
@@ -49,7 +51,7 @@
 
   void createDefaultSections();
 
-  const WriterOptionsELF &_options;
+  const ELFTargetInfo &_targetInfo;
 
   typedef llvm::DenseMap<const Atom*, uint64_t> AtomToAddress;
   std::unique_ptr<KindHandler> _referenceKindHandler;
@@ -69,12 +71,12 @@
 //  ELFExecutableWriter
 //===----------------------------------------------------------------------===//
 template<class ELFT>
-ELFExecutableWriter<ELFT>::ELFExecutableWriter(const WriterOptionsELF &options)
-  : _options(options)
+ELFExecutableWriter<ELFT>::ELFExecutableWriter(const ELFTargetInfo &ti)
+  : _targetInfo(ti)
   , _referenceKindHandler(KindHandler::makeHandler(
-      _options.machine(), (endianness)ELFT::TargetEndianness))
-  , _runtimeFile(options) {
-  _layout =new DefaultELFLayout<ELFT>(options);
+                              ti.getTriple().getArch(), ti.isLittleEndian()))
+  , _runtimeFile(ti) {
+  _layout = new DefaultELFLayout<ELFT>(ti);
 }
 
 template<class ELFT>
@@ -248,14 +250,14 @@
   if (ec)
     return ec;
 
-  _elfHeader->e_ident(ELF::EI_CLASS, (_options.is64Bit() ? ELF::ELFCLASS64
-                                                        : ELF::ELFCLASS32));
-  _elfHeader->e_ident(ELF::EI_DATA, _options.endianness() == llvm::support::big
-                                    ? ELF::ELFDATA2MSB : ELF::ELFDATA2LSB);
+  _elfHeader->e_ident(ELF::EI_CLASS, _targetInfo.is64Bits() ? ELF::ELFCLASS64
+                                                            : ELF::ELFCLASS32);
+  _elfHeader->e_ident(ELF::EI_DATA, _targetInfo.isLittleEndian()
+                                    ? ELF::ELFDATA2LSB : ELF::ELFDATA2MSB);
   _elfHeader->e_ident(ELF::EI_VERSION, 1);
   _elfHeader->e_ident(ELF::EI_OSABI, 0);
-  _elfHeader->e_type(_options.type());
-  _elfHeader->e_machine(_options.machine());
+  _elfHeader->e_type(_targetInfo.getOutputType());
+  _elfHeader->e_machine(_targetInfo.getOutputMachine());
   _elfHeader->e_version(1);
   _elfHeader->e_entry(0ULL);
   _elfHeader->e_phoff(_programHeader->fileOffset());
@@ -305,24 +307,24 @@
 }
 } // namespace elf
 
-Writer *createWriterELF(const WriterOptionsELF &options) {
+std::unique_ptr<Writer> createWriterELF(const ELFTargetInfo &TI) {
   using llvm::object::ELFType;
   // Set the default layout to be the static executable layout
   // We would set the layout to a dynamic executable layout
   // if we came across any shared libraries in the process
 
-  if (!options.is64Bit() && options.endianness() == llvm::support::little)
-    return
-      new elf::ELFExecutableWriter<ELFType<support::little, 4, false>>(options);
-  else if (options.is64Bit() && options.endianness() == llvm::support::little)
-    return
-      new elf::ELFExecutableWriter<ELFType<support::little, 8, true>>(options);
-  else if (!options.is64Bit() && options.endianness() == llvm::support::big)
-    return
-      new elf::ELFExecutableWriter<ELFType<support::big, 4, false>>(options);
-  else if (options.is64Bit() && options.endianness() == llvm::support::big)
-    return
-      new elf::ELFExecutableWriter<ELFType<support::big, 8, true>>(options);
+  if (!TI.is64Bits() && TI.isLittleEndian())
+    return std::unique_ptr<Writer>(new
+        elf::ELFExecutableWriter<ELFType<support::little, 4, false>>(TI));
+  else if (TI.is64Bits() && TI.isLittleEndian())
+    return std::unique_ptr<Writer>(new
+        elf::ELFExecutableWriter<ELFType<support::little, 8, true>>(TI));
+  else if (!TI.is64Bits() && !TI.isLittleEndian())
+    return std::unique_ptr<Writer>(new
+        elf::ELFExecutableWriter<ELFType<support::big, 4, false>>(TI));
+  else if (TI.is64Bits() && !TI.isLittleEndian())
+    return std::unique_ptr<Writer>(new
+        elf::ELFExecutableWriter<ELFType<support::big, 8, true>>(TI));
 
   llvm_unreachable("Invalid Options!");
 }

Removed: lld/trunk/lib/ReaderWriter/ELF/WriterOptionsELF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/WriterOptionsELF.cpp?rev=173216&view=auto
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/WriterOptionsELF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/WriterOptionsELF.cpp (removed)
@@ -1,28 +0,0 @@
-//===- lib/ReaderWriter/ELF/WriterOptionsELF.cpp ----------------------===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lld/ReaderWriter/WriterELF.h"
-
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ELF.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/system_error.h"
-
-
-namespace lld {
-
-StringRef WriterOptionsELF::entryPoint() const {
-  if (_type == llvm::ELF::ET_EXEC)
-    return _entryPoint;
-  return StringRef();
-}
-
-} // namespace lld

Modified: lld/trunk/lib/ReaderWriter/MachO/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/CMakeLists.txt?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/CMakeLists.txt (original)
+++ lld/trunk/lib/ReaderWriter/MachO/CMakeLists.txt Tue Jan 22 19:18:43 2013
@@ -1,7 +1,6 @@
 add_lld_library(lldMachO
   MachOTargetInfo.cpp
   WriterMachO.cpp
-  WriterOptionsMachO.cpp
   ReferenceKinds.cpp
   )
 

Modified: lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ExecutableAtoms.hpp Tue Jan 22 19:18:43 2013
@@ -15,8 +15,7 @@
 #include "lld/Core/UndefinedAtom.h"
 #include "lld/Core/File.h"
 #include "lld/Core/Reference.h"
-
-#include "lld/ReaderWriter/WriterMachO.h"
+#include "lld/Core/TargetInfo.h"
 
 #include "SimpleAtoms.hpp"
 
@@ -30,10 +29,10 @@
 //
 class CRuntimeFile : public SimpleFile {
 public:
-    CRuntimeFile(const WriterOptionsMachO &options) 
+    CRuntimeFile(const MachOTargetInfo &ti) 
       : SimpleFile("C runtime"), _undefMain(*this, "_main") {
       // only main executables need _main
-      if ( options.outputKind() == WriterOptionsMachO::outputDynamicExecutable)
+      if (ti.getLinkerOptions()._outputKind == OutputKind::Executable)
         this->addAtom(_undefMain);
    }
         

Modified: lld/trunk/lib/ReaderWriter/MachO/GOTPass.hpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/GOTPass.hpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/GOTPass.hpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/GOTPass.hpp Tue Jan 22 19:18:43 2013
@@ -29,7 +29,7 @@
     return true;
   }
 
-  virtual bool isGOTAccess(Reference::Kind, bool& canBypassGOT) {
+  virtual bool isGOTAccess(int32_t, bool& canBypassGOT) {
     return false;
   }
 

Modified: lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachOTargetInfo.cpp Tue Jan 22 19:18:43 2013
@@ -41,7 +41,25 @@
   }
 }
 
-class GenericMachOTargetInfo final : public MachOTargetInfo {
+bool MachOTargetInfo::addEntryPointLoadCommand() const {
+  switch (_options._outputKind) {
+  case OutputKind::Executable:
+    return true;
+  default:
+    return false;
+  }
+}
+
+bool MachOTargetInfo::addUnixThreadLoadCommand() const {
+  switch (_options._outputKind) {
+  case OutputKind::Executable:
+    return true;
+  default:
+    return false;
+  }
+}
+
+class GenericMachOTargetInfo LLVM_FINAL : public MachOTargetInfo {
 public:
   GenericMachOTargetInfo(const LinkerOptions &lo) : MachOTargetInfo(lo) {}
 
@@ -49,6 +67,8 @@
   virtual uint64_t getPageZeroSize() const { return getPageSize(); }
 
   virtual StringRef getEntry() const {
+    if (_options._outputKind != OutputKind::Executable)
+      return "";
     if (!_options._entrySymbol.empty())
       return _options._entrySymbol;
     return "_main";

Modified: lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp Tue Jan 22 19:18:43 2013
@@ -12,6 +12,7 @@
 
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/Triple.h"
 
 #include "llvm/Support/ErrorHandling.h"
 
@@ -28,18 +29,16 @@
 KindHandler::~KindHandler() {
 }
 
-KindHandler *KindHandler::makeHandler(WriterOptionsMachO::Architecture arch) {
+KindHandler *KindHandler::makeHandler(llvm::Triple::ArchType arch) {
   switch( arch ) {
-   case WriterOptionsMachO::arch_x86_64:
+    case llvm::Triple::x86_64:
       return new KindHandler_x86_64();
-      break;
-    case WriterOptionsMachO::arch_x86:
+    case llvm::Triple::x86:
       return new KindHandler_x86();
-      break;
-    case WriterOptionsMachO::arch_armv6:
-    case WriterOptionsMachO::arch_armv7:
+    case llvm::Triple::arm:
       return new KindHandler_arm();
-      break;
+    default:
+      llvm_unreachable("Unknown arch");
   }
 }
 

Modified: lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h Tue Jan 22 19:18:43 2013
@@ -10,7 +10,8 @@
 
 #include "lld/Core/LLVM.h"
 #include "lld/Core/Reference.h"
-#include "lld/ReaderWriter/WriterMachO.h"
+
+#include "llvm/ADT/Triple.h"
 
 #ifndef LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H_
 #define LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H_
@@ -28,7 +29,7 @@
 public:
   typedef Reference::Kind Kind;
   
-  static KindHandler *makeHandler(WriterOptionsMachO::Architecture arch);
+  static KindHandler *makeHandler(llvm::Triple::ArchType arch);
   virtual             ~KindHandler();
   virtual Kind        stringToKind(StringRef str) = 0;
   virtual StringRef   kindToString(Kind) = 0;

Modified: lld/trunk/lib/ReaderWriter/MachO/StubsPass.hpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/StubsPass.hpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/StubsPass.hpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/StubsPass.hpp Tue Jan 22 19:18:43 2013
@@ -28,19 +28,19 @@
 
 class StubsPass : public lld::StubsPass {
 public:
-  StubsPass(const WriterOptionsMachO &options) 
-    : _options(options), 
-      _kindHandler(KindHandler::makeHandler(options.architecture())),
+  StubsPass(const MachOTargetInfo &ti) 
+    : _targetInfo(ti),
+      _kindHandler(KindHandler::makeHandler(_targetInfo.getTriple().getArch())),
       _helperCommonAtom(nullptr),
       _helperCacheAtom(nullptr),
       _helperBinderAtom(nullptr) {
   }
 
   virtual bool noTextRelocs() {
-    return _options.noTextRelocations();
+    return !_targetInfo.getLinkerOptions()._textRelocations;
   }
 
-  virtual bool isCallSite(Reference::Kind kind) {
+  virtual bool isCallSite(int32_t kind) {
     return _kindHandler->isCallSite(kind);
   }
 
@@ -58,16 +58,15 @@
   }
 
   const DefinedAtom* makeStub(const Atom& target) {
-    switch ( _options.architecture() ) {
-      case WriterOptionsMachO::arch_x86_64:
+    switch (_targetInfo.getTriple().getArch()) {
+      case llvm::Triple::x86_64:
         return makeStub_x86_64(target);
-
-      case WriterOptionsMachO::arch_x86:
+      case llvm::Triple::x86:
         return makeStub_x86(target);
-
-      case WriterOptionsMachO::arch_armv6:
-      case WriterOptionsMachO::arch_armv7:
+      case llvm::Triple::arm:
         return makeStub_arm(target);
+      default:
+        llvm_unreachable("Unknown arch");
     }
   }
 
@@ -151,7 +150,7 @@
       }
   };
 
-  const WriterOptionsMachO                       &_options;
+  const MachOTargetInfo                          &_targetInfo;
   KindHandler                                    *_kindHandler;
   File                                            _file;
   llvm::DenseMap<const Atom*, const DefinedAtom*> _targetToStub;

Modified: lld/trunk/lib/ReaderWriter/MachO/WriterMachO.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/WriterMachO.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/WriterMachO.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/WriterMachO.cpp Tue Jan 22 19:18:43 2013
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "lld/ReaderWriter/WriterMachO.h"
+#include "lld/ReaderWriter/Writer.h"
 
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -23,12 +23,15 @@
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/Triple.h"
 
 #include "lld/Core/DefinedAtom.h"
 #include "lld/Core/File.h"
 #include "lld/Core/InputFiles.h"
+#include "lld/Core/LinkerOptions.h"
 #include "lld/Core/Reference.h"
 #include "lld/Core/SharedLibraryAtom.h"
+#include "lld/ReaderWriter/MachOTargetInfo.h"
 
 #include <vector>
 #include <map>
@@ -104,7 +107,7 @@
 class SectionChunk : public Chunk {
 public:
   static SectionChunk*  make(DefinedAtom::ContentType,
-                             const WriterOptionsMachO &options,
+                             const MachOTargetInfo &ti,
                              class MachOWriter &writer);
   virtual StringRef     segmentName() const;
   virtual bool          occupiesNoDiskSpace();
@@ -126,12 +129,12 @@
                 SectionChunk(StringRef seg,
                              StringRef sect,
                              uint32_t flags,
-                             const WriterOptionsMachO &options,
+                             const MachOTargetInfo &ti,
                              class MachOWriter &writer);
 
   StringRef                 _segmentName;
   StringRef                 _sectionName;
-  const WriterOptionsMachO &_options;
+  const MachOTargetInfo    &_targetInfo;
   class MachOWriter        &_writer;
   uint32_t                  _flags;
   uint32_t                  _permissions;
@@ -146,7 +149,7 @@
 //
 class MachHeaderChunk : public Chunk {
 public:
-                MachHeaderChunk(const WriterOptionsMachO &options,
+                MachHeaderChunk(const MachOTargetInfo &ti,
                                 const File &file);
   virtual StringRef     segmentName() const;
   virtual void          write(uint8_t *fileBuffer);
@@ -155,7 +158,7 @@
   uint64_t              loadCommandsSize();
 
 private:
-  uint32_t              filetype(WriterOptionsMachO::OutputKind kind);
+  uint32_t              filetype(OutputKind);
   uint32_t              magic(uint32_t cpuType);
 
   mach_header               _mh;
@@ -171,7 +174,7 @@
 class LoadCommandsChunk : public Chunk {
 public:
                       LoadCommandsChunk(MachHeaderChunk&,
-                                        const WriterOptionsMachO &options,
+                                        const MachOTargetInfo &,
                                         class MachOWriter&);
   virtual StringRef   segmentName() const;
   virtual void        write(uint8_t *fileBuffer);
@@ -197,7 +200,7 @@
   };
 
   MachHeaderChunk             &_mh;
-  const WriterOptionsMachO    &_options;
+  const MachOTargetInfo       &_targetInfo;
   class MachOWriter           &_writer;
   segment_command             *_linkEditSegment;
   symtab_command              *_symbolTableLoadCommand;
@@ -340,7 +343,7 @@
 //
 class MachOWriter : public Writer {
 public:
-              MachOWriter(const WriterOptionsMachO &options);
+              MachOWriter(const MachOTargetInfo &ti);
 
   virtual error_code  writeFile(const lld::File &file, StringRef path);
   virtual StubsPass  *stubPass();  
@@ -373,7 +376,7 @@
 
   typedef llvm::DenseMap<const Atom*, uint64_t> AtomToAddress;
 
-  const WriterOptionsMachO   &_options;
+  const MachOTargetInfo      &_targetInfo;
   KindHandler                *_referenceKindHandler;
   StubsPass                   _stubsPass;
   GOTPass                     _gotPass;
@@ -459,46 +462,46 @@
 //===----------------------------------------------------------------------===//
 
 SectionChunk::SectionChunk(StringRef seg, StringRef sect,
-                           uint32_t flags, const WriterOptionsMachO &options,
+                           uint32_t flags, const MachOTargetInfo &ti,
                                                 MachOWriter &writer)
- : _segmentName(seg), _sectionName(sect), _options(options),
+ : _segmentName(seg), _sectionName(sect), _targetInfo(ti),
    _writer(writer), _flags(flags), _permissions(0) {
 
 }
 
 SectionChunk* SectionChunk::make(DefinedAtom::ContentType type,
-                                 const WriterOptionsMachO &options,
+                                 const MachOTargetInfo &ti,
                                  MachOWriter &writer) {
   switch ( type ) {
     case DefinedAtom::typeCode:
       return new SectionChunk("__TEXT", "__text",
                               S_REGULAR | S_ATTR_PURE_INSTRUCTIONS,
-                              options, writer);
+                              ti, writer);
       break;
     case DefinedAtom::typeCString:
        return new SectionChunk("__TEXT", "__cstring",
                                S_CSTRING_LITERALS,
-                              options, writer);
+                              ti, writer);
        break;
     case DefinedAtom::typeStub:
       return new SectionChunk("__TEXT", "__stubs",
                               S_SYMBOL_STUBS | S_ATTR_PURE_INSTRUCTIONS,
-                              options, writer);
+                              ti, writer);
       break;
     case DefinedAtom::typeStubHelper:
       return new SectionChunk("__TEXT", "__stub_helper",
                               S_REGULAR | S_ATTR_PURE_INSTRUCTIONS,
-                              options, writer);
+                              ti, writer);
       break;
     case DefinedAtom::typeLazyPointer:
       return new SectionChunk("__DATA", "__la_symbol_ptr",
                               S_LAZY_SYMBOL_POINTERS,
-                              options, writer);
+                              ti, writer);
       break;
     case DefinedAtom::typeGOT:
       return new SectionChunk("__DATA", "__got",
                               S_NON_LAZY_SYMBOL_POINTERS,
-                              options, writer);
+                              ti, writer);
       break;
     default:
       assert(0 && "TO DO: add support for more sections");
@@ -595,13 +598,12 @@
 //  MachHeaderChunk
 //===----------------------------------------------------------------------===//
 
-MachHeaderChunk::MachHeaderChunk(const WriterOptionsMachO &options,
-                                                            const File &file) {
+MachHeaderChunk::MachHeaderChunk(const MachOTargetInfo &ti, const File &file) {
   // Set up mach_header based on options
-  _mh.magic      = this->magic(options.cpuType());
-  _mh.cputype    = options.cpuType();
-  _mh.cpusubtype = options.cpuSubtype();
-  _mh.filetype   = this->filetype(options.outputKind());
+  _mh.magic      = this->magic(ti.getCPUType());
+  _mh.cputype    = ti.getCPUType();
+  _mh.cpusubtype = ti.getCPUSubType();
+  _mh.filetype   = this->filetype(ti.getLinkerOptions()._outputKind);
   _mh.ncmds      = 0;
   _mh.sizeofcmds = 0;
   _mh.flags      = 0;
@@ -639,22 +641,29 @@
     case CPU_TYPE_X86_64:
       return MH_MAGIC_64;
   }
-  assert(0 && "file cpu type not supported");
+  llvm_unreachable("file CPU type not supported");
   return 0;
 }
 
-uint32_t MachHeaderChunk::filetype(WriterOptionsMachO::OutputKind kind) {
+uint32_t MachHeaderChunk::filetype(OutputKind kind) {
   switch ( kind ) {
-    case WriterOptionsMachO::outputDynamicExecutable:
-      return MH_EXECUTE;
-    case WriterOptionsMachO::outputDylib:
-      return MH_DYLIB;
-    case WriterOptionsMachO::outputBundle:
-      return MH_BUNDLE;
-    case WriterOptionsMachO::outputObjectFile:
-      return MH_OBJECT;
+  case OutputKind::Executable:
+    return MH_EXECUTE;
+  case OutputKind::Relocatable:
+    return MH_OBJECT;
+  case OutputKind::Shared:
+    return MH_DYLIB;
+  case OutputKind::SharedStubs:
+    return MH_DYLIB_STUB;
+  case OutputKind::Bundle:
+    return MH_BUNDLE;
+  case OutputKind::Preload:
+  case OutputKind::DebugSymbols:
+  case OutputKind::Core:
+    break;
   }
-  assert(0 && "file outputkind not supported");
+  llvm_unreachable("file OutputKind not supported");
+  return 0;
 }
 
 
@@ -664,9 +673,9 @@
 //===----------------------------------------------------------------------===//
 
 LoadCommandsChunk::LoadCommandsChunk(MachHeaderChunk &mh,
-                                     const WriterOptionsMachO &options,
+                                     const MachOTargetInfo &ti,
                                      MachOWriter& writer)
- : _mh(mh), _options(options), _writer(writer),
+ : _mh(mh), _targetInfo(ti), _writer(writer),
    _linkEditSegment(nullptr), _symbolTableLoadCommand(nullptr),
    _entryPointLoadCommand(nullptr), _threadLoadCommand(nullptr), 
    _dyldInfoLoadCommand(nullptr) {
@@ -714,7 +723,7 @@
 void LoadCommandsChunk::computeSize(const lld::File &file) {
   const bool is64 = _writer.use64BitMachO();
   // Main executables have a __PAGEZERO segment.
-  uint64_t pageZeroSize = _options.pageZeroSize();
+  uint64_t pageZeroSize = _targetInfo.getPageZeroSize();
   if ( pageZeroSize != 0 ) {
     assert(is64 || (pageZeroSize < 0xFFFFFFFF));
     segment_command* pzSegCmd = new segment_command(0, is64);
@@ -796,12 +805,11 @@
   this->addLoadCommand(_dyldInfoLoadCommand);
 
   // Add entry point load command to main executables
-  if ( _options.addEntryPointLoadCommand() ) {
+  if (_targetInfo.addEntryPointLoadCommand()) {
     _entryPointLoadCommand = new entry_point_command(is64);
     this->addLoadCommand(_entryPointLoadCommand);
-  }
-  else if ( _options.addUnixThreadLoadCommand() ) {
-    _threadLoadCommand = new thread_command(_options.cpuType(), is64);
+  } else if (_targetInfo.addUnixThreadLoadCommand()) {
+    _threadLoadCommand = new thread_command(_targetInfo.getCPUType(), is64);
     this->addLoadCommand(_threadLoadCommand);
   }
   
@@ -1295,10 +1303,10 @@
 //  MachOWriter
 //===----------------------------------------------------------------------===//
 
-MachOWriter::MachOWriter(const WriterOptionsMachO &options)
-  : _options(options), 
-    _referenceKindHandler(KindHandler::makeHandler(_options.architecture())), 
-    _stubsPass(options), _cRuntimeFile(options), 
+MachOWriter::MachOWriter(const MachOTargetInfo &ti)
+  : _targetInfo(ti),
+    _referenceKindHandler(KindHandler::makeHandler(ti.getTriple().getArch())),
+    _stubsPass(ti), _cRuntimeFile(ti),
     _bindingInfo(nullptr), _lazyBindingInfo(nullptr),
     _symbolTableChunk(nullptr), _stringsChunk(nullptr), _entryAtom(nullptr),
     _linkEditStartOffset(0), _linkEditStartAddress(0) {
@@ -1339,7 +1347,7 @@
     DefinedAtom::ContentType type = atom->contentType();
     auto pos = map.find(type);
     if ( pos == map.end() ) {
-      SectionChunk *chunk = SectionChunk::make(type, _options, *this);
+      SectionChunk *chunk = SectionChunk::make(type, _targetInfo, *this);
       map[type] = chunk;
       chunk->appendAtom(atom);
     }
@@ -1352,10 +1360,10 @@
 
 
   // Make chunks in __TEXT for mach_header and load commands at start.
-  MachHeaderChunk *mhc = new MachHeaderChunk(_options, file);
+  MachHeaderChunk *mhc = new MachHeaderChunk(_targetInfo, file);
   _chunks.push_back(mhc);
 
-  _loadCommandsChunk = new LoadCommandsChunk(*mhc, _options, *this);
+  _loadCommandsChunk = new LoadCommandsChunk(*mhc, _targetInfo, *this);
   _chunks.push_back(_loadCommandsChunk);
 
   _paddingChunk = new LoadCommandPaddingChunk(*_loadCommandsChunk);
@@ -1388,15 +1396,15 @@
 void MachOWriter::buildAtomToAddressMap() {
   DEBUG_WITH_TYPE("WriterMachO-layout", llvm::dbgs() 
                    << "assign atom addresses:\n");
-  const bool lookForEntry = 
-      (_options.outputKind() == WriterOptionsMachO::outputDynamicExecutable);
+  const bool lookForEntry = _targetInfo.getLinkerOptions()._outputKind ==
+                            OutputKind::Executable;
   for (SectionChunk *chunk : _sectionChunks ) {
     for (const SectionChunk::AtomInfo &info : chunk->atoms() ) {
       _atomToAddress[info.atom] = chunk->address() + info.offsetInSection;
       if (       lookForEntry
               && (info.atom->contentType() == DefinedAtom::typeCode)
               && (info.atom->size() != 0)
-              &&  info.atom->name().equals(_options.entryPointName()) ) {
+              &&  info.atom->name() == _targetInfo.getEntry()) {
         _entryAtom = info.atom;
       }
       DEBUG_WITH_TYPE("WriterMachO-layout", llvm::dbgs()  
@@ -1419,7 +1427,7 @@
   DEBUG_WITH_TYPE("WriterMachO-layout", llvm::dbgs() 
                     << "assign file offsets:\n");
   uint64_t offset = 0;
-  uint64_t address = _options.pageZeroSize();
+  uint64_t address = _targetInfo.getPageZeroSize();
   for ( Chunk *chunk : _chunks ) {
     if ( chunk->segmentName().equals("__LINKEDIT") ) {
       _linkEditStartOffset  = Chunk::alignTo(offset, 12);
@@ -1457,7 +1465,7 @@
   const uint64_t kInvalidAddress = (uint64_t)(-1);
   StringRef lastSegName("__TEXT");
   *segIndex = 0;
-  if ( _options.pageZeroSize() != 0 ) {
+  if ( _targetInfo.getPageZeroSize() != 0 ) {
       *segIndex = 1;
   }
   *segStartAddr = kInvalidAddress;
@@ -1481,15 +1489,7 @@
 }
 
 bool MachOWriter::use64BitMachO() const {
-  switch ( _options.cpuType() ) {
-    case CPU_TYPE_ARM:
-    case CPU_TYPE_I386:
-      return false;
-    case CPU_TYPE_X86_64:
-      return true;
-  }
-  assert(0 && "unknown cpu type");
-  return false;
+  return _targetInfo.getTriple().isArch64Bit();
 }
 
 
@@ -1542,8 +1542,8 @@
 } // namespace mach_o
 
 
-Writer* createWriterMachO(const WriterOptionsMachO &options) {
-  return new lld::mach_o::MachOWriter(options);
+std::unique_ptr<Writer> createWriterMachO(const MachOTargetInfo &ti) {
+  return std::unique_ptr<Writer>(new lld::mach_o::MachOWriter(ti));
 }
 
 } // namespace lld

Removed: lld/trunk/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp?rev=173216&view=auto
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp (removed)
@@ -1,137 +0,0 @@
-//===- lib/ReaderWriter/MachO/WriterOptionsMachO.cpp ----------------------===//
-//
-//                             The LLVM Linker
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lld/ReaderWriter/WriterMachO.h"
-
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/system_error.h"
-
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringRef.h"
-
-#include "MachOFormat.hpp"
-
-namespace lld {
-
-WriterOptionsMachO::WriterOptionsMachO() 
- : _outputkind(outputDynamicExecutable),
-   _architecture(arch_x86),
-   _pageZeroSize(0x1000),
-   _noTextRelocations(true) {
-}
-
-WriterOptionsMachO::~WriterOptionsMachO() {
-}
-
-StringRef WriterOptionsMachO::archName() const {
-  switch ( _architecture ) {
-    case arch_x86_64:
-      return StringRef("x86_64");
-    case arch_x86:
-       return StringRef("i386");
-    case arch_armv6:
-       return StringRef("armv6");
-    case arch_armv7:
-       return StringRef("armv7");
-  }
-  llvm_unreachable("unknown arch");
-} 
-
-uint32_t WriterOptionsMachO::cpuType() const {
-  switch ( _architecture ) {
-    case arch_x86_64:
-       return mach_o::CPU_TYPE_X86_64;
-    case arch_x86:
-       return mach_o::CPU_TYPE_I386;
-    case arch_armv6:
-    case arch_armv7:
-       return mach_o::CPU_TYPE_ARM;
-  }
-  llvm_unreachable("unknown arch");
-}
-
-uint32_t WriterOptionsMachO::cpuSubtype() const {
-  switch ( _architecture ) {
-    case arch_x86_64:
-       return mach_o::CPU_SUBTYPE_X86_64_ALL;
-    case arch_x86:
-       return mach_o::CPU_SUBTYPE_X86_ALL;
-    case arch_armv6:
-       return mach_o::CPU_SUBTYPE_ARM_V6;
-    case arch_armv7:
-       return mach_o::CPU_SUBTYPE_ARM_V7;
-  }
-  llvm_unreachable("unknown arch");
-}
-
-uint64_t WriterOptionsMachO::pageZeroSize() const { 
-  switch ( _outputkind ) {
-    case outputDynamicExecutable:
-      return _pageZeroSize; 
-    case outputDylib:
-    case outputBundle:
-    case outputObjectFile:
-      assert(_pageZeroSize == 0);
-      return 0;
-  }
-  llvm_unreachable("unknown outputkind");
-}
-
-bool WriterOptionsMachO::addEntryPointLoadCommand() const {
-  switch ( _outputkind ) {
-    case outputDynamicExecutable:
-      // Only main executables have an entry point
-      return false; 
-    case outputDylib:
-    case outputBundle:
-    case outputObjectFile:
-      return false;
-  }
-  llvm_unreachable("unknown outputkind");
-}
-
-bool WriterOptionsMachO::addUnixThreadLoadCommand() const {
-  switch ( _outputkind ) {
-    case outputDynamicExecutable:
-      // Only main executables have an entry point
-      return true; 
-    case outputDylib:
-    case outputBundle:
-    case outputObjectFile:
-      return false;
-  }
-  llvm_unreachable("unknown outputkind");
-}
-
-StringRef WriterOptionsMachO::entryPointName() const {
-  switch ( _outputkind ) {
-    case outputDynamicExecutable:
-      // Only main executables have an entry point
-      if ( ! _customEntryPointName.empty() ) {
-        return _customEntryPointName;
-      }
-      else {
-        if ( true || this->addEntryPointLoadCommand() ) 
-          return StringRef("_main");
-        else
-          return StringRef("start"); 
-      }
-      break;
-    case outputDylib:
-    case outputBundle:
-    case outputObjectFile:
-      return StringRef();
-  }
-  llvm_unreachable("unknown outputkind");
-}
-
-
-} // namespace lld
-

Modified: lld/trunk/lib/ReaderWriter/Native/ReaderNative.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/Native/ReaderNative.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/Native/ReaderNative.cpp (original)
+++ lld/trunk/lib/ReaderWriter/Native/ReaderNative.cpp Tue Jan 22 19:18:43 2013
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "lld/ReaderWriter/ReaderNative.h"
+#include "lld/ReaderWriter/Reader.h"
 
 #include "lld/Core/Atom.h"
 #include "lld/Core/Error.h"
@@ -914,39 +914,24 @@
 
 inline void NativeReferenceV1::setAddend(Addend a) {
   // Do nothing if addend value is not being changed.
-  if ( this->addend() == a )
+  if (addend() == a)
     return;
-  assert(0 && "setAddend() not supported");
+  llvm_unreachable("setAddend() not supported");
 }
 
-
 class Reader : public lld::Reader {
 public:
-  Reader(const ReaderOptionsNative &options) {}
+  Reader(const TargetInfo &ti)
+   : lld::Reader(ti) {}
   
   virtual error_code parseFile(std::unique_ptr<MemoryBuffer> mb, 
                                std::vector<std::unique_ptr<lld::File>> &result) {
     return File::make(mb, mb->getBufferIdentifier(), result);
   }
 };
+} // end namespace native
 
-
-
-} // namespace native
-
-Reader* createReaderNative(const ReaderOptionsNative &options) {
-  return new lld::native::Reader(options);
-}
-
-ReaderOptionsNative::ReaderOptionsNative() {
-}
-
-ReaderOptionsNative::~ReaderOptionsNative() {
+std::unique_ptr<Reader> createReaderNative(const TargetInfo &ti) {
+  return std::unique_ptr<Reader>(new lld::native::Reader(ti));
 }
-
-
-} // namespace lld
-
-
-
-
+} // end namespace lld

Modified: lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp (original)
+++ lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp Tue Jan 22 19:18:43 2013
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "lld/ReaderWriter/WriterNative.h"
+#include "lld/ReaderWriter/Writer.h"
 #include "lld/Core/File.h"
 
 #include "llvm/ADT/ArrayRef.h"
@@ -28,7 +28,7 @@
 ///
 class Writer : public lld::Writer {
 public:
-  Writer(const WriterOptionsNative &options) {}
+  Writer(const TargetInfo &ti) {}
   
   virtual error_code writeFile(const lld::File &file, StringRef outPath) {
     // reserve first byte for unnamed atoms
@@ -576,21 +576,9 @@
   NameToOffsetVector                      _sectionNames;
   NameToOffsetVector                      _sharedLibraryNames;
 };
+} // end namespace native
 
-
-} // namespace native
-
-Writer* createWriterNative(const WriterOptionsNative &options) {
-  return new lld::native::Writer(options);
-}
-
-WriterOptionsNative::WriterOptionsNative() {
-}
-
-WriterOptionsNative::~WriterOptionsNative() {
+std::unique_ptr<Writer> createWriterNative(const TargetInfo &ti) {
+  return std::unique_ptr<Writer>(new native::Writer(ti));
 }
-
-
-} // namespace lld
-
-
+} // end namespace lld

Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Tue Jan 22 19:18:43 2013
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "lld/ReaderWriter/ReaderPECOFF.h"
+#include "lld/ReaderWriter/Reader.h"
 #include "lld/Core/File.h"
 
 #include "llvm/ADT/ArrayRef.h"
@@ -359,7 +359,7 @@
 
 class ReaderCOFF : public Reader {
 public:
-  ReaderCOFF(const ReaderOptionsPECOFF &options) {}
+  ReaderCOFF(const TargetInfo &ti) : Reader(ti) {}
 
   error_code parseFile(std::unique_ptr<MemoryBuffer> mb,
                        std::vector<std::unique_ptr<File>> &result) {
@@ -373,22 +373,11 @@
     return error_code::success();
   }
 };
-
-} // namespace anonymous
-
+} // end namespace anonymous
 
 namespace lld {
-
-Reader *createReaderPECOFF(const ReaderOptionsPECOFF &options) {
-  return new ReaderCOFF(options);
+std::unique_ptr<Reader> createReaderPECOFF(const TargetInfo & ti,
+                                           std::function<ReaderFunc>) {
+  return std::unique_ptr<Reader>(new ReaderCOFF(ti));
 }
-
-ReaderOptionsPECOFF::ReaderOptionsPECOFF() {
 }
-
-ReaderOptionsPECOFF::~ReaderOptionsPECOFF() {
-}
-
-} // namespace lld
-
-

Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Tue Jan 22 19:18:43 2013
@@ -7,29 +7,14 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "lld/ReaderWriter/WriterPECOFF.h"
+#include "lld/ReaderWriter/Writer.h"
 
-#include "llvm/Support/Debug.h"
+#include "llvm/Support/ErrorHandling.h"
 
 
 namespace lld {
-namespace pe_coff {
-
-// define PE/COFF writer class here
-
-
-} // namespace pe_coff
-
-Writer* createWriterPECOFF(const WriterOptionsPECOFF &options) {
-  assert(0 && "PE/COFF support not implemented yet");
+std::unique_ptr<Writer> createWriterPECOFF(const TargetInfo &) {
+  llvm_unreachable("PE/COFF support not implemented yet");
   return nullptr;
 }
-
-WriterOptionsPECOFF::WriterOptionsPECOFF() {
-}
-
-WriterOptionsPECOFF::~WriterOptionsPECOFF() {
-}
-
-} // namespace lld
-
+} // end namespace lld

Modified: lld/trunk/lib/ReaderWriter/Reader.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/Reader.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/Reader.cpp (original)
+++ lld/trunk/lib/ReaderWriter/Reader.cpp Tue Jan 22 19:18:43 2013
@@ -14,29 +14,17 @@
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/system_error.h"
 
-
 namespace lld {
-
-Reader::Reader() {
-}
-
 Reader::~Reader() {
 }
 
 error_code Reader::readFile(StringRef path,
-                                  std::vector<std::unique_ptr<File>> &result) {
+                            std::vector<std::unique_ptr<File>> &result) {
   OwningPtr<llvm::MemoryBuffer> opmb;
-  if ( error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb) )
+  if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, opmb))
     return ec;
  
   std::unique_ptr<MemoryBuffer> mb(opmb.take());
   return this->parseFile(std::move(mb), result);
 }
-
-
-
-ReaderOptions::ReaderOptions() {
-}
-
-} // namespace lld 
-
+} // end namespace lld 

Modified: lld/trunk/lib/ReaderWriter/ReaderArchive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ReaderArchive.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ReaderArchive.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ReaderArchive.cpp Tue Jan 22 19:18:43 2013
@@ -9,7 +9,11 @@
 
 #include "lld/ReaderWriter/ReaderArchive.h"
 
+#include "lld/Core/ArchiveLibraryFile.h"
+#include "lld/Core/LinkerOptions.h"
+
 #include "llvm/ADT/Hashing.h"
+#include "llvm/Object/ObjectFile.h"
 
 #include <unordered_map>
 
@@ -46,8 +50,8 @@
     
     std::vector<std::unique_ptr<File>> result;
 
-    if ((ec = _options.reader()->parseFile(std::unique_ptr<MemoryBuffer>
-                                           (ci->getBuffer()), result)))
+    LinkerInput li(std::unique_ptr<MemoryBuffer>(ci->getBuffer()));
+    if ((ec = _getReader(li)->parseFile(li.takeBuffer(), result)))
       return nullptr;
 
     assert(result.size() == 1);
@@ -109,8 +113,8 @@
   }
 
 private:
+  std::function<ErrorOr<Reader&> (const LinkerInput &)> _getReader;
   std::unique_ptr<llvm::object::Archive> _archive;
-  const ReaderOptionsArchive _options;
   atom_collection_vector<DefinedAtom>       _definedAtoms;
   atom_collection_vector<UndefinedAtom>     _undefinedAtoms;
   atom_collection_vector<SharedLibraryAtom> _sharedLibraryAtoms;
@@ -118,13 +122,13 @@
 
 public:
   /// only subclasses of ArchiveLibraryFile can be instantiated 
-  explicit FileArchive(llvm::MemoryBuffer *mb, 
-                       const ReaderOptionsArchive &options, 
-                       error_code &ec)
-                      :ArchiveLibraryFile(mb->getBufferIdentifier()),
-                       _options(options) { 
+  FileArchive(const TargetInfo &ti,
+              std::function<ErrorOr<Reader&> (const LinkerInput &)> getReader,
+              std::unique_ptr<llvm::MemoryBuffer> mb,
+              error_code &ec)
+      : ArchiveLibraryFile(mb->getBufferIdentifier()), _getReader(getReader) {
     std::unique_ptr<llvm::object::Archive> archive_obj(
-      new llvm::object::Archive(mb, ec));
+        new llvm::object::Archive(mb.release(), ec));
     if (ec)
       return;
     _archive.swap(archive_obj);
@@ -148,23 +152,23 @@
 // Returns a vector of Files that are contained in the archive file 
 // pointed to by the MemoryBuffer
 error_code ReaderArchive::parseFile(std::unique_ptr<llvm::MemoryBuffer> mb,
-		std::vector<std::unique_ptr<File>> &result) {
+                                    std::vector<std::unique_ptr<File>> &result){
   error_code ec;
   
-  if (_options.isForceLoad()) {
+  if (_options._forceLoadArchives) {
     _archive.reset(new llvm::object::Archive(mb.release(), ec));
     if (ec)
       return ec;
     
     for (auto mf = _archive->begin_children(), 
               me = _archive->end_children(); mf != me; ++mf) {
-    	if ((ec = _options.reader()->parseFile(std::unique_ptr<MemoryBuffer>
-                                             (mf->getBuffer()), result)))
+      LinkerInput li(std::unique_ptr<MemoryBuffer>(mf->getBuffer()));
+      if ((ec = _getReader(li)->parseFile(li.takeBuffer(), result)))
         return ec;
     }
   } else {
     std::unique_ptr<File> f;
-    f.reset(new FileArchive(mb.release(), _options, ec));
+    f.reset(new FileArchive(_targetInfo, _getReader, std::move(mb), ec));
     if (ec)
       return ec;
 
@@ -172,5 +176,4 @@
   }
   return llvm::error_code::success();
 }
-
-} // namespace lld
+} // end namespace lld

Modified: lld/trunk/lib/ReaderWriter/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/Writer.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/Writer.cpp (original)
+++ lld/trunk/lib/ReaderWriter/Writer.cpp Tue Jan 22 19:18:43 2013
@@ -9,17 +9,10 @@
 
 #include "lld/ReaderWriter/Writer.h"
 
-
 namespace lld {
-
 Writer::Writer() {
 }
 
 Writer::~Writer() {
 }
-
-WriterOptions::WriterOptions() {
-}
-
-} // namespace lld
-
+} // end namespace lld

Modified: lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp (original)
+++ lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp Tue Jan 22 19:18:43 2013
@@ -8,14 +8,15 @@
 //===----------------------------------------------------------------------===//
 
 
+#include "lld/ReaderWriter/Reader.h"
+#include "lld/ReaderWriter/Writer.h"
+
 #include "lld/Core/ArchiveLibraryFile.h"
 #include "lld/Core/DefinedAtom.h"
 #include "lld/Core/Error.h"
 #include "lld/Core/File.h"
 #include "lld/Core/LLVM.h"
 #include "lld/Core/Reference.h"
-#include "lld/ReaderWriter/ReaderYAML.h"
-#include "lld/ReaderWriter/WriterYAML.h"
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/OwningPtr.h"
@@ -38,6 +39,7 @@
 using llvm::yaml::SequenceTraits;
 using llvm::yaml::DocumentListTraits;
 
+using namespace lld;
 
 /// The conversion of Atoms to and from YAML uses LLVM's YAML I/O.  This
 /// file just defines template specializations on the lld types which control
@@ -51,16 +53,11 @@
 /// supplies contextual information.
 class ContextInfo {
 public:
-  ContextInfo(const lld::ReaderOptionsYAML &ro)
-    : _currentFile(nullptr), _readerOptions(&ro), _writerOptions(nullptr) { }
-  ContextInfo(const lld::WriterOptionsYAML &wo)
-    : _currentFile(nullptr), _readerOptions(nullptr), _writerOptions(&wo) { }
-
-  lld::File                     *_currentFile;
-  const lld::ReaderOptionsYAML  *_readerOptions;
-  const lld::WriterOptionsYAML  *_writerOptions;
-};
+  ContextInfo(const TargetInfo &ti) : _currentFile(nullptr), _targetInfo(ti) {}
 
+  lld::File       *_currentFile;
+  const TargetInfo &_targetInfo;
+};
 
 /// Used when writing yaml files.
 /// In most cases, atoms names are unambiguous, so references can just
@@ -293,13 +290,17 @@
                                                       llvm::raw_ostream &out) {
     assert(ctxt != nullptr);
     ContextInfo *info = reinterpret_cast<ContextInfo*>(ctxt);
-    out << info->_writerOptions->kindToString(value);
+    auto relocStr = info->_targetInfo.stringFromRelocKind(value);
+    out << (relocStr ? *relocStr : "<unknown>");
   }
 
   static StringRef input(StringRef scalar, void *ctxt, RefKind &value) {
     assert(ctxt != nullptr);
     ContextInfo *info = reinterpret_cast<ContextInfo*>(ctxt);
-    value = info->_readerOptions->kindFromString(scalar);
+    auto relocKind = info->_targetInfo.relocKindFromString(scalar);
+    if (!relocKind)
+      return "Invalid relocation kind";
+    value = *relocKind;
     return StringRef();
   }
 };
@@ -1260,8 +1261,7 @@
 
 class Writer : public lld::Writer {
 public:
-  Writer(const WriterOptionsYAML &options) : _options(options) {
-  }
+  Writer(const TargetInfo &ti) : _targetInfo(ti) {}
   
   virtual error_code writeFile(const lld::File &file, StringRef outPath) {
     // Create stream to path.
@@ -1271,7 +1271,7 @@
       return llvm::make_error_code(llvm::errc::no_such_file_or_directory);
 
     // Create yaml Output writer, using yaml options for context.
-    ContextInfo context(_options);
+    ContextInfo context(_targetInfo);
     llvm::yaml::Output yout(out, &context);
     
     // Write yaml output.
@@ -1282,24 +1282,21 @@
   }
   
   virtual StubsPass *stubPass() {
-    return _options.stubPass();
+    return _targetInfo.getStubPass();
   }
   
   virtual GOTPass *gotPass() {
-    return _options.gotPass();
+    return _targetInfo.getGOTPass();
   }
   
   
 private:
-  const WriterOptionsYAML &_options;
+  const TargetInfo &_targetInfo;
 };
 
-
-
 class ReaderYAML : public Reader {
 public:
-  ReaderYAML(const ReaderOptionsYAML &options) : _options(options) {
-  }
+  ReaderYAML(const TargetInfo &ti) : Reader(ti) {}
 
   error_code parseFile(std::unique_ptr<MemoryBuffer> mb,
                        std::vector<std::unique_ptr<File>> &result) {
@@ -1311,7 +1308,7 @@
     // is deallocated.
 
     // Create YAML Input parser.
-    ContextInfo context(_options);
+    ContextInfo context(_targetInfo);
     llvm::yaml::Input yin(mb->getBuffer(), &context);
     
     // Fill vector with File objects created by parsing yaml.
@@ -1329,38 +1326,14 @@
     }
     return make_error_code(lld::yaml_reader_error::success);
   }
-
-private:
-  const ReaderOptionsYAML       &_options;
 };
+} // end namespace yaml
 
-
-
-} // namespace yaml
-
-
-Writer *createWriterYAML(const WriterOptionsYAML &options) {
-  return new lld::yaml::Writer(options);
+std::unique_ptr<Writer> createWriterYAML(const TargetInfo &ti) {
+  return std::unique_ptr<Writer>(new lld::yaml::Writer(ti));
 }
 
-WriterOptionsYAML::WriterOptionsYAML() {
+std::unique_ptr<Reader> createReaderYAML(const TargetInfo &ti) {
+  return std::unique_ptr<Reader>(new lld::yaml::ReaderYAML(ti));
 }
-
-WriterOptionsYAML::~WriterOptionsYAML() {
-}
-
-
-
-Reader *createReaderYAML(const ReaderOptionsYAML &options) {
-  return new lld::yaml::ReaderYAML(options);
-}
-
-ReaderOptionsYAML::ReaderOptionsYAML() {
-}
-
-ReaderOptionsYAML::~ReaderOptionsYAML() {
-}
-
-
-} // namespace lld
-
+} // end namespace lld

Modified: lld/trunk/test/elf/reloc.objtxt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/reloc.objtxt?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/test/elf/reloc.objtxt (original)
+++ lld/trunk/test/elf/reloc.objtxt Tue Jan 22 19:18:43 2013
@@ -27,13 +27,13 @@
 
 ELF-i386:    - name:              main
 ELF-i386:      scope:             global
-ELF-i386:      content:           [ 55, 89, E5, 83, E4, F0, 83, EC, 10, C7, 04, 24, 
-ELF-i386:                           00, 00, 00, 00, E8, FC, FF, FF, FF, 31, C0, C9, 
+ELF-i386:      content:           [ 55, 89, E5, 83, E4, F0, 83, EC, 10, C7, 04, 24,
+ELF-i386:                           00, 00, 00, 00, E8, FC, FF, FF, FF, 31, C0, C9,
 ELF-i386:                           C3 ]
 ELF-i386:      section-choice:    custom-required
 ELF-i386:      section-name:      .text.startup
 ELF-i386:      references:
-ELF-i386:      - kind:              ???
+ELF-i386:      - kind:              <unknown>
 ELF-i386:        offset:            12
 ELF-i386:        target:            .rodata.str1.1
 ELF-i386:      - kind:              call32
@@ -42,7 +42,7 @@
 
 ELF-i386:    - name:              .comment
 ELF-i386:      type:              constant
-ELF-i386:      content:           [ 00, 47, 43, 43, 3A, 20, 28, 47, 4E, 55, 29, 20, 
+ELF-i386:      content:           [ 00, 47, 43, 43, 3A, 20, 28, 47, 4E, 55, 29, 20,
 ELF-i386:                           34, 2E, 37, 2E, 30, 00 ]
 ELF-i386:      section-choice:    custom-required
 ELF-i386:      section-name:      .comment
@@ -52,10 +52,10 @@
 ELF-i386:      section-name:      .note.GNU-stack
 
 ELF-i386:    - name:              .eh_frame
-ELF-i386:      content:           [ 14, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 52, 00, 
-ELF-i386:                           01, 7C, 08, 01, 1B, 0C, 04, 04, 88, 01, 00, 00, 
-ELF-i386:                           1C, 00, 00, 00, 1C, 00, 00, 00, 00, 00, 00, 00, 
-ELF-i386:                           19, 00, 00, 00, 00, 41, 0E, 08, 85, 02, 42, 0D, 
+ELF-i386:      content:           [ 14, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 52, 00,
+ELF-i386:                           01, 7C, 08, 01, 1B, 0C, 04, 04, 88, 01, 00, 00,
+ELF-i386:                           1C, 00, 00, 00, 1C, 00, 00, 00, 00, 00, 00, 00,
+ELF-i386:                           19, 00, 00, 00, 00, 41, 0E, 08, 85, 02, 42, 0D,
 ELF-i386:                           05, 55, C5, 0C, 04, 04, 00, 00 ]
 ELF-i386:      section-choice:    custom-required
 ELF-i386:      section-name:      .eh_frame

Modified: lld/trunk/tools/lld-core/TestingHelpers.hpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/tools/lld-core/TestingHelpers.hpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/tools/lld-core/TestingHelpers.hpp (original)
+++ lld/trunk/tools/lld-core/TestingHelpers.hpp Tue Jan 22 19:18:43 2013
@@ -14,7 +14,7 @@
 #include "lld/Core/LLVM.h"
 #include "lld/Core/Pass.h"
 #include "lld/Core/Resolver.h"
-#include "lld/ReaderWriter/WriterYAML.h"
+#include "lld/ReaderWriter/Writer.h"
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/Support/CommandLine.h"
@@ -246,7 +246,7 @@
 
 struct TestingKindMapping {
   const char     *string;
-  Reference::Kind value;
+  int32_t         value;
   bool            isBranch;
   bool            isGotLoad;
   bool            isGotUse;
@@ -270,7 +270,7 @@
     return true;
   }
 
-  virtual bool isCallSite(Reference::Kind kind) {
+  virtual bool isCallSite(int32_t kind) {
     for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) {
       if (kind == p->value)
         return p->isBranch;
@@ -300,7 +300,7 @@
     return true;
   }
 
-  virtual bool isGOTAccess(Reference::Kind kind, bool &canBypassGOT) {
+  virtual bool isGOTAccess(int32_t kind, bool &canBypassGOT) {
     for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) {
       if (kind == p->value) {
         canBypassGOT = p->isGotLoad;
@@ -325,51 +325,4 @@
   TestingPassFile _file;
 };
 
-class TestingWriterOptionsYAML : public lld::WriterOptionsYAML {
-public:
-  TestingWriterOptionsYAML(bool stubs, bool got)
-    : _doStubs(stubs), _doGOT(got) {
-  }
-
-  virtual StubsPass *stubPass() const {
-    if (_doStubs)
-      return const_cast<TestingStubsPass*>(&_stubsPass);
-    else
-      return nullptr;
-  }
-
-  virtual GOTPass *gotPass() const {
-     if (_doGOT)
-      return const_cast<TestingGOTPass*>(&_gotPass);
-    else
-      return nullptr;
-  }
-
-  virtual StringRef kindToString(Reference::Kind value) const {
-    for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) {
-      if (value == p->value)
-        return p->string;
-    }
-    return StringRef("???");
-  }
-private:
-  bool              _doStubs;
-  bool              _doGOT;
-  TestingStubsPass  _stubsPass;
-  TestingGOTPass    _gotPass;
-};
-
-class TestingReaderOptionsYAML : public lld::ReaderOptionsYAML {
-  virtual Reference::Kind kindFromString(StringRef kindName) const {
-    for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) {
-      if (kindName.equals(p->string))
-        return p->value;
-    }
-    int k;
-    if (kindName.getAsInteger(0, k))
-      k = 0;
-    return k;
-  }
-};
-
 #endif // LLD_TOOLS_TESTING_HELPERS_H_

Modified: lld/trunk/tools/lld-core/lld-core.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/tools/lld-core/lld-core.cpp?rev=173217&r1=173216&r2=173217&view=diff
==============================================================================
--- lld/trunk/tools/lld-core/lld-core.cpp (original)
+++ lld/trunk/tools/lld-core/lld-core.cpp Tue Jan 22 19:18:43 2013
@@ -12,22 +12,15 @@
 #include "lld/Core/LLVM.h"
 #include "lld/Core/Pass.h"
 #include "lld/Core/Resolver.h"
-#include "lld/Core/TargetInfo.h"
+#include "lld/ReaderWriter/ELFTargetInfo.h"
+#include "lld/ReaderWriter/MachOTargetInfo.h"
 #include "lld/ReaderWriter/Reader.h"
 #include "lld/ReaderWriter/ReaderArchive.h"
-#include "lld/ReaderWriter/ReaderNative.h"
-#include "lld/ReaderWriter/ReaderYAML.h"
-#include "lld/ReaderWriter/ReaderELF.h"
-#include "lld/ReaderWriter/ReaderPECOFF.h"
-#include "lld/ReaderWriter/ReaderMachO.h"
 #include "lld/ReaderWriter/Writer.h"
-#include "lld/ReaderWriter/WriterELF.h"
-#include "lld/ReaderWriter/WriterMachO.h"
-#include "lld/ReaderWriter/WriterNative.h"
-#include "lld/ReaderWriter/WriterPECOFF.h"
-#include "lld/ReaderWriter/WriterYAML.h"
 
 #include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/Support/ELF.h"
 #include "llvm/Support/Endian.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FileSystem.h"
@@ -107,7 +100,8 @@
     clEnumValN(writeMachO,  "mach-o", "link as darwin would"),
     clEnumValN(writePECOFF, "PECOFF", "link as windows would"),
     clEnumValN(writeELF,    "ELF",    "link as linux would"),
-    clEnumValEnd));
+    clEnumValEnd),
+  llvm::cl::init(writeYAML));
 
 enum ReaderChoice {
   readerYAML, readerMachO, readerPECOFF, readerELF
@@ -120,7 +114,8 @@
     clEnumValN(readerMachO,  "mach-o", "read as darwin would"),
     clEnumValN(readerPECOFF, "PECOFF", "read as windows would"),
     clEnumValN(readerELF,    "ELF",    "read as linux would"),
-    clEnumValEnd));
+    clEnumValEnd),
+  llvm::cl::init(readerYAML));
     
 enum ArchChoice {
   i386 = llvm::ELF::EM_386,
@@ -140,7 +135,8 @@
                "hexagon", "output Hexagon, EM_HEXAGON file"),
     clEnumValN(ppc, 
                "ppc", "output PowerPC, EM_PPC file"),
-    clEnumValEnd));
+    clEnumValEnd),
+  llvm::cl::init(i386));
 
 
 enum endianChoice {
@@ -156,7 +152,7 @@
                "output little endian format"),
     clEnumValEnd));
     
-class TestingTargetInfo LLVM_FINAL : public TargetInfo {
+class TestingTargetInfo : public TargetInfo {
 public:
   TestingTargetInfo(const LinkerOptions &lo, bool stubs, bool got)
       : TargetInfo(lo), _doStubs(stubs), _doGOT(got) {}
@@ -177,7 +173,7 @@
       return nullptr;
   }
 
-  virtual ErrorOr<uint32_t> relocKindFromString(StringRef str) const {
+  virtual ErrorOr<int32_t> relocKindFromString(StringRef str) const {
     // Try parsing as a number.
     if (auto kind = TargetInfo::relocKindFromString(str))
       return kind;
@@ -187,9 +183,9 @@
     return llvm::make_error_code(llvm::errc::invalid_argument);
   }
 
-  virtual ErrorOr<std::string> stringFromRelocKind(uint32_t kind) const {
+  virtual ErrorOr<std::string> stringFromRelocKind(int32_t kind) const {
     for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) {
-      if (kind == static_cast<uint32_t>(p->value))
+      if (kind == p->value)
         return std::string(p->string);
     }
     return llvm::make_error_code(llvm::errc::invalid_argument);
@@ -244,49 +240,32 @@
 
   TestingTargetInfo tti(lo, cmdLineDoStubsPass, cmdLineDoGotPass);
 
-  // create writer for final output, default to i386 if none selected
-  WriterOptionsELF writerOptionsELF(false,
-                                    endianSelected == big
-                                    ? llvm::support::big
-                                    : llvm::support::little,
-                                    llvm::ELF::ET_EXEC,
-                                    archSelected.getValue() == 0
-                                    ? i386
-                                    : archSelected);
-
-  TestingWriterOptionsYAML  writerOptionsYAML(cmdLineDoStubsPass, 
-                                              cmdLineDoGotPass);
-  WriterOptionsMachO        writerOptionsMachO;
-  WriterOptionsPECOFF       writerOptionsPECOFF;
-
-  Writer* writer = nullptr;
+  std::unique_ptr<ELFTargetInfo> eti = ELFTargetInfo::create(lo);
+  std::unique_ptr<MachOTargetInfo> mti = MachOTargetInfo::create(lo);
+  std::unique_ptr<Writer> writer;
   switch ( writeSelected ) {
     case writeYAML:
-      writer = createWriterYAML(writerOptionsYAML);
+      writer = createWriterYAML(tti);
       break;
     case writeMachO:
-      writer = createWriterMachO(writerOptionsMachO);
+      writer = createWriterMachO(*mti);
       break;
     case writePECOFF:
-      writer = createWriterPECOFF(writerOptionsPECOFF);
+      writer = createWriterPECOFF(tti);
       break;
     case writeELF:
-      writer = createWriterELF(writerOptionsELF);
+      writer = createWriterELF(*eti);
       break;
   }
   
   // create object to mange input files
   InputFiles inputFiles;
 
-  ReaderOptionsArchive readerOptionsArchive(cmdLineForceLoad);
-
   // read input files into in-memory File objects
-
-  TestingReaderOptionsYAML  readerOptionsYAML;
-  Reader *reader = nullptr;
+  std::unique_ptr<Reader> reader;
   switch ( readerSelected ) {
     case readerYAML:
-      reader = createReaderYAML(readerOptionsYAML);
+      reader = createReaderYAML(tti);
       break;
 #if 0
     case readerMachO:
@@ -294,15 +273,19 @@
       break;
 #endif
     case readerPECOFF:
-      reader = createReaderPECOFF(lld::ReaderOptionsPECOFF());
+      reader = createReaderPECOFF(tti,
+      [&] (const LinkerInput &) -> ErrorOr<Reader&> {
+        return *reader;
+      });
       break;
     case readerELF:
-      reader = createReaderELF(lld::ReaderOptionsELF(),
-                               readerOptionsArchive);
-
+      reader = createReaderELF(*eti,
+      [&] (const LinkerInput &) -> ErrorOr<Reader&> {
+        return *reader;
+      });
       break;
     default:
-      reader = createReaderYAML(readerOptionsYAML);
+      reader = createReaderYAML(tti);
       break;
   }
 
@@ -342,14 +325,12 @@
   }
   
   // write as native file
-  WriterOptionsNative  optionsNativeWriter;
-  Writer *natWriter = createWriterNative(optionsNativeWriter);
+  std::unique_ptr<Writer> natWriter = createWriterNative(tti);
   if (error(natWriter->writeFile(mergedMasterFile, tmpNativePath.c_str())))
     return 1;
   
   // read as native file
-  ReaderOptionsNative  optionsNativeReader;
-  Reader *natReader = createReaderNative(optionsNativeReader);
+  std::unique_ptr<Reader> natReader = createReaderNative(tti);
   std::vector<std::unique_ptr<File>> readNativeFiles;
   if (error(natReader->readFile(tmpNativePath.c_str(), readNativeFiles)))
     return 1;





More information about the llvm-commits mailing list