commit 2dfd6210dcc3782d0f298b7bb996cc313d53c3a6 Author: dim Date: Sun Sep 22 17:31:27 2019 +0000 Pull in r372513 from upstream lld trunk (by Simon Atanasyan): [mips] Deduce MIPS specific ELF header flags from `emulation` In case of linking binary blobs which do not have any ELF headers, we can deduce MIPS ABI ELF header flags from an `emulation` option. Patch by Kyle Evans. Requested by: kevans :) Notes: svn path=/projects/clang900-import/; revision=352600 diff --git tools/lld/ELF/Arch/MipsArchTree.cpp tools/lld/ELF/Arch/MipsArchTree.cpp index f64d03756457..20e07e1114eb 100644 --- tools/lld/ELF/Arch/MipsArchTree.cpp +++ tools/lld/ELF/Arch/MipsArchTree.cpp @@ -294,12 +294,30 @@ static uint32_t getArchFlags(ArrayRef files) { return ret; } +// If we don't have any input files, we'll have to rely on the information we +// can derive from emulation information, since this at least gets us ABI. +static uint32_t getFlagsFromEmulation() { + uint32_t ret = 0; + + if (config->emulation.empty()) + return 0; + + if (config->ekind == ELF32BEKind || config->ekind == ELF32LEKind) { + if (config->mipsN32Abi) + ret |= EF_MIPS_ABI2; + else + ret |= EF_MIPS_ABI_O32; + } + + return ret; +} + template uint32_t elf::calcMipsEFlags() { std::vector v; for (InputFile *f : objectFiles) v.push_back({f, cast>(f)->getObj().getHeader()->e_flags}); if (v.empty()) - return 0; + return getFlagsFromEmulation(); checkFlags(v); return getMiscFlags(v) | getPicFlags(v) | getArchFlags(v); }