mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-21 01:50:30 +00:00
third_party/libcxxabi: Add test suite (#1076)
Added the `libcxxabi` test suite as found in LLVM 17.0.6. Some tests that do not apply to the current configuration of comsopolitan are not added. These include: - `backtrace_test`, `forced_unwind*`: Use unwind function unsupported in SjLj mode. - `noexception*`: Designed to test `libcxxabi` in no exceptions mode. Some tests are added but not enabled due to bugs specific to GCC or cosmopolitan. These are clearly indicated in the `BUILD.mk` file.
This commit is contained in:
parent
8fb24a8f88
commit
b0566348b2
65 changed files with 43262 additions and 2 deletions
82
third_party/libcxxabi/test/dynamic_cast_stress.pass.cc
vendored
Normal file
82
third_party/libcxxabi/test/dynamic_cast_stress.pass.cc
vendored
Normal file
|
@ -0,0 +1,82 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// UNSUPPORTED: c++03
|
||||
|
||||
#include "third_party/libcxx/cassert"
|
||||
#include "third_party/libcxx/tuple"
|
||||
#include "third_party/libcxxabi/test/support/timer.hh"
|
||||
|
||||
template <std::size_t Indx, std::size_t Depth>
|
||||
struct C
|
||||
: public virtual C<Indx, Depth-1>,
|
||||
public virtual C<Indx+1, Depth-1>
|
||||
{
|
||||
virtual ~C() {}
|
||||
};
|
||||
|
||||
template <std::size_t Indx>
|
||||
struct C<Indx, 0>
|
||||
{
|
||||
virtual ~C() {}
|
||||
};
|
||||
|
||||
template <std::size_t Indx, std::size_t Depth>
|
||||
struct B
|
||||
: public virtual C<Indx, Depth-1>,
|
||||
public virtual C<Indx+1, Depth-1>
|
||||
{
|
||||
};
|
||||
|
||||
template <class Indx, std::size_t Depth>
|
||||
struct makeB;
|
||||
|
||||
template <std::size_t ...Indx, std::size_t Depth>
|
||||
struct makeB<std::__tuple_indices<Indx...>, Depth>
|
||||
: public B<Indx, Depth>...
|
||||
{
|
||||
};
|
||||
|
||||
template <std::size_t Width, std::size_t Depth>
|
||||
struct A
|
||||
: public makeB<typename std::__make_tuple_indices<Width>::type, Depth>
|
||||
{
|
||||
};
|
||||
|
||||
void test()
|
||||
{
|
||||
const std::size_t Width = 10;
|
||||
const std::size_t Depth = 5;
|
||||
A<Width, Depth> a;
|
||||
typedef B<Width/2, Depth> Destination;
|
||||
// typedef A<Width, Depth> Destination;
|
||||
Destination *b = nullptr;
|
||||
{
|
||||
timer t;
|
||||
b = dynamic_cast<Destination*>((C<Width/2, 0>*)&a);
|
||||
}
|
||||
assert(b != 0);
|
||||
}
|
||||
|
||||
int main(int, char**)
|
||||
{
|
||||
test();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Timing results I'm seeing (median of 3 microseconds):
|
||||
|
||||
libc++abi gcc's dynamic_cast
|
||||
B<Width/2, Depth> -O3 48.334 93.190 libc++abi 93% faster
|
||||
B<Width/2, Depth> -Os 58.535 94.103 libc++abi 61% faster
|
||||
A<Width, Depth> -O3 11.515 33.134 libc++abi 188% faster
|
||||
A<Width, Depth> -Os 12.631 31.553 libc++abi 150% faster
|
||||
|
||||
*/
|
Loading…
Add table
Add a link
Reference in a new issue