diff options
| author | Simon Atanasyan <simon@atanasyan.com> | 2019-09-22 16:26:39 +0000 |
|---|---|---|
| committer | Simon Atanasyan <simon@atanasyan.com> | 2019-09-22 16:26:39 +0000 |
| commit | e03007cb4e520f1c157632504cc7fdc3d982b482 (patch) | |
| tree | ba1133b784f1cab44ffa9aa0c5f807e086a16e8d | |
| parent | 44b6e02f35702c4984aa66655fd4018ac9810878 (diff) | |
| download | bcm5719-llvm-e03007cb4e520f1c157632504cc7fdc3d982b482.tar.gz bcm5719-llvm-e03007cb4e520f1c157632504cc7fdc3d982b482.zip | |
[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.
llvm-svn: 372513
| -rw-r--r-- | lld/ELF/Arch/MipsArchTree.cpp | 20 | ||||
| -rw-r--r-- | lld/test/ELF/mips-elf-flags-binary.s | 25 |
2 files changed, 44 insertions, 1 deletions
diff --git a/lld/ELF/Arch/MipsArchTree.cpp b/lld/ELF/Arch/MipsArchTree.cpp index f745a87a263..5de85e245be 100644 --- a/lld/ELF/Arch/MipsArchTree.cpp +++ b/lld/ELF/Arch/MipsArchTree.cpp @@ -294,12 +294,30 @@ static uint32_t getArchFlags(ArrayRef<FileFlags> 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 <class ELFT> uint32_t elf::calcMipsEFlags() { std::vector<FileFlags> v; for (InputFile *f : objectFiles) v.push_back({f, cast<ObjFile<ELFT>>(f)->getObj().getHeader()->e_flags}); if (v.empty()) - return 0; + return getFlagsFromEmulation(); checkFlags(v); return getMiscFlags(v) | getPicFlags(v) | getArchFlags(v); } diff --git a/lld/test/ELF/mips-elf-flags-binary.s b/lld/test/ELF/mips-elf-flags-binary.s new file mode 100644 index 00000000000..3278fa0c7e2 --- /dev/null +++ b/lld/test/ELF/mips-elf-flags-binary.s @@ -0,0 +1,25 @@ +# REQUIRES: mips +# Check deducing MIPS specific ELF header flags from `emulation`. + +# RUN: echo -n "BLOB" > %t.binary +# RUN: ld.lld -m elf32btsmip -r -b binary %t.binary -o %t.out +# RUN: llvm-readobj -h %t.out | FileCheck -check-prefix=O32 %s + +# RUN: echo -n "BLOB" > %t.binary +# RUN: ld.lld -m elf32btsmipn32 -r -b binary %t.binary -o %t.out +# RUN: llvm-readobj -h %t.out | FileCheck -check-prefix=N32 %s + +# RUN: echo -n "BLOB" > %t.binary +# RUN: ld.lld -m elf64btsmip -r -b binary %t.binary -o %t.out +# RUN: llvm-readobj -h %t.out | FileCheck -check-prefix=N64 %s + +# O32: Flags [ +# O32-NEXT: EF_MIPS_ABI_O32 +# O32-NEXT: ] + +# N32: Flags [ +# N32-NEXT: EF_MIPS_ABI2 +# N32-NEXT: ] + +# N64: Flags [ +# N64-NEXT: ] |

