summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2019-09-22 16:26:39 +0000
committerSimon Atanasyan <simon@atanasyan.com>2019-09-22 16:26:39 +0000
commite03007cb4e520f1c157632504cc7fdc3d982b482 (patch)
treeba1133b784f1cab44ffa9aa0c5f807e086a16e8d
parent44b6e02f35702c4984aa66655fd4018ac9810878 (diff)
downloadbcm5719-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.cpp20
-rw-r--r--lld/test/ELF/mips-elf-flags-binary.s25
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: ]
OpenPOWER on IntegriCloud