diff --git a/clang/lib/Driver/ToolChains/AIX.h b/clang/lib/Driver/ToolChains/AIX.h --- a/clang/lib/Driver/ToolChains/AIX.h +++ b/clang/lib/Driver/ToolChains/AIX.h @@ -67,6 +67,11 @@ AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const override; + + CXXStdlibType GetDefaultCXXStdlibType() const override; + protected: Tool *buildAssembler() const override; Tool *buildLinker() const override; diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -141,6 +141,9 @@ Args.AddAllArgs(CmdArgs, options::OPT_L); ToolChain.AddFilePathLibArgs(Args, CmdArgs); + if (getToolChain().ShouldLinkCXXStdlib(Args)) + getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); + if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { // Support POSIX threads if "-pthreads" or "-pthread" is present. if (Args.hasArg(options::OPT_pthreads, options::OPT_pthread)) @@ -197,6 +200,21 @@ addSystemInclude(DriverArgs, CC1Args, UP.str()); } +void AIX::AddCXXStdlibLibArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const { + switch (GetCXXStdlibType(DriverArgs)) { + case ToolChain::CST_Libcxx: + CC1Args.push_back("-lc++"); + break; + case ToolChain::CST_Libstdcxx: + llvm::report_fatal_error("linking libstdc++ unimplemented on AIX"); + } +} + +ToolChain::CXXStdlibType AIX::GetDefaultCXXStdlibType() const { + return ToolChain::CST_Libcxx; +} + auto AIX::buildAssembler() const -> Tool * { return new aix::Assembler(*this); } auto AIX::buildLinker() const -> Tool * { return new aix::Linker(*this); } diff --git a/clang/test/Driver/aix-ld.c b/clang/test/Driver/aix-ld.c --- a/clang/test/Driver/aix-ld.c +++ b/clang/test/Driver/aix-ld.c @@ -192,3 +192,131 @@ // CHECK-LD32-CXX-ARG-ORDER: "-bcdtors:all:0:s" // CHECK-LD32-CXX-ARG-ORDER: "-bnocdtors" // CHECK-LD32-CXX-ARG-ORDER-NOT: "-bcdtors:all:0:s" +// CHECK-LD32-CXX-ARG-ORDER: "-lc++" +// CHECK-LD32-CXX-ARG-ORDER: "-lc" + +// Check powerpc-ibm-aix7.1.0.0, 32-bit. lc++ and lc order. +// RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ +// RUN: -target powerpc-ibm-aix7.1.0.0 \ +// RUN: --sysroot %S/Inputs/aix_ppc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD32-CXX-ARG-LCXX %s +// CHECK-LD32-CXX-ARG-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" +// CHECK-LD32-CXX-ARG-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-LD32-CXX-ARG-LCXX: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD32-CXX-ARG-LCXX: "-b32" +// CHECK-LD32-CXX-ARG-LCXX: "-bpT:0x10000000" "-bpD:0x20000000" +// CHECK-LD32-CXX-ARG-LCXX: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-CXX-ARG-LCXX: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD32-CXX-ARG-LCXX: "-lc++" +// CHECK-LD32-CXX-ARG-LCXX: "-lc" + +// Check powerpc64-ibm-aix7.1.0.0, 64-bit. lc++ and lc order. +// RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ +// RUN: -target powerpc64-ibm-aix7.1.0.0 \ +// RUN: --sysroot %S/Inputs/aix_ppc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD64-CXX-ARG-LCXX %s +// CHECK-LD64-CXX-ARG-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" +// CHECK-LD64-CXX-ARG-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-LD64-CXX-ARG-LCXX: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD64-CXX-ARG-LCXX: "-b64" +// CHECK-LD64-CXX-ARG-LCXX: "-bpT:0x100000000" "-bpD:0x110000000" +// CHECK-LD64-CXX-ARG-LCXX: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-CXX-ARG-LCXX: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD64-CXX-ARG-LCXX: "-lc++" +// CHECK-LD64-CXX-ARG-LCXX: "-lc" + +// Check powerpc-ibm-aix7.1.0.0, 32-bit. -nodefaultlibs. +// RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ +// RUN: -nodefaultlibs \ +// RUN: -target powerpc-ibm-aix7.1.0.0 \ +// RUN: --sysroot %S/Inputs/aix_ppc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD32-NODEFLIB-LCXX %s +// CHECK-LD32-NODEFLIB-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" +// CHECK-LD32-NODEFLIB-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-LD32-NODEFLIB-LCXX: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD32-NODEFLIB-LCXX: "-b32" +// CHECK-LD32-NODEFLIB-LCXX: "-bpT:0x10000000" "-bpD:0x20000000" +// CHECK-LD32-NODEFLIB-LCXX: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-NODEFLIB-LCXX: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD32-NODEFLIB-LCXX-NOT: "-lc++" +// CHECK-LD32-NODEFLIB-LCXX-NOT: "-lc" + +// Check powerpc64-ibm-aix7.1.0.0, 64-bit. -nodefaultlibs. +// RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ +// RUN: -nodefaultlibs \ +// RUN: -target powerpc64-ibm-aix7.1.0.0 \ +// RUN: --sysroot %S/Inputs/aix_ppc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD64-NODEFLIB-LCXX %s +// CHECK-LD64-NODEFLIB-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" +// CHECK-LD64-NODEFLIB-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-LD64-NODEFLIB-LCXX: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD64-NODEFLIB-LCXX: "-b64" +// CHECK-LD64-NODEFLIB-LCXX: "-bpT:0x100000000" "-bpD:0x110000000" +// CHECK-LD64-NODEFLIB-LCXX: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-NODEFLIB-LCXX: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD64-NODEFLIB-LCXX-NOT: "-lc++" +// CHECK-LD64-NODEFLIB-LCXX-NOT: "-lc" + +// Check powerpc-ibm-aix7.1.0.0, 32-bit. -nostdlib. +// RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ +// RUN: -nostdlib \ +// RUN: -target powerpc-ibm-aix7.1.0.0 \ +// RUN: --sysroot %S/Inputs/aix_ppc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD32-NOSTDLIB-LCXX %s +// CHECK-LD32-NOSTDLIB-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" +// CHECK-LD32-NOSTDLIB-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-LD32-NOSTDLIB-LCXX: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD32-NOSTDLIB-LCXX: "-b32" +// CHECK-LD32-NOSTDLIB-LCXX: "-bpT:0x10000000" "-bpD:0x20000000" +// CHECK-LD32-NOSTDLIB-LCXX-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-NOSTDLIB-LCXX: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD32-NOSTDLIB-LCXX-NOT: "-lc++" +// CHECK-LD32-NOSTDLIB-LCXX-NOT: "-lc" + +// Check powerpc64-ibm-aix7.1.0.0, 64-bit. -nostdlib. +// RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ +// RUN: -nostdlib \ +// RUN: -target powerpc64-ibm-aix7.1.0.0 \ +// RUN: --sysroot %S/Inputs/aix_ppc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD64-NOSTDLIB-LCXX %s +// CHECK-LD64-NOSTDLIB-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" +// CHECK-LD64-NOSTDLIB-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-LD64-NOSTDLIB-LCXX: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD64-NOSTDLIB-LCXX: "-b64" +// CHECK-LD64-NOSTDLIB-LCXX: "-bpT:0x100000000" "-bpD:0x110000000" +// CHECK-LD64-NOSTDLIB-LCXX-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-NOSTDLIB-LCXX: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD64-NOSTDLIB-LCXX-NOT: "-lc++" +// CHECK-LD64-NOSTDLIB-LCXX-NOT: "-lc" + +// Check powerpc-ibm-aix7.1.0.0, 32-bit. -nostdlib++. +// RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ +// RUN: -nostdlib++ \ +// RUN: -target powerpc-ibm-aix7.1.0.0 \ +// RUN: --sysroot %S/Inputs/aix_ppc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD32-NOSTDLIBXX-LCXX %s +// CHECK-LD32-NOSTDLIBXX-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" +// CHECK-LD32-NOSTDLIBXX-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-LD32-NOSTDLIBXX-LCXX: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD32-NOSTDLIBXX-LCXX: "-b32" +// CHECK-LD32-NOSTDLIBXX-LCXX: "-bpT:0x10000000" "-bpD:0x20000000" +// CHECK-LD32-NOSTDLIBXX-LCXX: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-NOSTDLIBXX-LCXX: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD32-NOSTDLIBXX-LCXX-NOT: "-lc++" +// CHECK-LD32-NOSTDLIBXX-LCXX: "-lc" + +// Check powerpc64-ibm-aix7.1.0.0, 64-bit. -nostdlib++. +// RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ +// RUN: -nostdlib++ \ +// RUN: -target powerpc64-ibm-aix7.1.0.0 \ +// RUN: --sysroot %S/Inputs/aix_ppc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD64-NOSTDLIBXX-LCXX %s +// CHECK-LD64-NOSTDLIBXX-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" +// CHECK-LD64-NOSTDLIBXX-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-LD64-NOSTDLIBXX-LCXX: "{{.*}}ld{{(.exe)?}}" +// CHECK-LD64-NOSTDLIBXX-LCXX: "-b64" +// CHECK-LD64-NOSTDLIBXX-LCXX: "-bpT:0x100000000" "-bpD:0x110000000" +// CHECK-LD64-NOSTDLIBXX-LCXX: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-NOSTDLIBXX-LCXX: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD64-NOSTDLIBXX-LCXX-NOT: "-lc++" +// CHECK-LD64-NOSTDLIBXX-LCXX: "-lc"