Index: ELF/ScriptParser.cpp =================================================================== --- ELF/ScriptParser.cpp +++ ELF/ScriptParser.cpp @@ -123,6 +123,12 @@ // A set to detect an INCLUDE() cycle. StringSet<> Seen; }; + +struct BfdDesc { + ELFKind EKind; + uint16_t EMachine; + uint8_t OSABI; +}; } // namespace static StringRef unquote(StringRef S) { @@ -383,23 +389,25 @@ skip(); } -static std::pair parseBfdName(StringRef S) { - return StringSwitch>(S) - .Case("elf32-i386", {ELF32LEKind, EM_386}) - .Case("elf32-iamcu", {ELF32LEKind, EM_IAMCU}) - .Case("elf32-littlearm", {ELF32LEKind, EM_ARM}) - .Case("elf32-x86-64", {ELF32LEKind, EM_X86_64}) - .Case("elf64-littleaarch64", {ELF64LEKind, EM_AARCH64}) - .Case("elf64-powerpc", {ELF64BEKind, EM_PPC64}) - .Case("elf64-powerpcle", {ELF64LEKind, EM_PPC64}) - .Case("elf64-x86-64", {ELF64LEKind, EM_X86_64}) - .Case("elf32-tradbigmips", {ELF32BEKind, EM_MIPS}) - .Case("elf32-ntradbigmips", {ELF32BEKind, EM_MIPS}) - .Case("elf32-tradlittlemips", {ELF32LEKind, EM_MIPS}) - .Case("elf32-ntradlittlemips", {ELF32LEKind, EM_MIPS}) - .Case("elf64-tradbigmips", {ELF64BEKind, EM_MIPS}) - .Case("elf64-tradlittlemips", {ELF64LEKind, EM_MIPS}) - .Default({ELFNoneKind, EM_NONE}); +static BfdDesc parseBfdName(StringRef S) { + uint8_t OSABI = S.consume_back("-freebsd") ? ELFOSABI_FREEBSD : ELFOSABI_NONE; + return StringSwitch(S) + .Case("elf32-i386", {ELF32LEKind, EM_386, OSABI}) + .Case("elf32-iamcu", {ELF32LEKind, EM_IAMCU, OSABI}) + .Case("elf32-littlearm", {ELF32LEKind, EM_ARM, OSABI}) + .Case("elf32-x86-64", {ELF32LEKind, EM_X86_64, OSABI}) + .Case("elf64-aarch64", {ELF64LEKind, EM_AARCH64, OSABI}) + .Case("elf64-littleaarch64", {ELF64LEKind, EM_AARCH64, OSABI}) + .Case("elf64-powerpc", {ELF64BEKind, EM_PPC64, OSABI}) + .Case("elf64-powerpcle", {ELF64LEKind, EM_PPC64, OSABI}) + .Case("elf64-x86-64", {ELF64LEKind, EM_X86_64, OSABI}) + .Case("elf32-tradbigmips", {ELF32BEKind, EM_MIPS, OSABI}) + .Case("elf32-ntradbigmips", {ELF32BEKind, EM_MIPS, OSABI}) + .Case("elf32-tradlittlemips", {ELF32LEKind, EM_MIPS, OSABI}) + .Case("elf32-ntradlittlemips", {ELF32LEKind, EM_MIPS, OSABI}) + .Case("elf64-tradbigmips", {ELF64BEKind, EM_MIPS, OSABI}) + .Case("elf64-tradlittlemips", {ELF64LEKind, EM_MIPS, OSABI}) + .Default({ELFNoneKind, EM_NONE, ELFOSABI_NONE}); } // Parse OUTPUT_FORMAT(bfdname) or OUTPUT_FORMAT(bfdname, big, little). @@ -409,9 +417,12 @@ StringRef S = unquote(next()); - std::tie(Config->EKind, Config->EMachine) = parseBfdName(S); - if (Config->EMachine == EM_NONE) + BfdDesc Desc = parseBfdName(S); + if (Desc.EMachine == EM_NONE) setError("unknown output format name: " + S); + Config->EKind = Desc.EKind; + Config->EMachine = Desc.EMachine; + Config->OSABI = Desc.OSABI; if (S == "elf32-ntradlittlemips" || S == "elf32-ntradbigmips") Config->MipsN32Abi = true; 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)