summaryrefslogtreecommitdiffstats
path: root/lld/lib/Driver
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/Driver')
-rw-r--r--lld/lib/Driver/Drivers.cpp3
-rw-r--r--lld/lib/Driver/LinkerInvocation.cpp12
-rw-r--r--lld/lib/Driver/Targets.cpp212
3 files changed, 37 insertions, 190 deletions
diff --git a/lld/lib/Driver/Drivers.cpp b/lld/lib/Driver/Drivers.cpp
index 2063878495d..d6c29ca175e 100644
--- a/lld/lib/Driver/Drivers.cpp
+++ b/lld/lib/Driver/Drivers.cpp
@@ -228,7 +228,8 @@ LinkerOptions lld::generateOptions(const llvm::opt::ArgList &args) {
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);
diff --git a/lld/lib/Driver/LinkerInvocation.cpp b/lld/lib/Driver/LinkerInvocation.cpp
index 268a3ce1530..51cd74b3de0 100644
--- a/lld/lib/Driver/LinkerInvocation.cpp
+++ b/lld/lib/Driver/LinkerInvocation.cpp
@@ -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 @@ void LinkerInvocation::operator()() {
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();
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