diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp b/clang/lib/Driver/ToolChains/OpenBSD.cpp --- a/clang/lib/Driver/ToolChains/OpenBSD.cpp +++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp @@ -157,6 +157,52 @@ if (Args.hasArg(options::OPT_nopie) || Args.hasArg(options::OPT_pg)) CmdArgs.push_back("-nopie"); + // Determine the correct emulation for ld. + switch (Arch) { + case llvm::Triple::aarch64: + CmdArgs.push_back("-m"); + CmdArgs.push_back("aarch64elf"); + break; + case llvm::Triple::arm: + CmdArgs.push_back("-m"); + CmdArgs.push_back("armelf"); + break; + case llvm::Triple::mips64: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf64btsmip"); + break; + case llvm::Triple::mips64el: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf64ltsmip"); + break; + case llvm::Triple::ppc: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf32ppc"); + break; + case llvm::Triple::ppc64: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf64ppc"); + break; + case llvm::Triple::riscv64: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf64lriscv"); + break; + case llvm::Triple::sparcv9: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf64_sparc"); + break; + case llvm::Triple::x86: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf_i386"); + break; + case llvm::Triple::x86_64: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf_x86_64"); + break; + default: + break; + } + if (Arch == llvm::Triple::riscv64) CmdArgs.push_back("-X"); diff --git a/clang/test/Driver/openbsd.c b/clang/test/Driver/openbsd.c --- a/clang/test/Driver/openbsd.c +++ b/clang/test/Driver/openbsd.c @@ -2,13 +2,13 @@ // RUN: %clang --target=i686-pc-openbsd -static -### %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-LD-STATIC-EH %s // CHECK-LD-STATIC-EH: "-cc1" "-triple" "i686-pc-openbsd" -// CHECK-LD-STATIC-EH: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bstatic" "-o" "a.out" "{{.*}}rcrt0.o" "{{.*}}crtbegin.o" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" +// CHECK-LD-STATIC-EH: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bstatic" "-m" "elf_i386" "-o" "a.out" "{{.*}}rcrt0.o" "{{.*}}crtbegin.o" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" // Check for profiling variants of libraries when linking and -nopie // RUN: %clang --target=i686-pc-openbsd -pg -pthread -### %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-PG %s // CHECK-PG: "-cc1" "-triple" "i686-pc-openbsd" -// CHECK-PG: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-nopie" "-o" "a.out" "{{.*}}gcrt0.o" "{{.*}}crtbegin.o" "{{.*}}.o" "-lcompiler_rt" "-lpthread_p" "-lc_p" "-lcompiler_rt" "{{.*}}crtend.o" +// CHECK-PG: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-nopie" "-m" "elf_i386" "-o" "a.out" "{{.*}}gcrt0.o" "{{.*}}crtbegin.o" "{{.*}}.o" "-lcompiler_rt" "-lpthread_p" "-lc_p" "-lcompiler_rt" "{{.*}}crtend.o" // Check CPU type for i386 // RUN: %clang --target=i386-unknown-openbsd -### -c %s 2>&1 \ @@ -40,15 +40,15 @@ // CHECK-LD-R-NOT: "-l // CHECK-LD-R-NOT: crt{{[^./]+}}.o // CHECK-LD-S: "-cc1" "-triple" "i686-pc-openbsd" -// CHECK-LD-S: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "-s" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" +// CHECK-LD-S: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-m" "elf_i386" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "-s" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" // CHECK-LD-T: "-cc1" "-triple" "i686-pc-openbsd" -// CHECK-LD-T: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "-t" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" +// CHECK-LD-T: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-m" "elf_i386" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "-t" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" // CHECK-LD-Z: "-cc1" "-triple" "i686-pc-openbsd" -// CHECK-LD-Z: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "-Z" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" +// CHECK-LD-Z: ld{{.*}}" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-m" "elf_i386" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "-Z" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" // CHECK-MIPS64-LD: "-cc1" "-triple" "mips64-unknown-openbsd" -// CHECK-MIPS64-LD: ld{{.*}}" "-EB" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" +// CHECK-MIPS64-LD: ld{{.*}}" "-EB" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-m" "elf64btsmip" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" // CHECK-MIPS64EL-LD: "-cc1" "-triple" "mips64el-unknown-openbsd" -// CHECK-MIPS64EL-LD: ld{{.*}}" "-EL" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" +// CHECK-MIPS64EL-LD: ld{{.*}}" "-EL" "-e" "__start" "--eh-frame-hdr" "-Bdynamic" "-dynamic-linker" "{{.*}}ld.so" "-m" "elf64ltsmip" "-o" "a.out" "{{.*}}crt0.o" "{{.*}}crtbegin.o" "-L{{.*}}" "{{.*}}.o" "-lcompiler_rt" "-lc" "-lcompiler_rt" "{{.*}}crtend.o" // Check that --sysroot is passed to the linker // RUN: %clang --target=i686-pc-openbsd -### %s 2>&1 \ @@ -56,6 +56,38 @@ // RUN: | FileCheck --check-prefix=CHECK-LD-SYSROOT %s // CHECK-LD-SYSROOT: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]" +// Check the ld emulation type passed to the linker +// RUN: %clang --target=aarch64-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-AARCH64 %s +// RUN: %clang --target=arm-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-ARM %s +// RUN: %clang --target=mips64-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-MIPS64 %s +// RUN: %clang --target=mips64el-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-MIPS64EL %s +// RUN: %clang --target=powerpc-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-POWERPC %s +// RUN: %clang --target=powerpc64-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-POWERPC64 %s +// RUN: %clang --target=riscv64-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-RISCV64 %s +// RUN: %clang --target=sparc64-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-SPARC64 %s +// RUN: %clang --target=i386-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-i386 %s +// RUN: %clang --target=amd64-unknown-openbsd %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-M-AMD64 %s +// CHECK-LD-M-AARCH64: "-m" "aarch64elf" +// CHECK-LD-M-ARM: "-m" "armelf" +// CHECK-LD-M-MIPS64: "-m" "elf64btsmip" +// CHECK-LD-M-MIPS64EL: "-m" "elf64ltsmip" +// CHECK-LD-M-POWERPC: "-m" "elf32ppc" +// CHECK-LD-M-POWERPC64: "-m" "elf64ppc" +// CHECK-LD-M-RISCV64: "-m" "elf64lriscv" +// CHECK-LD-M-SPARC64: "-m" "elf64_sparc" +// CHECK-LD-M-i386: "-m" "elf_i386" +// CHECK-LD-M-AMD64: "-m" "elf_x86_64" + // Check passing options to the assembler for various OpenBSD targets // RUN: %clang --target=amd64-pc-openbsd -m32 -### -no-integrated-as -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK-AMD64-M32 %s