add hexagon target to lld

llvm-svn: 172202
This commit is contained in:
Shankar Easwaran 2013-01-11 15:01:04 +00:00
parent 29e1c4b03e
commit d127d8169a
1 changed files with 69 additions and 0 deletions

View File

@ -159,6 +159,72 @@ private:
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 @@ std::unique_ptr<Target> Target::create(const LinkerOptions &lo) {
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>();
}