Commit Graph

2849 Commits

Author SHA1 Message Date
Eric Fiselier
7310ec83f3 Fix undefined behavior in __tree
Summary:
This patch attempts to fix the undefined behavior in __tree by changing the node pointer types used throughout. The pointer types are changed for raw pointers in the current ABI and for fancy pointers in ABI V2 (since the fancy pointer types may not be ABI compatible).

The UB in `__tree` arises because tree downcasts the embedded end node and then deferences that pointer. Currently there are 3 node types in __tree.

* `__tree_end_node` which contains the `__left_` pointer. This node is embedded within the container.
* `__tree_node_base` which contains `__right_`, `__parent_` and `__is_black`. This node is used throughout the tree rebalancing algorithms.
* `__tree_node` which contains `__value_`.

Currently `__tree` stores the start of the tree, `__begin_node_`, as a pointer to a `__tree_node`. Additionally the iterators store their position as a pointer to a `__tree_node`. In both of these cases the pointee can be the end node. This is fixed by changing them to store `__tree_end_node` pointers instead.

To make this change I introduced an `__iter_pointer` typedef which is defined to be a pointer to either `__tree_end_node` in the new ABI or `__tree_node` in the current one.
Both `__tree::__begin_node_` and iterator pointers are now stored as `__iter_pointers`.

The other situation where `__tree_end_node` is stored as the wrong type is in `__tree_node_base::__parent_`.  Currently `__left_`, `__right_`, and `__parent_` are all `__tree_node_base` pointers. Since the end node will only be stored in `__parent_` the fix is to change `__parent_` to be a pointer to `__tree_end_node`.

To make this change I introduced a `__parent_pointer` typedef which is defined to be a pointer to either `__tree_end_node` in the new ABI or `__tree_node_base` in the current one.

Note that in the new ABI `__iter_pointer` and `__parent_pointer` are the same type (but not in the old one). The confusion between these two types is unfortunate but it was the best solution I could come up with that maintains the ABI.

The typedef changes force a ton of explicit type casts to correct pointer types and to make current code compatible with both the old and new pointer typedefs. This is the bulk of the change and it's really messy. Unfortunately I don't know how to avoid it.

Please let me know what you think.





Reviewers: howard.hinnant, mclow.lists

Subscribers: howard.hinnant, bbannier, cfe-commits

Differential Revision: https://reviews.llvm.org/D20786

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@276003 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-19 17:56:20 +00:00
Marshall Clow
fc8847cefa Bump version # to 4.0.0
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275904 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 20:27:19 +00:00
Marshall Clow
65eb1e90fa Don't use pthread initializers in constexpr constructors. Patch by elram. Reviewed at https://reviews.llvm.org/D21637.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275819 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 17:23:06 +00:00
Marshall Clow
3f013898d1 Change a couple ifdefs from '#if __cplusplus >= 2011xxx' to '#ifndef _LIBCPP_CXX03_LANG'. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275787 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 13:19:00 +00:00
Eric Fiselier
066feb8249 Remove locale tests that depend on enviroment variables.
Constructing a std::locale object from an empty string selects the language
from the current environment variables. If the environment variables name
a locale that doesn't exist, or isn't installed, then the construction of
facets using that locale may throw.

This patch removes tests that use 'std::locale l("")'.

The optimal solution would be to manually set the environment variables
in the test. Unfortunately there is no portable way to do this.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275772 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 06:15:55 +00:00
Jonas Hahnfeld
b9c20327ac [libcxx][filesystem] Remove setgid from parent before testing permissions
man page for mkdir says: "If the parent directory has the set-group-ID bit set,
then so will the newly created directory."

Differential Revision: https://reviews.llvm.org/D22265

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275760 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 06:06:50 +00:00
Eric Fiselier
5432e3b9a1 Rework libatomic handling in CMake and LIT.
This patch updates the way libc++ handles checking for libatomic, in part
to prepare for https://reviews.llvm.org/D22073.

Changes:
* 'LIBCXX_HAS_ATOMIC_LIB' is now set whenever libatomic is available even libc++
   doesn't need to manually link it.
* 'LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB' is now used to detect when libatomic
   needs to be manually linked.
* 'LIBCXX_HAS_ATOMIC_LIB' now adds 'libatomic' as a available feature in the
   test suite.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275759 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 06:01:50 +00:00
Eric Fiselier
755baa9f4e Improve ABI tests for std::pair.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275757 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 04:48:37 +00:00
Eric Fiselier
f5750d5c05 Add checkpoint diagnostics to help diagnose buildbot failures.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275754 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 03:00:09 +00:00
Eric Fiselier
0751cc188f Prevent failures by marking Clock::is_steady tests as UNSUPPORTED: asan.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275753 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 02:29:33 +00:00
Eric Fiselier
9ae7274ea5 Add includes in test. Patch from STL@microsoft.com
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275751 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 02:05:31 +00:00
Eric Fiselier
465c68a7b9 Upgrade arcconfig to use https
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275750 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 02:02:49 +00:00
Eric Fiselier
c71c304663 Rename and rework _LIBCPP_TRIVIAL_PAIR_COPY_CTOR. Move FreeBSD configuration in-tree.
This patch does the following:

