Export of internal Abseil changes

--
f51743aa96e19aa3dda96d09d313b4390f1d61e7 by CJ Johnson <johnsoncj@google.com>:

Minor touchup on the InlinedVector/Storage internal header file

PiperOrigin-RevId: 262389640

--
e2f54c1f7142e40d30ff0fda43bef050625821a5 by Abseil Team <absl-team@google.com>:

Update the absl codebase to use proper marketing names for macOS and Xcode

PiperOrigin-RevId: 262389450

--
f29aae774edd0d00e2daa1fb96694a6dc3565a55 by CJ Johnson <johnsoncj@google.com>:

Blocks code generator script from being affected by LTS inline namespaces

PiperOrigin-RevId: 262376791
GitOrigin-RevId: f51743aa96e19aa3dda96d09d313b4390f1d61e7
Change-Id: I33be7f5a708ce8a2b7111b00151e43d73c5e0009
This commit is contained in:
Abseil Team 2019-08-08 10:56:58 -07:00 committed by CJ Johnson
parent 8efba58a3b
commit 9ee91d3e43
11 changed files with 118 additions and 94 deletions

View file

@ -43,7 +43,7 @@ the Abseil code, running tests, and getting a simple binary working.
## Building Abseil ## Building Abseil
[Bazel](https://bazel.build) is the official build system for Abseil, [Bazel](https://bazel.build) is the official build system for Abseil,
which is supported on most major platforms (Linux, Windows, MacOS, for example) which is supported on most major platforms (Linux, Windows, macOS, for example)
and compilers. See the [quickstart](https://abseil.io/docs/cpp/quickstart) for and compilers. See the [quickstart](https://abseil.io/docs/cpp/quickstart) for
more information on building Abseil using the Bazel build system. more information on building Abseil using the Bazel build system.

View file

@ -260,7 +260,7 @@
// Linux and Linux-derived __linux__ // Linux and Linux-derived __linux__
// Android __ANDROID__ (implies __linux__) // Android __ANDROID__ (implies __linux__)
// Linux (non-Android) __linux__ && !__ANDROID__ // Linux (non-Android) __linux__ && !__ANDROID__
// Darwin (Mac OS X and iOS) __APPLE__ // Darwin (macOS and iOS) __APPLE__
// Akaros (http://akaros.org) __ros__ // Akaros (http://akaros.org) __ros__
// Windows _WIN32 // Windows _WIN32
// NaCL __native_client__ // NaCL __native_client__
@ -370,7 +370,7 @@
#error "absl endian detection needs to be set up for your compiler" #error "absl endian detection needs to be set up for your compiler"
#endif #endif
// MacOS 10.13 and iOS 10.11 don't let you use <any>, <optional>, or <variant> // macOS 10.13 and iOS 10.11 don't let you use <any>, <optional>, or <variant>
// even though the headers exist and are publicly noted to work. See // even though the headers exist and are publicly noted to work. See
// https://github.com/abseil/abseil-cpp/issues/207 and // https://github.com/abseil/abseil-cpp/issues/207 and
// https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes // https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes

View file

@ -20,7 +20,7 @@
#ifdef _MSC_VER #ifdef _MSC_VER
#include <stdlib.h> // NOLINT(build/include) #include <stdlib.h> // NOLINT(build/include)
#elif defined(__APPLE__) #elif defined(__APPLE__)
// Mac OS X / Darwin features // macOS / Darwin features
#include <libkern/OSByteOrder.h> #include <libkern/OSByteOrder.h>
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
#include <sys/endian.h> #include <sys/endian.h>

View file

@ -19,6 +19,7 @@
#include <cstddef> #include <cstddef>
#include <cstring> #include <cstring>
#include <iterator> #include <iterator>
#include <limits>
#include <memory> #include <memory>
#include <utility> #include <utility>
@ -270,6 +271,19 @@ class Storage {
using ConstructionTransaction = using ConstructionTransaction =
inlined_vector_internal::ConstructionTransaction<allocator_type>; inlined_vector_internal::ConstructionTransaction<allocator_type>;
static size_type NextCapacity(size_type current_capacity) {
return current_capacity * 2;
}
static size_type ComputeCapacity(size_type current_capacity,
size_type requested_capacity) {
return (std::max)(NextCapacity(current_capacity), requested_capacity);
}
// ---------------------------------------------------------------------------
// Storage Constructors and Destructor
// ---------------------------------------------------------------------------
Storage() : metadata_() {} Storage() : metadata_() {}
explicit Storage(const allocator_type& alloc) explicit Storage(const allocator_type& alloc)
@ -281,10 +295,26 @@ class Storage {
DeallocateIfAllocated(); DeallocateIfAllocated();
} }
// ---------------------------------------------------------------------------
// Storage Member Accessors
// ---------------------------------------------------------------------------
size_type& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
const size_type& GetSizeAndIsAllocated() const {
return metadata_.template get<1>();
}
size_type GetSize() const { return GetSizeAndIsAllocated() >> 1; } size_type GetSize() const { return GetSizeAndIsAllocated() >> 1; }
bool GetIsAllocated() const { return GetSizeAndIsAllocated() & 1; } bool GetIsAllocated() const { return GetSizeAndIsAllocated() & 1; }
pointer GetAllocatedData() { return data_.allocated.allocated_data; }
const_pointer GetAllocatedData() const {
return data_.allocated.allocated_data;
}
pointer GetInlinedData() { pointer GetInlinedData() {
return reinterpret_cast<pointer>( return reinterpret_cast<pointer>(
std::addressof(data_.inlined.inlined_data[0])); std::addressof(data_.inlined.inlined_data[0]));
@ -295,18 +325,12 @@ class Storage {
std::addressof(data_.inlined.inlined_data[0])); std::addressof(data_.inlined.inlined_data[0]));
} }
pointer GetAllocatedData() { return data_.allocated.allocated_data; }
const_pointer GetAllocatedData() const {
return data_.allocated.allocated_data;
}
size_type GetInlinedCapacity() const { return static_cast<size_type>(N); }
size_type GetAllocatedCapacity() const { size_type GetAllocatedCapacity() const {
return data_.allocated.allocated_capacity; return data_.allocated.allocated_capacity;
} }
size_type GetInlinedCapacity() const { return static_cast<size_type>(N); }
StorageView MakeStorageView() { StorageView MakeStorageView() {
return GetIsAllocated() return GetIsAllocated()
? StorageView{GetAllocatedData(), GetSize(), ? StorageView{GetAllocatedData(), GetSize(),
@ -322,57 +346,9 @@ class Storage {
return std::addressof(metadata_.template get<0>()); return std::addressof(metadata_.template get<0>());
} }
void SetIsAllocated() { GetSizeAndIsAllocated() |= 1; } // ---------------------------------------------------------------------------
// Storage Member Mutators
void UnsetIsAllocated() { // ---------------------------------------------------------------------------
SetIsAllocated();
GetSizeAndIsAllocated() -= 1;
}
void SetAllocatedSize(size_type size) {
GetSizeAndIsAllocated() = (size << 1) | static_cast<size_type>(1);
}
void SetInlinedSize(size_type size) { GetSizeAndIsAllocated() = size << 1; }
void SetSize(size_type size) {
GetSizeAndIsAllocated() =
(size << 1) | static_cast<size_type>(GetIsAllocated());
}
void AddSize(size_type count) { GetSizeAndIsAllocated() += count << 1; }
void SubtractSize(size_type count) {
assert(count <= GetSize());
GetSizeAndIsAllocated() -= count << 1;
}
void SetAllocatedData(pointer data, size_type capacity) {
data_.allocated.allocated_data = data;
data_.allocated.allocated_capacity = capacity;
}
void DeallocateIfAllocated() {
if (GetIsAllocated()) {
AllocatorTraits::deallocate(*GetAllocPtr(), GetAllocatedData(),
GetAllocatedCapacity());
}
}
void AcquireAllocation(AllocationTransaction* allocation_tx_ptr) {
SetAllocatedData(allocation_tx_ptr->GetData(),
allocation_tx_ptr->GetCapacity());
allocation_tx_ptr->GetData() = nullptr;
allocation_tx_ptr->GetCapacity() = 0;
}
void MemcpyFrom(const Storage& other_storage) {
assert(IsMemcpyOk::value || other_storage.GetIsAllocated());
GetSizeAndIsAllocated() = other_storage.GetSizeAndIsAllocated();
data_ = other_storage.data_;
}
template <typename ValueAdapter> template <typename ValueAdapter>
void Initialize(ValueAdapter values, size_type new_size); void Initialize(ValueAdapter values, size_type new_size);
@ -398,22 +374,64 @@ class Storage {
void Swap(Storage* other_storage_ptr); void Swap(Storage* other_storage_ptr);
void SetIsAllocated() {
GetSizeAndIsAllocated() |= static_cast<size_type>(1);
}
void UnsetIsAllocated() {
GetSizeAndIsAllocated() &= ((std::numeric_limits<size_type>::max)() - 1);
}
void SetSize(size_type size) {
GetSizeAndIsAllocated() =
(size << 1) | static_cast<size_type>(GetIsAllocated());
}
void SetAllocatedSize(size_type size) {
GetSizeAndIsAllocated() = (size << 1) | static_cast<size_type>(1);
}
void SetInlinedSize(size_type size) {
GetSizeAndIsAllocated() = size << static_cast<size_type>(1);
}
void AddSize(size_type count) {
GetSizeAndIsAllocated() += count << static_cast<size_type>(1);
}
void SubtractSize(size_type count) {
assert(count <= GetSize());
GetSizeAndIsAllocated() -= count << static_cast<size_type>(1);
}
void SetAllocatedData(pointer data, size_type capacity) {
data_.allocated.allocated_data = data;
data_.allocated.allocated_capacity = capacity;
}
void AcquireAllocatedData(AllocationTransaction* allocation_tx_ptr) {
SetAllocatedData(allocation_tx_ptr->GetData(),
allocation_tx_ptr->GetCapacity());
allocation_tx_ptr->GetData() = nullptr;
allocation_tx_ptr->GetCapacity() = 0;
}
void MemcpyFrom(const Storage& other_storage) {
assert(IsMemcpyOk::value || other_storage.GetIsAllocated());
GetSizeAndIsAllocated() = other_storage.GetSizeAndIsAllocated();
data_ = other_storage.data_;
}
void DeallocateIfAllocated() {
if (GetIsAllocated()) {
AllocatorTraits::deallocate(*GetAllocPtr(), GetAllocatedData(),
GetAllocatedCapacity());
}
}
private: private:
size_type& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
const size_type& GetSizeAndIsAllocated() const {
return metadata_.template get<1>();
}
static size_type NextCapacity(size_type current_capacity) {
return current_capacity * 2;
}
static size_type ComputeCapacity(size_type current_capacity,
size_type requested_capacity) {
return (std::max)(NextCapacity(current_capacity), requested_capacity);
}
using Metadata = using Metadata =
container_internal::CompressedTuple<allocator_type, size_type>; container_internal::CompressedTuple<allocator_type, size_type>;
@ -508,7 +526,7 @@ auto Storage<T, N, A>::Assign(ValueAdapter values, size_type new_size) -> void {
if (allocation_tx.DidAllocate()) { if (allocation_tx.DidAllocate()) {
DeallocateIfAllocated(); DeallocateIfAllocated();
AcquireAllocation(&allocation_tx); AcquireAllocatedData(&allocation_tx);
SetIsAllocated(); SetIsAllocated();
} }
@ -557,7 +575,7 @@ auto Storage<T, N, A>::Resize(ValueAdapter values, size_type new_size) -> void {
construction_tx.Commit(); construction_tx.Commit();
if (allocation_tx.DidAllocate()) { if (allocation_tx.DidAllocate()) {
DeallocateIfAllocated(); DeallocateIfAllocated();
AcquireAllocation(&allocation_tx); AcquireAllocatedData(&allocation_tx);
SetIsAllocated(); SetIsAllocated();
} }
@ -600,7 +618,7 @@ auto Storage<T, N, A>::Insert(const_iterator pos, ValueAdapter values,
construction_tx.Commit(); construction_tx.Commit();
move_construciton_tx.Commit(); move_construciton_tx.Commit();
DeallocateIfAllocated(); DeallocateIfAllocated();
AcquireAllocation(&allocation_tx); AcquireAllocatedData(&allocation_tx);
SetAllocatedSize(new_size); SetAllocatedSize(new_size);
return iterator(new_data + insert_index); return iterator(new_data + insert_index);
@ -697,7 +715,7 @@ auto Storage<T, N, A>::EmplaceBack(Args&&... args) -> reference {
storage_view.size); storage_view.size);
DeallocateIfAllocated(); DeallocateIfAllocated();
AcquireAllocation(&allocation_tx); AcquireAllocatedData(&allocation_tx);
SetIsAllocated(); SetIsAllocated();
} }
@ -754,7 +772,7 @@ auto Storage<T, N, A>::Reserve(size_type requested_capacity) -> void {
storage_view.size); storage_view.size);
DeallocateIfAllocated(); DeallocateIfAllocated();
AcquireAllocation(&allocation_tx); AcquireAllocatedData(&allocation_tx);
SetIsAllocated(); SetIsAllocated();
} }
@ -800,7 +818,7 @@ auto Storage<T, N, A>::ShrinkToFit() -> void {
storage_view.capacity); storage_view.capacity);
if (allocation_tx.DidAllocate()) { if (allocation_tx.DidAllocate()) {
AcquireAllocation(&allocation_tx); AcquireAllocatedData(&allocation_tx);
} else { } else {
UnsetIsAllocated(); UnsetIsAllocated();
} }

View file

@ -162,7 +162,7 @@ ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack.
static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count, static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
const void *ucp, int *min_dropped_frames) { const void *ucp, int *min_dropped_frames) {
void **sp; void **sp;
// Apple OS X uses an old version of gnu as -- both Darwin 7.9.0 (Panther) // Apple macOS uses an old version of gnu as -- both Darwin 7.9.0 (Panther)
// and Darwin 8.8.1 (Tiger) use as 1.38. This means we have to use a // and Darwin 8.8.1 (Tiger) use as 1.38. This means we have to use a
// different asm syntax. I don't know quite the best way to discriminate // different asm syntax. I don't know quite the best way to discriminate
// systems using the old as from the new one; I've gone with __APPLE__. // systems using the old as from the new one; I've gone with __APPLE__.

View file

@ -110,8 +110,12 @@ void TableGenerator::Print(std::ostream* os) {
"\n" "\n"
"#include \"absl/random/gaussian_distribution.h\"\n" "#include \"absl/random/gaussian_distribution.h\"\n"
"\n" "\n"
"namespace absl {\n" // "namespace " and "absl" are broken apart so as not to conflict with
"namespace random_internal {\n" // script that adds the LTS inline namespace.
"namespace "
"absl {\n"
"namespace "
"random_internal {\n"
"\n" "\n"
"const gaussian_distribution_base::Tables\n" "const gaussian_distribution_base::Tables\n"
" gaussian_distribution_base::zg_ = {\n"; " gaussian_distribution_base::zg_ = {\n";
@ -120,8 +124,10 @@ void TableGenerator::Print(std::ostream* os) {
FormatArrayContents(os, tables_.f); FormatArrayContents(os, tables_.f);
*os << "};\n" *os << "};\n"
"\n" "\n"
"} // namespace random_internal\n" "} // namespace "
"} // namespace absl\n" "random_internal\n"
"} // namespace "
"absl\n"
"\n" "\n"
"// clang-format on\n" "// clang-format on\n"
"// END GENERATED CODE"; "// END GENERATED CODE";

View file

@ -30,7 +30,7 @@
// Linux and Linux-derived __linux__ // Linux and Linux-derived __linux__
// Android __ANDROID__ (implies __linux__) // Android __ANDROID__ (implies __linux__)
// Linux (non-Android) __linux__ && !__ANDROID__ // Linux (non-Android) __linux__ && !__ANDROID__
// Darwin (Mac OS X and iOS) __APPLE__ // Darwin (macOS and iOS) __APPLE__
// Akaros (http://akaros.org) __ros__ // Akaros (http://akaros.org) __ros__
// Windows _WIN32 // Windows _WIN32
// NaCL __native_client__ // NaCL __native_client__

View file

@ -713,7 +713,7 @@ TEST(stringtest, safe_strtou64_base_length_delimited) {
} }
} }
// feenableexcept() and fedisableexcept() are missing on Mac OS X, MSVC, // feenableexcept() and fedisableexcept() are missing on macOS, MSVC,
// and WebAssembly. // and WebAssembly.
#if defined(_MSC_VER) || defined(__APPLE__) || defined(__EMSCRIPTEN__) #if defined(_MSC_VER) || defined(__APPLE__) || defined(__EMSCRIPTEN__)
#define ABSL_MISSING_FEENABLEEXCEPT 1 #define ABSL_MISSING_FEENABLEEXCEPT 1

