summaryrefslogtreecommitdiffstats
path: root/lld/lib/Driver/Targets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/Driver/Targets.cpp')
-rw-r--r--lld/lib/Driver/Targets.cpp212
1 files changed, 32 insertions, 180 deletions
diff --git a/lld/lib/Driver/Targets.cpp b/lld/lib/Driver/Targets.cpp
index ae82e905d2d..55ae206bac9 100644
--- a/lld/lib/Driver/Targets.cpp
+++ b/lld/lib/Driver/Targets.cpp
@@ -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 @@ public:
}
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>();
}
-
OpenPOWER on IntegriCloud