[lld] Add -emit-yaml option. This outputs yaml instead of a binary.
llvm-svn: 171710
diff --git a/lld/include/lld/Driver/LinkerOptions.h b/lld/include/lld/Driver/LinkerOptions.h
index 494d403..1ed0241 100644
--- a/lld/include/lld/Driver/LinkerOptions.h
+++ b/lld/include/lld/Driver/LinkerOptions.h
@@ -111,7 +111,8 @@
, _outputPath(std::move(other._outputPath))
, _entrySymbol(std::move(other._entrySymbol))
, _relocatable(other._relocatable)
- , _outputCommands(other._outputCommands) {}
+ , _outputCommands(other._outputCommands)
+ , _outputYAML(other._outputYAML) {}
std::vector<LinkerInput> _input;
std::string _target;
@@ -120,6 +121,7 @@
unsigned _relocatable : 1;
/// \brief -###
unsigned _outputCommands : 1;
+ unsigned _outputYAML : 1;
private:
LinkerOptions(const LinkerOptions&) LLVM_DELETED_FUNCTION;
diff --git a/lld/lib/Driver/CoreOptions.td b/lld/lib/Driver/CoreOptions.td
index 77b819d..938a49b 100644
--- a/lld/lib/Driver/CoreOptions.td
+++ b/lld/lib/Driver/CoreOptions.td
@@ -8,3 +8,5 @@
def relocatable : Flag<["-"], "relocatable">;
def OCTOTHORPE_OCTOTHORPE_OCTOTHORPE : Flag<["-"], "###">;
+
+def emit_yaml : Flag<["-"], "emit-yaml">;
diff --git a/lld/lib/Driver/Drivers.cpp b/lld/lib/Driver/Drivers.cpp
index 8a334d9..93a4087 100644
--- a/lld/lib/Driver/Drivers.cpp
+++ b/lld/lib/Driver/Drivers.cpp
@@ -136,6 +136,9 @@
newArgs->AddFlagArg(A, _core.getOption(
core::OPT_OCTOTHORPE_OCTOTHORPE_OCTOTHORPE));
+ if (llvm::opt::Arg *A = _inputArgs->getLastArg(ld::OPT_emit_yaml))
+ newArgs->AddFlagArg(A, _core.getOption(core::OPT_emit_yaml));
+
// Copy input args.
for (llvm::opt::arg_iterator it = _inputArgs->filtered_begin(ld::OPT_INPUT),
ie = _inputArgs->filtered_end();
@@ -197,6 +200,7 @@
ret._entrySymbol = args.getLastArgValue(core::OPT_entry);
ret._relocatable = args.hasArg(core::OPT_relocatable);
ret._outputCommands = args.hasArg(core::OPT_OCTOTHORPE_OCTOTHORPE_OCTOTHORPE);
+ ret._outputYAML = args.hasArg(core::OPT_emit_yaml);
return std::move(ret);
}
diff --git a/lld/lib/Driver/LDOptions.td b/lld/lib/Driver/LDOptions.td
index f6c0053..1d1cf40 100644
--- a/lld/lib/Driver/LDOptions.td
+++ b/lld/lib/Driver/LDOptions.td
@@ -13,3 +13,5 @@
def relocatable_r : Flag<["-"], "r">, Alias<relocatable>;
def OCTOTHORPE_OCTOTHORPE_OCTOTHORPE : Flag<["-"], "###">;
+
+def emit_yaml : Flag<["-"], "emit-yaml">;
diff --git a/lld/lib/Driver/Targets.cpp b/lld/lib/Driver/Targets.cpp
index e2f9371..98a5d4c 100644
--- a/lld/lib/Driver/Targets.cpp
+++ b/lld/lib/Driver/Targets.cpp
@@ -19,8 +19,12 @@
#include "lld/ReaderWriter/ReaderELF.h"
#include "lld/ReaderWriter/ReaderYAML.h"
#include "lld/ReaderWriter/WriterELF.h"
+#include "lld/ReaderWriter/WriterYAML.h"
#include "llvm/ADT/Triple.h"
+#include "llvm/Support/raw_ostream.h"
+
+#include <set>
using namespace lld;
@@ -30,6 +34,7 @@
_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) {
@@ -47,7 +52,7 @@
}
virtual ErrorOr<lld::Writer&> getWriter() {
- return *_writer;
+ return _options._outputYAML ? *_writerYAML : *_writer;
}
private:
@@ -72,8 +77,20 @@
}
} _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;
+ std::unique_ptr<lld::Writer> _writer, _writerYAML;
};
class X86_64LinuxTarget final : public Target {
@@ -83,6 +100,7 @@
_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) {
@@ -100,7 +118,7 @@
}
virtual ErrorOr<lld::Writer&> getWriter() {
- return *_writer;
+ return _options._outputYAML ? *_writerYAML : *_writer;
}
private:
@@ -125,8 +143,20 @@
}
} _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;
+ std::unique_ptr<lld::Writer> _writer, _writerYAML;
};
std::unique_ptr<Target> Target::create(const LinkerOptions &lo) {