[PATCH] D55748: [AArch64] [MinGW] Allow enabling SEH exceptions

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 16 14:19:01 PST 2018


mstorsjo created this revision.
mstorsjo added reviewers: rnk, mgrang, ssijaric.
Herald added subscribers: JDevlieghere, kristof.beyls, javed.absar, aprantl.

The default for mingw/aarch64 still is dwarf, but SEH exceptions can now be enabled optionally for the MinGW target.

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:
  rL LLVM

https://reviews.llvm.org/D55748

Files:
  lib/MC/MCObjectFileInfo.cpp
  lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp
  test/CodeGen/AArch64/wineh-mingw.ll


Index: test/CodeGen/AArch64/wineh-mingw.ll
===================================================================
--- /dev/null
+++ test/CodeGen/AArch64/wineh-mingw.ll
@@ -0,0 +1,48 @@
+; RUN: llc < %s -exception-model=wineh -mtriple=aarch64-pc-mingw32 | FileCheck %s -check-prefix=WINEH
+; RUN: llc < %s -exception-model=wineh -mtriple=aarch64-pc-mingw32 -filetype=obj | llvm-readobj -s | FileCheck %s -check-prefix=WINEH-SECTIONS
+
+; Check emission of eh handler and handler data
+declare i32 @_d_eh_personality(i32, i32, i64, i8*, i8*)
+declare void @_d_eh_resume_unwind(i8*)
+
+declare i32 @bar()
+
+define i32 @foo4() #0 personality i32 (i32, i32, i64, i8*, i8*)* @_d_eh_personality {
+entry:
+  %step = alloca i32, align 4
+  store i32 0, i32* %step
+  %tmp = load i32, i32* %step
+
+  %tmp1 = invoke i32 @bar()
+          to label %finally unwind label %landingpad
+
+finally:
+  store i32 1, i32* %step
+  br label %endtryfinally
+
+landingpad:
+  %landing_pad = landingpad { i8*, i32 }
+          cleanup
+  %tmp3 = extractvalue { i8*, i32 } %landing_pad, 0
+  store i32 2, i32* %step
+  call void @_d_eh_resume_unwind(i8* %tmp3)
+  unreachable
+
+endtryfinally:
+  %tmp10 = load i32, i32* %step
+  ret i32 %tmp10
+}
+; WINEH-LABEL: foo4:
+; WINEH: .seh_proc foo4
+; WINEH: .seh_handler _d_eh_personality, @unwind, @except
+; WINEH: ret
+; WINEH: .section .xdata,"dr"
+; WINEH-NEXT: .seh_handlerdata
+; WINEH-NEXT: .text
+; WINEH-NEXT: .seh_endproc
+; WINEH: .section .xdata,"dr"
+; WINEH-NEXT: .p2align 2
+; WINEH-NEXT: GCC_except_table0:
+
+; WINEH-SECTIONS: Name: .xdata
+; WINEH-SECTIONS-NOT: Name: .gcc_except_table
Index: lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp
===================================================================
--- lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp
+++ lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp
@@ -132,4 +132,5 @@
 
   CommentString = "//";
   ExceptionsType = ExceptionHandling::DwarfCFI;
+  WinEHEncodingType = WinEH::EncodingType::Itanium;
 }
Index: lib/MC/MCObjectFileInfo.cpp
===================================================================
--- lib/MC/MCObjectFileInfo.cpp
+++ lib/MC/MCObjectFileInfo.cpp
@@ -510,7 +510,7 @@
       ".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
       SectionKind::getReadOnly());
 
-  if (T.getArch() == Triple::x86_64) {
+  if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::aarch64) {
     // On Windows 64 with SEH, the LSDA is emitted into the .xdata section
     LSDASection = nullptr;
   } else {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55748.178408.patch
Type: text/x-patch
Size: 2559 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181216/4382f00d/attachment.bin>


More information about the llvm-commits mailing list