diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -142,28 +142,35 @@ osabi = ELFOSABI_FREEBSD; } - std::pair ret = - StringSwitch>(s) - .Cases("aarch64elf", "aarch64linux", "aarch64_elf64_le_vec", - {ELF64LEKind, EM_AARCH64}) - .Cases("armelf", "armelf_linux_eabi", {ELF32LEKind, EM_ARM}) - .Case("elf32_x86_64", {ELF32LEKind, EM_X86_64}) - .Cases("elf32btsmip", "elf32btsmipn32", {ELF32BEKind, EM_MIPS}) - .Cases("elf32ltsmip", "elf32ltsmipn32", {ELF32LEKind, EM_MIPS}) - .Case("elf32lriscv", {ELF32LEKind, EM_RISCV}) - .Cases("elf32ppc", "elf32ppclinux", {ELF32BEKind, EM_PPC}) - .Cases("elf32lppc", "elf32lppclinux", {ELF32LEKind, EM_PPC}) - .Case("elf64btsmip", {ELF64BEKind, EM_MIPS}) - .Case("elf64ltsmip", {ELF64LEKind, EM_MIPS}) - .Case("elf64lriscv", {ELF64LEKind, EM_RISCV}) - .Case("elf64ppc", {ELF64BEKind, EM_PPC64}) - .Case("elf64lppc", {ELF64LEKind, EM_PPC64}) - .Cases("elf_amd64", "elf_x86_64", {ELF64LEKind, EM_X86_64}) - .Case("elf_i386", {ELF32LEKind, EM_386}) - .Case("elf_iamcu", {ELF32LEKind, EM_IAMCU}) - .Case("elf64_sparc", {ELF64BEKind, EM_SPARCV9}) - .Case("msp430elf", {ELF32LEKind, EM_MSP430}) - .Default({ELFNoneKind, EM_NONE}); + std::pair ret; + if (s.consume_front("elf32lriscv")) { + if (s.empty() || s == "_ilp32" || s == "_ilp32f") + ret = {ELF32LEKind, EM_RISCV}; + } else if (s.consume_front("elf64lriscv")) { + if (s.empty() || s == "_lp64" || s == "_lp64f") + ret = {ELF64LEKind, EM_RISCV}; + } else { + ret = StringSwitch>(s) + .Cases("aarch64elf", "aarch64linux", "aarch64_elf64_le_vec", + {ELF64LEKind, EM_AARCH64}) + .Cases("armelf", "armelf_linux_eabi", {ELF32LEKind, EM_ARM}) + .Case("elf32_x86_64", {ELF32LEKind, EM_X86_64}) + .Cases("elf32btsmip", "elf32btsmipn32", {ELF32BEKind, EM_MIPS}) + .Cases("elf32ltsmip", "elf32ltsmipn32", {ELF32LEKind, EM_MIPS}) + .Case("elf32lriscv", {ELF32LEKind, EM_RISCV}) + .Cases("elf32ppc", "elf32ppclinux", {ELF32BEKind, EM_PPC}) + .Cases("elf32lppc", "elf32lppclinux", {ELF32LEKind, EM_PPC}) + .Case("elf64btsmip", {ELF64BEKind, EM_MIPS}) + .Case("elf64ltsmip", {ELF64LEKind, EM_MIPS}) + .Case("elf64ppc", {ELF64BEKind, EM_PPC64}) + .Case("elf64lppc", {ELF64LEKind, EM_PPC64}) + .Cases("elf_amd64", "elf_x86_64", {ELF64LEKind, EM_X86_64}) + .Case("elf_i386", {ELF32LEKind, EM_386}) + .Case("elf_iamcu", {ELF32LEKind, EM_IAMCU}) + .Case("elf64_sparc", {ELF64BEKind, EM_SPARCV9}) + .Case("msp430elf", {ELF32LEKind, EM_MSP430}) + .Default({ELFNoneKind, EM_NONE}); + } if (ret.first == ELFNoneKind) error("unknown emulation: " + emul); diff --git a/lld/test/ELF/emulation-riscv.s b/lld/test/ELF/emulation-riscv.s --- a/lld/test/ELF/emulation-riscv.s +++ b/lld/test/ELF/emulation-riscv.s @@ -2,12 +2,17 @@ # RUN: llvm-mc -filetype=obj -triple=riscv32 %s -o %t.o # RUN: ld.lld %t.o -o %t -# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefix=RV32 %s +# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefixes=RV32,SYSV32 %s # RUN: ld.lld -m elf32lriscv %t.o -o %t -# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefix=RV32 %s +# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefixes=RV32,SYSV32 %s # RUN: echo 'OUTPUT_FORMAT(elf32-littleriscv)' > %t.script # RUN: ld.lld %t.script %t.o -o %t -# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefix=RV32 %s +# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefixes=RV32,SYSV32 %s + +# RUN: ld.lld -m elf32lriscv_ilp32 %t.o -o - | llvm-readobj -h - | FileCheck --check-prefixes=RV32,SYSV32 %s +# RUN: ld.lld -m elf32lriscv_ilp32f %t.o -o - | llvm-readobj -h - | FileCheck --check-prefixes=RV32,SYSV32 %s + +# RUN: ld.lld -m elf32lriscv_fbsd %t.o -o - | llvm-readobj -h - | FileCheck --check-prefixes=RV32,FBSD32 %s # RV32: ElfHeader { # RV32-NEXT: Ident { @@ -15,7 +20,8 @@ # RV32-NEXT: Class: 32-bit (0x1) # RV32-NEXT: DataEncoding: LittleEndian (0x1) # RV32-NEXT: FileVersion: 1 -# RV32-NEXT: OS/ABI: SystemV (0x0) +# SYSV32-NEXT: OS/ABI: SystemV (0x0) +# FBSD32-NEXT: OS/ABI: FreeBSD (0x9) # RV32-NEXT: ABIVersion: 0 # RV32-NEXT: Unused: (00 00 00 00 00 00 00) # RV32-NEXT: } @@ -37,12 +43,17 @@ # RUN: llvm-mc -filetype=obj -triple=riscv64 %s -o %t.o # RUN: ld.lld %t.o -o %t -# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefix=RV64 %s +# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefixes=RV64,SYSV64 %s # RUN: ld.lld -m elf64lriscv %t.o -o %t -# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefix=RV64 %s +# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefixes=RV64,SYSV64 %s # RUN: echo 'OUTPUT_FORMAT(elf64-littleriscv)' > %t.script # RUN: ld.lld %t.script %t.o -o %t -# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefix=RV64 %s +# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefixes=RV64,SYSV64 %s + +# RUN: ld.lld -m elf64lriscv_lp64 %t.o -o - | llvm-readobj -h - | FileCheck --check-prefixes=RV64,SYSV64 %s +# RUN: ld.lld -m elf64lriscv_lp64f %t.o -o - | llvm-readobj -h - | FileCheck --check-prefixes=RV64,SYSV64 %s + +# RUN: ld.lld -m elf64lriscv_lp64_fbsd %t.o -o - | llvm-readobj -h - | FileCheck --check-prefixes=RV64,FBSD64 %s # RV64: ElfHeader { # RV64-NEXT: Ident { @@ -50,7 +61,8 @@ # RV64-NEXT: Class: 64-bit (0x2) # RV64-NEXT: DataEncoding: LittleEndian (0x1) # RV64-NEXT: FileVersion: 1 -# RV64-NEXT: OS/ABI: SystemV (0x0) +# SYSV64-NEXT: OS/ABI: SystemV (0x0) +# FBSD64-NEXT: OS/ABI: FreeBSD (0x9) # RV64-NEXT: ABIVersion: 0 # RV64-NEXT: Unused: (00 00 00 00 00 00 00) # RV64-NEXT: }