* It renames `_LIBCPP_TRIVIAL_PAIR_COPY_CTOR` to `_LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR`.
* It automatically enables this option on FreeBSD in ABI V1, since that's the current ABI FreeBSD ships.
* It cleans up the handling of this option in `std::pair`.

I would like the sign off from the FreeBSD maintainers. They will no longer need to keep their `__config` changes downstream.

I'm still hoping to come up with a better way to maintain the ABI without needing these constructors.

Reviewed in https://reviews.llvm.org/D21329


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275749 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 01:58:37 +00:00
Eric Fiselier
c79e8b692d Suppress warning in make_from_tuple tests.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275748 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 01:52:46 +00:00
Eric Fiselier
5839fedf28 Implement C++17 tuple bits. Including apply and make_from_tuple.
This patch upgrades <tuple> to be C++17 compliant by implementing:

* tuple_size_v: This was forgotten when implementing the other _v traits.
* std::apply: This was added via LFTS v1 in p0220r1.
* std::make_from_tuple: This was added in p0209r2.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275745 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 00:35:56 +00:00
Eric Fiselier
41aafc25c6 Check for unconstrained hash equality before constrained hash equality.
This patch implements a simple optimization in __hash_table::find. When iterating
the found bucket we only constrain the bucket elements hash if it doesn't
already match the unconstrained hash of the specified key. This prevent
the performance of an expensive modulo operation.

Since the bucket element almost always matches the key, especially when the
load factor is low, this optimization has large performance impacts. For
a unordered_set<int> of random integers this patch improves the performance of
'find(...)' by 40%.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275734 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-17 22:04:57 +00:00
Eric Fiselier
3e732e94ae Fix std::experimental::optional tests. Patch from Casey Carter.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275732 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-17 20:32:30 +00:00
Marshall Clow
a80de495f7 Constuct a sentry object in istream::readsome, and handle failures appropriately. Fixes PR#28217.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275280 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-13 16:58:48 +00:00
Marshall Clow
211f9a485c Add more tests for LWG#2582. No code changes needed, just tests.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275211 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 20:15:46 +00:00
JF Bastien
f6752747db libc++: name anonymous structs
As discussed in http://reviews.llvm.org/D22073

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275210 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 20:14:52 +00:00
Marshall Clow
3f5435853f Add tests for the meta.unary.props that do not require a complete type. This is part of LWG#2582
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275184 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 15:50:53 +00:00
Marshall Clow
3384fa62f2 mark issue #2422 as complete; this was just a wording clarification
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275177 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 15:29:35 +00:00
Marshall Clow
d7a7384e04 mark issue #2181 as complete; this was just a wording clarification
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275176 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 15:15:55 +00:00
Saleem Abdulrasool
ab008f7cb1 Add option to disable __deallocate #warning
From r229162:
  Visual Studio's SAL extension uses a macro named __deallocate. This
  macro is used pervasively
Using -Werror when building for Windows can force the use of -Wno-#warnings
specifically because of this __deallocate #warning. Instead of forcing
builds to disable all #warnings, this option allows libc++ to be built
without this particular warning, while leaving other #warnings enabled.

Patch by Dave Lee!

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275172 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 14:39:13 +00:00
Marshall Clow
6f4713b2d5 Put the status in the right column
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275171 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 14:38:59 +00:00
Marshall Clow
683272df82 Mark P0067 as 'postponed', because it will be revised before the next meeting
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275170 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-12 14:37:39 +00:00
Eric Fiselier
576639133a Don't compute modulus of hash if it is smaller than the bucket count.
This cleans up a previous optimization attempt in hash, and results in
additional performance improvements over that previous attempt. Additionally
this new optimization does not hinder the power of 2 bucket count optimization.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275114 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-11 22:02:02 +00:00
Marshall Clow
51d7e8e381 Always use the allocator to construct/destruct elements of a deque/vector. Fixes PR#28412. Thanks to Jonathan Wakely for the report.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275105 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-11 21:38:08 +00:00
Eric Fiselier
45e9a936b6 Allow is_swappable to SFINAE on deleted/ambiguous swap functions
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275094 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-11 19:57:13 +00:00
Eric Fiselier
4a98c1e776 Hide some internal symbols for memory resource.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@275089 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-11 19:22:09 +00:00
Marshall Clow
faa37d5de6 Fix typo in #ifdef; leave tests commented out b/c gcc 4.8 harks on them.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274882 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-08 16:59:54 +00:00
Marshall Clow
df4a22dec7 Implement LWG685 (which is from C++11!). Fixes PR#28421. Note: this (subtly) changes the return type of operator-(Iter1, Iter2) where Iter1 is a reverse iterator or a move_iterator, and Iter2 is some other move/reverse iterator type. In practice, I believe that almost every time the second param will be const_XXX and this will mean that the return type will be the same as it was before.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274880 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-08 16:54:47 +00:00
Kwasi Mensah
95a22db0bb [libc++] Check hash before calling __hash_table key_eq function
Summary: The current implementations of __hash_table::find used by std::unordered_set/unordered_map call key_eq on each key that lands in the same bucket as the key you're looking for. However, since equal objects mush hash to the same value, you can short-circuit the possibly expensive call to key_eq by checking the hashes first.

