diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp index f4bab833fa9d..0d4d7e3dbf9f 100644 --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -1,229 +1,233 @@ //===--- AIX.cpp - AIX ToolChain Implementations ----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "AIX.h" #include "Arch/PPC.h" #include "CommonArgs.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Options.h" #include "clang/Driver/SanitizerArgs.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/Path.h" using AIX = clang::driver::toolchains::AIX; using namespace clang::driver; using namespace clang::driver::tools; using namespace clang::driver::toolchains; using namespace llvm::opt; using namespace llvm::sys; void aix::Assembler::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { ArgStringList CmdArgs; const bool IsArch32Bit = getToolChain().getTriple().isArch32Bit(); const bool IsArch64Bit = getToolChain().getTriple().isArch64Bit(); // Only support 32 and 64 bit. if (!IsArch32Bit && !IsArch64Bit) llvm_unreachable("Unsupported bit width value."); // Specify the mode in which the as(1) command operates. if (IsArch32Bit) { CmdArgs.push_back("-a32"); } else { // Must be 64-bit, otherwise asserted already. CmdArgs.push_back("-a64"); } // Accept any mixture of instructions. // On Power for AIX and Linux, this behaviour matches that of GCC for both the // user-provided assembler source case and the compiler-produced assembler // source case. Yet XL with user-provided assembler source would not add this. CmdArgs.push_back("-many"); Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); // Specify assembler output file. assert((Output.isFilename() || Output.isNothing()) && "Invalid output."); if (Output.isFilename()) { CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); } // Specify assembler input file. // The system assembler on AIX takes exactly one input file. The driver is // expected to invoke as(1) separately for each assembler source input file. if (Inputs.size() != 1) llvm_unreachable("Invalid number of input files."); const InputInfo &II = Inputs[0]; assert((II.isFilename() || II.isNothing()) && "Invalid input."); if (II.isFilename()) CmdArgs.push_back(II.getFilename()); const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); C.addCommand(std::make_unique(JA, *this, ResponseFileSupport::None(), Exec, CmdArgs, Inputs)); } void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { const AIX &ToolChain = static_cast(getToolChain()); const Driver &D = ToolChain.getDriver(); ArgStringList CmdArgs; const bool IsArch32Bit = ToolChain.getTriple().isArch32Bit(); const bool IsArch64Bit = ToolChain.getTriple().isArch64Bit(); // Only support 32 and 64 bit. if (!(IsArch32Bit || IsArch64Bit)) llvm_unreachable("Unsupported bit width value."); // Force static linking when "-static" is present. if (Args.hasArg(options::OPT_static)) CmdArgs.push_back("-bnso"); // Add options for shared libraries. if (Args.hasArg(options::OPT_shared)) { CmdArgs.push_back("-bM:SRE"); CmdArgs.push_back("-bnoentry"); } // Specify linker output file. assert((Output.isFilename() || Output.isNothing()) && "Invalid output."); if (Output.isFilename()) { CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); } // Set linking mode (i.e., 32/64-bit) and the address of // text and data sections based on arch bit width. if (IsArch32Bit) { CmdArgs.push_back("-b32"); CmdArgs.push_back("-bpT:0x10000000"); CmdArgs.push_back("-bpD:0x20000000"); } else { // Must be 64-bit, otherwise asserted already. CmdArgs.push_back("-b64"); CmdArgs.push_back("-bpT:0x100000000"); CmdArgs.push_back("-bpD:0x110000000"); } auto getCrt0Basename = [&Args, IsArch32Bit] { // Enable gprofiling when "-pg" is specified. if (Args.hasArg(options::OPT_pg)) return IsArch32Bit ? "gcrt0.o" : "gcrt0_64.o"; // Enable profiling when "-p" is specified. else if (Args.hasArg(options::OPT_p)) return IsArch32Bit ? "mcrt0.o" : "mcrt0_64.o"; else return IsArch32Bit ? "crt0.o" : "crt0_64.o"; }; if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles, options::OPT_shared)) { CmdArgs.push_back( Args.MakeArgString(ToolChain.GetFilePath(getCrt0Basename()))); + + if (D.CCCIsCXX()) + CmdArgs.push_back(Args.MakeArgString( + ToolChain.GetFilePath(IsArch32Bit ? "crti.o" : "crti_64.o"))); } // Collect all static constructor and destructor functions in CXX mode. This // has to come before AddLinkerInputs as the implied option needs to precede // any other '-bcdtors' settings or '-bnocdtors' that '-Wl' might forward. if (D.CCCIsCXX()) CmdArgs.push_back("-bcdtors:all:0:s"); // Specify linker input file(s). AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA); // Add directory to library search path. 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)) CmdArgs.push_back("-lpthreads"); CmdArgs.push_back("-lc"); } const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); C.addCommand(std::make_unique(JA, *this, ResponseFileSupport::None(), Exec, CmdArgs, Inputs)); } /// AIX - AIX tool chain which can call as(1) and ld(1) directly. AIX::AIX(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args) { getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); } // Returns the effective header sysroot path to use. // This comes from either -isysroot or --sysroot. llvm::StringRef AIX::GetHeaderSysroot(const llvm::opt::ArgList &DriverArgs) const { if (DriverArgs.hasArg(options::OPT_isysroot)) return DriverArgs.getLastArgValue(options::OPT_isysroot); if (!getDriver().SysRoot.empty()) return getDriver().SysRoot; return "/"; } void AIX::AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { // Return if -nostdinc is specified as a driver option. if (DriverArgs.hasArg(options::OPT_nostdinc)) return; llvm::StringRef Sysroot = GetHeaderSysroot(DriverArgs); const Driver &D = getDriver(); // Add the Clang builtin headers (/include). if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { SmallString<128> P(D.ResourceDir); path::append(P, "/include"); addSystemInclude(DriverArgs, CC1Args, P.str()); } // Return if -nostdlibinc is specified as a driver option. if (DriverArgs.hasArg(options::OPT_nostdlibinc)) return; // Add /usr/include. SmallString<128> UP(Sysroot); path::append(UP, "/usr/include"); 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++"); return; case ToolChain::CST_Libstdcxx: llvm::report_fatal_error("linking libstdc++ unimplemented on AIX"); } llvm_unreachable("Unexpected C++ library type; only libc++ is supported."); } 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 index 22b0378aa3dd..6dd14dc164df 100644 --- a/clang/test/Driver/aix-ld.c +++ b/clang/test/Driver/aix-ld.c @@ -1,413 +1,440 @@ // General tests that ld invocations on AIX targets are sane. Note that we use // sysroot to make these tests independent of the host system. // Check powerpc-ibm-aix7.1.0.0, 32-bit. // RUN: %clang -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 %s // CHECK-LD32-NOT: warning: // CHECK-LD32: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-NOT: "-bnso" // CHECK-LD32: "-b32" // CHECK-LD32: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // CHECK-LD32: "-L[[SYSROOT]]/usr/lib" // CHECK-LD32-NOT: "-lc++" // CHECK-LD32: "-lc" // Check powerpc64-ibm-aix7.1.0.0, 64-bit. // RUN: %clang -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 %s // CHECK-LD64-NOT: warning: // CHECK-LD64: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD64: "{{.*}}ld{{(.exe)?}}" // CHECK-LD64-NOT: "-bnso" // CHECK-LD64: "-b64" // CHECK-LD64: "-bpT:0x100000000" "-bpD:0x110000000" // CHECK-LD64: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o" // CHECK-LD64: "-L[[SYSROOT]]/usr/lib" // CHECK-LD64-NOT: "-lc++" // CHECK-LD64: "-lc" // Check powerpc-ibm-aix7.1.0.0, 32-bit. Enable POSIX thread support. // RUN: %clang -no-canonical-prefixes %s -### 2>&1 \ // RUN: -pthread \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-PTHREAD %s // CHECK-LD32-PTHREAD-NOT: warning: // CHECK-LD32-PTHREAD: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-PTHREAD: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32-PTHREAD: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-PTHREAD-NOT: "-bnso" // CHECK-LD32-PTHREAD: "-b32" // CHECK-LD32-PTHREAD: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-PTHREAD: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-PTHREAD-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // CHECK-LD32-PTHREAD: "-L[[SYSROOT]]/usr/lib" // CHECK-LD32-PTHREAD-NOT: "-lc++" // CHECK-LD32-PTHREAD: "-lpthreads" // CHECK-LD32-PTHREAD: "-lc" // Check powerpc64-ibm-aix7.1.0.0, 64-bit. POSIX thread alias. // RUN: %clang -no-canonical-prefixes %s -### 2>&1 \ // RUN: -pthreads \ // RUN: -target powerpc64-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD64-PTHREAD %s // CHECK-LD64-PTHREAD-NOT: warning: // CHECK-LD64-PTHREAD: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-PTHREAD: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD64-PTHREAD: "{{.*}}ld{{(.exe)?}}" // CHECK-LD64-PTHREAD-NOT: "-bnso" // CHECK-LD64-PTHREAD: "-b64" // CHECK-LD64-PTHREAD: "-bpT:0x100000000" "-bpD:0x110000000" // CHECK-LD64-PTHREAD: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-PTHREAD-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o" // CHECK-LD64-PTHREAD: "-L[[SYSROOT]]/usr/lib" // CHECK-LD64-PTHREAD-NOT: "-lc++" // CHECK-LD64-PTHREAD: "-lpthreads" // CHECK-LD64-PTHREAD: "-lc" // Check powerpc-ibm-aix7.1.0.0, 32-bit. Enable profiling. // RUN: %clang -no-canonical-prefixes %s -### 2>&1 \ // RUN: -p \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-PROF %s // CHECK-LD32-PROF-NOT: warning: // CHECK-LD32-PROF: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-PROF: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32-PROF: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-PROF-NOT: "-bnso" // CHECK-LD32-PROF: "-b32" // CHECK-LD32-PROF: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-PROF: "[[SYSROOT]]/usr/lib{{/|\\\\}}mcrt0.o" +// CHECK-LD32-PROF-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // CHECK-LD32-PROF: "-L[[SYSROOT]]/usr/lib" // CHECK-LD32-PROF-NOT: "-lc++" // CHECK-LD32-PROF: "-lc" // Check powerpc64-ibm-aix7.1.0.0, 64-bit. Enable g-profiling. // RUN: %clang -no-canonical-prefixes %s -### 2>&1 \ // RUN: -pg \ // RUN: -target powerpc64-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD64-GPROF %s // CHECK-LD64-GPROF-NOT: warning: // CHECK-LD64-GPROF: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-GPROF: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD64-GPROF: "{{.*}}ld{{(.exe)?}}" // CHECK-LD64-GPROF-NOT: "-bnso" // CHECK-LD64-GPROF: "-b64" // CHECK-LD64-GPROF: "-bpT:0x100000000" "-bpD:0x110000000" // CHECK-LD64-GPROF: "[[SYSROOT]]/usr/lib{{/|\\\\}}gcrt0_64.o" +// CHECK-LD64-GPROF-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o" // CHECK-LD64-GPROF: "-L[[SYSROOT]]/usr/lib" // CHECK-LD64-GPROF-NOT: "-lc++" // CHECK-LD64-GPROF: "-lc" // Check powerpc-ibm-aix7.1.0.0, 32-bit. Static linking. // RUN: %clang -no-canonical-prefixes %s -### 2>&1 \ // RUN: -static \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-STATIC %s // CHECK-LD32-STATIC-NOT: warning: // CHECK-LD32-STATIC: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-STATIC: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32-STATIC: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-STATIC: "-bnso" // CHECK-LD32-STATIC: "-b32" // CHECK-LD32-STATIC: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-STATIC: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-STATIC-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // CHECK-LD32-STATIC: "-L[[SYSROOT]]/usr/lib" // CHECK-LD32-STATIC-NOT: "-lc++" // CHECK-LD32-STATIC: "-lc" // Check powerpc-ibm-aix7.1.0.0, 32-bit. Library search path. // RUN: %clang -no-canonical-prefixes %s -### 2>&1 \ // RUN: -L%S/Inputs/aix_ppc_tree/powerpc-ibm-aix7.1.0.0 \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-LIBP %s // CHECK-LD32-LIBP-NOT: warning: // CHECK-LD32-LIBP: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-LIBP: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32-LIBP: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-LIBP-NOT: "-bnso" // CHECK-LD32-LIBP: "-b32" // CHECK-LD32-LIBP: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-LIBP: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-LIBP-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // CHECK-LD32-LIBP: "-L[[SYSROOT]]/powerpc-ibm-aix7.1.0.0" // CHECK-LD32-LIBP: "-L[[SYSROOT]]/usr/lib" // CHECK-LD32-LIBP-NOT: "-lc++" // CHECK-LD32-LIBP: "-lc" // Check powerpc-ibm-aix7.1.0.0, 32-bit. nostdlib. // RUN: %clang -no-canonical-prefixes %s -### 2>&1 \ // RUN: -nostdlib \ // RUN: -pthread \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-NO-STD-LIB %s // CHECK-LD32-NO-STD-LIB-NOT: warning: // CHECK-LD32-NO-STD-LIB: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-NO-STD-LIB: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32-NO-STD-LIB: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-NO-STD-LIB-NOT: "-bnso" // CHECK-LD32-NO-STD-LIB: "-b32" // CHECK-LD32-NO-STD-LIB: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-NO-STD-LIB-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-NO-STD-LIB-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // CHECK-LD32-NO-STD-LIB: "-L[[SYSROOT]]/usr/lib" // CHECK-LD32-NO-STD-LIB-NOT: "-lc++" // CHECK-LD32-NO-STD-LIB-NOT: "-lpthreads" // CHECK-LD32-NO-STD-LIB-NOT: "-lc" // Check powerpc64-ibm-aix7.1.0.0, 64-bit. nodefaultlibs. // RUN: %clang -no-canonical-prefixes %s -### 2>&1 \ // RUN: -nodefaultlibs \ // RUN: -pthread \ // RUN: -target powerpc64-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD64-NO-DEFAULT-LIBS %s // CHECK-LD64-NO-DEFAULT-LIBS-NOT: warning: // CHECK-LD64-NO-DEFAULT-LIBS: {{.*}}clang{{(.exe)?}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-NO-DEFAULT-LIBS: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD64-NO-DEFAULT-LIBS: "{{.*}}ld{{(.exe)?}}" // CHECK-LD64-NO-DEFAULT-LIBS-NOT: "-bnso" // CHECK-LD64-NO-DEFAULT-LIBS: "-b64" // CHECK-LD64-NO-DEFAULT-LIBS: "-bpT:0x100000000" "-bpD:0x110000000" // CHECK-LD64-NO-DEFAULT-LIBS: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-NO-DEFAULT-LIBS-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o" // CHECK-LD64-NO-DEFAULT-LIBS: "-L[[SYSROOT]]/usr/lib" // CHECK-LD64-NO-DEFAULT-LIBS-NOT: "-lc++" // CHECK-LD64-NO-DEFAULT-LIBS-NOT: "-lpthreads" // CHECK-LD64-NO-DEFAULT-LIBS-NOT: "-lc" // Check powerpc-ibm-aix7.1.0.0, 32-bit. 'bcdtors' and argument order. // RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ // RUN: -Wl,-bnocdtors \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-CXX-ARG-ORDER %s // CHECK-LD32-CXX-ARG-ORDER: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-CXX-ARG-ORDER: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32-CXX-ARG-ORDER: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-CXX-ARG-ORDER-NOT: "-bnso" // CHECK-LD32-CXX-ARG-ORDER: "-b32" // CHECK-LD32-CXX-ARG-ORDER: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-CXX-ARG-ORDER: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-CXX-ARG-ORDER: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // 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: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.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: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_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: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.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: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_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-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.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-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_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++. +// Note: crti is still linked for initialization/finalization functionality. // 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: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.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: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o" // CHECK-LD64-NOSTDLIBXX-LCXX: "-L[[SYSROOT]]/usr/lib" // CHECK-LD64-NOSTDLIBXX-LCXX-NOT: "-lc++" // CHECK-LD64-NOSTDLIBXX-LCXX: "-lc" // Check powerpc64-ibm-aix7.1.0.0, 32-bit. -nostartfiles. // RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ // RUN: -nostartfiles \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-NOSTARTFILES-LCXX %s // CHECK-LD32-NOSTARTFILES-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-NOSTARTFILES-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32-NOSTARTFILES-LCXX: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-NOSTARTFILES-LCXX: "-b32" // CHECK-LD32-NOSTARTFILES-LCXX: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-NOSTARTFILES-LCXX-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-NOSTARTFILES-LCXX-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // CHECK-LD32-NOSTARTFILES-LCXX: "-L[[SYSROOT]]/usr/lib" // CHECK-LD32-NOSTARTFILES-LCXX "-lc++" // CHECK-LD32-NOSTARTFILES-LCXX: "-lc" // Check powerpc64-ibm-aix7.1.0.0, 64-bit. -nostartfiles. // RUN: %clangxx -no-canonical-prefixes %s 2>&1 -### \ // RUN: -nostartfiles \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-NOSTARTFILES-LCXX %s // CHECK-LD64-NOSTARTFILES-LCXX: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-NOSTARTFILES-LCXX: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD64-NOSTARTFILES-LCXX: "{{.*}}ld{{(.exe)?}}" // CHECK-LD64-NOSTARTFILES-LCXX: "-b64" // CHECK-LD64-NOSTARTFILES-LCXX: "-bpT:0x100000000" "-bpD:0x110000000" // CHECK-LD64-NOSTARTFILES-LCXX-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-NOSTARTFILES-LCXX-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o" // CHECK-LD64-NOSTARTFILES-LCXX: "-L[[SYSROOT]]/usr/lib" // CHECK-LD64-NOSTARTFILES-LCXX: "-lc++" // CHECK-LD64-NOSTARTFILES-LCXX: "-lc" // Check powerpc-ibm-aix7.1.0.0, 32-bit. -stdlib=libstdc++ invokes fatal error. // RUN: not --crash %clangxx -no-canonical-prefixes %s 2>&1 -### \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: -stdlib=libstdc++ \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD-LIBSTDCXX %s // Check powerpc64-ibm-aix7.1.0.0, 64-bit. -stdlib=libstdc++ invokes fatal error. // RUN: not --crash %clangxx -no-canonical-prefixes %s 2>&1 -### \ // RUN: -target powerpc64-ibm-aix7.1.0.0 \ // RUN: -stdlib=libstdc++ \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD-LIBSTDCXX %s // CHECK-LD-LIBSTDCXX: LLVM ERROR: linking libstdc++ unimplemented on AIX // Check powerpc64-ibm-aix7.1.0.0, 32-bit. -shared. -// RUN: %clang -no-canonical-prefixes %s 2>&1 -### \ +// RUN: %clangxx -x c++ -no-canonical-prefixes %s 2>&1 -### \ // RUN: -shared \ // RUN: -target powerpc-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD32-SHARED %s // CHECK-LD32-SHARED: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-SHARED: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD32-SHARED: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-SHARED: "-bM:SRE" // CHECK-LD32-SHARED: "-bnoentry" // CHECK-LD32-SHARED: "-b32" // CHECK-LD32-SHARED: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-SHARED-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" +// CHECK-LD32-SHARED-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" // CHECK-LD32-SHARED: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD32-SHARED: "-lc++" // CHECK-LD32-SHARED: "-lc" + // Check powerpc64-ibm-aix7.1.0.0, 64-bit. -shared. -// RUN: %clang -no-canonical-prefixes %s 2>&1 -### \ +// RUN: %clangxx -x c++ -no-canonical-prefixes %s 2>&1 -### \ // RUN: -shared \ // RUN: -target powerpc64-ibm-aix7.1.0.0 \ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD64-SHARED %s // CHECK-LD64-SHARED: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-SHARED: "-isysroot" "[[SYSROOT:[^"]+]]" // CHECK-LD64-SHARED: "{{.*}}ld{{(.exe)?}}" // CHECK-LD64-SHARED: "-bM:SRE" // CHECK-LD64-SHARED: "-bnoentry" // CHECK-LD64-SHARED: "-b64" // CHECK-LD64-SHARED: "-bpT:0x100000000" "-bpD:0x110000000" // CHECK-LD64-SHARED-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" +// CHECK-LD64-SHARED-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o" // CHECK-LD64-SHARED: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD64-SHARED: "-lc++" // CHECK-LD64-SHARED: "-lc"