Index: ELF/ScriptParser.cpp =================================================================== --- ELF/ScriptParser.cpp +++ ELF/ScriptParser.cpp @@ -93,7 +93,16 @@ SortSectionPolicy readSortKind(); SymbolAssignment *readProvideHidden(bool Provide, bool Hidden); SymbolAssignment *readAssignment(StringRef Tok); - std::tuple readBfdName(); + struct BfdDesc { + BfdDesc(ELFKind EKind, uint16_t EMachine, uint8_t OSABI, bool MipsN32Abi) + : EKind(EKind), EMachine(EMachine), OSABI(OSABI), + MipsN32Abi(MipsN32Abi) {} + ELFKind EKind; + uint16_t EMachine; + uint8_t OSABI; + bool MipsN32Abi; + }; + BfdDesc readBfdName(); void readSort(); Expr readAssert(); Expr readConstant(); @@ -384,39 +393,43 @@ skip(); } -std::tuple ScriptParser::readBfdName() { - StringRef S = unquote(next()); +ScriptParser::BfdDesc ScriptParser::readBfdName() { + StringRef Name = unquote(next()); + StringRef S = Name; + uint8_t OSABI = S.consume_back("-freebsd") ? ELFOSABI_FREEBSD : ELFOSABI_NONE; if (S == "elf32-i386") - return std::make_tuple(ELF32LEKind, EM_386, false); + return BfdDesc(ELF32LEKind, EM_386, OSABI, false); if (S == "elf32-iamcu") - return std::make_tuple(ELF32LEKind, EM_IAMCU, false); + return BfdDesc(ELF32LEKind, EM_IAMCU, OSABI, false); if (S == "elf32-littlearm") - return std::make_tuple(ELF32LEKind, EM_ARM, false); + return BfdDesc(ELF32LEKind, EM_ARM, OSABI, false); if (S == "elf32-x86-64") - return std::make_tuple(ELF32LEKind, EM_X86_64, false); + return BfdDesc(ELF32LEKind, EM_X86_64, OSABI, false); + if (S == "elf64-aarch64") + return BfdDesc(ELF64LEKind, EM_AARCH64, OSABI, false); if (S == "elf64-littleaarch64") - return std::make_tuple(ELF64LEKind, EM_AARCH64, false); + return BfdDesc(ELF64LEKind, EM_AARCH64, OSABI, false); if (S == "elf64-powerpc") - return std::make_tuple(ELF64BEKind, EM_PPC64, false); + return BfdDesc(ELF64BEKind, EM_PPC64, OSABI, false); if (S == "elf64-powerpcle") - return std::make_tuple(ELF64LEKind, EM_PPC64, false); + return BfdDesc(ELF64LEKind, EM_PPC64, OSABI, false); if (S == "elf64-x86-64") - return std::make_tuple(ELF64LEKind, EM_X86_64, false); + return BfdDesc(ELF64LEKind, EM_X86_64, OSABI, false); if (S == "elf32-tradbigmips") - return std::make_tuple(ELF32BEKind, EM_MIPS, false); + return BfdDesc(ELF32BEKind, EM_MIPS, OSABI, false); if (S == "elf32-ntradbigmips") - return std::make_tuple(ELF32BEKind, EM_MIPS, true); + return BfdDesc(ELF32BEKind, EM_MIPS, OSABI, true); if (S == "elf32-tradlittlemips") - return std::make_tuple(ELF32LEKind, EM_MIPS, false); + return BfdDesc(ELF32LEKind, EM_MIPS, OSABI, false); if (S == "elf32-ntradlittlemips") - return std::make_tuple(ELF32LEKind, EM_MIPS, true); + return BfdDesc(ELF32LEKind, EM_MIPS, OSABI, true); if (S == "elf64-tradbigmips") - return std::make_tuple(ELF64BEKind, EM_MIPS, false); + return BfdDesc(ELF64BEKind, EM_MIPS, OSABI, false); if (S == "elf64-tradlittlemips") - return std::make_tuple(ELF64LEKind, EM_MIPS, false); + return BfdDesc(ELF64LEKind, EM_MIPS, OSABI, false); - setError("unknown output format name: " + S); - return std::make_tuple(ELFNoneKind, EM_NONE, false); + setError("unknown output format name: " + Name); + return BfdDesc(ELFNoneKind, EM_NONE, ELFOSABI_NONE, false); } // Parse OUTPUT_FORMAT(bfdname) or OUTPUT_FORMAT(bfdname, big, little). @@ -424,10 +437,13 @@ void ScriptParser::readOutputFormat() { expect("("); - std::tuple BfdTuple = readBfdName(); - if (Config->EKind == ELFNoneKind) - std::tie(Config->EKind, Config->EMachine, Config->MipsN32Abi) = BfdTuple; - + BfdDesc Desc = readBfdName(); + if (Config->EKind == ELFNoneKind) { + Config->EKind = Desc.EKind; + Config->EMachine = Desc.EMachine; + Config->OSABI = Desc.OSABI; + Config->MipsN32Abi = Desc.MipsN32Abi; + } if (consume(")")) return; expect(","); Index: test/ELF/emulation-aarch64.s =================================================================== --- test/ELF/emulation-aarch64.s +++ test/ELF/emulation-aarch64.s @@ -30,5 +30,28 @@ # AARCH64-NEXT: Flags [ (0x0) # AARCH64-NEXT: ] +# RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-freebsd %s -o %taarch64fbsd +# RUN: echo 'OUTPUT_FORMAT(elf64-aarch64-freebsd)' > %taarch64fbsd.script +# RUN: ld.lld %taarch64fbsd.script %taarch64fbsd -o %t2aarch64fbsd +# RUN: llvm-readobj -file-headers %t2aarch64fbsd | FileCheck --check-prefix=AARCH64-FBSD %s +# AARCH64-FBSD: ElfHeader { +# AARCH64-FBSD-NEXT: Ident { +# AARCH64-FBSD-NEXT: Magic: (7F 45 4C 46) +# AARCH64-FBSD-NEXT: Class: 64-bit (0x2) +# AARCH64-FBSD-NEXT: DataEncoding: LittleEndian (0x1) +# AARCH64-FBSD-NEXT: FileVersion: 1 +# AARCH64-FBSD-NEXT: OS/ABI: FreeBSD (0x9) +# AARCH64-FBSD-NEXT: ABIVersion: 0 +# AARCH64-FBSD-NEXT: Unused: (00 00 00 00 00 00 00) +# AARCH64-FBSD-NEXT: } +# AARCH64-FBSD-NEXT: Type: Executable (0x2) +# AARCH64-FBSD-NEXT: Machine: EM_AARCH64 (0xB7) +# AARCH64-FBSD-NEXT: Version: 1 +# AARCH64-FBSD-NEXT: Entry: +# AARCH64-FBSD-NEXT: ProgramHeaderOffset: 0x40 +# AARCH64-FBSD-NEXT: SectionHeaderOffset: +# AARCH64-FBSD-NEXT: Flags [ (0x0) +# AARCH64-FBSD-NEXT: ] + .globl _start _start: Index: test/ELF/emulation-ppc.s =================================================================== --- test/ELF/emulation-ppc.s +++ test/ELF/emulation-ppc.s @@ -35,6 +35,38 @@ # PPC64-NEXT: StringTableSectionIndex: # PPC64-NEXT: } +# RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-freebsd %s -o %tppc64fbsd +# RUN: echo 'OUTPUT_FORMAT(elf64-powerpc-freebsd)' > %tppc64fbsd.script +# RUN: ld.lld %tppc64fbsd.script %tppc64fbsd -o %t2ppc64fbsd +# RUN: llvm-readobj -file-headers %t2ppc64fbsd | FileCheck --check-prefix=PPC64-FBSD %s + +# PPC64-FBSD: ElfHeader { +# PPC64-FBSD-NEXT: Ident { +# PPC64-FBSD-NEXT: Magic: (7F 45 4C 46) +# PPC64-FBSD-NEXT: Class: 64-bit (0x2) +# PPC64-FBSD-NEXT: DataEncoding: BigEndian (0x2) +# PPC64-FBSD-NEXT: FileVersion: 1 +# PPC64-FBSD-NEXT: OS/ABI: FreeBSD (0x9) +# PPC64-FBSD-NEXT: ABIVersion: 0 +# PPC64-FBSD-NEXT: Unused: (00 00 00 00 00 00 00) +# PPC64-FBSD-NEXT: } +# PPC64-FBSD-NEXT: Type: Executable (0x2) +# PPC64-FBSD-NEXT: Machine: EM_PPC64 (0x15) +# PPC64-FBSD-NEXT: Version: 1 +# PPC64-FBSD-NEXT: Entry: +# PPC64-FBSD-NEXT: ProgramHeaderOffset: 0x40 +# PPC64-FBSD-NEXT: SectionHeaderOffset: +# PPC64-FBSD-NEXT: Flags [ (0x2) +# PPC64-FBSD-NEXT: 0x2 +# PPC64-FBSD-NEXT: ] +# PPC64-FBSD-NEXT: HeaderSize: 64 +# PPC64-FBSD-NEXT: ProgramHeaderEntrySize: 56 +# PPC64-FBSD-NEXT: ProgramHeaderCount: +# PPC64-FBSD-NEXT: SectionHeaderEntrySize: 64 +# PPC64-FBSD-NEXT: SectionHeaderCount: +# PPC64-FBSD-NEXT: StringTableSectionIndex: +# PPC64-FBSD-NEXT: } + # RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %tppc64le # RUN: ld.lld -m elf64lppc %tppc64le -o %t2ppc64le # RUN: llvm-readobj -file-headers %t2ppc64le | FileCheck --check-prefix=PPC64LE %s Index: test/ELF/emulation-x86.s =================================================================== --- test/ELF/emulation-x86.s +++ test/ELF/emulation-x86.s @@ -7,6 +7,9 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.sysv # RUN: ld.lld -m elf_amd64_fbsd %t.sysv -o %t.freebsd # RUN: llvm-readobj -file-headers %t.freebsd | FileCheck --check-prefix=AMD64 %s +# RUN: echo 'OUTPUT_FORMAT(elf64-x86-64-freebsd)' > %t4x64.script +# RUN: ld.lld %t4x64.script %tx64 -o %t4x64 +# RUN: llvm-readobj -file-headers %t4x64 | FileCheck --check-prefix=AMD64 %s # AMD64: ElfHeader { # AMD64-NEXT: Ident { # AMD64-NEXT: Magic: (7F 45 4C 46) @@ -137,10 +140,13 @@ # X86-NEXT: } # RUN: llvm-mc -filetype=obj -triple=i686-unknown-freebsd %s -o %tx86fbsd -# RUN: ld.lld -m elf_i386_fbsd %tx86fbsd -o %t2x86_fbsd -# RUN: llvm-readobj -file-headers %t2x86_fbsd | FileCheck --check-prefix=X86FBSD %s +# RUN: ld.lld -m elf_i386_fbsd %tx86fbsd -o %t2x86fbsd +# RUN: llvm-readobj -file-headers %t2x86fbsd | FileCheck --check-prefix=X86FBSD %s # RUN: ld.lld %tx86fbsd -o %t3x86fbsd # RUN: llvm-readobj -file-headers %t3x86fbsd | FileCheck --check-prefix=X86FBSD %s +# RUN: echo 'OUTPUT_FORMAT(elf32-i386-freebsd)' > %t4x86fbsd.script +# RUN: ld.lld %t4x86fbsd.script %tx86fbsd -o %t4x86fbsd +# RUN: llvm-readobj -file-headers %t4x86fbsd | FileCheck --check-prefix=X86FBSD %s # X86FBSD: ElfHeader { # X86FBSD-NEXT: Ident { # X86FBSD-NEXT: Magic: (7F 45 4C 46)