diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 764699f17e208ee636e0ffc2e63f11262cd1d68d..ceff38c4e68bb66c1e4c8e105d90237847aad260 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1166,16 +1166,22 @@ template void Writer::setPhdrs() { } } -static uint32_t getMipsEFlags(bool Is64Bits) { - // FIXME: In fact ELF flags depends on ELF flags of input object files - // and selected emulation. For now just use hard coded values. +template +static uint32_t getMipsEFlags(bool Is64Bits, + const ELFFileBase &FirstElf) { + // FIXME: ELF flags depends on ELF flags of all input object files and + // selected emulation. For now pick the arch flag from the fisrt input file + // and use hard coded values for other flags. + uint32_t FirstElfFlags = FirstElf.getObj().getHeader()->e_flags; + uint32_t ElfFlags = FirstElfFlags & EF_MIPS_ARCH; if (Is64Bits) - return EF_MIPS_CPIC | EF_MIPS_PIC | EF_MIPS_ARCH_64R2; - - uint32_t V = EF_MIPS_CPIC | EF_MIPS_ABI_O32 | EF_MIPS_ARCH_32R2; - if (Config->Shared) - V |= EF_MIPS_PIC; - return V; + ElfFlags |= EF_MIPS_CPIC | EF_MIPS_PIC; + else { + ElfFlags |= EF_MIPS_CPIC | EF_MIPS_ABI_O32; + if (Config->Shared) + ElfFlags |= EF_MIPS_PIC; + } + return ElfFlags; } template static typename ELFT::uint getEntryAddr() { @@ -1252,7 +1258,7 @@ template void Writer::writeHeader() { EHdr->e_shstrndx = Out::ShStrTab->SectionIndex; if (Config->EMachine == EM_MIPS) - EHdr->e_flags = getMipsEFlags(ELFT::Is64Bits); + EHdr->e_flags = getMipsEFlags(ELFT::Is64Bits, FirstObj); if (!Config->Relocatable) { EHdr->e_phoff = sizeof(Elf_Ehdr); diff --git a/lld/test/ELF/basic-mips.s b/lld/test/ELF/basic-mips.s index c598c7b5f2f750ade65d49b35eb2712f856f5e8d..86dd0420053327abef7491db6d64269525ffa925 100644 --- a/lld/test/ELF/basic-mips.s +++ b/lld/test/ELF/basic-mips.s @@ -30,7 +30,7 @@ __start: # CHECK-NEXT: SectionHeaderOffset: 0x30088 # CHECK-NEXT: Flags [ # CHECK-NEXT: EF_MIPS_ABI_O32 -# CHECK-NEXT: EF_MIPS_ARCH_32R2 +# CHECK-NEXT: EF_MIPS_ARCH_32 # CHECK-NEXT: EF_MIPS_CPIC # CHECK-NEXT: ] # CHECK-NEXT: HeaderSize: 52 diff --git a/lld/test/ELF/emulation.s b/lld/test/ELF/emulation.s index 7cc764fc6c182ffbec7b955ef41ef0690e05c9e5..1d95b56d1a4581b95f76926ad65155b2404d7d03 100644 --- a/lld/test/ELF/emulation.s +++ b/lld/test/ELF/emulation.s @@ -176,7 +176,7 @@ # MIPS-NEXT: SectionHeaderOffset: # MIPS-NEXT: Flags [ # MIPS-NEXT: EF_MIPS_ABI_O32 -# MIPS-NEXT: EF_MIPS_ARCH_32R2 +# MIPS-NEXT: EF_MIPS_ARCH_32 # MIPS-NEXT: EF_MIPS_CPIC # MIPS-NEXT: ] @@ -205,7 +205,7 @@ # MIPSEL-NEXT: SectionHeaderOffset: # MIPSEL-NEXT: Flags [ # MIPSEL-NEXT: EF_MIPS_ABI_O32 -# MIPSEL-NEXT: EF_MIPS_ARCH_32R2 +# MIPSEL-NEXT: EF_MIPS_ARCH_32 # MIPSEL-NEXT: EF_MIPS_CPIC # MIPSEL-NEXT: ] @@ -231,7 +231,7 @@ # MIPS64-NEXT: ProgramHeaderOffset: 0x40 # MIPS64-NEXT: SectionHeaderOffset: # MIPS64-NEXT: Flags [ -# MIPS64-NEXT: EF_MIPS_ARCH_64R2 +# MIPS64-NEXT: EF_MIPS_ARCH_64 # MIPS64-NEXT: EF_MIPS_CPIC # MIPS64-NEXT: EF_MIPS_PIC # MIPS64-NEXT: ] @@ -258,7 +258,7 @@ # MIPS64EL-NEXT: ProgramHeaderOffset: 0x40 # MIPS64EL-NEXT: SectionHeaderOffset: # MIPS64EL-NEXT: Flags [ -# MIPS64EL-NEXT: EF_MIPS_ARCH_64R2 +# MIPS64EL-NEXT: EF_MIPS_ARCH_64 # MIPS64EL-NEXT: EF_MIPS_CPIC # MIPS64EL-NEXT: EF_MIPS_PIC # MIPS64EL-NEXT: ] diff --git a/lld/test/ELF/mips-elf-flags.s b/lld/test/ELF/mips-elf-flags.s index 7817e58b538384cc5adf803246cb9ece27e4b00c..c71e2b181cc82a383d972876de3d110fb1791761 100644 --- a/lld/test/ELF/mips-elf-flags.s +++ b/lld/test/ELF/mips-elf-flags.s @@ -5,6 +5,14 @@ # RUN: llvm-readobj -h %t.so | FileCheck -check-prefix=SO %s # RUN: ld.lld %t.o -o %t.exe # RUN: llvm-readobj -h %t.exe | FileCheck -check-prefix=EXE %s +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux \ +# RUN: -mcpu=mips32r2 %s -o %t-r2.o +# RUN: ld.lld %t-r2.o -o %t-r2.exe +# RUN: llvm-readobj -h %t-r2.exe | FileCheck -check-prefix=EXE-R2 %s +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux \ +# RUN: -mcpu=mips32r6 %s -o %t-r6.o +# RUN: ld.lld %t-r6.o -o %t-r6.exe +# RUN: llvm-readobj -h %t-r6.exe | FileCheck -check-prefix=EXE-R6 %s # REQUIRES: mips @@ -15,13 +23,25 @@ __start: # SO: Flags [ # SO-NEXT: EF_MIPS_ABI_O32 -# SO-NEXT: EF_MIPS_ARCH_32R2 +# SO-NEXT: EF_MIPS_ARCH_32 # SO-NEXT: EF_MIPS_CPIC # SO-NEXT: EF_MIPS_PIC # SO-NEXT: ] # EXE: Flags [ # EXE-NEXT: EF_MIPS_ABI_O32 -# EXE-NEXT: EF_MIPS_ARCH_32R2 +# EXE-NEXT: EF_MIPS_ARCH_32 # EXE-NEXT: EF_MIPS_CPIC # EXE-NEXT: ] + +# EXE-R2: Flags [ +# EXE-R2-NEXT: EF_MIPS_ABI_O32 +# EXE-R2-NEXT: EF_MIPS_ARCH_32R2 +# EXE-R2-NEXT: EF_MIPS_CPIC +# EXE-R2-NEXT: ] + +# EXE-R6: Flags [ +# EXE-R6-NEXT: EF_MIPS_ABI_O32 +# EXE-R6-NEXT: EF_MIPS_ARCH_32R6 +# EXE-R6-NEXT: EF_MIPS_CPIC +# EXE-R6-NEXT: ]