[PATCH] D50414: [libunwind][include] Add SEH declarations to <unwind.h>.
Charles Davis via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 7 15:53:17 PDT 2018
cdavis5x created this revision.
cdavis5x added reviewers: mstorsjo, rnk, compnerd, smeenai.
Herald added subscribers: cfe-commits, chrib, christof.
Make the `_Unwind_Exception` struct correct under SEH. Add a
declaration of `_GCC_specific_handler()`, which is used by SEH versions
of Itanium personality handlers to do common setup. Roughly corresponds
to Clang's https://reviews.llvm.org/D50380.
Repository:
rUNW libunwind
https://reviews.llvm.org/D50414
Files:
include/unwind.h
Index: include/unwind.h
===================================================================
--- include/unwind.h
+++ include/unwind.h
@@ -19,6 +19,10 @@
#include <stdint.h>
#include <stddef.h>
+#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__)
+#include <windows.h>
+#endif
+
#if defined(__APPLE__)
#define LIBUNWIND_UNAVAIL __attribute__ (( unavailable ))
#else
@@ -120,13 +124,17 @@
uint64_t exception_class;
void (*exception_cleanup)(_Unwind_Reason_Code reason,
_Unwind_Exception *exc);
+#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__)
+ uintptr_t private_[6];
+#else
uintptr_t private_1; // non-zero means forced unwind
uintptr_t private_2; // holds sp that phase1 found for phase2 to use
+#endif
#if __SIZEOF_POINTER__ == 4
// The implementation of _Unwind_Exception uses an attribute mode on the
// above fields which has the side effect of causing this whole struct to
- // round up to 32 bytes in size. To be more explicit, we add pad fields
- // added for binary compatibility.
+ // round up to 32 bytes in size (48 with SEH). To be more explicit, we add
+ // pad fields added for binary compatibility.
uint32_t reserved[3];
#endif
// The Itanium ABI requires that _Unwind_Exception objects are "double-word
@@ -369,6 +377,24 @@
extern void *__deregister_frame_info_bases(const void *fde)
LIBUNWIND_UNAVAIL;
+#if defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__)
+// This is the common wrapper for GCC-style personality functions with SEH.
+#ifdef __x86_64__
+// The DISPATCHER_CONTEXT struct is only defined on x64.
+extern EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD exc,
+ PVOID frame,
+ PCONTEXT ctx,
+ PDISPATCHER_CONTEXT disp,
+ _Unwind_Personality_Fn pers);
+#else
+extern EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD exc,
+ PVOID frame,
+ PCONTEXT ctx,
+ PVOID disp,
+ _Unwind_Personality_Fn pers);
+#endif
+#endif
+
#ifdef __cplusplus
}
#endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D50414.159611.patch
Type: text/x-patch
Size: 2403 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180807/26f9716f/attachment.bin>
More information about the llvm-commits
mailing list