diff options
| author | Simon Atanasyan <simon@atanasyan.com> | 2015-08-28 21:39:00 +0000 |
|---|---|---|
| committer | Simon Atanasyan <simon@atanasyan.com> | 2015-08-28 21:39:00 +0000 |
| commit | 6d39140b6e43f94e5e39b66254d082889d74200f (patch) | |
| tree | 94f68916dfa6c7846c119b68d279d737194e9309 /lld/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp | |
| parent | 0660bcda5369a76474823eca451f4ecb58433ef7 (diff) | |
| download | bcm5719-llvm-6d39140b6e43f94e5e39b66254d082889d74200f.tar.gz bcm5719-llvm-6d39140b6e43f94e5e39b66254d082889d74200f.zip | |
[Mips] Initial support of the MIPS N32 ABI
llvm-svn: 246334
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp')
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp b/lld/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp index b905fa5f3ab..2e72fa39ee2 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp @@ -46,9 +46,16 @@ MipsLinkingContext::MipsLinkingContext(llvm::Triple triple) : ELFLinkingContext(triple, createTarget(triple, *this)) {} uint64_t MipsLinkingContext::getBaseAddress() const { - if (_baseAddress == 0 && getOutputELFType() == llvm::ELF::ET_EXEC) - return getTriple().isArch64Bit() ? 0x120000000 : 0x400000; - return _baseAddress; + if (_baseAddress != 0 || getOutputELFType() != llvm::ELF::ET_EXEC) + return _baseAddress; + switch (getAbi()) { + case MipsAbi::O32: + return 0x0400000; + case MipsAbi::N32: + return 0x10000000; + case MipsAbi::N64: + return 0x120000000; + } } StringRef MipsLinkingContext::entrySymbolName() const { @@ -58,7 +65,14 @@ StringRef MipsLinkingContext::entrySymbolName() const { } StringRef MipsLinkingContext::getDefaultInterpreter() const { - return getTriple().isArch64Bit() ? "/lib64/ld.so.1" : "/lib/ld.so.1"; + switch (getAbi()) { + case MipsAbi::O32: + return "/lib/ld.so.1"; + case MipsAbi::N32: + return "/lib32/ld.so.1"; + case MipsAbi::N64: + return "/lib64/ld.so.1"; + } } void MipsLinkingContext::addPasses(PassManager &pm) { @@ -124,6 +138,11 @@ bool MipsLinkingContext::isRelativeReloc(const Reference &r) const { } } +MipsAbi MipsLinkingContext::getAbi() const { + auto &handler = static_cast<MipsBaseTargetHandler &>(getTargetHandler()); + return handler.getAbi(); +} + const Registry::KindStrings kindStrings[] = { #define ELF_RELOC(name, value) LLD_KIND_STRING_ENTRY(name), #include "llvm/Support/ELFRelocs/Mips.def" |

