On Thu, Oct 12, 2017 at 4:32 PM, Hans-Peter Nilsson <[email protected]> wrote:
> On Thu, 12 Oct 2017, Tsimbalist, Igor V wrote:
>> * unwind.inc (_Unwind_RaiseException_Phase2): Use FRAMES_P_DECL,
>> FRAMES_VAR_DECL_1, FRAMES_VAR_INC and FRAMES_P_UPDATE.
>> (_Unwind_RaiseException): Use FRAMES_VAR_DECL, FRAMES_VAR_P and
>> FRAMES_VAR.
>> (_Unwind_ForcedUnwind_Phase2): Use FRAMES_P_DECL,
>> FRAMES_VAR_DECL_1, FRAMES_VAR_INC, FRAMES_P_UPDATE.
>> (_Unwind_ForcedUnwind): Use FRAMES_VAR_DECL, FRAMES_VAR_P and
>> FRAMES_VAR.
>> (_Unwind_Resume): Use FRAMES_VAR_DECL, FRAMES_VAR_P and
>> FRAMES_VAR.
>> (_Unwind_Resume_or_Rethrow): Use FRAMES_VAR_DECL, FRAMES_VAR_P
>> and FRAMES_VAR.
>
> I think you'll have to test this on a non-CET target too,
> because it looks like this won't fly:
>
> - uw_install_context (&this_context, &cur_context);
> + uw_install_context (&this_context, &cur_context, FRAMES_VAR);
>
> You'll be introducing a naked comma for the default empty
It is done on purpose. There are
/* Install TARGET into CURRENT so that we can return to it. This is a
macro because __builtin_eh_return must be invoked in the context of
our caller. */
#define uw_install_context(CURRENT, TARGET, FRAMES) \
do \
{ \
long offset = uw_install_context_1 ((CURRENT), (TARGET)); \
void *handler = uw_frob_return_addr ((CURRENT), (TARGET)); \
_Unwind_DebugHook ((TARGET)->cfa, handler); \
_Unwind_Frames_Extra (FRAMES); \
__builtin_eh_return (offset, handler); \
} \
while (0)
For non-CET targets, we have
#define FRAMES_VAR
[hjl@gnu-6 tmp]$ cat bar.c
#define FRAMES_VAR
#define foo(x, FRAMES) _Unwind_Frames_Extra (FRAMES)
foo (xxx, FRAMES_VAR);
[hjl@gnu-6 tmp]$ gcc -E bar.c
# 1 "bar.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "bar.c"
_Unwind_Frames_Extra ();
[hjl@gnu-6 tmp]$
> FRAMES_VAR. I like the basic approach though, FWIW.
>
> brgds, H-P
Thanks.
--
H.J.