diff --git a/clang/lib/Driver/ToolChains/Hexagon.h b/clang/lib/Driver/ToolChains/Hexagon.h --- a/clang/lib/Driver/ToolChains/Hexagon.h +++ b/clang/lib/Driver/ToolChains/Hexagon.h @@ -80,11 +80,17 @@ void addLibStdCxxIncludePaths( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void addLibCxxIncludePaths( + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; const char *getDefaultLinker() const override { return "hexagon-link"; } CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; + void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const override; + StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } bool IsIntegratedAssemblerDefault() const override { return true; diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp --- a/clang/lib/Driver/ToolChains/Hexagon.cpp +++ b/clang/lib/Driver/ToolChains/Hexagon.cpp @@ -273,12 +273,12 @@ if (!Args.hasArg(options::OPT_shared, options::OPT_nostartfiles, options::OPT_nostdlib)) - CmdArgs.push_back(Args.MakeArgString(D.SysRoot + "/lib/crt1.o")); + CmdArgs.push_back(Args.MakeArgString(D.SysRoot + "/usr/lib/crt1.o")); else if (Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_nostartfiles, options::OPT_nostdlib)) - CmdArgs.push_back(Args.MakeArgString(D.SysRoot + "/lib/Scrt1.o")); + CmdArgs.push_back(Args.MakeArgString(D.SysRoot + "/usr/lib/crti.o")); - CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + D.SysRoot + "/lib")); + CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + D.SysRoot + "/usr/lib")); Args.AddAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_e, options::OPT_s, options::OPT_t, options::OPT_u_Group}); @@ -288,7 +288,10 @@ CmdArgs.push_back("-lclang_rt.builtins-hexagon"); CmdArgs.push_back("-lc"); } - + if (D.CCCIsCXX()) { + if (HTC.ShouldLinkCXXStdlib(Args)) + HTC.AddCXXStdlibLibArgs(Args, CmdArgs); + } return; } @@ -508,6 +511,22 @@ HexagonToolChain::~HexagonToolChain() {} +void HexagonToolChain::AddCXXStdlibLibArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + CXXStdlibType Type = GetCXXStdlibType(Args); + switch (Type) { + case ToolChain::CST_Libcxx: + CmdArgs.push_back("-lc++"); + CmdArgs.push_back("-lc++abi"); + CmdArgs.push_back("-lunwind"); + break; + + case ToolChain::CST_Libstdcxx: + CmdArgs.push_back("-lstdc++"); + break; + } +} + Tool *HexagonToolChain::buildAssembler() const { return new tools::hexagon::Assembler(*this); } @@ -571,7 +590,7 @@ const Driver &D = getDriver(); if (!D.SysRoot.empty()) { SmallString<128> P(D.SysRoot); - llvm::sys::path::append(P, "include"); + llvm::sys::path::append(P, "usr/include"); addExternCSystemInclude(DriverArgs, CC1Args, P.str()); return; } @@ -582,6 +601,22 @@ } +void HexagonToolChain::addLibCxxIncludePaths( + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const { + const Driver &D = getDriver(); + if (!D.SysRoot.empty() && getTriple().isMusl()) + addLibStdCXXIncludePaths(D.SysRoot + "/usr/include/c++/v1", "", "", "", "", "", + DriverArgs, CC1Args); + else if (getTriple().isMusl()) + addLibStdCXXIncludePaths("/usr/include/c++/v1", "", "", "", "", "", + DriverArgs, CC1Args); + else { + std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs); + addLibStdCXXIncludePaths(TargetDir, "/hexagon/include/c++/v1", "", "", "", + "", DriverArgs, CC1Args); + } +} void HexagonToolChain::addLibStdCxxIncludePaths( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const { @@ -594,14 +629,22 @@ ToolChain::CXXStdlibType HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const { Arg *A = Args.getLastArg(options::OPT_stdlib_EQ); - if (!A) - return ToolChain::CST_Libstdcxx; - + if (!A) { + if (getTriple().isMusl()) + return ToolChain::CST_Libcxx; + else + return ToolChain::CST_Libstdcxx; + } StringRef Value = A->getValue(); - if (Value != "libstdc++") + if (Value != "libstdc++" && Value != "libc++") getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args); - return ToolChain::CST_Libstdcxx; + if (Value == "libstdc++") + return ToolChain::CST_Libstdcxx; + else if (Value == "libc++") + return ToolChain::CST_Libcxx; + else + return ToolChain::CST_Libstdcxx; } bool HexagonToolChain::isAutoHVXEnabled(const llvm::opt::ArgList &Args) { diff --git a/clang/test/Driver/Inputs/hexagon_tree/Tools/target/hexagon/include/c++/v1/readme b/clang/test/Driver/Inputs/hexagon_tree/Tools/target/hexagon/include/c++/v1/readme new file mode 100644 --- /dev/null +++ b/clang/test/Driver/Inputs/hexagon_tree/Tools/target/hexagon/include/c++/v1/readme @@ -0,0 +1,4 @@ +Git does not record empty directories. Create a dummy file in each directory +here. Strictly speaking, putting dummy files in leaf directories should be +sufficient, but adding them everywhere reduces the risk of repeating the same +problem in case new directories are added. diff --git a/clang/test/Driver/hexagon-toolchain-elf.c b/clang/test/Driver/hexagon-toolchain-elf.c --- a/clang/test/Driver/hexagon-toolchain-elf.c +++ b/clang/test/Driver/hexagon-toolchain-elf.c @@ -587,7 +587,7 @@ // RUN: %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK083 %s // CHECK083: "-isysroot" "/hexagon" -// CHECK083: "-internal-externc-isystem" "/hexagon{{/|\\\\}}include" +// CHECK083: "-internal-externc-isystem" "/hexagon{{/|\\\\}}usr{{/|\\\\}}include" // ----------------------------------------------------------------------------- // Passing -fno-use-init-array // ----------------------------------------------------------------------------- @@ -604,12 +604,12 @@ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ // RUN: -mcpu=hexagonv60 \ // RUN: -fuse-ld=lld \ -// RUN: --sysroot=/hexagon \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree \ // RUN: %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK085 %s -// CHECK085-NOT: /hexagon{{/|\\\\}}lib{{/|\\\\}}Scrt1.o +// CHECK085-NOT: {{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crti.o // CHECK085: "-dynamic-linker={{/|\\\\}}lib{{/|\\\\}}ld-musl-hexagon.so.1" -// CHECK085: "/hexagon{{/|\\\\}}lib{{/|\\\\}}crt1.o" +// CHECK085: "{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crt1.o" // CHECK085: "-lclang_rt.builtins-hexagon" "-lc" // ----------------------------------------------------------------------------- // Passing --musl --shared @@ -617,25 +617,25 @@ // RUN: %clang -### -target hexagon-unknown-linux-musl \ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ // RUN: -mcpu=hexagonv60 \ -// RUN: --sysroot=/hexagon -shared \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree -shared \ // RUN: %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK086 %s // CHECK086-NOT: -dynamic-linker={{/|\\\\}}lib{{/|\\\\}}ld-musl-hexagon.so.1 -// CHECK086: "/hexagon{{/|\\\\}}lib{{/|\\\\}}Scrt1.o" +// CHECK086: "{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crti.o" // CHECK086: "-lclang_rt.builtins-hexagon" "-lc" -// CHECK086-NOT: /hexagon{{/|\\\\}}lib{{/|\\\\}}crt1.o +// CHECK086-NOT: {{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crt1.o // ----------------------------------------------------------------------------- // Passing --musl -nostdlib // ----------------------------------------------------------------------------- // RUN: %clang -### -target hexagon-unknown-linux-musl \ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ // RUN: -mcpu=hexagonv60 \ -// RUN: --sysroot=/hexagon -nostdlib \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree -nostdlib \ // RUN: %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK087 %s // CHECK087: "-dynamic-linker={{/|\\\\}}lib{{/|\\\\}}ld-musl-hexagon.so.1" -// CHECK087-NOT: /hexagon{{/|\\\\}}lib{{/|\\\\}}Scrt1.o -// CHECK087-NOT: /hexagon{{/|\\\\}}lib{{/|\\\\}}crt1.o +// CHECK087-NOT: {{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crti.o +// CHECK087-NOT: {{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crt1.o // CHECK087-NOT: -lclang_rt.builtins-hexagon // CHECK087-NOT: -lc // ----------------------------------------------------------------------------- @@ -644,12 +644,12 @@ // RUN: %clang -### -target hexagon-unknown-linux-musl \ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ // RUN: -mcpu=hexagonv60 \ -// RUN: --sysroot=/hexagon -nostartfiles \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree -nostartfiles \ // RUN: %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK088 %s // CHECK088: "-dynamic-linker={{/|\\\\}}lib{{/|\\\\}}ld-musl-hexagon.so.1" -// CHECK088-NOT: /hexagon{{/|\\\\}}lib{{/|\\\\}}Scrt1.o -// CHECK088-NOT: /hexagon{{/|\\\\}}lib{{/|\\\\}}crt1.o +// CHECK088-NOT: {{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}Scrt1.o +// CHECK088-NOT: {{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crt1.o // CHECK088: "-lclang_rt.builtins-hexagon" "-lc" // ----------------------------------------------------------------------------- // Passing --musl -nodefaultlibs @@ -657,11 +657,11 @@ // RUN: %clang -### -target hexagon-unknown-linux-musl \ // RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ // RUN: -mcpu=hexagonv60 \ -// RUN: --sysroot=/hexagon -nodefaultlibs \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree -nodefaultlibs \ // RUN: %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK089 %s // CHECK089: "-dynamic-linker={{/|\\\\}}lib{{/|\\\\}}ld-musl-hexagon.so.1" -// CHECK089: "/hexagon{{/|\\\\}}lib{{/|\\\\}}crt1.o" +// CHECK089: "{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}lib{{/|\\\\}}crt1.o" // CHECK089-NOT: -lclang_rt.builtins-hexagon // CHECK089-NOT: -lc // ----------------------------------------------------------------------------- @@ -674,3 +674,23 @@ // RUN: | FileCheck -check-prefix=CHECK090 %s // CHECK090-NOT: -fno-use-init-array // ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// c++ when musl is selected +// ----------------------------------------------------------------------------- +// RUN: %clangxx -### -target hexagon-unknown-linux-musl \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree \ +// RUN: -mcpu=hexagonv60 \ +// RUN: %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK091 %s +// CHECK091: "-internal-isystem" "{{.*}}basic_linux_libcxx_tree{{/|\\\\}}usr{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}v1" +// ----------------------------------------------------------------------------- +// c++ when musl is selected +// ----------------------------------------------------------------------------- +// RUN: %clangxx -### -target hexagon-unknown-elf \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ +// RUN: -stdlib=libc++ \ +// RUN: -mcpu=hexagonv60 \ +// RUN: %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK092 %s +// CHECK092: "-internal-isystem" "{{.*}}hexagon{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}v1"