[llvm-commits] [lld] r172202 - /lld/trunk/lib/Driver/Targets.cpp

Shankar Easwaran shankare at codeaurora.org
Fri Jan 11 07:01:04 PST 2013


Author: shankare
Date: Fri Jan 11 09:01:04 2013
New Revision: 172202

URL: http://llvm.org/viewvc/llvm-project?rev=172202&view=rev
Log:
add hexagon target to lld

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=172202&r1=172201&r2=172202&view=diff
==============================================================================
--- lld/trunk/lib/Driver/Targets.cpp (original)
+++ lld/trunk/lib/Driver/Targets.cpp Fri Jan 11 09:01:04 2013
@@ -159,6 +159,72 @@
   std::unique_ptr<lld::Writer> _writer, _writerYAML;
 };
 
+class HexagonTarget final : public Target {
+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;
+};
+
 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)
@@ -166,5 +232,8 @@
   else if (t.getOS() == llvm::Triple::Linux &&
            t.getArch() == llvm::Triple::x86_64)
     return std::unique_ptr<Target>(new X86_64LinuxTarget(lo));
+  else if (t.getArch() == llvm::Triple::hexagon) 
+    return std::unique_ptr<Target>(new HexagonTarget(lo));
   return std::unique_ptr<Target>();
 }
+





More information about the llvm-commits mailing list