[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