[lld] r347742 - [ELF][MIPS] Handle mips in the OUTPUT_FORMAT directive
Simon Atanasyan via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 28 03:41:20 PST 2018
Author: atanasyan
Date: Wed Nov 28 03:41:20 2018
New Revision: 347742
URL: http://llvm.org/viewvc/llvm-project?rev=347742&view=rev
Log:
[ELF][MIPS] Handle mips in the OUTPUT_FORMAT directive
Differential Revision: http://reviews.llvm.org/D54920
Modified:
lld/trunk/ELF/ScriptParser.cpp
lld/trunk/test/ELF/emulation-mips.s
Modified: lld/trunk/ELF/ScriptParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ScriptParser.cpp?rev=347742&r1=347741&r2=347742&view=diff
==============================================================================
--- lld/trunk/ELF/ScriptParser.cpp (original)
+++ lld/trunk/ELF/ScriptParser.cpp Wed Nov 28 03:41:20 2018
@@ -94,7 +94,7 @@ private:
SortSectionPolicy readSortKind();
SymbolAssignment *readProvideHidden(bool Provide, bool Hidden);
SymbolAssignment *readAssignment(StringRef Tok);
- std::pair<ELFKind, uint16_t> readBfdName();
+ std::tuple<ELFKind, uint16_t, bool> readBfdName();
void readSort();
Expr readAssert();
Expr readConstant();
@@ -385,27 +385,39 @@ void ScriptParser::readOutputArch() {
skip();
}
-std::pair<ELFKind, uint16_t> ScriptParser::readBfdName() {
+std::tuple<ELFKind, uint16_t, bool> ScriptParser::readBfdName() {
StringRef S = unquote(next());
if (S == "elf32-i386")
- return {ELF32LEKind, EM_386};
+ return {ELF32LEKind, EM_386, false};
if (S == "elf32-iamcu")
- return {ELF32LEKind, EM_IAMCU};
+ return {ELF32LEKind, EM_IAMCU, false};
if (S == "elf32-littlearm")
- return {ELF32LEKind, EM_ARM};
+ return {ELF32LEKind, EM_ARM, false};
if (S == "elf32-x86-64")
- return {ELF32LEKind, EM_X86_64};
+ return {ELF32LEKind, EM_X86_64, false};
if (S == "elf64-littleaarch64")
- return {ELF64LEKind, EM_AARCH64};
+ return {ELF64LEKind, EM_AARCH64, false};
if (S == "elf64-powerpc")
- return {ELF64BEKind, EM_PPC64};
+ return {ELF64BEKind, EM_PPC64, false};
if (S == "elf64-powerpcle")
- return {ELF64LEKind, EM_PPC64};
+ return {ELF64LEKind, EM_PPC64, false};
if (S == "elf64-x86-64")
- return {ELF64LEKind, EM_X86_64};
+ return {ELF64LEKind, EM_X86_64, false};
+ if (S == "elf32-tradbigmips")
+ return {ELF32BEKind, EM_MIPS, false};
+ if (S == "elf32-ntradbigmips")
+ return {ELF32BEKind, EM_MIPS, true};
+ if (S == "elf32-tradlittlemips")
+ return {ELF32LEKind, EM_MIPS, false};
+ if (S == "elf32-ntradlittlemips")
+ return {ELF32LEKind, EM_MIPS, true};
+ if (S == "elf64-tradbigmips")
+ return {ELF64BEKind, EM_MIPS, false};
+ if (S == "elf64-tradlittlemips")
+ return {ELF64LEKind, EM_MIPS, false};
setError("unknown output format name: " + S);
- return {ELFNoneKind, EM_NONE};
+ return {ELFNoneKind, EM_NONE, false};
}
// Parse OUTPUT_FORMAT(bfdname) or OUTPUT_FORMAT(bfdname, big, little).
@@ -413,11 +425,9 @@ std::pair<ELFKind, uint16_t> ScriptParse
void ScriptParser::readOutputFormat() {
expect("(");
- std::pair<ELFKind, uint16_t> P = readBfdName();
- if (Config->EKind == ELFNoneKind) {
- Config->EKind = P.first;
- Config->EMachine = P.second;
- }
+ std::tuple<ELFKind, uint16_t, bool> BfdTuple = readBfdName();
+ if (Config->EKind == ELFNoneKind)
+ std::tie(Config->EKind, Config->EMachine, Config->MipsN32Abi) = BfdTuple;
if (consume(")"))
return;
Modified: lld/trunk/test/ELF/emulation-mips.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/emulation-mips.s?rev=347742&r1=347741&r2=347742&view=diff
==============================================================================
--- lld/trunk/test/ELF/emulation-mips.s (original)
+++ lld/trunk/test/ELF/emulation-mips.s Wed Nov 28 03:41:20 2018
@@ -4,6 +4,9 @@
# RUN: llvm-readobj -file-headers %t2mips | FileCheck --check-prefix=MIPS %s
# RUN: ld.lld %tmips -e _start -o %t3mips
# RUN: llvm-readobj -file-headers %t3mips | FileCheck --check-prefix=MIPS %s
+# RUN: echo 'OUTPUT_FORMAT(elf32-tradbigmips)' > %tmips.script
+# RUN: ld.lld %tmips.script -e _start %tmips -o %t4mips
+# RUN: llvm-readobj -file-headers %t4mips | FileCheck --check-prefix=MIPS %s
# MIPS: ElfHeader {
# MIPS-NEXT: Ident {
# MIPS-NEXT: Magic: (7F 45 4C 46)
@@ -33,6 +36,9 @@
# RUN: llvm-readobj -file-headers %t2mipsel | FileCheck --check-prefix=MIPSEL %s
# RUN: ld.lld %tmipsel -e _start -o %t3mipsel
# RUN: llvm-readobj -file-headers %t3mipsel | FileCheck --check-prefix=MIPSEL %s
+# RUN: echo 'OUTPUT_FORMAT(elf32-tradlittlemips)' > %tmipsel.script
+# RUN: ld.lld %tmipsel.script -e _start %tmipsel -o %t4mipsel
+# RUN: llvm-readobj -file-headers %t4mipsel | FileCheck --check-prefix=MIPSEL %s
# MIPSEL: ElfHeader {
# MIPSEL-NEXT: Ident {
# MIPSEL-NEXT: Magic: (7F 45 4C 46)
@@ -55,12 +61,77 @@
# MIPSEL-NEXT: EF_MIPS_CPIC
# MIPSEL-NEXT: ]
+# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux-gnuabin32 %s -o %tmipsn32
+# RUN: ld.lld -m elf32btsmipn32 -e _start %tmipsn32 -o %t2mipsn32
+# RUN: llvm-readobj -file-headers %t2mipsn32 | FileCheck --check-prefix=MIPSN32 %s
+# RUN: ld.lld %tmipsn32 -e _start -o %t3mipsn32
+# RUN: llvm-readobj -file-headers %t3mipsn32 | FileCheck --check-prefix=MIPSN32 %s
+# RUN: echo 'OUTPUT_FORMAT(elf32-ntradbigmips)' > %tmipsn32.script
+# RUN: ld.lld %tmipsn32.script -e _start %tmipsn32 -o %t4mipsn32
+# RUN: llvm-readobj -file-headers %t4mipsn32 | FileCheck --check-prefix=MIPSN32 %s
+# MIPSN32: ElfHeader {
+# MIPSN32-NEXT: Ident {
+# MIPSN32-NEXT: Magic: (7F 45 4C 46)
+# MIPSN32-NEXT: Class: 32-bit (0x1)
+# MIPSN32-NEXT: DataEncoding: BigEndian (0x2)
+# MIPSN32-NEXT: FileVersion: 1
+# MIPSN32-NEXT: OS/ABI: SystemV (0x0)
+# MIPSN32-NEXT: ABIVersion: 1
+# MIPSN32-NEXT: Unused: (00 00 00 00 00 00 00)
+# MIPSN32-NEXT: }
+# MIPSN32-NEXT: Type: Executable (0x2)
+# MIPSN32-NEXT: Machine: EM_MIPS (0x8)
+# MIPSN32-NEXT: Version: 1
+# MIPSN32-NEXT: Entry:
+# MIPSN32-NEXT: ProgramHeaderOffset: 0x34
+# MIPSN32-NEXT: SectionHeaderOffset:
+# MIPSN32-NEXT: Flags [
+# MIPSN32-NEXT: EF_MIPS_ABI2
+# MIPSN32-NEXT: EF_MIPS_ARCH_64
+# MIPSN32-NEXT: EF_MIPS_CPIC
+# MIPSN32-NEXT: ]
+
+# RUN: llvm-mc -filetype=obj -triple=mips64el-unknown-linux-gnuabin32 %s -o %tmipsn32el
+# RUN: ld.lld -m elf32ltsmipn32 -e _start %tmipsn32el -o %t2mipsn32el
+# RUN: llvm-readobj -file-headers %t2mipsn32el | FileCheck --check-prefix=MIPSN32EL %s
+# RUN: ld.lld -melf32ltsmipn32 -e _start %tmipsn32el -o %t2mipsn32el
+# RUN: llvm-readobj -file-headers %t2mipsn32el | FileCheck --check-prefix=MIPSN32EL %s
+# RUN: ld.lld %tmipsn32el -e _start -o %t3mipsn32el
+# RUN: llvm-readobj -file-headers %t3mipsn32el | FileCheck --check-prefix=MIPSN32EL %s
+# RUN: echo 'OUTPUT_FORMAT(elf32-ntradlittlemips)' > %tmipsn32el.script
+# RUN: ld.lld %tmipsn32el.script -e _start %tmipsn32el -o %t4mipsn32el
+# RUN: llvm-readobj -file-headers %t4mipsn32el | FileCheck --check-prefix=MIPSN32EL %s
+# MIPSN32EL: ElfHeader {
+# MIPSN32EL-NEXT: Ident {
+# MIPSN32EL-NEXT: Magic: (7F 45 4C 46)
+# MIPSN32EL-NEXT: Class: 32-bit (0x1)
+# MIPSN32EL-NEXT: DataEncoding: LittleEndian (0x1)
+# MIPSN32EL-NEXT: FileVersion: 1
+# MIPSN32EL-NEXT: OS/ABI: SystemV (0x0)
+# MIPSN32EL-NEXT: ABIVersion: 1
+# MIPSN32EL-NEXT: Unused: (00 00 00 00 00 00 00)
+# MIPSN32EL-NEXT: }
+# MIPSN32EL-NEXT: Type: Executable (0x2)
+# MIPSN32EL-NEXT: Machine: EM_MIPS (0x8)
+# MIPSN32EL-NEXT: Version: 1
+# MIPSN32EL-NEXT: Entry:
+# MIPSN32EL-NEXT: ProgramHeaderOffset: 0x34
+# MIPSN32EL-NEXT: SectionHeaderOffset:
+# MIPSN32EL-NEXT: Flags [
+# MIPSN32EL-NEXT: EF_MIPS_ABI2
+# MIPSN32EL-NEXT: EF_MIPS_ARCH_64
+# MIPSN32EL-NEXT: EF_MIPS_CPIC
+# MIPSN32EL-NEXT: ]
+
# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux -position-independent \
# RUN: %s -o %tmips64
# RUN: ld.lld -m elf64btsmip -e _start %tmips64 -o %t2mips64
# RUN: llvm-readobj -file-headers %t2mips64 | FileCheck --check-prefix=MIPS64 %s
# RUN: ld.lld %tmips64 -e _start -o %t3mips64
# RUN: llvm-readobj -file-headers %t3mips64 | FileCheck --check-prefix=MIPS64 %s
+# RUN: echo 'OUTPUT_FORMAT(elf64-tradbigmips)' > %tmips64.script
+# RUN: ld.lld %tmips64.script -e _start %tmips64 -o %t4mips64
+# RUN: llvm-readobj -file-headers %t4mips64 | FileCheck --check-prefix=MIPS64 %s
# MIPS64: ElfHeader {
# MIPS64-NEXT: Ident {
# MIPS64-NEXT: Magic: (7F 45 4C 46)
@@ -89,6 +160,9 @@
# RUN: llvm-readobj -file-headers %t2mips64el | FileCheck --check-prefix=MIPS64EL %s
# RUN: ld.lld %tmips64el -e _start -o %t3mips64el
# RUN: llvm-readobj -file-headers %t3mips64el | FileCheck --check-prefix=MIPS64EL %s
+# RUN: echo 'OUTPUT_FORMAT(elf64-tradlittlemips)' > %tmips64el.script
+# RUN: ld.lld %tmips64el.script -e _start %tmips64el -o %t4mips64el
+# RUN: llvm-readobj -file-headers %t4mips64el | FileCheck --check-prefix=MIPS64EL %s
# MIPS64EL: ElfHeader {
# MIPS64EL-NEXT: Ident {
# MIPS64EL-NEXT: Magic: (7F 45 4C 46)
More information about the llvm-commits
mailing list