Skip to content

Commit

Permalink
[mips] Deduce MIPS specific ELF header flags from emulation
Browse files Browse the repository at this point in the history
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
  • Loading branch information
atanasyan committed Sep 22, 2019
1 parent 44b6e02 commit e03007c
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
20 changes: 19 additions & 1 deletion lld/ELF/Arch/MipsArchTree.cpp
Expand Up @@ -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);
}
Expand Down
25 changes: 25 additions & 0 deletions 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: ]

0 comments on commit e03007c

Please sign in to comment.