Skip to content

Commit 637245f

Browse files
committed
[runtimes][PAC] Harden unwinding when possible (#138571)
This hardens the unwinding logic and datastructures on systems that support pointer authentication. The approach taken to hardening is to harden the schemas of as many high value fields in the myriad structs as possible, and then also explicitly qualify local variables referencing privileged or security critical values. This ABI is exposed to the personality functions, and so updating to conform to that is a mandatory change, but to reduce the risk of oracles, the adoption also hardened the locals and datastructures in compiler-rt and libcxxabi.
1 parent eed98e1 commit 637245f

15 files changed

+601
-102
lines changed

compiler-rt/lib/builtins/gcc_personality_v0.c

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,46 @@ EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, void *, PCONTEXT,
3030
_Unwind_Personality_Fn);
3131
#endif
3232

33+
#if __has_include(<ptrauth.h>)
34+
#include <ptrauth.h>
35+
#endif
36+
37+
#if defined(__APPLE__) && __has_feature(ptrauth_qualifier)
38+
#if __has_feature(ptrauth_restricted_intptr_qualifier)
39+
#define PERSONALITY_PTRAUTH_RESTRICTED_INTPTR(key, addressDiscriminated, \
40+
discriminatorString) \
41+
__ptrauth_restricted_intptr( \
42+
key, addressDiscriminated, \
43+
ptrauth_string_discriminator(discriminatorString))
44+
#else
45+
#define PERSONALITY_PTRAUTH_RESTRICTED_INTPTR(key, addressDiscriminated, \
46+
discriminatorString) \
47+
__ptrauth(key, addressDiscriminated, \
48+
ptrauth_string_discriminator(discriminatorString))
49+
#endif
50+
#else
51+
#define PERSONALITY_PTRAUTH_RESTRICTED_INTPTR(key, addressDiscriminated, \
52+
discriminatorString)
53+
#endif
54+
55+
// Helper wrappers for pointer auth qualifiers because we use a lot of variants
56+
// Suffixes:
57+
// * PDC : ptrauth_key_process_dependent_code
58+
// * RA : ptrauth_key_return_address
59+
// * FN : ptrauth_key_function_pointer
60+
#define PERSONALITY_PTRAUTH_RI_FN(__discriminator) \
61+
PERSONALITY_PTRAUTH_RESTRICTED_INTPTR(ptrauth_key_function_pointer, \
62+
/*__address_discriminated=*/1, \
63+
__discriminator)
64+
#define PERSONALITY_PTRAUTH_RI_PDC(__discriminator) \
65+
PERSONALITY_PTRAUTH_RESTRICTED_INTPTR(ptrauth_key_process_dependent_code, \
66+
/*__address_discriminated=*/1, \
67+
__discriminator)
68+
#define PERSONALITY_PTRAUTH_RI_RA(__discriminator) \
69+
PERSONALITY_PTRAUTH_RESTRICTED_INTPTR(ptrauth_key_return_address, \
70+
/*__address_discriminated=*/1, \
71+
__discriminator)
72+
3373
// Pointer encodings documented at:
3474
// http://refspecs.freestandards.org/LSB_1.3.0/gLSB/gLSB/ehframehdr.html
3575

