[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