Author: Tim Northover Date: 2022-09-20T10:47:18+01:00 New Revision: 4388b56d525c08ce3cf941cfbad2428b0e1695b0
URL: https://github.com/llvm/llvm-project/commit/4388b56d525c08ce3cf941cfbad2428b0e1695b0 DIFF: https://github.com/llvm/llvm-project/commit/4388b56d525c08ce3cf941cfbad2428b0e1695b0.diff LOG: Refactor unwind table driver interface to expose default level. NFC. Added: Modified: clang/include/clang/Driver/ToolChain.h clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Driver/ToolChains/CrossWindows.cpp clang/lib/Driver/ToolChains/CrossWindows.h clang/lib/Driver/ToolChains/Darwin.cpp clang/lib/Driver/ToolChains/Darwin.h clang/lib/Driver/ToolChains/FreeBSD.cpp clang/lib/Driver/ToolChains/FreeBSD.h clang/lib/Driver/ToolChains/Fuchsia.h clang/lib/Driver/ToolChains/Gnu.cpp clang/lib/Driver/ToolChains/Gnu.h clang/lib/Driver/ToolChains/MSVC.cpp clang/lib/Driver/ToolChains/MSVC.h clang/lib/Driver/ToolChains/MinGW.cpp clang/lib/Driver/ToolChains/MinGW.h clang/lib/Driver/ToolChains/NetBSD.h clang/lib/Driver/ToolChains/OpenBSD.cpp clang/lib/Driver/ToolChains/OpenBSD.h Removed: ################################################################################ diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 28137e36e2af..a0d5127007cf 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -108,6 +108,12 @@ class ToolChain { UNW_Libgcc }; + enum class UnwindTableLevel { + None, + Synchronous, + Asynchronous, + }; + enum RTTIMode { RM_Enabled, RM_Disabled, @@ -495,9 +501,9 @@ class ToolChain { /// Returns true if gcov instrumentation (-fprofile-arcs or --coverage) is on. static bool needsGCovInstrumentation(const llvm::opt::ArgList &Args); - /// IsUnwindTablesDefault - Does this tool chain use -funwind-tables - /// by default. - virtual bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const; + /// How detailed should the unwind tables be by default. + virtual UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const; /// Test whether this toolchain supports outline atomics by default. virtual bool diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 26c5087b4ac2..5547f28d6351 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -287,8 +287,9 @@ std::string ToolChain::getInputFilename(const InputInfo &Input) const { return Input.getFilename(); } -bool ToolChain::IsUnwindTablesDefault(const ArgList &Args) const { - return false; +ToolChain::UnwindTableLevel +ToolChain::getDefaultUnwindTableLevel(const ArgList &Args) const { + return UnwindTableLevel::None; } Tool *ToolChain::getClang() const { diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 9cc08306471c..34caeaf0f6af 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5461,17 +5461,26 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more // complicated ways. auto SanitizeArgs = TC.getSanitizerArgs(Args); - bool AsyncUnwindTables = Args.hasFlag( - options::OPT_fasynchronous_unwind_tables, - options::OPT_fno_asynchronous_unwind_tables, - (TC.IsUnwindTablesDefault(Args) || SanitizeArgs.needsUnwindTables()) && - !Freestanding); - bool UnwindTables = Args.hasFlag(options::OPT_funwind_tables, - options::OPT_fno_unwind_tables, false); - if (AsyncUnwindTables) - CmdArgs.push_back("-funwind-tables=2"); - else if (UnwindTables) + auto UnwindTables = TC.getDefaultUnwindTableLevel(Args); + + if (Args.hasFlag(options::OPT_fasynchronous_unwind_tables, + options::OPT_fno_asynchronous_unwind_tables, + SanitizeArgs.needsUnwindTables()) && + !Freestanding) + UnwindTables = ToolChain::UnwindTableLevel::Asynchronous; + else if (Args.hasFlag(options::OPT_funwind_tables, + options::OPT_fno_unwind_tables, false)) + UnwindTables = ToolChain::UnwindTableLevel::Synchronous; + else if (Args.hasFlag(options::OPT_fno_unwind_tables, + options::OPT_fno_asynchronous_unwind_tables, + options::OPT_funwind_tables, false) || Freestanding) + UnwindTables = ToolChain::UnwindTableLevel::None; + + + if (UnwindTables == ToolChain::UnwindTableLevel::Synchronous) CmdArgs.push_back("-funwind-tables=1"); + else if (UnwindTables == ToolChain::UnwindTableLevel::Asynchronous) + CmdArgs.push_back("-funwind-tables=2"); // Prepare `-aux-target-cpu` and `-aux-target-feature` unless // `--gpu-use-aux-triple-only` is specified. @@ -7293,7 +7302,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-faddrsig"); if ((Triple.isOSBinFormatELF() || Triple.isOSBinFormatMachO()) && - (EH || AsyncUnwindTables || UnwindTables || + (EH || UnwindTables != ToolChain::UnwindTableLevel::None || DebugInfoKind != codegenoptions::NoDebugInfo)) CmdArgs.push_back("-D__GCC_HAVE_DWARF2_CFI_ASM=1"); diff --git a/clang/lib/Driver/ToolChains/CrossWindows.cpp b/clang/lib/Driver/ToolChains/CrossWindows.cpp index 681a6824dad1..bc91449326a5 100644 --- a/clang/lib/Driver/ToolChains/CrossWindows.cpp +++ b/clang/lib/Driver/ToolChains/CrossWindows.cpp @@ -213,10 +213,11 @@ CrossWindowsToolChain::CrossWindowsToolChain(const Driver &D, const llvm::opt::ArgList &Args) : Generic_GCC(D, T, Args) {} -bool CrossWindowsToolChain::IsUnwindTablesDefault(const ArgList &Args) const { +ToolChain::UnwindTableLevel +CrossWindowsToolChain::getDefaultUnwindTableLevel(const ArgList &Args) const { // FIXME: all non-x86 targets need unwind tables, however, LLVM currently does // not know how to emit them. - return getArch() == llvm::Triple::x86_64; + return getArch() == llvm::Triple::x86_64 ? UnwindTableLevel::Asynchronous : UnwindTableLevel::None; } bool CrossWindowsToolChain::isPICDefault() const { diff --git a/clang/lib/Driver/ToolChains/CrossWindows.h b/clang/lib/Driver/ToolChains/CrossWindows.h index bab690ea34d0..165dcdfd5d3a 100644 --- a/clang/lib/Driver/ToolChains/CrossWindows.h +++ b/clang/lib/Driver/ToolChains/CrossWindows.h @@ -55,7 +55,8 @@ class LLVM_LIBRARY_VISIBILITY CrossWindowsToolChain : public Generic_GCC { const llvm::opt::ArgList &Args); bool IsIntegratedAssemblerDefault() const override { return true; } - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; bool isPICDefault() const override; bool isPIEDefault(const llvm::opt::ArgList &Args) const override; bool isPICDefaultForced() const override; diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 7d83948369f8..e466ce935a68 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -2925,13 +2925,16 @@ Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch, return DAL; } -bool MachO::IsUnwindTablesDefault(const ArgList &Args) const { +ToolChain::UnwindTableLevel MachO::getDefaultUnwindTableLevel(const ArgList &Args) const { // Unwind tables are not emitted if -fno-exceptions is supplied (except when // targeting x86_64). - return getArch() == llvm::Triple::x86_64 || - (GetExceptionModel(Args) != llvm::ExceptionHandling::SjLj && - Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, - true)); + if (getArch() == llvm::Triple::x86_64 || + (GetExceptionModel(Args) != llvm::ExceptionHandling::SjLj && + Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, + true))) + return UnwindTableLevel::Asynchronous; + + return UnwindTableLevel::None; } bool MachO::UseDwarfDebugFlags() const { diff --git a/clang/lib/Driver/ToolChains/Darwin.h b/clang/lib/Driver/ToolChains/Darwin.h index 619c05da2598..dd2a03d938fe 100644 --- a/clang/lib/Driver/ToolChains/Darwin.h +++ b/clang/lib/Driver/ToolChains/Darwin.h @@ -254,7 +254,8 @@ class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain { bool UseObjCMixedDispatch() const override { return true; } - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; RuntimeLibType GetDefaultRuntimeLibType() const override { return ToolChain::RLT_CompilerRT; diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index e49e8b0bf7d1..fa6c11265ef8 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -473,7 +473,10 @@ llvm::ExceptionHandling FreeBSD::GetExceptionModel(const ArgList &Args) const { bool FreeBSD::HasNativeLLVMSupport() const { return true; } -bool FreeBSD::IsUnwindTablesDefault(const ArgList &Args) const { return true; } +ToolChain::UnwindTableLevel +FreeBSD::getDefaultUnwindTableLevel(const ArgList &Args) const { + return UnwindTableLevel::Asynchronous; +} bool FreeBSD::isPIEDefault(const llvm::opt::ArgList &Args) const { return getSanitizerArgs(Args).requiresPIE(); diff --git a/clang/lib/Driver/ToolChains/FreeBSD.h b/clang/lib/Driver/ToolChains/FreeBSD.h index 2a721c750a64..e9cba14174ec 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.h +++ b/clang/lib/Driver/ToolChains/FreeBSD.h @@ -73,7 +73,8 @@ class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { llvm::ExceptionHandling GetExceptionModel(const llvm::opt::ArgList &Args) const override; - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; bool isPIEDefault(const llvm::opt::ArgList &Args) const override; SanitizerMask getSupportedSanitizers() const override; unsigned GetDefaultDwarfVersion() const override; diff --git a/clang/lib/Driver/ToolChains/Fuchsia.h b/clang/lib/Driver/ToolChains/Fuchsia.h index f9f3bbfa9fbf..e43cb3b0dddf 100644 --- a/clang/lib/Driver/ToolChains/Fuchsia.h +++ b/clang/lib/Driver/ToolChains/Fuchsia.h @@ -50,8 +50,9 @@ class LLVM_LIBRARY_VISIBILITY Fuchsia : public ToolChain { CXXStdlibType GetDefaultCXXStdlibType() const override { return ToolChain::CST_Libcxx; } - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override { - return true; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override { + return UnwindTableLevel::Asynchronous; } bool isPICDefault() const override { return false; } bool isPIEDefault(const llvm::opt::ArgList &Args) const override { diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index e153f86334aa..6099b42d715f 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -2827,7 +2827,8 @@ void Generic_GCC::printVerboseInfo(raw_ostream &OS) const { RocmInstallation.print(OS); } -bool Generic_GCC::IsUnwindTablesDefault(const ArgList &Args) const { +ToolChain::UnwindTableLevel +Generic_GCC::getDefaultUnwindTableLevel(const ArgList &Args) const { switch (getArch()) { case llvm::Triple::aarch64: case llvm::Triple::ppc: @@ -2836,9 +2837,9 @@ bool Generic_GCC::IsUnwindTablesDefault(const ArgList &Args) const { case llvm::Triple::ppc64le: case llvm::Triple::x86: case llvm::Triple::x86_64: - return true; + return UnwindTableLevel::Asynchronous; default: - return false; + return UnwindTableLevel::None; } } diff --git a/clang/lib/Driver/ToolChains/Gnu.h b/clang/lib/Driver/ToolChains/Gnu.h index 4eb7ab0215ab..b4314a2c849c 100644 --- a/clang/lib/Driver/ToolChains/Gnu.h +++ b/clang/lib/Driver/ToolChains/Gnu.h @@ -296,7 +296,8 @@ class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { void printVerboseInfo(raw_ostream &OS) const override; - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; bool isPICDefault() const override; bool isPIEDefault(const llvm::opt::ArgList &Args) const override; bool isPICDefaultForced() const override; diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 472ffd97a1dc..7e549bfbdffa 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -450,16 +450,20 @@ bool MSVCToolChain::IsIntegratedAssemblerDefault() const { return true; } -bool MSVCToolChain::IsUnwindTablesDefault(const ArgList &Args) const { +ToolChain::UnwindTableLevel +MSVCToolChain::getDefaultUnwindTableLevel(const ArgList &Args) const { // Don't emit unwind tables by default for MachO targets. if (getTriple().isOSBinFormatMachO()) - return false; + return UnwindTableLevel::None; // All non-x86_32 Windows targets require unwind tables. However, LLVM // doesn't know how to generate them for all targets, so only enable // the ones that are actually implemented. - return getArch() == llvm::Triple::x86_64 || getArch() == llvm::Triple::arm || - getArch() == llvm::Triple::thumb || getArch() == llvm::Triple::aarch64; + if (getArch() == llvm::Triple::x86_64 || getArch() == llvm::Triple::arm || + getArch() == llvm::Triple::thumb || getArch() == llvm::Triple::aarch64) + return UnwindTableLevel::Asynchronous; + + return UnwindTableLevel::None; } bool MSVCToolChain::isPICDefault() const { diff --git a/clang/lib/Driver/ToolChains/MSVC.h b/clang/lib/Driver/ToolChains/MSVC.h index f09256ba124e..a3e94db1fc84 100644 --- a/clang/lib/Driver/ToolChains/MSVC.h +++ b/clang/lib/Driver/ToolChains/MSVC.h @@ -51,7 +51,8 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { Action::OffloadKind DeviceOffloadKind) const override; bool IsIntegratedAssemblerDefault() const override; - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; bool isPICDefault() const override; bool isPIEDefault(const llvm::opt::ArgList &Args) const override; bool isPICDefaultForced() const override; diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp index e7710bf12c08..7ba46cba1da4 100644 --- a/clang/lib/Driver/ToolChains/MinGW.cpp +++ b/clang/lib/Driver/ToolChains/MinGW.cpp @@ -493,15 +493,19 @@ bool toolchains::MinGW::HasNativeLLVMSupport() const { return NativeLLVMSupport; } -bool toolchains::MinGW::IsUnwindTablesDefault(const ArgList &Args) const { +ToolChain::UnwindTableLevel +toolchains::MinGW::getDefaultUnwindTableLevel(const ArgList &Args) const { Arg *ExceptionArg = Args.getLastArg(options::OPT_fsjlj_exceptions, options::OPT_fseh_exceptions, options::OPT_fdwarf_exceptions); if (ExceptionArg && ExceptionArg->getOption().matches(options::OPT_fseh_exceptions)) - return true; - return getArch() == llvm::Triple::x86_64 || getArch() == llvm::Triple::arm || - getArch() == llvm::Triple::thumb || getArch() == llvm::Triple::aarch64; + return UnwindTableLevel::Asynchronous; + + if (getArch() == llvm::Triple::x86_64 || getArch() == llvm::Triple::arm || + getArch() == llvm::Triple::thumb || getArch() == llvm::Triple::aarch64) + return UnwindTableLevel::Asynchronous; + return UnwindTableLevel::None; } bool toolchains::MinGW::isPICDefault() const { diff --git a/clang/lib/Driver/ToolChains/MinGW.h b/clang/lib/Driver/ToolChains/MinGW.h index 531b2b9eabf3..bb2b7f6e8f61 100644 --- a/clang/lib/Driver/ToolChains/MinGW.h +++ b/clang/lib/Driver/ToolChains/MinGW.h @@ -66,7 +66,8 @@ class LLVM_LIBRARY_VISIBILITY MinGW : public ToolChain { bool HasNativeLLVMSupport() const override; bool IsIntegratedAssemblerDefault() const override; - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; bool isPICDefault() const override; bool isPIEDefault(const llvm::opt::ArgList &Args) const override; bool isPICDefaultForced() const override; diff --git a/clang/lib/Driver/ToolChains/NetBSD.h b/clang/lib/Driver/ToolChains/NetBSD.h index 8348554fd149..6bcbe16316ce 100644 --- a/clang/lib/Driver/ToolChains/NetBSD.h +++ b/clang/lib/Driver/ToolChains/NetBSD.h @@ -65,8 +65,9 @@ class LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override { - return true; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override { + return UnwindTableLevel::Asynchronous; } llvm::ExceptionHandling GetExceptionModel( diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp b/clang/lib/Driver/ToolChains/OpenBSD.cpp index 8b3a40606ff3..c80c650e18fb 100644 --- a/clang/lib/Driver/ToolChains/OpenBSD.cpp +++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp @@ -363,11 +363,12 @@ Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); } bool OpenBSD::HasNativeLLVMSupport() const { return true; } -bool OpenBSD::IsUnwindTablesDefault(const ArgList &Args) const { - switch (getArch()) { - case llvm::Triple::arm: - return false; - default: - return true; - } +ToolChain::UnwindTableLevel +OpenBSD::getDefaultUnwindTableLevel(const ArgList &Args) const { + switch (getArch()) { + case llvm::Triple::arm: + return UnwindTableLevel::None; + default: + return UnwindTableLevel::Asynchronous; + } } diff --git a/clang/lib/Driver/ToolChains/OpenBSD.h b/clang/lib/Driver/ToolChains/OpenBSD.h index 2d4c4e34520b..b7d3d1b5b6dc 100644 --- a/clang/lib/Driver/ToolChains/OpenBSD.h +++ b/clang/lib/Driver/ToolChains/OpenBSD.h @@ -82,7 +82,8 @@ class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component, FileType Type = ToolChain::FT_Static) const override; - bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override; + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; LangOptions::StackProtectorMode GetDefaultStackProtectorLevel(bool KernelOrKext) const override { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits