public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] libstdc++: Update personality function for purecap
@ 2022-07-12 10:36 Alex Coplan
0 siblings, 0 replies; only message in thread
From: Alex Coplan @ 2022-07-12 10:36 UTC (permalink / raw)
To: gcc-cvs, libstdc++-cvs
https://gcc.gnu.org/g:afaa9f2bb327ae04a22d26c5793079f7c06da1bf
commit afaa9f2bb327ae04a22d26c5793079f7c06da1bf
Author: Alex Coplan <alex.coplan@arm.com>
Date: Sat Jun 18 11:45:33 2022 +0100
libstdc++: Update personality function for purecap
This updates the C++ personality function following the changes made to
the libgcc C personality function for pure-capability Morello. There are
two main changes here. The first is using
__builtin_code_address_from_pointer to drop the LSB from Morello code
pointers when searching through call-site tables (without this we would
never find the right landing pad when unwinding).
The second change is to reflect the change in the exception table format
for pure-capability Morello where the landing pad is a capability
indirected by an offset in the call-site table.
We also improve on the robustness of the existing code in the C
personality function by asserting that we only see the implemented
capability landing pad marker value (0xd) and also handling the case
where this is no associated landing pad with a given call-site table
entry.
This fixes many execution tests involving exception handling in the g++
testsuite.
libgcc/ChangeLog:
* unwind-c.c (PERSONALITY_FUNCTION): Fix handling of case where
call-site table entry doesn't have an associated landing pad.
libstdc++-v3/ChangeLog:
* libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Adapt for
pure-capability Morello.
Diff:
---
libgcc/unwind-c.c | 17 +++++++++---
libstdc++-v3/libsupc++/eh_personality.cc | 45 +++++++++++++++++++++++++++-----
2 files changed, 52 insertions(+), 10 deletions(-)
diff --git a/libgcc/unwind-c.c b/libgcc/unwind-c.c
index ac0085c1159..a2a5c2e92bf 100644
--- a/libgcc/unwind-c.c
+++ b/libgcc/unwind-c.c
@@ -214,10 +214,19 @@ PERSONALITY_FUNCTION (int version,
_Unwind_Ptr marker = 0;
/* Single uleb128 value as the capability marker. */
p = read_encoded_value (0, DW_EH_PE_uleb128, p, &marker);
- /* 8 byte value indicating the offset from said 8 byte value.
- Could use DW_EH_PE_indirect except that the offset is zero if there is
- no landing pad. */
- p = read_encoded_value (0, DW_EH_PE_pcrel | DW_EH_PE_udata8, p, &cs_lp);
+ if (marker == 0xd)
+ {
+ /* 8 byte value indicating the offset from said 8 byte value.
+ Could use DW_EH_PE_indirect except that the offset is zero
+ if there is no landing pad. */
+ p = read_encoded_value (0, DW_EH_PE_pcrel | DW_EH_PE_udata8, p,
+ &cs_lp);
+ }
+ else if (marker)
+ /* Unsupported landing pad marker value. */
+ __builtin_abort ();
+ else
+ cs_lp = 0; /* No landing pad. */
# else
p = read_encoded_value (0, info.call_site_encoding, p, &cs_lp);
# endif
diff --git a/libstdc++-v3/libsupc++/eh_personality.cc b/libstdc++-v3/libsupc++/eh_personality.cc
index fd7cd6fc798..25079f76725 100644
--- a/libstdc++-v3/libsupc++/eh_personality.cc
+++ b/libstdc++-v3/libsupc++/eh_personality.cc
@@ -375,7 +375,8 @@ PERSONALITY_FUNCTION (int version,
const unsigned char *language_specific_data;
const unsigned char *action_record;
const unsigned char *p;
- _Unwind_Ptr landing_pad, ip;
+ _Unwind_Ptr landing_pad, ip_ptr;
+ _Unwind_Address ip;
int handler_switch_value;
void* thrown_ptr = 0;
bool foreign_exception;
@@ -422,8 +423,8 @@ PERSONALITY_FUNCTION (int version,
// function and LSDA pointers. The ARM implementation caches these in
// the exception header (UCB). To avoid rewriting everything we make a
// virtual scratch register point at the UCB.
- ip = (_Unwind_Ptr) ue_header;
- _Unwind_SetGR(context, UNWIND_POINTER_REG, ip);
+ ip_ptr = (_Unwind_Ptr) ue_header;
+ _Unwind_SetGR (context, UNWIND_POINTER_REG, ip_ptr);
#else
__cxa_exception* xh = __get_exception_header_from_ue(ue_header);
@@ -454,10 +455,17 @@ PERSONALITY_FUNCTION (int version,
p = parse_lsda_header (context, language_specific_data, &info);
info.ttype_base = base_of_encoded_value (info.ttype_encoding, context);
#ifdef _GLIBCXX_HAVE_GETIPINFO
- ip = _Unwind_GetIPInfo (context, &ip_before_insn);
+ ip_ptr = _Unwind_GetIPInfo (context, &ip_before_insn);
#else
- ip = _Unwind_GetIP (context);
+ ip_ptr = _Unwind_GetIP (context);
#endif
+
+#ifdef __USING_SJLJ_EXCEPTIONS__
+ ip = (_Unwind_Address) ip_ptr;
+#else
+ ip = __builtin_code_address_from_pointer ((void *)ip_ptr);
+#endif
+
if (! ip_before_insn)
--ip;
landing_pad = 0;
@@ -502,7 +510,26 @@ PERSONALITY_FUNCTION (int version,
// Note that all call-site encodings are "absolute" displacements.
p = read_encoded_value (0, info.call_site_encoding, p, &cs_start);
p = read_encoded_value (0, info.call_site_encoding, p, &cs_len);
+#ifdef __CHERI_PURE_CAPABILITY__
+ // Single uleb128 value as the capability marker.
+ _Unwind_Ptr marker = 0;
+ p = read_encoded_value (0, DW_EH_PE_uleb128, p, &marker);
+ if (marker == 0xd)
+ {
+ // 8-byte offset to the (indirected) capability.
+ p = read_encoded_value (0, DW_EH_PE_pcrel | DW_EH_PE_udata8, p,
+ &cs_lp);
+ }
+ else if (marker)
+ {
+ // Unsupported landing pad marker value.
+ std::abort ();
+ }
+ else
+ cs_lp = 0; // No landing pad.
+#else
p = read_encoded_value (0, info.call_site_encoding, p, &cs_lp);
+#endif
p = read_uleb128 (p, &cs_action);
// The table is sorted, so if we've passed the ip, stop.
@@ -511,7 +538,13 @@ PERSONALITY_FUNCTION (int version,
else if (ip < info.Start + cs_start + cs_len)
{
if (cs_lp)
- landing_pad = info.LPStart + cs_lp;
+ {
+#ifdef __CHERI_PURE_CAPABILITY__
+ landing_pad = *(_Unwind_Ptr *)cs_lp;
+#else
+ landing_pad = info.LPStart + cs_lp;
+#endif
+ }
if (cs_action)
action_record = info.action_table + cs_action - 1;
goto found_something;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-07-12 10:36 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-12 10:36 [gcc(refs/vendors/ARM/heads/morello)] libstdc++: Update personality function for purecap Alex Coplan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).