@@ -205,7 +245,8 @@ COMPILER_RT_ABI _Unwind_Reason_Code __gcc_personality_v0(
205245
return continueUnwind(exceptionObject, context);
206246

207247
uintptr_t pc = (uintptr_t)_Unwind_GetIP(context) - 1;
208-
uintptr_t funcStart = (uintptr_t)_Unwind_GetRegionStart(context);
248+
uintptr_t PERSONALITY_PTRAUTH_RI_FN("__gcc_personality_v0'funcStart")
249+
funcStart = (uintptr_t)_Unwind_GetRegionStart(context);
209250
uintptr_t pcOffset = pc - funcStart;
210251

211252
// Parse LSDA header.
@@ -224,11 +265,14 @@ COMPILER_RT_ABI _Unwind_Reason_Code __gcc_personality_v0(
224265
const uint8_t *callSiteTableEnd = callSiteTableStart + callSiteTableLength;
225266
const uint8_t *p = callSiteTableStart;
226267
while (p < callSiteTableEnd) {
227-
uintptr_t start = readEncodedPointer(&p, callSiteEncoding);
228-
size_t length = readEncodedPointer(&p, callSiteEncoding);
229-
size_t landingPad = readEncodedPointer(&p, callSiteEncoding);
268+
uintptr_t PERSONALITY_PTRAUTH_RI_PDC("__gcc_personality_v0'start") start =
269+
readEncodedPointer(&p, callSiteEncoding);
270+
size_t PERSONALITY_PTRAUTH_RI_PDC("__gcc_personality_v0'length") length =
271+
readEncodedPointer(&p, callSiteEncoding);
272+
size_t PERSONALITY_PTRAUTH_RI_PDC("__gcc_personality_v0'landingPadOffset")
273+
landingPadOffset = readEncodedPointer(&p, callSiteEncoding);
230274
readULEB128(&p); // action value not used for C code
231-
if (landingPad == 0)
275+
if (landingPadOffset == 0)
232276
continue; // no landing pad for this entry
233277
if ((start <= pcOffset) && (pcOffset < (start + length))) {
234278
// Found landing pad for the PC.
@@ -238,7 +282,20 @@ COMPILER_RT_ABI _Unwind_Reason_Code __gcc_personality_v0(
238282
_Unwind_SetGR(context, __builtin_eh_return_data_regno(0),
239283
(uintptr_t)exceptionObject);
240284
_Unwind_SetGR(context, __builtin_eh_return_data_regno(1), 0);
241-
_Unwind_SetIP(context, (funcStart + landingPad));
285+
#define LANDING_PAD_DISCRIMINATOR "__gcc_personality_v0'landingPad"
286+
size_t PERSONALITY_PTRAUTH_RI_RA(LANDING_PAD_DISCRIMINATOR) landingPad =
287+
funcStart + landingPadOffset;
288+
#if defined(__APPLE__) && __has_feature(ptrauth_qualifier)
289+
uintptr_t stack_pointer = _Unwind_GetGR(context, -2);
290+
const uintptr_t existingDiscriminator = ptrauth_blend_discriminator(
291+
&landingPad, ptrauth_string_discriminator(LANDING_PAD_DISCRIMINATOR));
292+
uintptr_t newIP = (uintptr_t)ptrauth_auth_and_resign(
293+
*(void **)&landingPad, ptrauth_key_function_pointer,
294+
existingDiscriminator, ptrauth_key_return_address, stack_pointer);
295+
_Unwind_SetIP(context, newIP);
296+
#else
297+
_Unwind_SetIP(context, landingPad);
298+
#endif
242299
return _URC_INSTALL_CONTEXT;
243300
}
244301
}

compiler-rt/lib/profile/InstrProfilingValue.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,13 @@ __llvm_profile_iterate_data(const __llvm_profile_data *Data) {
8383
/* This method is only used in value profiler mock testing. */
8484
COMPILER_RT_VISIBILITY void *
8585
__llvm_get_function_addr(const __llvm_profile_data *Data) {
86-
return Data->FunctionPointer;
86+
void *FP = Data->FunctionPointer;
87+
#if __has_feature(ptrauth_calls)
88+
// This is only used for tests where we compare against what happens to be
89+
// signed pointers.
90+
FP = ptrauth_sign_unauthenticated(FP, VALID_CODE_KEY, 0);
91+
#endif
92+
return FP;
8793
}
8894

8995
/* Allocate an array that holds the pointers to the linked lists of

libcxxabi/include/__cxxabi_config.h

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,23 @@
3232
#endif
3333

3434
#if defined(_WIN32)
35-
#if defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS) || (defined(__MINGW32__) && !defined(_LIBCXXABI_BUILDING_LIBRARY))
36-
#define _LIBCXXABI_HIDDEN
37-
#define _LIBCXXABI_DATA_VIS
38-
#define _LIBCXXABI_FUNC_VIS
39-
#define _LIBCXXABI_TYPE_VIS
40-
#elif defined(_LIBCXXABI_BUILDING_LIBRARY)
41-
#define _LIBCXXABI_HIDDEN
42-
#define _LIBCXXABI_DATA_VIS __declspec(dllexport)
43-
#define _LIBCXXABI_FUNC_VIS __declspec(dllexport)
44-
#define _LIBCXXABI_TYPE_VIS __declspec(dllexport)
45-
#else
46-
#define _LIBCXXABI_HIDDEN
47-
#define _LIBCXXABI_DATA_VIS __declspec(dllimport)
48-
#define _LIBCXXABI_FUNC_VIS __declspec(dllimport)
49-
#define _LIBCXXABI_TYPE_VIS __declspec(dllimport)
50-
#endif
35+
# if defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS) || \
36+
(defined(__MINGW32__) && !defined(_LIBCXXABI_BUILDING_LIBRARY))
37+
# define _LIBCXXABI_HIDDEN
38+
# define _LIBCXXABI_DATA_VIS
39+
# define _LIBCXXABI_FUNC_VIS
40+
# define _LIBCXXABI_TYPE_VIS
41+
# elif defined(_LIBCXXABI_BUILDING_LIBRARY)
42+
# define _LIBCXXABI_HIDDEN
43+
# define _LIBCXXABI_DATA_VIS __declspec(dllexport)
44+
# define _LIBCXXABI_FUNC_VIS __declspec(dllexport)
45+
# define _LIBCXXABI_TYPE_VIS __declspec(dllexport)
46+
# else
47+
# define _LIBCXXABI_HIDDEN
48+
# define _LIBCXXABI_DATA_VIS __declspec(dllimport)
49+
# define _LIBCXXABI_FUNC_VIS __declspec(dllimport)
50+
# define _LIBCXXABI_TYPE_VIS __declspec(dllimport)
51+
# endif
5152
#else
5253
#if !defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
5354
#define _LIBCXXABI_HIDDEN __attribute__((__visibility__("hidden")))
@@ -109,4 +110,38 @@
109110
# define _LIBCXXABI_NOEXCEPT noexcept
110111
#endif
111112

113+
#if __has_include(<ptrauth.h>)
114+
# include <ptrauth.h>
115+
#endif
116+
117+
#if defined(__APPLE__) && __has_feature(ptrauth_qualifier)
118+
# define _LIBCXXABI_PTRAUTH(__key, __address_discriminated, __discriminator) \
119+
__ptrauth(__key, __address_discriminated, ptrauth_string_discriminator(__discriminator))
120+
// This work around is required to support divergence in spelling
121+
// during the ptrauth upstreaming process.
122+
# if __has_feature(ptrauth_restricted_intptr_qualifier)
123+
# define _LIBCXXABI_PTRAUTH_RESTRICTED_INTPTR(__key, __address_discriminated, __discriminator) \
124+
__ptrauth_restricted_intptr(__key, __address_discriminated, ptrauth_string_discriminator(__discriminator))
125+
# else
126+
# define _LIBCXXABI_PTRAUTH_RESTRICTED_INTPTR(__key, __address_discriminated, __discriminator) \
127+
__ptrauth(__key, __address_discriminated, ptrauth_string_discriminator(__discriminator))
128+
# endif
129+
#else
130+
# define _LIBCXXABI_PTRAUTH(__key, __address_discriminated, __discriminator)
131+
# define _LIBCXXABI_PTRAUTH_RESTRICTED_INTPTR(__key, __address_discriminated, __discriminator)
132+
#endif
133+
134+
// Helper wrappers for pointer auth qualifiers because we use a lot of variants
135+
// Suffixes:
136+
// * _RI : qualifier is __ptrauth_restricted_intptr
137+
// * PDD : key is ptrauth_key_process_dependent_data
138+
// * FN : key is ptrauth_key_function_pointer
139+
#define _LIBCXXABI_PTRAUTH_PDD(__discriminator) \
140+
_LIBCXXABI_PTRAUTH(ptrauth_key_process_dependent_data, /*__address_discriminated=*/1, __discriminator)
141+
#define _LIBCXXABI_PTRAUTH_FN(__discriminator) \
142+
_LIBCXXABI_PTRAUTH(ptrauth_key_function_pointer, /*__address_discriminated=*/1, __discriminator)
143+
#define _LIBCXXABI_PTRAUTH_RI_PDD(__discriminator) \
144+
_LIBCXXABI_PTRAUTH_RESTRICTED_INTPTR(ptrauth_key_process_dependent_data, /*__address_discriminated=*/1, \
145+
__discriminator)
146+
112147
#endif // ____CXXABI_CONFIG_H

libcxxabi/src/cxa_exception.h

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ struct _LIBCXXABI_HIDDEN __cxa_exception {
4747
// In Wasm, a destructor returns its argument
4848
void *(_LIBCXXABI_DTOR_FUNC *exceptionDestructor)(void *);
4949
#else
50-
void (_LIBCXXABI_DTOR_FUNC *exceptionDestructor)(void *);
50+
void(_LIBCXXABI_DTOR_FUNC* _LIBCXXABI_PTRAUTH_FN("__cxa_exception::exceptionDestructor")
51+
exceptionDestructor)(void*);
5152
#endif
52-
std::unexpected_handler unexpectedHandler;
53-
std::terminate_handler terminateHandler;
53+
std::unexpected_handler _LIBCXXABI_PTRAUTH_FN("__cxa_exception::unexpectedHandler") unexpectedHandler;
54+
std::terminate_handler _LIBCXXABI_PTRAUTH_FN("__cxa_exception::terminateHandler") terminateHandler;
5455

5556
__cxa_exception *nextException;
5657

@@ -61,10 +62,10 @@ struct _LIBCXXABI_HIDDEN __cxa_exception {
6162
int propagationCount;
6263
#else
6364
int handlerSwitchValue;
64-
const unsigned char *actionRecord;
65-
const unsigned char *languageSpecificData;
66-
void *catchTemp;
67-
void *adjustedPtr;
65+
const unsigned char* _LIBCXXABI_PTRAUTH_PDD("__cxa_exception::actionRecord") actionRecord;
66+
const unsigned char* _LIBCXXABI_PTRAUTH_PDD("__cxa_exception::languageSpecificData") languageSpecificData;
67+
void* _LIBCXXABI_PTRAUTH_PDD("__cxa_exception::catchTemp") catchTemp;
68+
void* _LIBCXXABI_PTRAUTH_PDD("__cxa_exception::adjustedPtr") adjustedPtr;
6869
#endif
6970

7071
#if !defined(__LP64__) && !defined(_WIN64) && !defined(_LIBCXXABI_ARM_EHABI)
@@ -79,16 +80,19 @@ struct _LIBCXXABI_HIDDEN __cxa_exception {
7980
// http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html
8081
// The layout of this structure MUST match the layout of __cxa_exception, with
8182
// primaryException instead of referenceCount.
83+
// The tags used in the pointer authentication qualifiers also need to match
84+
// those of the corresponding members in __cxa_exception.
8285
struct _LIBCXXABI_HIDDEN __cxa_dependent_exception {
8386
#if defined(__LP64__) || defined(_WIN64) || defined(_LIBCXXABI_ARM_EHABI)
8487
void* reserve; // padding.
8588
void* primaryException;
8689
#endif
8790

8891
std::type_info *exceptionType;
89-
void (_LIBCXXABI_DTOR_FUNC *exceptionDestructor)(void *);
90-
std::unexpected_handler unexpectedHandler;
91-
std::terminate_handler terminateHandler;
92+
void(_LIBCXXABI_DTOR_FUNC* _LIBCXXABI_PTRAUTH_FN("__cxa_exception::exceptionDestructor")
93+
exceptionDestructor)(void*);
94+
std::unexpected_handler _LIBCXXABI_PTRAUTH_FN("__cxa_exception::unexpectedHandler") unexpectedHandler;
95+
std::terminate_handler _LIBCXXABI_PTRAUTH_FN("__cxa_exception::terminateHandler") terminateHandler;
9296

9397
__cxa_exception *nextException;
9498

@@ -99,10 +103,10 @@ struct _LIBCXXABI_HIDDEN __cxa_dependent_exception {
99103
int propagationCount;
100104
#else
101105
int handlerSwitchValue;
102-
const unsigned char *actionRecord;
103-
const unsigned char *languageSpecificData;
104-
void * catchTemp;
105-
void *adjustedPtr;
106+
const unsigned char* _LIBCXXABI_PTRAUTH_PDD("__cxa_exception::actionRecord") actionRecord;
107+
const unsigned char* _LIBCXXABI_PTRAUTH_PDD("__cxa_exception::languageSpecificData") languageSpecificData;
108+
void* _LIBCXXABI_PTRAUTH_PDD("__cxa_exception::catchTemp") catchTemp;
109+
void* _LIBCXXABI_PTRAUTH_PDD("__cxa_exception::adjustedPtr") adjustedPtr;
106110
#endif
107111

108112
#if !defined(__LP64__) && !defined(_WIN64) && !defined(_LIBCXXABI_ARM_EHABI)

libcxxabi/src/cxa_personality.cpp

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
#include "private_typeinfo.h"
2323
#include "unwind.h"
2424

25+
#if __has_include(<ptrauth.h>)
26+
# include <ptrauth.h>
27+
#endif
28+
29+
#include "libunwind.h"
30+
2531
// TODO: This is a temporary workaround for libc++abi to recognize that it's being
2632
// built against LLVM's libunwind. LLVM's libunwind started reporting _LIBUNWIND_VERSION
2733
// in LLVM 15 -- we can remove this workaround after shipping LLVM 17. Once we remove
@@ -527,12 +533,19 @@ get_thrown_object_ptr(_Unwind_Exception* unwind_exception)
527533
namespace
528534
{
529535

536+
#define _LIBCXXABI_PTRAUTH_KEY ptrauth_key_process_dependent_code
537+
typedef const uint8_t* _LIBCXXABI_PTRAUTH_PDD("scan_results::languageSpecificData") lsd_ptr_t;
538+
typedef const uint8_t* _LIBCXXABI_PTRAUTH_PDD("scan_results::actionRecord") action_ptr_t;
539+
#define _LIBCXXABI_PTRAUTH_SCANRESULT_LANDINGPAD_DISC "scan_results::landingPad"
540+
typedef uintptr_t _LIBCXXABI_PTRAUTH_RI_PDD(_LIBCXXABI_PTRAUTH_SCANRESULT_LANDINGPAD_DISC) landing_pad_t;
541+
typedef void* _LIBCXXABI_PTRAUTH_PDD(_LIBCXXABI_PTRAUTH_SCANRESULT_LANDINGPAD_DISC) landing_pad_ptr_t;
542+
530543
struct scan_results
531544
{
532545
int64_t ttypeIndex; // > 0 catch handler, < 0 exception spec handler, == 0 a cleanup
533-
const uint8_t* actionRecord; // Currently unused. Retained to ease future maintenance.
534-
const uint8_t* languageSpecificData; // Needed only for __cxa_call_unexpected
535-
uintptr_t landingPad; // null -> nothing found, else something found
546+
action_ptr_t actionRecord; // Currently unused. Retained to ease future maintenance.
547+
lsd_ptr_t languageSpecificData; // Needed only for __cxa_call_unexpected
548+
landing_pad_t landingPad; // null -> nothing found, else something found
536549
void* adjustedPtr; // Used in cxa_exception.cpp
537550
_Unwind_Reason_Code reason; // One of _URC_FATAL_PHASE1_ERROR,
538551
// _URC_FATAL_PHASE2_ERROR,
@@ -541,7 +554,33 @@ struct scan_results
541554
};
542555

543556
} // unnamed namespace
557+
}
544558

559+
namespace {
560+
// The logical model for casting authenticated function pointers makes
561+
// it impossible to directly cast them without breaking the authentication,
562+
// as a result we need this pair of helpers.
563+
template <typename PtrType>
564+
void set_landing_pad_as_ptr(scan_results& results, const PtrType& out) {
565+
union {
566+
landing_pad_t* as_landing_pad;
567+
landing_pad_ptr_t* as_pointer;
568+
} u;
569+
u.as_landing_pad = &results.landingPad;
570+
*u.as_pointer = out;
571+
}
572+
573+
static const landing_pad_ptr_t& get_landing_pad_as_ptr(const scan_results& results) {
574+
union {
575+
const landing_pad_t* as_landing_pad;
576+
const landing_pad_ptr_t* as_pointer;
577+
} u;
578+
u.as_landing_pad = &results.landingPad;
579+
return *u.as_pointer;
580+
}
581+
} // unnamed namespace
582+
583+
extern "C" {
545584
static
546585
void
547586
set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context,
@@ -557,7 +596,19 @@ set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context,
557596
reinterpret_cast<uintptr_t>(unwind_exception));
558597
_Unwind_SetGR(context, __builtin_eh_return_data_regno(1),
559598
static_cast<uintptr_t>(results.ttypeIndex));
599+
#if defined(__APPLE__) && __has_feature(ptrauth_qualifier)
600+
auto stack_pointer = _Unwind_GetGR(context, UNW_REG_SP);
601+
// We manually re-sign the IP as the __ptrauth qualifiers cannot
602+
// express the required relationship with the destination address
603+
const auto existingDiscriminator = ptrauth_blend_discriminator(
604+
&results.landingPad, ptrauth_string_discriminator(_LIBCXXABI_PTRAUTH_SCANRESULT_LANDINGPAD_DISC));
605+
unw_word_t newIP =
606+
(unw_word_t)ptrauth_auth_and_resign(*(void**)&results.landingPad, _LIBCXXABI_PTRAUTH_KEY, existingDiscriminator,
607+
ptrauth_key_return_address, stack_pointer);
608+
_Unwind_SetIP(context, newIP);
609+
#else
560610
_Unwind_SetIP(context, results.landingPad);
611+
#endif
561612
}
562613

563614
/*
@@ -691,12 +742,12 @@ static void scan_eh_tab(scan_results &results, _Unwind_Action actions,
691742
// The call sites are ordered in increasing value of start
692743
uintptr_t start = readEncodedPointer(&callSitePtr, callSiteEncoding);
693744
uintptr_t length = readEncodedPointer(&callSitePtr, callSiteEncoding);
694-
uintptr_t landingPad = readEncodedPointer(&callSitePtr, callSiteEncoding);
745+
landing_pad_t landingPad = readEncodedPointer(&callSitePtr, callSiteEncoding);
695746
uintptr_t actionEntry = readULEB128(&callSitePtr);
696747
if ((start <= ipOffset) && (ipOffset < (start + length)))
697748
#else // __USING_SJLJ_EXCEPTIONS__ || __WASM_EXCEPTIONS__
698749
// ip is 1-based index into this table
699-
uintptr_t landingPad = readULEB128(&callSitePtr);
750+
landing_pad_t landingPad = readULEB128(&callSitePtr);
700751
uintptr_t actionEntry = readULEB128(&callSitePtr);
701752
if (--ip == 0)
702753
#endif // __USING_SJLJ_EXCEPTIONS__ || __WASM_EXCEPTIONS__
@@ -935,8 +986,7 @@ __gxx_personality_v0
935986
results.ttypeIndex = exception_header->handlerSwitchValue;
936987
results.actionRecord = exception_header->actionRecord;
937988
results.languageSpecificData = exception_header->languageSpecificData;
938-
results.landingPad =
939-
reinterpret_cast<uintptr_t>(exception_header->catchTemp);
989+
set_landing_pad_as_ptr(results, exception_header->catchTemp);
940990
results.adjustedPtr = exception_header->adjustedPtr;
941991

942992
// Jump to the handler.
@@ -970,7 +1020,7 @@ __gxx_personality_v0
9701020
exc->handlerSwitchValue = static_cast<int>(results.ttypeIndex);
9711021
exc->actionRecord = results.actionRecord;
9721022
exc->languageSpecificData = results.languageSpecificData;
973-
exc->catchTemp = reinterpret_cast<void*>(results.landingPad);
1023+
exc->catchTemp = get_landing_pad_as_ptr(results);
9741024
exc->adjustedPtr = results.adjustedPtr;
9751025
#ifdef __WASM_EXCEPTIONS__
9761026
// Wasm only uses a single phase (_UA_SEARCH_PHASE), so save the

0 commit comments

Comments
 (0)