"invalid runtime library name in argument '%0'">;
def err_drv_unsupported_rtlib_for_platform : Error<
"unsupported runtime library '%0' for platform '%1'">;
-def err_drv_invalid_unwindlib_name : Error<
- "invalid unwind library name in argument '%0'">;
-def err_drv_incompatible_unwindlib : Error<
- "--rtlib=libgcc requires --unwindlib=libgcc">;
def err_drv_invalid_stdlib_name : Error<
"invalid library name in argument '%0'">;
def err_drv_invalid_output_with_multiple_archs : Error<
}]>;
def stdlib_EQ : Joined<["-", "--"], "stdlib=">, Flags<[CC1Option]>,
HelpText<"C++ standard library to use">, Values<"libc++,libstdc++,platform">;
-def unwindlib_EQ : Joined<["-", "--"], "unwindlib=">, Flags<[CC1Option]>,
- HelpText<"Unwind library to use">, Values<"libgcc,compiler-rt,platform">;
def sub__library : JoinedOrSeparate<["-"], "sub_library">;
def sub__umbrella : JoinedOrSeparate<["-"], "sub_umbrella">;
def system_header_prefix : Joined<["--"], "system-header-prefix=">,
return ToolChain::CST_Libstdcxx;
}
- virtual RuntimeLibType GetDefaultUnwindLibType() const {
- return ToolChain::RLT_Libgcc;
- }
-
virtual std::string getCompilerRTPath() const;
virtual std::string getCompilerRT(const llvm::opt::ArgList &Args,
// given compilation arguments.
virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const;
- // GetUnwindLibType - Determine the unwind library type to use with the
- // given compilation arguments.
- virtual RuntimeLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const;
-
/// AddClangCXXStdlibIncludeArgs - Add the clang -cc1 level arguments to set
/// the include paths to use for the given C++ standard library type.
virtual void
return GetDefaultRuntimeLibType();
}
-ToolChain::RuntimeLibType ToolChain
-::GetUnwindLibType(
- const ArgList &Args) const {
- const Arg *A = Args.getLastArg(options::OPT_unwindlib_EQ);
- // If nothing has been specified, follow the runtime lib type.
- if (!A)
- return GetRuntimeLibType(Args);
-
- StringRef LibName = A->getValue();
- if (LibName == "compiler-rt") {
- if (GetRuntimeLibType(Args) == RLT_Libgcc)
- getDriver().Diag(diag::err_drv_incompatible_unwindlib);
- return ToolChain::RLT_CompilerRT;
- }
- else if (LibName == "libgcc")
- return ToolChain::RLT_Libgcc;
- else if (LibName == "platform") {
- return GetRuntimeLibType(Args);
- }
-
- if (A)
- getDriver().Diag(diag::err_drv_invalid_unwindlib_name)
- << A->getAsString(Args);
-
- return GetDefaultUnwindLibType();
-}
-
ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
const Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_CXX_STDLIB;
return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
}
-enum class LibGccType { UnspecifiedLibGcc, StaticLibGcc, SharedLibGcc };
-
-static LibGccType getLibGccType(const ArgList &Args) {
- bool Static = Args.hasArg(options::OPT_static_libgcc) ||
- Args.hasArg(options::OPT_static);
-
- bool Shared = Args.hasArg(options::OPT_shared_libgcc);
- if (Shared)
- return LibGccType::SharedLibGcc;
- if (Static)
- return LibGccType::StaticLibGcc;
- return LibGccType::UnspecifiedLibGcc;
-}
-
-static void AddUnwindLibrary(const ToolChain &TC, const Driver &D,
- ArgStringList &CmdArgs, const ArgList &Args) {
- // Targets that don't use unwind libraries.
- if (TC.getTriple().isAndroid() || TC.getTriple().isOSIAMCU() ||
- TC.getTriple().isOSBinFormatWasm())
- return;
-
- ToolChain::RuntimeLibType UNW = TC.GetUnwindLibType(Args);
- switch (UNW) {
- case ToolChain::RLT_Libgcc: {
- LibGccType LGT = getLibGccType(Args);
- if (LGT == LibGccType::UnspecifiedLibGcc || LGT == LibGccType::SharedLibGcc)
- CmdArgs.push_back("-lgcc_s");
- else if (LGT == LibGccType::StaticLibGcc)
- CmdArgs.push_back("-lgcc_eh");
- break;
- }
- case ToolChain::RLT_CompilerRT:
- CmdArgs.push_back("-lunwind");
- break;
- }
-}
+static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
+ ArgStringList &CmdArgs, const ArgList &Args) {
+ bool isAndroid = Triple.isAndroid();
+ bool isCygMing = Triple.isOSCygMing();
+ bool IsIAMCU = Triple.isOSIAMCU();
+ bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
+ Args.hasArg(options::OPT_static);
-// Gcc adds libgcc arguments in various ways:
-//
-// gcc <none>: -lgcc --as-needed -lgcc_s --no-as-needed
-// g++ <none>: -lgcc_s -lgcc
-// gcc shared: -lgcc_s -lgcc
-// g++ shared: -lgcc_s -lgcc
-// gcc static: -lgcc -lgcc_eh
-// g++ static: -lgcc -lgcc_eh
-//
-// Also, certain targets need additional adjustments.
+ bool SharedLibgcc = Args.hasArg(options::OPT_shared_libgcc);
+ bool UnspecifiedLibgcc = !StaticLibgcc && !SharedLibgcc;
-static void AddLibgcc(const ToolChain &TC, const Driver &D,
- ArgStringList &CmdArgs, const ArgList &Args) {
- bool isAndroid = TC.getTriple().isAndroid();
- LibGccType LGT = getLibGccType(Args);
+ // Gcc adds libgcc arguments in various ways:
+ //
+ // gcc <none>: -lgcc --as-needed -lgcc_s --no-as-needed
+ // g++ <none>: -lgcc_s -lgcc
+ // gcc shared: -lgcc_s -lgcc
+ // g++ shared: -lgcc_s -lgcc
+ // gcc static: -lgcc -lgcc_eh
+ // g++ static: -lgcc -lgcc_eh
+ //
+ // Also, certain targets need additional adjustments.
- bool LibGccFirst = (D.CCCIsCC() && LGT == LibGccType::UnspecifiedLibGcc) ||
- LGT == LibGccType::StaticLibGcc;
+ bool LibGccFirst = (D.CCCIsCC() && UnspecifiedLibgcc) || StaticLibgcc;
if (LibGccFirst)
CmdArgs.push_back("-lgcc");
- bool AsNeeded = D.CCCIsCC() && LGT == LibGccType::UnspecifiedLibGcc &&
- !isAndroid && !TC.getTriple().isOSCygMing();
+ bool AsNeeded = D.CCCIsCC() && UnspecifiedLibgcc && !isAndroid && !isCygMing;
if (AsNeeded)
CmdArgs.push_back("--as-needed");
- AddUnwindLibrary(TC, D, CmdArgs, Args);
+ if ((UnspecifiedLibgcc || SharedLibgcc) && !isAndroid)
+ CmdArgs.push_back("-lgcc_s");
+
+ else if (StaticLibgcc && !isAndroid && !IsIAMCU)
+ CmdArgs.push_back("-lgcc_eh");
if (AsNeeded)
CmdArgs.push_back("--no-as-needed");
//
// NOTE: This fixes a link error on Android MIPS as well. The non-static
// libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
- if (isAndroid && LGT != LibGccType::StaticLibGcc)
+ if (isAndroid && !StaticLibgcc)
CmdArgs.push_back("-ldl");
}
switch (RLT) {
case ToolChain::RLT_CompilerRT:
CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
- AddUnwindLibrary(TC, D, CmdArgs, Args);
break;
case ToolChain::RLT_Libgcc:
// Make sure libgcc is not used under MSVC environment by default
<< Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
}
} else
- AddLibgcc(TC, D, CmdArgs, Args);
+ AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
break;
}
}
+++ /dev/null
-// General tests that the driver handles combinations of --rtlib=XXX and
-// --unwindlib=XXX properly.
-//
-// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-// RUN: --target=x86_64-unknown-linux \
-// RUN: --gcc-toolchain="" \
-// RUN: | FileCheck --check-prefix=RTLIB-EMPTY %s
-// RTLIB-EMPTY: "{{.*}}lgcc"
-// RTLIB-EMPTY: "{{.*}}-lgcc_s"
-//
-// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-// RUN: --target=x86_64-unknown-linux -rtlib=gcc \
-// RUN: --gcc-toolchain="" \
-// RUN: | FileCheck --check-prefix=RTLIB-GCC %s
-// RTLIB-GCC: "{{.*}}lgcc"
-// RTLIB-GCC: "{{.*}}lgcc_s"
-//
-// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-// RUN: --target=x86_64-unknown-linux -rtlib=gcc --unwindlib=compiler-rt \
-// RUN: --gcc-toolchain="" \
-// RUN: | FileCheck --check-prefix=RTLIB-GCC-UNWINDLIB-COMPILER-RT %s
-// RTLIB-GCC-UNWINDLIB-COMPILER-RT: "{{.*}}lgcc"
-// RTLIB-GCC-UNWINDLIB-COMPILER-RT: "{{.*}}lunwind"
-//
-// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-// RUN: --target=x86_64-unknown-linux -rtlib=compiler-rt \
-// RUN: --gcc-toolchain="" \
-// RUN: | FileCheck --check-prefix=RTLIB-COMPILER-RT %s
-// RTLIB-COMPILER-RT: "{{.*}}libclang_rt.builtins-x86_64.a"
-// RTLIB-COMPILER-RT: "{{.*}}-lunwind"
-//
-// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-// RUN: --target=x86_64-unknown-linux -rtlib=compiler-rt --unwindlib=gcc \
-// RUN: --gcc-toolchain="" \
-// RUN: | FileCheck --check-prefix=RTLIB-COMPILER-RT-UNWINDLIB-GCC %s
-// RTLIB-COMPILER-RT-UNWINDLIB-GCC: "{{.*}}libclang_rt.builtins-x86_64.a"
-// RTLIB-COMPILER-RT-UNWINDLIB-GCC: "{{.*}}lgcc_s"
-//
-// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-// RUN: --target=x86_64-unknown-linux -rtlib=compiler-rt --unwindlib=gcc \
-// RUN: -static --gcc-toolchain="" \
-// RUN: | FileCheck --check-prefix=RTLIB-COMPILER-RT-UNWINDLIB-GCC-STATIC %s
-// RTLIB-COMPILER-RT-UNWINDLIB-GCC-STATIC: "{{.*}}libclang_rt.builtins-x86_64.a"
-// RTLIB-COMPILER-RT-UNWINDLIB-GCC-STATIC: "{{.*}}lgcc_eh"
-//
-// RUN: not %clang -no-canonical-prefixes %s -o %t.o 2> %t.err \
-// RUN: --target=x86_64-unknown-linux -rtlib=libgcc --unwindlib=compiler-rt \
-// RUN: --gcc-toolchain="" \
-// RUN: FileCheck --input-file=%t.err --check-prefix=RTLIB-GCC-UNWINDLIB-COMPILER_RT %s
-// RTLIB-GCC-UNWINDLIB-COMPILER_RT: "{{[.|\\\n]*}}--rtlib=libgcc requires --unwindlib=libgcc"