[llvm-commits] [lld] r171557 - in /lld/trunk: lib/Driver/Targets.cpp test/Driver/x86_64-target.test

Michael J. Spencer bigcheesegs at gmail.com
Fri Jan 4 15:34:29 PST 2013


Author: mspencer
Date: Fri Jan  4 17:34:29 2013
New Revision: 171557

URL: http://llvm.org/viewvc/llvm-project?rev=171557&view=rev
Log:
[Driver] Add x86-64 target.

Added:
    lld/trunk/test/Driver/x86_64-target.test
Modified:
    lld/trunk/lib/Driver/Targets.cpp

Modified: lld/trunk/lib/Driver/Targets.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Targets.cpp?rev=171557&r1=171556&r2=171557&view=diff
==============================================================================
--- lld/trunk/lib/Driver/Targets.cpp (original)
+++ lld/trunk/lib/Driver/Targets.cpp Fri Jan  4 17:34:29 2013
@@ -76,9 +76,65 @@
   std::unique_ptr<lld::Writer> _writer;
 };
 
+class X86_64LinuxTarget final : public Target {
+public:
+  X86_64LinuxTarget(const LinkerOptions &lo)
+    : Target(lo), _woe(lo._entrySymbol) {
+    _readerELF.reset(createReaderELF(_roe, _roa));
+    _readerYAML.reset(createReaderYAML(_roy));
+    _writer.reset(createWriterELF(_woe));
+  }
+
+  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 *_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_X86_64;
+      _entryPoint = entry;
+    }
+  } _woe;
+
+  std::unique_ptr<lld::Reader> _readerELF, _readerYAML;
+  std::unique_ptr<lld::Writer> _writer;
+};
+
 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));
   return std::unique_ptr<Target>();
 }

Added: lld/trunk/test/Driver/x86_64-target.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/Driver/x86_64-target.test?rev=171557&view=auto
==============================================================================
--- lld/trunk/test/Driver/x86_64-target.test (added)
+++ lld/trunk/test/Driver/x86_64-target.test Fri Jan  4 17:34:29 2013
@@ -0,0 +1,3 @@
+RUN: lld -flavor ld -target x86_64-linux 2>&1 | FileCheck %s
+
+CHECK-NOT: Failed to create target





More information about the llvm-commits mailing list