[lld] r372513 - [mips] Deduce MIPS specific ELF header flags from `emulation`

Simon Atanasyan via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 22 09:26:39 PDT 2019


Author: atanasyan
Date: Sun Sep 22 09:26:39 2019
New Revision: 372513

URL: http://llvm.org/viewvc/llvm-project?rev=372513&view=rev
Log:
[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.

Added:
    lld/trunk/test/ELF/mips-elf-flags-binary.s
Modified:
    lld/trunk/ELF/Arch/MipsArchTree.cpp

Modified: lld/trunk/ELF/Arch/MipsArchTree.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Arch/MipsArchTree.cpp?rev=372513&r1=372512&r2=372513&view=diff
==============================================================================
--- lld/trunk/ELF/Arch/MipsArchTree.cpp (original)
+++ lld/trunk/ELF/Arch/MipsArchTree.cpp Sun Sep 22 09:26:39 2019
@@ -294,12 +294,30 @@ static uint32_t getArchFlags(ArrayRef<Fi
   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);
 }

Added: lld/trunk/test/ELF/mips-elf-flags-binary.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/mips-elf-flags-binary.s?rev=372513&view=auto
==============================================================================
--- lld/trunk/test/ELF/mips-elf-flags-binary.s (added)
+++ lld/trunk/test/ELF/mips-elf-flags-binary.s Sun Sep 22 09:26:39 2019
@@ -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: ]




More information about the llvm-commits mailing list