mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 23:56:05 +00:00

When testing with sanitizers enabled, we need to link against a plethora of system libraries. Using `-nodefaultlibs` like we used to breaks this, and we would have to add all these system libraries manually, which is not portable and error prone. Instead, stop using `-nodefaultlibs` so that we get the libraries added by default by the compiler. The only caveat with this approach is that we are now relying on the fact that `-L <path-to-local-libunwind>` will cause the just built libunwind to be selected before the system implementation (either of libunwind or libgcc_s.so), which is somewhat fragile. This patch also turns the 32 bit multilib build into a soft failure since we are in the process of removing it anyway, see D114473 for details. This patch is incompatible with the 32 bit multilib build because Ubuntu does not provide a proper libstdc++ for 32 bits, and that is required when running with sanitizers enabled. Differential Revision: https://reviews.llvm.org/D114385
69 lines
2.0 KiB
C++
69 lines
2.0 KiB
C++
// -*- 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,
|
|
_Unwind_Exception_Class 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));
|
|
strcpy(reinterpret_cast<char *>(&e->exception_class), "CLNGUNW");
|
|
#endif
|
|
_Unwind_ForcedUnwind(e, stop, (void *)&foo);
|
|
}
|
|
|
|
int main() {
|
|
foo();
|
|
return -2;
|
|
}
|