From e69cca48505098f1ca70b10f829b07526d6465bf Mon Sep 17 00:00:00 2001 From: Joerg Sonnenberger Date: Mon, 14 Oct 2013 20:13:05 +0000 Subject: [PATCH] For NetBSD/current on X86 do not use libgcc and default to libc++. Adjust linkage to make more sense for older releases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192615 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/ToolChains.cpp | 6 ++++++ lib/Driver/Tools.cpp | 41 +++++++++++++++++++---------------- test/Driver/netbsd.c | 45 +++++++++++++++++++++++++++++++++++++++ test/Driver/netbsd.cpp | 45 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 18 deletions(-) create mode 100644 test/Driver/netbsd.c create mode 100644 test/Driver/netbsd.cpp diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index a2e64f2e9a..ec0d8f387c 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1982,6 +1982,12 @@ NetBSD::GetCXXStdlibType(const ArgList &Args) const { << A->getAsString(Args); } + unsigned Major, Minor, Micro; + getTriple().getOSVersion(Major, Minor, Micro); + if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) { + if (getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64) + return ToolChain::CST_Libcxx; + } return ToolChain::CST_Libstdcxx; } diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 19767fc290..8cf35e8e26 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -5860,34 +5860,39 @@ void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); + unsigned Major, Minor, Micro; + getToolChain().getTriple().getOSVersion(Major, Minor, Micro); + bool useLibgcc = true; + if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) { + if (getToolChain().getArch() == llvm::Triple::x86 || + getToolChain().getArch() == llvm::Triple::x86_64) + useLibgcc = false; + } + if (!Args.hasArg(options::OPT_nostdlib) && !Args.hasArg(options::OPT_nodefaultlibs)) { if (D.CCCIsCXX()) { getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); CmdArgs.push_back("-lm"); } - // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding - // the default system libraries. Just mimic this for now. - if (Args.hasArg(options::OPT_static)) { - CmdArgs.push_back("-lgcc_eh"); - } else { - CmdArgs.push_back("--as-needed"); - CmdArgs.push_back("-lgcc_s"); - CmdArgs.push_back("--no-as-needed"); - } - CmdArgs.push_back("-lgcc"); - if (Args.hasArg(options::OPT_pthread)) CmdArgs.push_back("-lpthread"); CmdArgs.push_back("-lc"); - CmdArgs.push_back("-lgcc"); - if (Args.hasArg(options::OPT_static)) { - CmdArgs.push_back("-lgcc_eh"); - } else { - CmdArgs.push_back("--as-needed"); - CmdArgs.push_back("-lgcc_s"); - CmdArgs.push_back("--no-as-needed"); + if (useLibgcc) { + if (Args.hasArg(options::OPT_static)) { + // libgcc_eh depends on libc, so resolve as much as possible, + // pull in any new requirements from libc and then get the rest + // of libgcc. + CmdArgs.push_back("-lgcc_eh"); + CmdArgs.push_back("-lc"); + CmdArgs.push_back("-lgcc"); + } else { + CmdArgs.push_back("-lgcc"); + CmdArgs.push_back("--as-needed"); + CmdArgs.push_back("-lgcc_s"); + CmdArgs.push_back("--no-as-needed"); + } } } diff --git a/test/Driver/netbsd.c b/test/Driver/netbsd.c new file mode 100644 index 0000000000..1ca1360a15 --- /dev/null +++ b/test/Driver/netbsd.c @@ -0,0 +1,45 @@ +// RUN: %clang -no-canonical-prefixes -target x86_64--netbsd %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=X86_64 %s +// RUN: %clang -no-canonical-prefixes -target x86_64--netbsd7.0.0 %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=X86_64-7 %s +// RUN: %clang -no-canonical-prefixes -target x86_64--netbsd6.0.0 %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=X86_64-6 %s + +// RUN: %clang -no-canonical-prefixes -target x86_64--netbsd %s -static -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-X86_64 %s +// RUN: %clang -no-canonical-prefixes -target x86_64--netbsd7.0.0 -static %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-X86_64-7 %s +// RUN: %clang -no-canonical-prefixes -target x86_64--netbsd6.0.0 -static %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-X86_64-6 %s + +// X86_64: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd" +// X86_64: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// X86_64: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc" +// X86_64: "crtend.o" "crtn.o" + +// X86_64-7: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd7.0.0" +// X86_64-7: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// X86_64-7: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc" +// X86_64-7: "crtend.o" "crtn.o" + +// X86_64-6: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd6.0.0" +// X86_64-6: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// X86_64-6: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc" +// X86_64-6: "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// X86_64-6: "crtend.o" "crtn.o" + +// S-X86_64: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd" +// S-X86_64: ld{{.*}}" "-Bstatic" +// S-X86_64: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc" +// S-X86_64: "crtend.o" "crtn.o" + +// S-X86_64-7: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd7.0.0" +// S-X86_64-7: ld{{.*}}" "-Bstatic" +// S-X86_64-7: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc" +// S-X86_64-7: "crtend.o" "crtn.o" + +// S-X86_64-6: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd6.0.0" +// S-X86_64-6: ld{{.*}}" "-Bstatic" +// S-X86_64-6: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc" +// S-X86_64-6: "-lgcc_eh" "-lc" "-lgcc" +// S-X86_64-6: "crtend.o" "crtn.o" diff --git a/test/Driver/netbsd.cpp b/test/Driver/netbsd.cpp new file mode 100644 index 0000000000..bb7958648d --- /dev/null +++ b/test/Driver/netbsd.cpp @@ -0,0 +1,45 @@ +// RUN: %clangxx -no-canonical-prefixes -target x86_64--netbsd %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=X86_64 %s +// RUN: %clangxx -no-canonical-prefixes -target x86_64--netbsd7.0.0 %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=X86_64-7 %s +// RUN: %clangxx -no-canonical-prefixes -target x86_64--netbsd6.0.0 %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=X86_64-6 %s + +// RUN: %clangxx -no-canonical-prefixes -target x86_64--netbsd %s -static -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-X86_64 %s +// RUN: %clangxx -no-canonical-prefixes -target x86_64--netbsd7.0.0 -static %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-X86_64-7 %s +// RUN: %clangxx -no-canonical-prefixes -target x86_64--netbsd6.0.0 -static %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=S-X86_64-6 %s + +// X86_64: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd" +// X86_64: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// X86_64: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc++" +// X86_64: "-lm" "-lc" "crtend.o" "crtn.o" + +// X86_64-7: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd7.0.0" +// X86_64-7: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// X86_64-7: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc++" +// X86_64-7: "-lm" "-lc" "crtend.o" "crtn.o" + +// X86_64-6: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd6.0.0" +// X86_64-6: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" +// X86_64-6: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lstdc++" +// X86_64-6: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// X86_64-6: "crtend.o" "crtn.o" + +// S-X86_64: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd" +// S-X86_64: ld{{.*}}" "-Bstatic" +// S-X86_64: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc++" +// S-X86_64: "-lm" "-lc" "crtend.o" "crtn.o" + +// S-X86_64-7: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd7.0.0" +// S-X86_64-7: ld{{.*}}" "-Bstatic" +// S-X86_64-7: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lc++" +// S-X86_64-7: "-lm" "-lc" "crtend.o" "crtn.o" + +// S-X86_64-6: clang{{.*}}" "-cc1" "-triple" "x86_64--netbsd6.0.0" +// S-X86_64-6: ld{{.*}}" "-Bstatic" +// S-X86_64-6: "-o" "a.out" "crt0.o" "crti.o" "crtbegin.o" "{{.*}}.o" "-lstdc++" +// S-X86_64-6: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc" +// S-X86_64-6: "crtend.o" "crtn.o" -- 2.50.1