-
Notifications
You must be signed in to change notification settings - Fork 753
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Arm][Unwind][libc++abi] Add _Unwind_ForcedUnwind to EHABI.
_Unwind_ForcedUnwind is not mandated by the EHABI but for compatibilty reasons adding so the interface to higher layers would be the same. Dropping EHABI specific _Unwind_Stop_Fn definition since it is not defined by EHABI. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D89570
- Loading branch information
1 parent
9ed1c7e
commit db126ae
Showing
9 changed files
with
229 additions
and
50 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// -*- C++ -*- | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
// REQUIRES: linux | ||
|
||
// Basic test for _Unwind_ForcedUnwind. | ||
// See libcxxabi/test/forced_unwind* tests too. | ||
|
||
#include <assert.h> | ||
#include <dlfcn.h> | ||
#include <signal.h> | ||
#include <stdint.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <sys/types.h> | ||
#include <unistd.h> | ||
#include <unwind.h> | ||
|
||
void foo(); | ||
_Unwind_Exception ex; | ||
|
||
_Unwind_Reason_Code stop(int version, _Unwind_Action actions, | ||
uint64_t exceptionClass, | ||
_Unwind_Exception *exceptionObject, | ||
struct _Unwind_Context *context, | ||
void *stop_parameter) { | ||
assert(version == 1); | ||
assert((actions & _UA_FORCE_UNWIND) != 0); | ||
(void)exceptionClass; | ||
assert(exceptionObject == &ex); | ||
assert(stop_parameter == &foo); | ||
|
||
Dl_info info = {0, 0, 0, 0}; | ||
|
||
// Unwind util the main is reached, above frames depend on the platform and | ||
// architecture. | ||
if (dladdr(reinterpret_cast<void *>(_Unwind_GetIP(context)), &info) && | ||
info.dli_sname && !strcmp("main", info.dli_sname)) { | ||
_Exit(0); | ||
} | ||
return _URC_NO_REASON; | ||
} | ||
|
||
__attribute__((noinline)) void foo() { | ||
|
||
// Arm EHABI defines struct _Unwind_Control_Block as exception | ||
// object. Ensure struct _Unwind_Exception* work there too, | ||
// because _Unwind_Exception in this case is just an alias. | ||
struct _Unwind_Exception *e = &ex; | ||
#if defined(_LIBUNWIND_ARM_EHABI) | ||
// Create a mock exception object. | ||
memset(e, '\0', sizeof(*e)); | ||
e->exception_class = 0x434C4E47554E5700; // CLNGUNW\0 | ||
#endif | ||
_Unwind_ForcedUnwind(e, stop, (void *)&foo); | ||
} | ||
|
||
int main() { | ||
foo(); | ||
return -2; | ||
} |