[PATCH] D55749: [Driver] Automatically enable -munwind-tables if -fseh-exceptions is enabled
Martin Storsjö via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Dec 16 14:24:29 PST 2018
mstorsjo created this revision.
mstorsjo added reviewers: rnk, mgrang, ssijaric.
Herald added subscribers: JDevlieghere, kristof.beyls, javed.absar, aprantl.
For targets where SEH exceptions are used by default (on MinGW, only x86_64 so far), -munwind-tables are added automatically. If
-fseh-exeptions is enabled on a target where SEH exeptions are availble but not enabled by default yet (aarch64), we need to pass -munwind-tables if -fseh-exceptions was specified.
Once things have settled and this works fine in practice, the default can be switched from dwarf to SEH. Or is this unnecessary churn and we should just keep off this until the default can be changed?
Repository:
rC Clang
https://reviews.llvm.org/D55749
Files:
lib/Driver/ToolChains/Clang.cpp
test/Driver/windows-exceptions.cpp
Index: test/Driver/windows-exceptions.cpp
===================================================================
--- test/Driver/windows-exceptions.cpp
+++ test/Driver/windows-exceptions.cpp
@@ -2,8 +2,11 @@
// RUN: %clang -target x86_64-windows-msvc -c %s -### 2>&1 | FileCheck -check-prefix=MSVC %s
// RUN: %clang -target i686-windows-gnu -c %s -### 2>&1 | FileCheck -check-prefix=MINGW-DWARF %s
// RUN: %clang -target x86_64-windows-gnu -c %s -### 2>&1 | FileCheck -check-prefix=MINGW-SEH %s
+// RUN: %clang -target aarch64-windows-gnu -c %s -### 2>&1 | FileCheck -check-prefix=MINGW-DWARF %s
+// RUN: %clang -target aarch64-windows-gnu -fseh-exceptions -c %s -### 2>&1 | FileCheck -check-prefix=MINGW-SEH %s
MSVC-NOT: -fdwarf-exceptions
MSVC-NOT: -fseh-exceptions
MINGW-DWARF: -fdwarf-exceptions
+MINGW-SEH: -munwind-tables
MINGW-SEH: -fseh-exceptions
Index: lib/Driver/ToolChains/Clang.cpp
===================================================================
--- lib/Driver/ToolChains/Clang.cpp
+++ lib/Driver/ToolChains/Clang.cpp
@@ -3917,15 +3917,20 @@
if (Freestanding)
CmdArgs.push_back("-ffreestanding");
+ Arg *ExceptionArg = Args.getLastArg(options::OPT_fsjlj_exceptions,
+ options::OPT_fseh_exceptions,
+ options::OPT_fdwarf_exceptions);
// This is a coarse approximation of what llvm-gcc actually does, both
// -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
// complicated ways.
- bool AsynchronousUnwindTables =
- Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
- options::OPT_fno_asynchronous_unwind_tables,
- (TC.IsUnwindTablesDefault(Args) ||
- TC.getSanitizerArgs().needsUnwindTables()) &&
- !Freestanding);
+ bool AsynchronousUnwindTables = Args.hasFlag(
+ options::OPT_fasynchronous_unwind_tables,
+ options::OPT_fno_asynchronous_unwind_tables,
+ (TC.IsUnwindTablesDefault(Args) ||
+ (ExceptionArg &&
+ ExceptionArg->getOption().matches(options::OPT_fseh_exceptions)) ||
+ TC.getSanitizerArgs().needsUnwindTables()) &&
+ !Freestanding);
if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
AsynchronousUnwindTables))
CmdArgs.push_back("-munwind-tables");
@@ -4704,11 +4709,8 @@
addExceptionArgs(Args, InputType, TC, KernelOrKext, Runtime, CmdArgs);
// Handle exception personalities
- Arg *A = Args.getLastArg(options::OPT_fsjlj_exceptions,
- options::OPT_fseh_exceptions,
- options::OPT_fdwarf_exceptions);
- if (A) {
- const Option &Opt = A->getOption();
+ if (ExceptionArg) {
+ const Option &Opt = ExceptionArg->getOption();
if (Opt.matches(options::OPT_fsjlj_exceptions))
CmdArgs.push_back("-fsjlj-exceptions");
if (Opt.matches(options::OPT_fseh_exceptions))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55749.178410.patch
Type: text/x-patch
Size: 2983 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181216/2986fda9/attachment.bin>
More information about the cfe-commits
mailing list