View file

@ -201,7 +201,7 @@ TEST(ParseTime, ErrorCases) {
err.clear(); err.clear();
EXPECT_FALSE(absl::ParseTime("%Q", "x", &t, &err)) << err; EXPECT_FALSE(absl::ParseTime("%Q", "x", &t, &err)) << err;
// Exact contents of "err" are platform-dependent because of // Exact contents of "err" are platform-dependent because of
// differences in the strptime implementation between OSX and Linux. // differences in the strptime implementation between macOS and Linux.
EXPECT_FALSE(err.empty()); EXPECT_FALSE(err.empty());
// Fails because of trailing, unparsed data "blah". // Fails because of trailing, unparsed data "blah".

2
ci/macos_xcode_bazel.sh Normal file → Executable file
View file

@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# This script is invoked on Kokoro to test Abseil on MacOS. # This script is invoked on Kokoro to test Abseil on macOS.
# It is not hermetic and may break when Kokoro is updated. # It is not hermetic and may break when Kokoro is updated.
set -euox pipefail set -euox pipefail

2
ci/macos_xcode_cmake.sh Normal file → Executable file
View file

@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# This script is invoked on Kokoro to test Abseil on MacOS. # This script is invoked on Kokoro to test Abseil on macOS.
# It is not hermetic and may break when Kokoro is updated. # It is not hermetic and may break when Kokoro is updated.
set -euox pipefail set -euox pipefail