[libcxxabi] Introduce a -fno-exceptions libc++abi libary variant

Currently there is only support for a -fno-exceptions libc++ build. This is
problematic for functions such as std::terminate() which are defined in
libc++abi and using any of those functions throws away most of the benefits
of using -fno-exceptions (code-size). This patch introduces a -fno-exceptions
libc++abi build to address this issue.

This new variant of libc++abi cannot be linked against any with-exceptions
code as some symbols necessary for handling exceptions are missing in this
library.

Differential revision: http://reviews.llvm.org/D20677

Reviewers: EricWF, mclow.lists, bcraig
llvm-svn: 271267
This commit is contained in:
Asiri Rathnayake 2016-05-31 12:01:32 +00:00
parent 8f961aab25
commit 57e446dafa
49 changed files with 450 additions and 17 deletions

View File

@ -108,6 +108,7 @@ endif()
#===============================================================================
# Define options.
option(LIBCXXABI_ENABLE_EXCEPTIONS "Use exceptions." ON)
option(LIBCXXABI_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
option(LIBCXXABI_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
option(LIBCXXABI_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
@ -242,13 +243,20 @@ if (LIBCXXABI_ENABLE_PEDANTIC)
endif()
# Get feature flags.
# Exceptions
# Catches C++ exceptions only and tells the compiler to assume that extern C
# functions never throw a C++ exception.
append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_FSTRICT_ALIASING_FLAG -fstrict-aliasing)
append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc)
append_if(LIBCXXABI_C_FLAGS LIBCXXABI_HAS_FUNWIND_TABLES -funwind-tables)
# Exceptions
if (LIBCXXABI_ENABLE_EXCEPTIONS)
# Catches C++ exceptions only and tells the compiler to assume that extern C
# functions never throw a C++ exception.
append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_EHSC_FLAG -EHsc)
append_if(LIBCXXABI_C_FLAGS LIBCXXABI_HAS_FUNWIND_TABLES -funwind-tables)
else()
add_definitions(-D_LIBCXXABI_NO_EXCEPTIONS)
append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EXCEPTIONS_FLAG -fno-exceptions)
append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EHS_FLAG -EHs-)
append_if(LIBCXXABI_CXX_FLAGS LIBCXXABI_HAS_NO_EHA_FLAG -EHa-)
endif()
append_if(LIBCXXABI_COMPILE_FLAGS LIBCXXABI_HAS_FVISIBILITY_HIDDEN_FLAG -fvisibility=hidden)

View File

@ -4,12 +4,10 @@ set(LIBCXXABI_SOURCES
cxa_aux_runtime.cpp
cxa_default_handlers.cpp
cxa_demangle.cpp
cxa_exception.cpp
cxa_exception_storage.cpp
cxa_guard.cpp
cxa_handlers.cpp
cxa_new_delete.cpp
cxa_personality.cpp
cxa_unexpected.cpp
cxa_vector.cpp
cxa_virtual.cpp
@ -19,6 +17,13 @@ set(LIBCXXABI_SOURCES
typeinfo.cpp
)
if (LIBCXXABI_ENABLE_EXCEPTIONS)
list(APPEND LIBCXXABI_SOURCES cxa_exception.cpp)
list(APPEND LIBCXXABI_SOURCES cxa_personality.cpp)
else()
list(APPEND LIBCXXABI_SOURCES cxa_noexception.cpp)
endif()
if (UNIX AND NOT (APPLE OR CYGWIN))
list(APPEND LIBCXXABI_SOURCES cxa_thread_atexit.cpp)
endif()

View File

@ -17,16 +17,28 @@
namespace __cxxabiv1 {
extern "C" {
_LIBCXXABI_FUNC_VIS LIBCXXABI_NORETURN void __cxa_bad_cast(void) {
#ifndef _LIBCXXABI_NO_EXCEPTIONS
throw std::bad_cast();
#else
std::terminate();
#endif
}
_LIBCXXABI_FUNC_VIS LIBCXXABI_NORETURN void __cxa_bad_typeid(void) {
#ifndef _LIBCXXABI_NO_EXCEPTIONS
throw std::bad_typeid();
#else
std::terminate();
#endif
}
_LIBCXXABI_FUNC_VIS LIBCXXABI_NORETURN void
__cxa_throw_bad_array_new_length(void) {
#ifndef _LIBCXXABI_NO_EXCEPTIONS
throw std::bad_array_new_length();
#else
std::terminate();
#endif
}
} // extern "C"
} // abi

View File

@ -61,21 +61,21 @@ __attribute__((visibility("hidden"), noreturn))
void
__terminate(terminate_handler func) _NOEXCEPT
{
#if __has_feature(cxx_exceptions)
#ifndef _LIBCXXABI_NO_EXCEPTIONS
try
{
#endif // __has_feature(cxx_exceptions)
#endif // _LIBCXXABI_NO_EXCEPTIONS
func();
// handler should not return
abort_message("terminate_handler unexpectedly returned");
#if __has_feature(cxx_exceptions)
#ifndef _LIBCXXABI_NO_EXCEPTIONS
}
catch (...)
{
// handler should not throw exception
abort_message("terminate_handler unexpectedly threw an exception");
}
#endif // #if __has_feature(cxx_exceptions)
#endif // _LIBCXXABI_NO_EXCEPTIONS
}
__attribute__((noreturn))

View File

@ -47,7 +47,11 @@ operator new(std::size_t size)
if (nh)
nh();
else
#ifndef _LIBCXXABI_NO_EXCEPTIONS
throw std::bad_alloc();
#else
break;
#endif
}
return p;
}
@ -74,13 +78,17 @@ operator new(size_t size, const std::nothrow_t&)
#endif
{
void* p = 0;
#ifndef _LIBCXXABI_NO_EXCEPTIONS
try
{
#endif
p = ::operator new(size);
#ifndef _LIBCXXABI_NO_EXCEPTIONS
}
catch (...)
{
}
#endif
return p;
}
@ -115,13 +123,17 @@ operator new[](size_t size, const std::nothrow_t&)
#endif
{
void* p = 0;
#ifndef _LIBCXXABI_NO_EXCEPTIONS
try
{
#endif
p = ::operator new[](size);
#ifndef _LIBCXXABI_NO_EXCEPTIONS
}
catch (...)
{
}
#endif
return p;
}