Reviewers: EricWF

Subscribers: kmensah, cfe-commits

Differential Revision: http://reviews.llvm.org/D21510

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274857 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-08 15:34:28 +00:00
Manman Ren
8e83446812 Revert r274605 due to bot failure: http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-expensive/244/
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274651 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-06 18:24:53 +00:00
Marshall Clow
8668189a1a Fix typo in #ifdef, and re-enable tests now that the green-dragon bots are no more
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274605 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-06 05:28:44 +00:00
Eric Fiselier
56a761493d Add unordered_map::insert benchmark test and rename file
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274424 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-02 05:30:54 +00:00
Eric Fiselier
38af0f8590 Improve performance of unordered_set<uint32_t>::find by 45%. Add benchmarks.
This patch improves the performance of unordered_set's find by 45% when
the value exists within the set. __hash_tables find method
needs to check if it's reached the end of the bucket by constraining the
hash of the current node and checking it against the bucket index. However
constraining the hash is an expensive operations and it can be avoided if the
two unconstrained hashes are equal. This patch applies that optimization.

This patch also adds a top level directory called benchmarks. 'benchmarks/'
is intended to store any/all benchmarks written for the standard library.
Currently nothing is done with files under 'benchmarks/' but I would like
to move towards introducing a formal format and test runner.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274423 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-02 05:19:59 +00:00
Eric Fiselier
990090f2ad Handle std::get<T>(...) for std::tuple<>
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274422 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-02 03:46:08 +00:00
Eric Fiselier
6b7a8718b8 Remove workarounds for C++17 inline variable ABI break. It has been fixed in clang.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274419 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-02 03:21:58 +00:00
Eric Fiselier
22c3e76205 Rewrite std::get<Type>(...) helper using constexpr functions.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274418 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-02 03:18:30 +00:00
Eric Fiselier
5fb1e0ab01 Cleanup SFINAE in tuple, and add tests for reference assignment
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274414 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-02 01:25:46 +00:00
Eric Fiselier
cebaf5cbf8 Make tuple_constructible and family lazy again.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274413 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-02 00:58:17 +00:00
Eric Fiselier
cd20679f5f Add another workaround for C++17 inline variable ABI breakage.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274408 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 23:41:48 +00:00
Eric Fiselier
103f80d818 Remove accidental change committed in r274403.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274407 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 23:31:55 +00:00
Eric Fiselier
e8b134c1bc Turn off ASAN's odr-violation diagnostics for now. See PR28391
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274404 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 23:25:47 +00:00
Eric Fiselier
1eb8739a33 Work around ABI break caused by C++17 inline variables.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274403 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 23:22:25 +00:00
Eric Fiselier
ed33ed8023 Flatten tuple_constructible, tuple_convertible and tuple_assignable.
This patch is the last in a series that replaces recursive meta-programming
in std::tuple with non-recursive implementations.

Previously std::tuple could only be instantiated with 126 elements before
it blew the max template instantiation depth. Now the size of std::tuple is
essentially unbounded (I've tested with over 5000 elements).

One unfortunate side-effect of this change is that tuple_constructible
and similar no longer short circuit after the first failure. Instead they
evaluate the conditions for all elements. This could be potentially breaking.
I plan to look into this further.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274331 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 04:07:39 +00:00
Eric Fiselier
053859ffc6 Flatten the tuple_element and __make_tuple_types implementations.
This patch attempts to improve the QoI of std::tuples tuple_element and
__make_tuple_types helpers. Previously they required O(N) instantiations,
one for every element in the tuple

The new implementations are O(1) after __tuple_indices<Id...> is created.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274330 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-01 03:54:54 +00:00
Eric Fiselier
a3ccd96ede Replace __make_tuple_indices implementation with superior implementation.
The previous __make_tuple_indices implementation caused O(N) instantiations
and was pretty inefficient. The C++14 __make_integer_sequence implementation
is much better, since it either uses a builtin to generate the sequence or
a very nice Log8(N) implementation provided by richard smith.

This patch moves the __make_integer_sequence implementation into __tuple
and uses it to implement __make_tuple_indices.

Since libc++ can't expose the name 'integer_sequence' in C++11 this patch
also introduces a dummy type '__integer_sequence' which is used when generating
the sequence. One the sequence is generated '__integer_sequence' can be
converted into the required type; either '__tuple_indices' or 'integer_sequence'.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274286 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-30 22:34:43 +00:00
Marshall Clow
1a93312404 Fix static assert problem on gcc; remove XFAILs that I put in in r274250
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274285 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-30 22:05:45 +00:00