View File

@ -0,0 +1,60 @@
//===------------------------- cxa_exception.cpp --------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//
// This file implements the "Exception Handling APIs"
// http://mentorembedded.github.io/cxx-abi/abi-eh.html
//
//===----------------------------------------------------------------------===//
// Support functions for the no-exceptions libc++ library
#include "config.h"
#include "cxxabi.h"
#include <exception> // for std::terminate
#include "cxa_exception.hpp"
#include "cxa_handlers.hpp"
namespace __cxxabiv1 {
#pragma GCC visibility push(default)
extern "C" {
void
__cxa_increment_exception_refcount(void *thrown_object) throw() {
if (thrown_object != nullptr)
std::terminate();
}
void
__cxa_decrement_exception_refcount(void *thrown_object) throw() {
if (thrown_object != nullptr)
std::terminate();
}
void *__cxa_current_primary_exception() throw() { return nullptr; }
void
__cxa_rethrow_primary_exception(void* thrown_object) {
if (thrown_object != nullptr)
std::terminate();
}
bool
__cxa_uncaught_exception() throw() { return false; }
unsigned int
__cxa_uncaught_exceptions() throw() { return 0; }
} // extern "C"
#pragma GCC visibility pop
} // abi

View File

@ -14,6 +14,7 @@ pythonize_bool(LLVM_BUILD_32_BITS)
pythonize_bool(LIBCXX_ENABLE_SHARED)
pythonize_bool(LIBCXXABI_ENABLE_SHARED)
pythonize_bool(LIBCXXABI_ENABLE_THREADS)
pythonize_bool(LIBCXXABI_ENABLE_EXCEPTIONS)
pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER)
pythonize_bool(LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL)
set(LIBCXXABI_TARGET_INFO "libcxx.test.target_info.LocalTI" CACHE STRING

View File

@ -6,6 +6,9 @@
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <assert.h>
#include <stddef.h>
#include <unwind.h>

View File

@ -9,10 +9,10 @@
// Can you have a catch clause of array type that catches anything?
// GCC incorrectly allows array types to be caught by reference.
// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69372
// XFAIL: gcc
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>

View File

@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
// Can you have a catch clause of array type that catches anything?
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -13,6 +13,8 @@
check against.
*/
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -13,6 +13,8 @@
check against. It also checks that virtual bases work properly
*/
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>
#if __has_feature(cxx_nullptr)

View File

@ -12,6 +12,7 @@
// GCC incorrectly allows function pointer to be caught by reference.
// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69372
// XFAIL: gcc
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>

View File

@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
// Can you have a catch clause of array type that catches anything?
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>

View File

@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// UNSUPPORTED: c++98, c++03, libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>
struct A

View File

@ -10,6 +10,7 @@
// GCC incorrectly allows PMF type "void (T::*)()" to be caught as "void (T::*)() const"
// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69375
// XFAIL: gcc
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>
struct A

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>
#if __has_feature(cxx_nullptr)

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>
#include <cstdlib>
#include <iostream>

View File

@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// UNSUPPORTED: c++98, c++03, libcxxabi-no-exceptions
#include <cassert>
#include <cstdlib>

View File

@ -25,6 +25,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -13,6 +13,8 @@
check against. It also checks that virtual bases work properly
*/
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cassert>
#if __cplusplus < 201103L

View File

@ -0,0 +1,55 @@
//===----------------------- cxa_bad_cast.pass.cpp ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
#include <cxxabi.h>
#include <cassert>
#include <stdlib.h>
#include <exception>
#include <typeinfo>
class Base {
virtual void foo() {};
};
class Derived : public Base {};
Derived &test_bad_cast(Base b) {
return dynamic_cast<Derived&>(b);
}
Base gB;
void my_terminate() { exit(0); }
int main ()
{
// swap-out the terminate handler
void (*default_handler)() = std::get_terminate();
std::set_terminate(my_terminate);
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
try {
#endif
Derived &d = test_bad_cast(gB);
assert(false);
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
} catch (std::bad_cast) {
// success
return 0;
} catch (...) {
assert(false);
}
#endif
// failure, restore the default terminate handler and fire
std::set_terminate(default_handler);
std::terminate();
}

View File

@ -0,0 +1,55 @@
//===----------------------- cxa_bad_typeid.pass.cpp ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===------------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
#include <cxxabi.h>
#include <cassert>
#include <stdlib.h>
#include <exception>
#include <typeinfo>
#include <string>
#include <iostream>
class Base {
virtual void foo() {};
};
class Derived : public Base {};
std::string test_bad_typeid(Derived *p) {
typeid(*p).name();
}
void my_terminate() { std::cout << "A" << std::endl; exit(0); }
int main ()
{
// swap-out the terminate handler
void (*default_handler)() = std::get_terminate();
std::set_terminate(my_terminate);
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
try {
#endif
test_bad_typeid(nullptr);
assert(false);
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
} catch (std::bad_typeid) {
// success
return 0;
} catch (...) {
assert(false);
}
#endif
// failure, restore the default terminate handler and fire
std::set_terminate(default_handler);
std::terminate();
}

View File

@ -14,6 +14,8 @@
// incomplete flags set, equality can be tested by comparing the type_info
// addresses.
// UNSUPPORTED: libcxxabi-no-exceptions
// RUN: %cxx %flags %compile_flags -c %s -o %t.one.o
// RUN: %cxx %flags %compile_flags -c %s -o %t.two.o -DTU_ONE
// RUN: %cxx %flags %t.one.o %t.two.o %link_flags -o %t.exe

View File

@ -25,6 +25,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <assert.h>
struct Base {

View File

@ -35,12 +35,17 @@ class Configuration(LibcxxConfiguration):
def configure_features(self):
super(Configuration, self).configure_features()
if not self.get_lit_bool('enable_exceptions', True):
self.config.available_features.add('libcxxabi-no-exceptions')
if self.get_lit_bool('thread_atexit', True):
self.config.available_features.add('thread_atexit')
def configure_compile_flags(self):
self.cxx.compile_flags += ['-DLIBCXXABI_NO_TIMER']
self.cxx.compile_flags += ['-funwind-tables']
if self.get_lit_bool('enable_exceptions', True):
self.cxx.compile_flags += ['-funwind-tables']
else:
self.cxx.compile_flags += ['-fno-exceptions', '-DLIBCXXABI_HAS_NO_EXCEPTIONS']
if not self.get_lit_bool('enable_threads', True):
self.cxx.compile_flags += ['-DLIBCXXABI_HAS_NO_THREADS=1']
super(Configuration, self).configure_compile_flags()

View File

@ -16,6 +16,7 @@ config.executor = "@LIBCXXABI_EXECUTOR@"
config.thread_atexit = "@LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL@"
config.libcxxabi_shared = "@LIBCXXABI_ENABLE_SHARED@"
config.enable_shared = "@LIBCXX_ENABLE_SHARED@"
config.enable_exceptions = "@LIBCXXABI_ENABLE_EXCEPTIONS@"
# Let the main config do the real work.
lit_config.load_config(config, "@LIBCXXABI_SOURCE_DIR@/test/lit.cfg")

View File

@ -0,0 +1,38 @@
//===----------------------- noexception1.pass.cpp ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// REQUIRES: libcxxabi-no-exceptions
#include <cxxabi.h>
#include <exception>
#include <cassert>
#include <stdlib.h>
// namespace __cxxabiv1 {
// void __cxa_increment_exception_refcount(void *thrown_object) throw();
// }
unsigned gCounter = 0;
void my_terminate() { exit(0); }
int main ()
{
// should not call std::terminate()
__cxxabiv1::__cxa_increment_exception_refcount(nullptr);
std::set_terminate(my_terminate);
// should call std::terminate()
__cxxabiv1::__cxa_increment_exception_refcount((void*) &gCounter);
assert(false);
return 0;
}

View File

@ -0,0 +1,38 @@
//===----------------------- noexception2.pass.cpp ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// REQUIRES: libcxxabi-no-exceptions
#include <cxxabi.h>
#include <exception>
#include <cassert>
#include <stdlib.h>
// namespace __cxxabiv1 {
// void __cxa_decrement_exception_refcount(void *thrown_object) throw();
// }
unsigned gCounter = 0;
void my_terminate() { exit(0); }
int main ()
{
// should not call std::terminate()
__cxxabiv1::__cxa_decrement_exception_refcount(nullptr);
std::set_terminate(my_terminate);
// should call std::terminate()
__cxxabiv1::__cxa_decrement_exception_refcount((void*) &gCounter);
assert(false);
return 0;
}

View File

@ -0,0 +1,38 @@
//===----------------------- noexception3.pass.cpp ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// REQUIRES: libcxxabi-no-exceptions
#include <cxxabi.h>
#include <exception>
#include <cassert>
#include <stdlib.h>
// namespace __cxxabiv1 {
// void __cxa_rethrow_primary_exception(void* thrown_object);
// }
unsigned gCounter = 0;
void my_terminate() { exit(0); }
int main ()
{
// should not call std::terminate()
__cxxabiv1::__cxa_rethrow_primary_exception(nullptr);
std::set_terminate(my_terminate);
// should call std::terminate()
__cxxabiv1::__cxa_rethrow_primary_exception((void*) &gCounter);
assert(false);
return 0;
}

View File

@ -0,0 +1,29 @@
//===----------------------- noexception4.pass.cpp ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// REQUIRES: libcxxabi-no-exceptions
#include <cxxabi.h>
#include <exception>
#include <cassert>
// namespace __cxxabiv1 {
// void *__cxa_current_primary_exception() throw();
// extern bool __cxa_uncaught_exception () throw();
// extern unsigned int __cxa_uncaught_exceptions() throw();
// }
int main ()
{
// Trivially
assert(nullptr == __cxxabiv1::__cxa_current_primary_exception());
assert(!__cxxabiv1::__cxa_uncaught_exception());
assert(0 == __cxxabiv1::__cxa_uncaught_exceptions());
return 0;
}

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <typeinfo>
#include <iostream>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <iostream>
#include <cxxabi.h>

View File

@ -41,6 +41,7 @@ namespace test1 {
// When initialization fails, ensure that we try to initialize it again next
// time.
namespace test2 {
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
static int run_count = 0;
int increment() {
++run_count;
@ -58,6 +59,9 @@ namespace test2 {
helper();
assert(run_count == 2);
}
#else
void test() {}
#endif
}
// Check that we can initialize a second value while initializing a first.

View File

@ -47,8 +47,19 @@ int gConstructorCounter;
int gConstructorThrowTarget;
int gDestructorCounter;
int gDestructorThrowTarget;
void throw_construct ( void *p ) { if ( gConstructorCounter == gConstructorThrowTarget ) throw 1; ++gConstructorCounter; }
void throw_destruct ( void *p ) { if ( ++gDestructorCounter == gDestructorThrowTarget ) throw 2; }
void throw_construct ( void *p ) {
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
if ( gConstructorCounter == gConstructorThrowTarget )
throw 1;
++gConstructorCounter;
#endif
}
void throw_destruct ( void *p ) {
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
if ( ++gDestructorCounter == gDestructorThrowTarget )
throw 2;
#endif
}
#if __cplusplus >= 201103L
# define CAN_THROW noexcept(false)
@ -146,6 +157,7 @@ int test_counted ( ) {
return retVal;
}
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
// Make sure the constructors and destructors are matched
int test_exception_in_constructor ( ) {
int retVal = 0;
@ -202,7 +214,9 @@ int test_exception_in_constructor ( ) {
return retVal;
}
#endif
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
// Make sure the constructors and destructors are matched
int test_exception_in_destructor ( ) {
int retVal = 0;
@ -253,12 +267,15 @@ int test_exception_in_destructor ( ) {
return retVal;
}
#endif
int main ( int argc, char *argv [] ) {
int retVal = 0;
retVal += test_empty ();
retVal += test_counted ();
#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS
retVal += test_exception_in_constructor ();
retVal += test_exception_in_destructor ();
#endif
return retVal;
}

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include "cxxabi.h"
#include <iostream>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include "cxxabi.h"
#include <stdio.h>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <cxxabi.h>
#include <exception>
#include <cassert>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <assert.h>
struct A

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <assert.h>
struct A

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>

View File

@ -7,6 +7,8 @@
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: libcxxabi-no-exceptions
#include <exception>
#include <stdlib.h>
#include <assert.h>