diff options
-rw-r--r-- | chromium/chromium/chromium-angle-gcc9.patch | 44 | ||||
-rwxr-xr-x | chromium/chromium/chromium-ffmpeg-clean.sh | 1 | ||||
-rw-r--r-- | chromium/chromium/chromium-gcc8-cl1503254.patch | 75 | ||||
-rw-r--r-- | chromium/chromium/chromium-gcc8-r641329.patch | 101 | ||||
-rw-r--r-- | chromium/chromium/chromium-gcc8-r641404.patch | 587 | ||||
-rw-r--r-- | chromium/chromium/chromium-gcc8-r642680.patch | 75 | ||||
-rw-r--r-- | chromium/chromium/chromium-gcc8-r647271.patch | 483 | ||||
-rw-r--r-- | chromium/chromium/chromium-gcc8-r647382.patch | 42 | ||||
-rw-r--r-- | chromium/chromium/chromium-gcc9-r654570.patch | 39 | ||||
-rw-r--r-- | chromium/chromium/chromium-gcc9-r666714.patch | 111 | ||||
-rw-r--r-- | chromium/chromium/chromium-gn-revert-bug-77.patch | 918 | ||||
-rw-r--r-- | chromium/chromium/chromium.spec | 23 |
12 files changed, 206 insertions, 2293 deletions
diff --git a/chromium/chromium/chromium-angle-gcc9.patch b/chromium/chromium/chromium-angle-gcc9.patch new file mode 100644 index 0000000..05e5f59 --- /dev/null +++ b/chromium/chromium/chromium-angle-gcc9.patch @@ -0,0 +1,44 @@ +From 926f1caa8b5c34a6d2e3a9fa9f10976ca6d51323 Mon Sep 17 00:00:00 2001 +From: Yi Xu <yiyix@chromium.org> +Date: Wed, 1 May 2019 14:03:05 -0400 +Subject: [PATCH] Add support for GCC Compilers + +Add support for GCC Compilers, so it can be build on Ubuntu. + +BUG=angleproject:3392 + +Change-Id: I2f5ac7355a40f52123bd465f86b1e966c59c943d +Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1592062 +Reviewed-by: Geoff Lang <geofflang@chromium.org> +Commit-Queue: Yi Xu <yiyix@chromium.org> +--- + src/common/debug.h | 4 +- + .../GPUTestExpectationsParser_unittest.cpp | 20 +++ + .../vulkan_command_buffer_utils.cpp | 116 +++++++++--------- + 3 files changed, 80 insertions(+), 60 deletions(-) + +diff --git a/src/common/debug.h b/src/common/debug.h +index 64783687b..3e687b816 100644 +--- a/third_party/angle/src/common/debug.h ++++ b/third_party/angle/src/common/debug.h +@@ -248,7 +248,7 @@ std::ostream &FmtHex(std::ostream &os, T value) + # define EVENT(message, ...) (void(0)) + #endif + +-#if defined(COMPILER_GCC) || defined(__clang__) ++#if defined(__GNUC__) + # define ANGLE_CRASH() __builtin_trap() + #else + # define ANGLE_CRASH() ((void)(*(volatile char *)0 = 0)), __assume(0) +@@ -336,7 +336,7 @@ std::ostream &FmtHex(std::ostream &os, T value) + # define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \ + _Pragma("clang diagnostic push") _Pragma("clang diagnostic error \"-Wpadded\"") + # define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("clang diagnostic pop") +-#elif defined(COMPILER_GCC) ++#elif defined(__GNUC__) + # define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \ + _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic error \"-Wpadded\"") + # define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("GCC diagnostic pop") +-- +2.21.0 + diff --git a/chromium/chromium/chromium-ffmpeg-clean.sh b/chromium/chromium/chromium-ffmpeg-clean.sh index bcfc16d..851cb90 100755 --- a/chromium/chromium/chromium-ffmpeg-clean.sh +++ b/chromium/chromium/chromium-ffmpeg-clean.sh @@ -124,6 +124,7 @@ header_files=" libavcodec/x86/inline_asm.h \ libavcodec/mpegvideodsp.h \ libavcodec/mpegvideoencdsp.h \ libavcodec/options_table.h \ + libavcodec/opusdsp.h \ libavcodec/opus_celt.h \ libavcodec/opus_pvq.h \ libavcodec/opus_rc.h \ diff --git a/chromium/chromium/chromium-gcc8-cl1503254.patch b/chromium/chromium/chromium-gcc8-cl1503254.patch deleted file mode 100644 index 25f0e6a..0000000 --- a/chromium/chromium/chromium-gcc8-cl1503254.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 22cd5f5f9f8af1f343e9fa747c03fc79667a60ea Mon Sep 17 00:00:00 2001 -From: Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com> -Date: Tue, 05 Mar 2019 11:11:51 +0100 -Subject: [PATCH] quic: Make QuicCryptoStream::substreams_ a std::unique_ptr - -This works around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63707, which -was causing the GCC build to fail since commit 167db3e68 ("Landing Recent -QUIC changes until 8:59 AM, Feb 26, 2019 UTC-5"): - -../../net/third_party/quic/core/quic_crypto_stream.cc: In constructor ‘quic::QuicCryptoStream::QuicCryptoStream(quic::QuicSession*)’: -../../net/third_party/quic/core/quic_crypto_stream.cc:33:52: error: use of deleted function ‘quic::QuicCryptoStream::CryptoSubstream::CryptoSubstream(quic::QuicCryptoStream::CryptoSubstream&&)’ - {this, ENCRYPTION_FORWARD_SECURE}} { - ^ -In file included from ../../net/third_party/quic/core/quic_crypto_stream.cc:5: -../../net/third_party/quic/core/quic_crypto_stream.h:152:10: note: ‘quic::QuicCryptoStream::CryptoSubstream::CryptoSubstream(quic::QuicCryptoStream::CryptoSubstream&&)’ is implicitly deleted because the default definition would be ill-formed: - struct CryptoSubstream { - ^~~~~~~~~~~~~~~ -../../net/third_party/quic/core/quic_crypto_stream.h:152:10: error: use of deleted function ‘quic::QuicStreamSendBuffer::QuicStreamSendBuffer(quic::QuicStreamSendBuffer&&)’ -In file included from ../../net/third_party/quic/core/quic_stream.h:27, - from ../../net/third_party/quic/core/quic_crypto_stream.h:15, - from ../../net/third_party/quic/core/quic_crypto_stream.cc:5: -../../net/third_party/quic/core/quic_stream_send_buffer.h:63:3: note: declared here - QuicStreamSendBuffer(QuicStreamSendBuffer&& other) = delete; - ^~~~~~~~~~~~~~~~~~~~ - -The code is actually correct, but that GCC bug causes the initialization to -fail. Work around it by making |substreams_| a std::unique_ptr so we can -initialize it via operator new[] instead. - -Bug: 819294, 937886 -Change-Id: If56f2a12a733e6f6680ed9c9e6f7688439e9d216 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1503254 ---- - -diff --git a/net/third_party/quic/core/quic_crypto_stream.cc b/net/third_party/quic/core/quic_crypto_stream.cc -index eb58f53..6ee344e 100644 ---- a/net/third_party/quic/core/quic_crypto_stream.cc -+++ b/net/third_party/quic/core/quic_crypto_stream.cc -@@ -28,9 +28,10 @@ - session, - /*is_static=*/true, - BIDIRECTIONAL), -- substreams_{{this, ENCRYPTION_NONE}, -- {this, ENCRYPTION_ZERO_RTT}, -- {this, ENCRYPTION_FORWARD_SECURE}} { -+ substreams_(new CryptoSubstream[NUM_ENCRYPTION_LEVELS]{ -+ {this, ENCRYPTION_NONE}, -+ {this, ENCRYPTION_ZERO_RTT}, -+ {this, ENCRYPTION_FORWARD_SECURE}}) { - // The crypto stream is exempt from connection level flow control. - DisableConnectionFlowControlForThisStream(); - } -diff --git a/net/third_party/quic/core/quic_crypto_stream.h b/net/third_party/quic/core/quic_crypto_stream.h -index 132751a..b13768c 100644 ---- a/net/third_party/quic/core/quic_crypto_stream.h -+++ b/net/third_party/quic/core/quic_crypto_stream.h -@@ -6,6 +6,7 @@ - #define NET_THIRD_PARTY_QUIC_CORE_QUIC_CRYPTO_STREAM_H_ - - #include <cstddef> -+#include <memory> - - #include "base/macros.h" - #include "net/third_party/quic/core/crypto/crypto_framer.h" -@@ -169,7 +170,9 @@ - - // Keeps state for data sent/received in CRYPTO frames at each encryption - // level. -- CryptoSubstream substreams_[NUM_ENCRYPTION_LEVELS]; -+ // N.B.: We are using a std::unique_ptr here only due to -+ // https://crbug.com/937886. -+ std::unique_ptr<CryptoSubstream[]> substreams_; - }; - - } // namespace quic diff --git a/chromium/chromium/chromium-gcc8-r641329.patch b/chromium/chromium/chromium-gcc8-r641329.patch deleted file mode 100644 index 49fcf69..0000000 --- a/chromium/chromium/chromium-gcc8-r641329.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 0e121588d500217a38d57f5e285aa586676059b2 Mon Sep 17 00:00:00 2001 -From: Sergey Abbakumov <sabbakumov@yandex-team.ru> -Date: Fri, 15 Mar 2019 22:32:16 +0000 -Subject: [PATCH] base::Value::SetKey/SetPath performance improvements - -Use rvalue references to avoid copying sizeof(base::Value). - -This commit gives about -20KB of the browser.dll and browser_child.dll -size. Also it reduces renderer memory consumption by ~200 -KB max. - -Bug: 646113 -Change-Id: I8c86594838292a2faf4d134b899a7978dbc214fc -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1520407 -Reviewed-by: danakj <danakj@chromium.org> -Commit-Queue: danakj <danakj@chromium.org> -Cr-Commit-Position: refs/heads/master@{#641329} ---- - base/values.cc | 10 +++++----- - base/values.h | 10 +++++----- - 2 files changed, 10 insertions(+), 10 deletions(-) - -diff --git a/base/values.cc b/base/values.cc -index 2b0c6c8163d8..0c002551b317 100644 ---- a/base/values.cc -+++ b/base/values.cc -@@ -353,7 +353,7 @@ bool Value::RemoveKey(StringPiece key) { - return dict_.erase(key) != 0; - } - --Value* Value::SetKey(StringPiece key, Value value) { -+Value* Value::SetKey(StringPiece key, Value&& value) { - CHECK(is_dict()); - // NOTE: We can't use |insert_or_assign| here, as only |try_emplace| does - // an explicit conversion from StringPiece to std::string if necessary. -@@ -366,7 +366,7 @@ Value* Value::SetKey(StringPiece key, Value value) { - return result.first->second.get(); - } - --Value* Value::SetKey(std::string&& key, Value value) { -+Value* Value::SetKey(std::string&& key, Value&& value) { - CHECK(is_dict()); - return dict_ - .insert_or_assign(std::move(key), -@@ -374,7 +374,7 @@ Value* Value::SetKey(std::string&& key, Value value) { - .first->second.get(); - } - --Value* Value::SetKey(const char* key, Value value) { -+Value* Value::SetKey(const char* key, Value&& value) { - return SetKey(StringPiece(key), std::move(value)); - } - -@@ -425,12 +425,12 @@ const Value* Value::FindPathOfType(span<const StringPiece> path, - return result; - } - --Value* Value::SetPath(std::initializer_list<StringPiece> path, Value value) { -+Value* Value::SetPath(std::initializer_list<StringPiece> path, Value&& value) { - DCHECK_GE(path.size(), 2u) << "Use SetKey() for a path of length 1."; - return SetPath(make_span(path.begin(), path.size()), std::move(value)); - } - --Value* Value::SetPath(span<const StringPiece> path, Value value) { -+Value* Value::SetPath(span<const StringPiece> path, Value&& value) { - DCHECK(path.begin() != path.end()); // Can't be empty path. - - // Walk/construct intermediate dictionaries. The last element requires -diff --git a/base/values.h b/base/values.h -index 7546fa53756d..429ef1dfdebd 100644 ---- a/base/values.h -+++ b/base/values.h -@@ -210,11 +210,11 @@ class BASE_EXPORT Value { - // - // Example: - // SetKey("foo", std::move(myvalue)); -- Value* SetKey(StringPiece key, Value value); -+ Value* SetKey(StringPiece key, Value&& value); - // This overload results in a performance improvement for std::string&&. -- Value* SetKey(std::string&& key, Value value); -+ Value* SetKey(std::string&& key, Value&& value); - // This overload is necessary to avoid ambiguity for const char* arguments. -- Value* SetKey(const char* key, Value value); -+ Value* SetKey(const char* key, Value&& value); - - // This attemps to remove the value associated with |key|. In case of failure, - // e.g. the key does not exist, |false| is returned and the underlying -@@ -276,8 +276,8 @@ class BASE_EXPORT Value { - // value.SetPath(components, std::move(myvalue)); - // - // Note: If there is only one component in the path, use SetKey() instead. -- Value* SetPath(std::initializer_list<StringPiece> path, Value value); -- Value* SetPath(span<const StringPiece> path, Value value); -+ Value* SetPath(std::initializer_list<StringPiece> path, Value&& value); -+ Value* SetPath(span<const StringPiece> path, Value&& value); - - // Tries to remove a Value at the given path. - // --- -2.20.1 - diff --git a/chromium/chromium/chromium-gcc8-r641404.patch b/chromium/chromium/chromium-gcc8-r641404.patch deleted file mode 100644 index fe84c7b..0000000 --- a/chromium/chromium/chromium-gcc8-r641404.patch +++ /dev/null @@ -1,587 +0,0 @@ -From e1b1f3a5f273c8da533fad495b9de316e2c83c9b Mon Sep 17 00:00:00 2001 -From: jdoerrie <jdoerrie@chromium.org> -Date: Sat, 16 Mar 2019 04:08:01 +0000 -Subject: [PATCH] [base] Add Dead Type to base::Value - -This change adds a temporary DEAD type to base::Value which should help -to track down use-after-free bugs. Furthermore, this change also removes -the now unneeded is_alive_ flag. - -Bug: 859477, 941404 -Change-Id: I9b7a2f3cbb0b22d7e3ed35b2453537419f3f7e55 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1478897 -Reviewed-by: Pavol Marko <pmarko@chromium.org> -Reviewed-by: Tao Bai <michaelbai@chromium.org> -Reviewed-by: Thomas Anderson <thomasanderson@chromium.org> -Reviewed-by: Mike Pinkerton <pinkerton@chromium.org> -Reviewed-by: Bill Budge <bbudge@chromium.org> -Reviewed-by: Ken Rockot <rockot@google.com> -Reviewed-by: Steven Bennetts <stevenjb@chromium.org> -Reviewed-by: Daniel Cheng <dcheng@chromium.org> -Reviewed-by: David Turner <digit@chromium.org> -Commit-Queue: Thomas Anderson <thomasanderson@chromium.org> -Cr-Commit-Position: refs/heads/master@{#641404} ---- - base/json/json_writer.cc | 5 ++ - base/values.cc | 68 ++++++++++++------- - base/values.h | 23 ++----- - base/values_unittest.cc | 10 ++- - .../ui/cocoa/applescript/apple_event_util.mm | 10 +++ - chromeos/network/onc/variable_expander.cc | 6 ++ - .../core/browser/android/policy_converter.cc | 11 ++- - .../core/common/policy_loader_win_unittest.cc | 8 ++- - .../policy/core/common/policy_test_utils.cc | 5 ++ - .../policy/core/common/registry_dict.cc | 4 ++ - .../gin_java_script_to_java_types_coercion.cc | 8 ++- - ipc/ipc_message_utils.cc | 11 ++- - mojo/public/cpp/base/values_mojom_traits.h | 7 +- - .../ppb_x509_certificate_private_shared.cc | 2 + - 14 files changed, 127 insertions(+), 51 deletions(-) - -diff --git a/base/json/json_writer.cc b/base/json/json_writer.cc -index 376a459f9a46..cd020e7fa0c0 100644 ---- a/base/json/json_writer.cc -+++ b/base/json/json_writer.cc -@@ -179,6 +179,11 @@ bool JSONWriter::BuildJSONString(const Value& node, size_t depth) { - // Successful only if we're allowed to omit it. - DLOG_IF(ERROR, !omit_binary_values_) << "Cannot serialize binary value."; - return omit_binary_values_; -+ -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case Value::Type::DEAD: -+ CHECK(false); -+ return false; - } - - // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -diff --git a/base/values.cc b/base/values.cc -index 0c002551b317..035aa2350cde 100644 ---- a/base/values.cc -+++ b/base/values.cc -@@ -90,8 +90,6 @@ std::unique_ptr<Value> CopyWithoutEmptyChildren(const Value& node) { - - } // namespace - --constexpr uint16_t Value::kMagicIsAlive; -- - // static - std::unique_ptr<Value> Value::CreateWithCopiedBuffer(const char* buffer, - size_t size) { -@@ -112,9 +110,9 @@ Value::Value(Value&& that) noexcept { - InternalMoveConstructFrom(std::move(that)); - } - --Value::Value() noexcept : type_(Type::NONE), is_alive_(kMagicIsAlive) {} -+Value::Value() noexcept : type_(Type::NONE) {} - --Value::Value(Type type) : type_(type), is_alive_(kMagicIsAlive) { -+Value::Value(Type type) : type_(type) { - // Initialize with the default value. - switch (type_) { - case Type::NONE: -@@ -141,22 +139,26 @@ Value::Value(Type type) : type_(type), is_alive_(kMagicIsAlive) { - case Type::LIST: - new (&list_) ListStorage(); - return; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case Type::DEAD: -+ CHECK(false); -+ return; - } -+ -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - } - - Value::Value(bool in_bool) - : bool_type_(Type::BOOLEAN), -- bool_is_alive_(kMagicIsAlive), - bool_value_(in_bool) {} - - Value::Value(int in_int) - : int_type_(Type::INTEGER), -- int_is_alive_(kMagicIsAlive), - int_value_(in_int) {} - - Value::Value(double in_double) - : double_type_(Type::DOUBLE), -- double_is_alive_(kMagicIsAlive), - double_value_(in_double) { - if (!std::isfinite(double_value_)) { - NOTREACHED() << "Non-finite (i.e. NaN or positive/negative infinity) " -@@ -171,7 +173,6 @@ Value::Value(StringPiece in_string) : Value(std::string(in_string)) {} - - Value::Value(std::string&& in_string) noexcept - : string_type_(Type::STRING), -- string_is_alive_(kMagicIsAlive), - string_value_(std::move(in_string)) { - DCHECK(IsStringUTF8(string_value_)); - } -@@ -182,21 +183,18 @@ Value::Value(StringPiece16 in_string16) : Value(UTF16ToUTF8(in_string16)) {} - - Value::Value(const std::vector<char>& in_blob) - : binary_type_(Type::BINARY), -- binary_is_alive_(kMagicIsAlive), - binary_value_(in_blob.begin(), in_blob.end()) {} - - Value::Value(base::span<const uint8_t> in_blob) - : binary_type_(Type::BINARY), -- binary_is_alive_(kMagicIsAlive), - binary_value_(in_blob.begin(), in_blob.end()) {} - - Value::Value(BlobStorage&& in_blob) noexcept - : binary_type_(Type::BINARY), -- binary_is_alive_(kMagicIsAlive), - binary_value_(std::move(in_blob)) {} - - Value::Value(const DictStorage& in_dict) -- : dict_type_(Type::DICTIONARY), dict_is_alive_(kMagicIsAlive), dict_() { -+ : dict_type_(Type::DICTIONARY), dict_() { - dict_.reserve(in_dict.size()); - for (const auto& it : in_dict) { - dict_.try_emplace(dict_.end(), it.first, -@@ -206,11 +204,9 @@ Value::Value(const DictStorage& in_dict) - - Value::Value(DictStorage&& in_dict) noexcept - : dict_type_(Type::DICTIONARY), -- dict_is_alive_(kMagicIsAlive), - dict_(std::move(in_dict)) {} - --Value::Value(const ListStorage& in_list) -- : list_type_(Type::LIST), list_is_alive_(kMagicIsAlive), list_() { -+Value::Value(const ListStorage& in_list) : list_type_(Type::LIST), list_() { - list_.reserve(in_list.size()); - for (const auto& val : in_list) - list_.emplace_back(val.Clone()); -@@ -218,7 +214,6 @@ Value::Value(const ListStorage& in_list) - - Value::Value(ListStorage&& in_list) noexcept - : list_type_(Type::LIST), -- list_is_alive_(kMagicIsAlive), - list_(std::move(in_list)) {} - - Value& Value::operator=(Value&& that) noexcept { -@@ -246,15 +241,21 @@ Value Value::Clone() const { - return Value(dict_); - case Type::LIST: - return Value(list_); -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case Type::DEAD: -+ CHECK(false); -+ return Value(); - } - -- NOTREACHED(); -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - return Value(); - } - - Value::~Value() { - InternalCleanup(); -- is_alive_ = 0; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ type_ = Type::DEAD; - } - - // static -@@ -654,9 +655,14 @@ bool operator==(const Value& lhs, const Value& rhs) { - }); - case Value::Type::LIST: - return lhs.list_ == rhs.list_; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case Value::Type::DEAD: -+ CHECK(false); -+ return false; - } - -- NOTREACHED(); -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - return false; - } - -@@ -693,9 +699,14 @@ bool operator<(const Value& lhs, const Value& rhs) { - }); - case Value::Type::LIST: - return lhs.list_ < rhs.list_; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case Value::Type::DEAD: -+ CHECK(false); -+ return false; - } - -- NOTREACHED(); -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - return false; - } - -@@ -733,7 +744,6 @@ size_t Value::EstimateMemoryUsage() const { - - void Value::InternalMoveConstructFrom(Value&& that) { - type_ = that.type_; -- is_alive_ = that.is_alive_; - - switch (type_) { - case Type::NONE: -@@ -759,12 +769,17 @@ void Value::InternalMoveConstructFrom(Value&& that) { - case Type::LIST: - new (&list_) ListStorage(std::move(that.list_)); - return; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case Type::DEAD: -+ CHECK(false); -+ return; - } -+ -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - } - - void Value::InternalCleanup() { -- CHECK_EQ(is_alive_, kMagicIsAlive); -- - switch (type_) { - case Type::NONE: - case Type::BOOLEAN: -@@ -785,7 +800,14 @@ void Value::InternalCleanup() { - case Type::LIST: - list_.~ListStorage(); - return; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case Type::DEAD: -+ CHECK(false); -+ return; - } -+ -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - } - - ///////////////////// DictionaryValue //////////////////// -diff --git a/base/values.h b/base/values.h -index 429ef1dfdebd..e31cadd83102 100644 ---- a/base/values.h -+++ b/base/values.h -@@ -92,7 +92,9 @@ class BASE_EXPORT Value { - STRING, - BINARY, - DICTIONARY, -- LIST -+ LIST, -+ // TODO(crbug.com/859477): Remove once root cause is found. -+ DEAD - // Note: Do not add more types. See the file-level comment above for why. - }; - -@@ -375,10 +377,6 @@ class BASE_EXPORT Value { - size_t EstimateMemoryUsage() const; - - protected: -- // Magic IsAlive signature to debug double frees. -- // TODO(crbug.com/859477): Remove once root cause is found. -- static constexpr uint16_t kMagicIsAlive = 0x2f19; -- - // Technical note: - // The naive way to implement a tagged union leads to wasted bytes - // in the object on CPUs like ARM ones, which impose an 8-byte alignment -@@ -408,8 +406,8 @@ class BASE_EXPORT Value { - // that |double_value_| below is always located at an offset that is a - // multiple of 8, relative to the start of the overall data structure. - // -- // Each struct must declare its own |type_| and |is_alive_| field, which -- // must have a different name, to appease the C++ compiler. -+ // Each struct must declare its own |type_| field, which must have a different -+ // name, to appease the C++ compiler. - // - // Using this technique sizeof(base::Value) == 16 on 32-bit ARM instead - // of 24, without losing any information. Results are unchanged for x86, -@@ -419,24 +417,17 @@ class BASE_EXPORT Value { - // TODO(crbug.com/646113): Make these private once DictionaryValue and - // ListValue are properly inlined. - Type type_ : 8; -- -- // IsAlive member to debug double frees. -- // TODO(crbug.com/859477): Remove once root cause is found. -- uint16_t is_alive_ = kMagicIsAlive; - }; - struct { - Type bool_type_ : 8; -- uint16_t bool_is_alive_; - bool bool_value_; - }; - struct { - Type int_type_ : 8; -- uint16_t int_is_alive_; - int int_value_; - }; - struct { - Type double_type_ : 8; -- uint16_t double_is_alive_; - // Subtle: On architectures that require it, the compiler will ensure - // that |double_value_|'s offset is a multiple of 8 (e.g. 32-bit ARM). - // See technical note above to understand why it is important. -@@ -444,22 +435,18 @@ class BASE_EXPORT Value { - }; - struct { - Type string_type_ : 8; -- uint16_t string_is_alive_; - std::string string_value_; - }; - struct { - Type binary_type_ : 8; -- uint16_t binary_is_alive_; - BlobStorage binary_value_; - }; - struct { - Type dict_type_ : 8; -- uint16_t dict_is_alive_; - DictStorage dict_; - }; - struct { - Type list_type_ : 8; -- uint16_t list_is_alive_; - ListStorage list_; - }; - }; -diff --git a/base/values_unittest.cc b/base/values_unittest.cc -index 0a641bcc7ef4..b23fd8332491 100644 ---- a/base/values_unittest.cc -+++ b/base/values_unittest.cc -@@ -20,17 +20,20 @@ - #include "base/strings/string16.h" - #include "base/strings/string_piece.h" - #include "base/strings/utf_string_conversions.h" -+#include "build/build_config.h" - #include "testing/gmock/include/gmock/gmock.h" - #include "testing/gtest/include/gtest/gtest.h" - - namespace base { - -+// Test is currently incorrect on Windows x86. -+#if !defined(OS_WIN) || !defined(ARCH_CPU_X86) - TEST(ValuesTest, SizeOfValue) { - // Ensure that base::Value is as small as possible, i.e. that there is - // no wasted space after the inner value due to alignment constraints. -- // Distinguish between the 'header' that includes |type_| and |is_alive_| -- // and the inner value that follows it, which can be a bool, int, double, -- // string, blob, list or dict. -+ // Distinguish between the 'header' that includes |type_| and and the inner -+ // value that follows it, which can be a bool, int, double, string, blob, list -+ // or dict. - #define INNER_TYPES_LIST(X) \ - X(bool, bool_value_) \ - X(int, int_value_) \ -@@ -61,6 +64,7 @@ TEST(ValuesTest, SizeOfValue) { - LOG(INFO) << "max_inner_struct_limit=" << max_inner_struct_limit; - } - } -+#endif - - TEST(ValuesTest, TestNothrow) { - static_assert(std::is_nothrow_move_constructible<Value>::value, -diff --git a/chrome/browser/ui/cocoa/applescript/apple_event_util.mm b/chrome/browser/ui/cocoa/applescript/apple_event_util.mm -index 16d685607ced..25a59338ee73 100644 ---- a/chrome/browser/ui/cocoa/applescript/apple_event_util.mm -+++ b/chrome/browser/ui/cocoa/applescript/apple_event_util.mm -@@ -96,6 +96,16 @@ NSAppleEventDescriptor* ValueToAppleEventDescriptor(const base::Value* value) { - } - break; - } -+ -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: -+ CHECK(false); -+ break; -+ -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ default: -+ CHECK(false); -+ break; - } - - return descriptor; -diff --git a/chromeos/network/onc/variable_expander.cc b/chromeos/network/onc/variable_expander.cc -index fd72752c2aa6..cd5bbb238eb3 100644 ---- a/chromeos/network/onc/variable_expander.cc -+++ b/chromeos/network/onc/variable_expander.cc -@@ -145,6 +145,12 @@ bool VariableExpander::ExpandValue(base::Value* value) const { - // Nothing to do here. - break; - } -+ -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: { -+ CHECK(false); -+ break; -+ } - } - return no_error; - } -diff --git a/components/policy/core/browser/android/policy_converter.cc b/components/policy/core/browser/android/policy_converter.cc -index b711a64febc9..9d41ad0d1507 100644 ---- a/components/policy/core/browser/android/policy_converter.cc -+++ b/components/policy/core/browser/android/policy_converter.cc -@@ -175,10 +175,17 @@ std::unique_ptr<base::Value> PolicyConverter::ConvertValueToSchema( - } - return value; - } -+ -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: { -+ CHECK(false); -+ return nullptr; -+ } - } - -- NOTREACHED(); -- return std::unique_ptr<base::Value>(); -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); -+ return nullptr; - } - - void PolicyConverter::SetPolicyValue(const std::string& key, -diff --git a/components/policy/core/common/policy_loader_win_unittest.cc b/components/policy/core/common/policy_loader_win_unittest.cc -index 311e7fb122fc..0377307c5e28 100644 ---- a/components/policy/core/common/policy_loader_win_unittest.cc -+++ b/components/policy/core/common/policy_loader_win_unittest.cc -@@ -133,8 +133,14 @@ bool InstallValue(const base::Value& value, - - case base::Value::Type::BINARY: - return false; -+ -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: -+ CHECK(false); -+ return false; - } -- NOTREACHED(); -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - return false; - } - -diff --git a/components/policy/core/common/policy_test_utils.cc b/components/policy/core/common/policy_test_utils.cc -index 5af98b47275c..919f004153ec 100644 ---- a/components/policy/core/common/policy_test_utils.cc -+++ b/components/policy/core/common/policy_test_utils.cc -@@ -137,6 +137,11 @@ CFPropertyListRef ValueToProperty(const base::Value& value) { - // because there's no equivalent JSON type, and policy values can only - // take valid JSON values. - break; -+ -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: -+ CHECK(false); -+ break; - } - - return NULL; -diff --git a/components/policy/core/common/registry_dict.cc b/components/policy/core/common/registry_dict.cc -index f3ed372bdcb3..696ba7e04abe 100644 ---- a/components/policy/core/common/registry_dict.cc -+++ b/components/policy/core/common/registry_dict.cc -@@ -135,6 +135,10 @@ std::unique_ptr<base::Value> ConvertRegistryValue(const base::Value& value, - case base::Value::Type::BINARY: - // No conversion possible. - break; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: -+ CHECK(false); -+ return nullptr; - } - - LOG(WARNING) << "Failed to convert " << value.type() << " to " -diff --git a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc -index dabd66ba8c72..84fd5489a414 100644 ---- a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc -+++ b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc -@@ -722,8 +722,14 @@ jvalue CoerceJavaScriptValueToJavaValue(JNIEnv* env, - case base::Value::Type::BINARY: - return CoerceGinJavaBridgeValueToJavaValue( - env, value, target_type, coerce_to_string, object_refs, error); -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: -+ CHECK(false); -+ return jvalue(); - } -- NOTREACHED(); -+ -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - return jvalue(); - } - -diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc -index ec04c77c6c18..df6ec39bd663 100644 ---- a/ipc/ipc_message_utils.cc -+++ b/ipc/ipc_message_utils.cc -@@ -92,7 +92,7 @@ void WriteValue(base::Pickle* m, const base::Value* value, int recursion) { - - switch (value->type()) { - case base::Value::Type::NONE: -- break; -+ break; - case base::Value::Type::BOOLEAN: { - bool val; - result = value->GetAsBoolean(&val); -@@ -147,6 +147,11 @@ void WriteValue(base::Pickle* m, const base::Value* value, int recursion) { - } - break; - } -+ -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ default: -+ CHECK(false); -+ break; - } - } - -@@ -260,7 +265,9 @@ bool ReadValue(const base::Pickle* m, - break; - } - default: -- return false; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ CHECK(false); -+ return false; - } - - return true; -diff --git a/mojo/public/cpp/base/values_mojom_traits.h b/mojo/public/cpp/base/values_mojom_traits.h -index cdb9bbbd94df..66752b7c90d8 100644 ---- a/mojo/public/cpp/base/values_mojom_traits.h -+++ b/mojo/public/cpp/base/values_mojom_traits.h -@@ -86,8 +86,13 @@ struct COMPONENT_EXPORT(MOJO_BASE_SHARED_TRAITS) - return mojo_base::mojom::ValueDataView::Tag::DICTIONARY_VALUE; - case base::Value::Type::LIST: - return mojo_base::mojom::ValueDataView::Tag::LIST_VALUE; -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: -+ CHECK(false); -+ return mojo_base::mojom::ValueDataView::Tag::NULL_VALUE; - } -- NOTREACHED(); -+ // TODO(crbug.com/859477): Revert to NOTREACHED() after root cause is found. -+ CHECK(false); - return mojo_base::mojom::ValueDataView::Tag::NULL_VALUE; - } - -diff --git a/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc b/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc -index 6ffff36337e0..7f392d50f718 100644 ---- a/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc -+++ b/ppapi/shared_impl/private/ppb_x509_certificate_private_shared.cc -@@ -73,6 +73,8 @@ PP_Var PPB_X509Certificate_Fields::GetFieldAsPPVar( - } - case base::Value::Type::DICTIONARY: - case base::Value::Type::LIST: -+ // TODO(crbug.com/859477): Remove after root cause is found. -+ case base::Value::Type::DEAD: - // Not handled. - break; - } --- -2.20.1 - diff --git a/chromium/chromium/chromium-gcc8-r642680.patch b/chromium/chromium/chromium-gcc8-r642680.patch deleted file mode 100644 index c81a758..0000000 --- a/chromium/chromium/chromium-gcc8-r642680.patch +++ /dev/null @@ -1,75 +0,0 @@ -From c2c467f69fc00d353879d7add5f2c04a6acabbb1 Mon Sep 17 00:00:00 2001 -From: David 'Digit' Turner <digit@google.com> -Date: Wed, 20 Mar 2019 21:41:09 +0000 -Subject: [PATCH] base: Value::FindDoubleKey() converts integers to doubles - -Ensure that FindDoubleKey() can return the value of an -INTEGER key as a double. This is consistent with the behaviour -of Value::GetDouble() which will auto-convert INTEGER values -to doubles. - -BUG=646113 -R=dcheng@chromium.org,jdoerrie@chromium.org,sdefresne@chromium.org,hidehiko@chromium.org - -Change-Id: I2c08cb91b6cfd5db268a182ffffe16682d848008 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1529017 -Reviewed-by: Sylvain Defresne <sdefresne@chromium.org> -Reviewed-by: Daniel Cheng <dcheng@chromium.org> -Commit-Queue: David Turner <digit@chromium.org> -Cr-Commit-Position: refs/heads/master@{#642680} ---- - base/values.cc | 10 ++++++++-- - base/values.h | 2 ++ - base/values_unittest.cc | 2 +- - 3 files changed, 11 insertions(+), 3 deletions(-) - -diff --git a/base/values.cc b/base/values.cc -index 035aa2350cde..69d66ff8ab00 100644 ---- a/base/values.cc -+++ b/base/values.cc -@@ -339,8 +339,14 @@ base::Optional<int> Value::FindIntKey(StringPiece key) const { - } - - base::Optional<double> Value::FindDoubleKey(StringPiece key) const { -- const Value* result = FindKeyOfType(key, Type::DOUBLE); -- return result ? base::make_optional(result->double_value_) : base::nullopt; -+ const Value* result = FindKey(key); -+ if (result) { -+ if (result->is_int()) -+ return base::make_optional(static_cast<double>(result->int_value_)); -+ if (result->is_double()) -+ return base::make_optional(result->double_value_); -+ } -+ return base::nullopt; - } - - const std::string* Value::FindStringKey(StringPiece key) const { -diff --git a/base/values.h b/base/values.h -index e31cadd83102..6f2cd3cc3d79 100644 ---- a/base/values.h -+++ b/base/values.h -@@ -200,6 +200,8 @@ class BASE_EXPORT Value { - // function's name. - base::Optional<bool> FindBoolKey(StringPiece key) const; - base::Optional<int> FindIntKey(StringPiece key) const; -+ // Note FindDoubleKey() will auto-convert INTEGER keys to their double -+ // value, for consistency with GetDouble(). - base::Optional<double> FindDoubleKey(StringPiece key) const; - - // |FindStringKey| returns |nullptr| if value is not found or not a string. -diff --git a/base/values_unittest.cc b/base/values_unittest.cc -index b23fd8332491..7c545c09d947 100644 ---- a/base/values_unittest.cc -+++ b/base/values_unittest.cc -@@ -674,7 +674,7 @@ TEST(ValuesTest, FindDoubleKey) { - const Value dict(std::move(storage)); - EXPECT_EQ(base::nullopt, dict.FindDoubleKey("null")); - EXPECT_EQ(base::nullopt, dict.FindDoubleKey("bool")); -- EXPECT_EQ(base::nullopt, dict.FindDoubleKey("int")); -+ EXPECT_NE(base::nullopt, dict.FindDoubleKey("int")); - EXPECT_NE(base::nullopt, dict.FindDoubleKey("double")); - EXPECT_EQ(base::nullopt, dict.FindDoubleKey("string")); - EXPECT_EQ(base::nullopt, dict.FindDoubleKey("blob")); --- -2.20.1 - diff --git a/chromium/chromium/chromium-gcc8-r647271.patch b/chromium/chromium/chromium-gcc8-r647271.patch deleted file mode 100644 index 9a53050..0000000 --- a/chromium/chromium/chromium-gcc8-r647271.patch +++ /dev/null @@ -1,483 +0,0 @@ -From 2f28731c17b246bd70075f828dcafcd23547da5d Mon Sep 17 00:00:00 2001 -From: David 'Digit' Turner <digit@google.com> -Date: Wed, 3 Apr 2019 14:32:09 +0000 -Subject: [PATCH] base: Fix Value layout for GCC -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -It turns out that the previous changes to the base::Value -layout broke GCC compilation (see [1] for details). - -This CL fixes the situation by using a new DoubleStorage -type that will store double values in a 4-byte aligned -struct, with bit_cast<> being used to convert between -double and DoubleStorage values in the implementation. - -This ensures that base::Value remains as small as possible -in all cases. The small penalty is that loading/storing -double values on 32-bit ARM is slightly slower due to -the fact that the value is no longer 8-byte aligned. - -+ Fix the ValuesTest.SizeOfValue test to work correctly, - and disable it for debug builds, so it doesn't fail - because debug versions of the internal containers - are larger on certain systems. - -[1] https://chromium-review.googlesource.com/c/chromium/src/+/1472716 - -BUG=646113 -R=dcheng@chromium.org, pasko@chromium.org, lizeb@chromium.org, jdoerrie@chromium.org, jose.dapena@lge.com - -Change-Id: I9a365407dc064ba1bdc19859706f4154a495921e -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1550363 -Commit-Queue: David Turner <digit@chromium.org> -Reviewed-by: Jan Wilken Dörrie <jdoerrie@chromium.org> -Cr-Commit-Position: refs/heads/master@{#647271} ---- - base/values.cc | 67 +++++++++++++--------------- - base/values.h | 94 ++++++++++------------------------------ - base/values_unittest.cc | 96 ++++++++++++++++++++++++++++++----------- - 3 files changed, 124 insertions(+), 133 deletions(-) - -diff --git a/base/values.cc b/base/values.cc -index 9fed5b52d60e..16d686b0bee5 100644 ---- a/base/values.cc -+++ b/base/values.cc -@@ -12,6 +12,7 @@ - #include <ostream> - #include <utility> - -+#include "base/bit_cast.h" - #include "base/json/json_writer.h" - #include "base/logging.h" - #include "base/memory/ptr_util.h" -@@ -36,6 +37,9 @@ static_assert(std::is_standard_layout<Value>::value, - "base::Value should be a standard-layout C++ class in order " - "to avoid undefined behaviour in its implementation!"); - -+static_assert(sizeof(Value::DoubleStorage) == sizeof(double), -+ "The double and DoubleStorage types should have the same size"); -+ - namespace { - - const char* const kTypeNames[] = {"null", "boolean", "integer", "double", -@@ -110,8 +114,6 @@ Value::Value(Value&& that) noexcept { - InternalMoveConstructFrom(std::move(that)); - } - --Value::Value() noexcept : type_(Type::NONE) {} -- - Value::Value(Type type) : type_(type) { - // Initialize with the default value. - switch (type_) { -@@ -125,7 +127,7 @@ Value::Value(Type type) : type_(type) { - int_value_ = 0; - return; - case Type::DOUBLE: -- double_value_ = 0.0; -+ double_value_ = bit_cast<DoubleStorage>(0.0); - return; - case Type::STRING: - new (&string_value_) std::string(); -@@ -149,21 +151,16 @@ Value::Value(Type type) : type_(type) { - CHECK(false); - } - --Value::Value(bool in_bool) -- : bool_type_(Type::BOOLEAN), -- bool_value_(in_bool) {} -+Value::Value(bool in_bool) : type_(Type::BOOLEAN), bool_value_(in_bool) {} - --Value::Value(int in_int) -- : int_type_(Type::INTEGER), -- int_value_(in_int) {} -+Value::Value(int in_int) : type_(Type::INTEGER), int_value_(in_int) {} - - Value::Value(double in_double) -- : double_type_(Type::DOUBLE), -- double_value_(in_double) { -- if (!std::isfinite(double_value_)) { -+ : type_(Type::DOUBLE), double_value_(bit_cast<DoubleStorage>(in_double)) { -+ if (!std::isfinite(in_double)) { - NOTREACHED() << "Non-finite (i.e. NaN or positive/negative infinity) " - << "values cannot be represented in JSON"; -- double_value_ = 0.0; -+ double_value_ = bit_cast<DoubleStorage>(0.0); - } - } - -@@ -172,8 +169,7 @@ Value::Value(const char* in_string) : Value(std::string(in_string)) {} - Value::Value(StringPiece in_string) : Value(std::string(in_string)) {} - - Value::Value(std::string&& in_string) noexcept -- : string_type_(Type::STRING), -- string_value_(std::move(in_string)) { -+ : type_(Type::STRING), string_value_(std::move(in_string)) { - DCHECK(IsStringUTF8(string_value_)); - } - -@@ -182,19 +178,15 @@ Value::Value(const char16* in_string16) : Value(StringPiece16(in_string16)) {} - Value::Value(StringPiece16 in_string16) : Value(UTF16ToUTF8(in_string16)) {} - - Value::Value(const std::vector<char>& in_blob) -- : binary_type_(Type::BINARY), -- binary_value_(in_blob.begin(), in_blob.end()) {} -+ : type_(Type::BINARY), binary_value_(in_blob.begin(), in_blob.end()) {} - - Value::Value(base::span<const uint8_t> in_blob) -- : binary_type_(Type::BINARY), -- binary_value_(in_blob.begin(), in_blob.end()) {} -+ : type_(Type::BINARY), binary_value_(in_blob.begin(), in_blob.end()) {} - - Value::Value(BlobStorage&& in_blob) noexcept -- : binary_type_(Type::BINARY), -- binary_value_(std::move(in_blob)) {} -+ : type_(Type::BINARY), binary_value_(std::move(in_blob)) {} - --Value::Value(const DictStorage& in_dict) -- : dict_type_(Type::DICTIONARY), dict_() { -+Value::Value(const DictStorage& in_dict) : type_(Type::DICTIONARY), dict_() { - dict_.reserve(in_dict.size()); - for (const auto& it : in_dict) { - dict_.try_emplace(dict_.end(), it.first, -@@ -203,18 +195,16 @@ Value::Value(const DictStorage& in_dict) - } - - Value::Value(DictStorage&& in_dict) noexcept -- : dict_type_(Type::DICTIONARY), -- dict_(std::move(in_dict)) {} -+ : type_(Type::DICTIONARY), dict_(std::move(in_dict)) {} - --Value::Value(const ListStorage& in_list) : list_type_(Type::LIST), list_() { -+Value::Value(const ListStorage& in_list) : type_(Type::LIST), list_() { - list_.reserve(in_list.size()); - for (const auto& val : in_list) - list_.emplace_back(val.Clone()); - } - - Value::Value(ListStorage&& in_list) noexcept -- : list_type_(Type::LIST), -- list_(std::move(in_list)) {} -+ : type_(Type::LIST), list_(std::move(in_list)) {} - - Value& Value::operator=(Value&& that) noexcept { - InternalCleanup(); -@@ -223,6 +213,10 @@ Value& Value::operator=(Value&& that) noexcept { - return *this; - } - -+double Value::AsDoubleInternal() const { -+ return bit_cast<double>(double_value_); -+} -+ - Value Value::Clone() const { - switch (type_) { - case Type::NONE: -@@ -232,7 +226,7 @@ Value Value::Clone() const { - case Type::INTEGER: - return Value(int_value_); - case Type::DOUBLE: -- return Value(double_value_); -+ return Value(AsDoubleInternal()); - case Type::STRING: - return Value(string_value_); - case Type::BINARY: -@@ -277,7 +271,7 @@ int Value::GetInt() const { - - double Value::GetDouble() const { - if (is_double()) -- return double_value_; -+ return AsDoubleInternal(); - if (is_int()) - return int_value_; - CHECK(false); -@@ -342,9 +336,10 @@ base::Optional<double> Value::FindDoubleKey(StringPiece key) const { - const Value* result = FindKey(key); - if (result) { - if (result->is_int()) -- return base::make_optional(static_cast<double>(result->int_value_)); -- if (result->is_double()) -- return base::make_optional(result->double_value_); -+ return static_cast<double>(result->int_value_); -+ if (result->is_double()) { -+ return result->AsDoubleInternal(); -+ } - } - return base::nullopt; - } -@@ -601,7 +596,7 @@ bool Value::GetAsInteger(int* out_value) const { - - bool Value::GetAsDouble(double* out_value) const { - if (out_value && is_double()) { -- *out_value = double_value_; -+ *out_value = AsDoubleInternal(); - return true; - } - if (out_value && is_int()) { -@@ -696,7 +691,7 @@ bool operator==(const Value& lhs, const Value& rhs) { - case Value::Type::INTEGER: - return lhs.int_value_ == rhs.int_value_; - case Value::Type::DOUBLE: -- return lhs.double_value_ == rhs.double_value_; -+ return lhs.AsDoubleInternal() == rhs.AsDoubleInternal(); - case Value::Type::STRING: - return lhs.string_value_ == rhs.string_value_; - case Value::Type::BINARY: -@@ -741,7 +736,7 @@ bool operator<(const Value& lhs, const Value& rhs) { - case Value::Type::INTEGER: - return lhs.int_value_ < rhs.int_value_; - case Value::Type::DOUBLE: -- return lhs.double_value_ < rhs.double_value_; -+ return lhs.AsDoubleInternal() < rhs.AsDoubleInternal(); - case Value::Type::STRING: - return lhs.string_value_ < rhs.string_value_; - case Value::Type::BINARY: -diff --git a/base/values.h b/base/values.h -index 486fe7ff3976..c455936d4961 100644 ---- a/base/values.h -+++ b/base/values.h -@@ -83,6 +83,8 @@ class BASE_EXPORT Value { - using BlobStorage = std::vector<uint8_t>; - using DictStorage = flat_map<std::string, std::unique_ptr<Value>>; - using ListStorage = std::vector<Value>; -+ // See technical note below explaining why this is used. -+ using DoubleStorage = struct { alignas(4) char v[sizeof(double)]; }; - - enum class Type { - NONE = 0, -@@ -111,7 +113,10 @@ class BASE_EXPORT Value { - static std::unique_ptr<Value> ToUniquePtrValue(Value val); - - Value(Value&& that) noexcept; -- Value() noexcept; // A null value. -+ Value() noexcept {} // A null value -+ // Fun fact: using '= default' above instead of '{}' does not work because -+ // the compiler complains that the default constructor was deleted since -+ // the inner union contains fields with non-default constructors. - - // Value's copy constructor and copy assignment operator are deleted. Use this - // to obtain a deep copy explicitly. -@@ -405,82 +410,29 @@ class BASE_EXPORT Value { - size_t EstimateMemoryUsage() const; - - protected: -- // Technical note: -- // The naive way to implement a tagged union leads to wasted bytes -- // in the object on CPUs like ARM ones, which impose an 8-byte alignment -- // for double values. I.e. if one does something like: -+ // Special case for doubles, which are aligned to 8 bytes on some -+ // 32-bit architectures. In this case, a simple declaration as a -+ // double member would make the whole union 8 byte-aligned, which -+ // would also force 4 bytes of wasted padding space before it in -+ // the Value layout. - // -- // struct TaggedValue { -- // int type_; // size = 1, align = 4 -- // union { -- // bool bool_value_; // size = 1, align = 1 -- // int int_value_; // size = 4, align = 4 -- // double double_value_; // size = 8, align = 8 -- // std::string string_value_; // size = 12, align = 4 (32-bit) -- // }; -- // }; -- // -- // The end result is that the union will have an alignment of 8, and a size -- // of 16, due to 4 extra padding bytes following |string_value_| to respect -- // the alignment requirement. -- // -- // As a consequence, the struct TaggedValue will have a size of 24 bytes, -- // due to the size of the union (16), the size of |type_| (4) and 4 bytes -- // of padding between |type_| and the union to respect its alignment. -- // -- // This means 8 bytes of unused memory per instance on 32-bit ARM! -- // -- // To reclaim these, a union of structs is used instead, in order to ensure -- // that |double_value_| below is always located at an offset that is a -- // multiple of 8, relative to the start of the overall data structure. -- // -- // Each struct must declare its own |type_| field, which must have a different -- // name, to appease the C++ compiler. -- // -- // Using this technique sizeof(base::Value) == 16 on 32-bit ARM instead -- // of 24, without losing any information. Results are unchanged for x86, -- // x86_64 and arm64 (16, 32 and 32 bytes respectively). -+ // To override this, store the value as an array of 32-bit integers, and -+ // perform the appropriate bit casts when reading / writing to it. -+ Type type_ = Type::NONE; -+ - union { -- struct { -- // TODO(crbug.com/646113): Make these private once DictionaryValue and -- // ListValue are properly inlined. -- Type type_ : 8; -- }; -- struct { -- Type bool_type_ : 8; -- bool bool_value_; -- }; -- struct { -- Type int_type_ : 8; -- int int_value_; -- }; -- struct { -- Type double_type_ : 8; -- // Subtle: On architectures that require it, the compiler will ensure -- // that |double_value_|'s offset is a multiple of 8 (e.g. 32-bit ARM). -- // See technical note above to understand why it is important. -- double double_value_; -- }; -- struct { -- Type string_type_ : 8; -- std::string string_value_; -- }; -- struct { -- Type binary_type_ : 8; -- BlobStorage binary_value_; -- }; -- struct { -- Type dict_type_ : 8; -- DictStorage dict_; -- }; -- struct { -- Type list_type_ : 8; -- ListStorage list_; -- }; -+ bool bool_value_; -+ int int_value_; -+ DoubleStorage double_value_; -+ std::string string_value_; -+ BlobStorage binary_value_; -+ DictStorage dict_; -+ ListStorage list_; - }; - - private: - friend class ValuesTest_SizeOfValue_Test; -+ double AsDoubleInternal() const; - void InternalMoveConstructFrom(Value&& that); - void InternalCleanup(); - -diff --git a/base/values_unittest.cc b/base/values_unittest.cc -index 2dd1c76afaa9..f3536a8612b1 100644 ---- a/base/values_unittest.cc -+++ b/base/values_unittest.cc -@@ -26,45 +26,89 @@ - - namespace base { - --// Test is currently incorrect on Windows x86. --#if !defined(OS_WIN) || !defined(ARCH_CPU_X86) -+// Ensure that base::Value is as small as possible, i.e. that there is -+// no wasted space after the inner value due to alignment constraints. -+// Distinguish between the 'header' that includes |type_| and and the inner -+// value that follows it, which can be a bool, int, double, string, blob, list -+// or dict. -+// -+// This test is only enabled when NDEBUG is defined. This way the test will not -+// fail in debug builds that sometimes contain larger versions of the standard -+// containers used inside base::Value. -+#if defined(NDEBUG) -+ -+static size_t AlignSizeTo(size_t size, size_t alignment) { -+ EXPECT_TRUE((alignment & (alignment - 1)) == 0) -+ << "Alignment " << alignment << " is not a power of 2!"; -+ return (size + (alignment - 1u)) & ~(alignment - 1u); -+} -+ - TEST(ValuesTest, SizeOfValue) { -- // Ensure that base::Value is as small as possible, i.e. that there is -- // no wasted space after the inner value due to alignment constraints. -- // Distinguish between the 'header' that includes |type_| and and the inner -- // value that follows it, which can be a bool, int, double, string, blob, list -- // or dict. --#define INNER_TYPES_LIST(X) \ -- X(bool, bool_value_) \ -- X(int, int_value_) \ -- X(double, double_value_) \ -- X(std::string, string_value_) \ -- X(Value::BlobStorage, binary_value_) \ -- X(Value::ListStorage, list_) \ -+#define INNER_TYPES_LIST(X) \ -+ X(bool, bool_value_) \ -+ X(int, int_value_) \ -+ X(Value::DoubleStorage, double_value_) \ -+ X(std::string, string_value_) \ -+ X(Value::BlobStorage, binary_value_) \ -+ X(Value::ListStorage, list_) \ - X(Value::DictStorage, dict_) - --#define INNER_STRUCT_LIMIT(type, value) offsetof(Value, value) + sizeof(type), -+#define INNER_FIELD_ALIGNMENT(type, value) alignof(type), -+ -+ // The maximum alignment of each inner struct value field inside base::Value -+ size_t max_inner_value_alignment = -+ std::max({INNER_TYPES_LIST(INNER_FIELD_ALIGNMENT)}); -+ -+ // Check that base::Value has the smallest alignment possible. This would -+ // fail if the header would contain something that has a larger alignment -+ // than necessary. -+ EXPECT_EQ(max_inner_value_alignment, alignof(Value)); -+ -+ // Find the offset of each inner value. Which should normally not be -+ // larger than 4. Note that we use std::max(4, ...) because bool_value_ -+ // could be stored just after the |bool_type_| field, with an offset of -+ // 1, and that would be ok. -+#define INNER_VALUE_START_OFFSET(type, value) offsetof(Value, value), -+ -+ size_t min_inner_value_offset = -+ std::min({INNER_TYPES_LIST(INNER_VALUE_START_OFFSET)}); - -- // Return the maximum size in bytes of each inner struct inside base::Value -- size_t max_inner_struct_limit = -- std::max({INNER_TYPES_LIST(INNER_STRUCT_LIMIT)}); -+ // Inner fields may contain pointers, which have an alignment of 8 -+ // on most 64-bit platforms. -+ size_t expected_min_offset = alignof(void*); -+ -+ EXPECT_EQ(expected_min_offset, min_inner_value_offset); - - // Ensure that base::Value is not larger than necessary, i.e. that there is -- // no un-necessary padding afte the structs due to alignment constraints of -+ // no un-necessary padding after the structs due to alignment constraints of - // one of the inner fields. -- EXPECT_EQ(max_inner_struct_limit, sizeof(Value)); -- if (max_inner_struct_limit != sizeof(Value)) { -+#define INNER_STRUCT_END_OFFSET(type, value) \ -+ offsetof(Value, value) + sizeof(type), -+ -+ // The maximum size in bytes of each inner struct inside base::Value, -+ size_t max_inner_struct_end_offset = -+ std::max({INNER_TYPES_LIST(INNER_STRUCT_END_OFFSET)}); -+ -+ // The expected value size. -+ size_t expected_value_size = -+ AlignSizeTo(max_inner_struct_end_offset, alignof(Value)); -+ -+ EXPECT_EQ(expected_value_size, sizeof(Value)); -+ if (min_inner_value_offset != expected_min_offset || -+ expected_value_size != sizeof(Value)) { - // The following are useful to understand what's wrong when the EXPECT_EQ() -- // above actually fails. --#define PRINT_INNER_FIELD_INFO(x, y) \ -- LOG(INFO) << #y " type=" #x " size=" << sizeof(x) << " align=" << alignof(x); -+ // above actually fail. -+#define PRINT_INNER_FIELD_INFO(x, y) \ -+ LOG(INFO) << #y " type=" #x " offset=" << offsetof(Value, y) \ -+ << " size=" << sizeof(x) << " align=" << alignof(x); - - LOG(INFO) << "Value size=" << sizeof(Value) << " align=" << alignof(Value); - INNER_TYPES_LIST(PRINT_INNER_FIELD_INFO) -- LOG(INFO) << "max_inner_struct_limit=" << max_inner_struct_limit; -+ LOG(INFO) << "max_inner_struct_end_offset=" << max_inner_struct_end_offset; - } - } --#endif -+ -+#endif // NDEBUG - - TEST(ValuesTest, TestNothrow) { - static_assert(std::is_nothrow_move_constructible<Value>::value, --- -2.20.1 - diff --git a/chromium/chromium/chromium-gcc8-r647382.patch b/chromium/chromium/chromium-gcc8-r647382.patch deleted file mode 100644 index 62efd00..0000000 --- a/chromium/chromium/chromium-gcc8-r647382.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 7685422a90e1da829cb32d685a4b970d30738098 Mon Sep 17 00:00:00 2001 -From: Jose Dapena Paz <jose.dapena@lge.com> -Date: Wed, 3 Apr 2019 18:35:04 +0000 -Subject: [PATCH] base: Value::Type enum class size should be 8-bit. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -GCC is complaining because, when base::Type is used to declare the different -variants of Type in its union, they are forced to take 8-bit, that is smaller -than the enum class default size (same as int). - -So this change sets explicitely the enum class underlying type to be unsigned -char. - -BUG=chromium:819294 - -Change-Id: I1765e2503e2c3d3675c73ecb0f7f5bc33456e6f0 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1550366 -Commit-Queue: José Dapena Paz <jose.dapena@lge.com> -Reviewed-by: Jan Wilken Dörrie <jdoerrie@chromium.org> -Cr-Commit-Position: refs/heads/master@{#647382} ---- - base/values.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/base/values.h b/base/values.h -index c455936d4961..14b76acec02f 100644 ---- a/base/values.h -+++ b/base/values.h -@@ -86,7 +86,7 @@ class BASE_EXPORT Value { - // See technical note below explaining why this is used. - using DoubleStorage = struct { alignas(4) char v[sizeof(double)]; }; - -- enum class Type { -+ enum class Type : unsigned char { - NONE = 0, - BOOLEAN, - INTEGER, --- -2.20.1 - diff --git a/chromium/chromium/chromium-gcc9-r654570.patch b/chromium/chromium/chromium-gcc9-r654570.patch new file mode 100644 index 0000000..6302b0c --- /dev/null +++ b/chromium/chromium/chromium-gcc9-r654570.patch @@ -0,0 +1,39 @@ +From aeed4d1f15ce84a17ea0bc219e258dc4982b2368 Mon Sep 17 00:00:00 2001 +From: Jose Dapena Paz <jose.dapena@lge.com> +Date: Fri, 26 Apr 2019 20:07:05 +0000 +Subject: [PATCH] libstdc++: do not assume unique_ptr has ostream operator +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +CompositorFrameReportingController is using DCHECK_NE to compare +several unique_ptr. This is valid in libc++, but on libstdc++ unique_ptr +does not have an ostream operator. + +Change-Id: I9f23ef17f02b9e107694ba493f6f8f3caf5cac4d +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1584292 +Reviewed-by: Sunny Sachanandani <sunnyps@chromium.org> +Commit-Queue: José Dapena Paz <jose.dapena@lge.com> +Cr-Commit-Position: refs/heads/master@{#654570} +--- + cc/scheduler/compositor_frame_reporting_controller.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/cc/scheduler/compositor_frame_reporting_controller.cc b/cc/scheduler/compositor_frame_reporting_controller.cc +index f1587ed158d4..1b17021fd229 100644 +--- a/cc/scheduler/compositor_frame_reporting_controller.cc ++++ b/cc/scheduler/compositor_frame_reporting_controller.cc +@@ -31,8 +31,8 @@ void CompositorFrameReportingController::WillBeginImplFrame() { + + void CompositorFrameReportingController::WillBeginMainFrame() { + DCHECK(reporters_[PipelineStage::kBeginImplFrame]); +- DCHECK_NE(reporters_[PipelineStage::kBeginMainFrame], +- reporters_[PipelineStage::kBeginImplFrame]); ++ DCHECK(reporters_[PipelineStage::kBeginMainFrame] != ++ reporters_[PipelineStage::kBeginImplFrame]); + reporters_[PipelineStage::kBeginImplFrame]->StartStage( + "SendBeginMainFrameToCommit"); + AdvanceReporterStage(PipelineStage::kBeginImplFrame, +-- +2.21.0 + diff --git a/chromium/chromium/chromium-gcc9-r666714.patch b/chromium/chromium/chromium-gcc9-r666714.patch new file mode 100644 index 0000000..77f71dd --- /dev/null +++ b/chromium/chromium/chromium-gcc9-r666714.patch @@ -0,0 +1,111 @@ +From 41d954dec0669c9a85730c0bde7df7ba7a0ff43e Mon Sep 17 00:00:00 2001 +From: Jose Dapena Paz <jose.dapena@lge.com> +Date: Thu, 6 Jun 2019 15:30:49 +0000 +Subject: [PATCH] Fix AutocompleteMatch move constructor/assign operator + noexcept +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +For AutocompleteMatch to declare noexcept them, all the contained +properties need to be noexcept too. This is required at least +for SuggestionAnswer, because base::string16 will make default +calculated signature of the move operator noexcept(false). + +To avoid this issue we explicitely declare them on SuggestionAnswer, +and its member classes TextField and ImageLine. + +Bug: 819294 +Change-Id: I8714f2c6352a3292bdebdc3aed9790270e49c580 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1554669 +Reviewed-by: Kevin Bailey <krb@chromium.org> +Commit-Queue: José Dapena Paz <jose.dapena@lge.com> +Cr-Commit-Position: refs/heads/master@{#666714} +--- + components/omnibox/browser/suggestion_answer.cc | 14 ++++++++++++++ + components/omnibox/browser/suggestion_answer.h | 8 ++++++++ + 2 files changed, 22 insertions(+) + +diff --git a/components/omnibox/browser/suggestion_answer.cc b/components/omnibox/browser/suggestion_answer.cc +index 151e55f7dd58..a0c9049afedb 100644 +--- a/components/omnibox/browser/suggestion_answer.cc ++++ b/components/omnibox/browser/suggestion_answer.cc +@@ -55,6 +55,12 @@ void AppendWithSpace(const SuggestionAnswer::TextField* text, + + SuggestionAnswer::TextField::TextField() = default; + SuggestionAnswer::TextField::~TextField() = default; ++SuggestionAnswer::TextField::TextField(const TextField&) = default; ++SuggestionAnswer::TextField::TextField(TextField&&) noexcept = default; ++SuggestionAnswer::TextField& SuggestionAnswer::TextField::operator=( ++ const TextField&) = default; ++SuggestionAnswer::TextField& SuggestionAnswer::TextField::operator=( ++ TextField&&) noexcept = default; + + // static + bool SuggestionAnswer::TextField::ParseTextField(const base::Value& field_json, +@@ -93,9 +99,12 @@ size_t SuggestionAnswer::TextField::EstimateMemoryUsage() const { + SuggestionAnswer::ImageLine::ImageLine() + : num_text_lines_(1) {} + SuggestionAnswer::ImageLine::ImageLine(const ImageLine& line) = default; ++SuggestionAnswer::ImageLine::ImageLine(ImageLine&&) noexcept = default; + + SuggestionAnswer::ImageLine& SuggestionAnswer::ImageLine::operator=( + const ImageLine& line) = default; ++SuggestionAnswer::ImageLine& SuggestionAnswer::ImageLine::operator=( ++ ImageLine&&) noexcept = default; + + SuggestionAnswer::ImageLine::~ImageLine() {} + +@@ -251,9 +260,14 @@ SuggestionAnswer::SuggestionAnswer() = default; + + SuggestionAnswer::SuggestionAnswer(const SuggestionAnswer& answer) = default; + ++SuggestionAnswer::SuggestionAnswer(SuggestionAnswer&&) noexcept = default; ++ + SuggestionAnswer& SuggestionAnswer::operator=(const SuggestionAnswer& answer) = + default; + ++SuggestionAnswer& SuggestionAnswer::operator=(SuggestionAnswer&&) noexcept = ++ default; ++ + SuggestionAnswer::~SuggestionAnswer() = default; + + // static +diff --git a/components/omnibox/browser/suggestion_answer.h b/components/omnibox/browser/suggestion_answer.h +index 31be937ccbed..2840ace1c117 100644 +--- a/components/omnibox/browser/suggestion_answer.h ++++ b/components/omnibox/browser/suggestion_answer.h +@@ -125,6 +125,10 @@ class SuggestionAnswer { + public: + TextField(); + ~TextField(); ++ TextField(const TextField&); ++ TextField(TextField&&) noexcept; ++ TextField& operator=(const TextField&); ++ TextField& operator=(TextField&&) noexcept; + + // Parses |field_json| dictionary and populates |text_field| with the + // contents. If any of the required elements is missing, returns false and +@@ -162,7 +166,9 @@ class SuggestionAnswer { + public: + ImageLine(); + explicit ImageLine(const ImageLine& line); ++ ImageLine(ImageLine&&) noexcept; + ImageLine& operator=(const ImageLine& line); ++ ImageLine& operator=(ImageLine&&) noexcept; + ~ImageLine(); + + // Parses dictionary |line_json| and populates |image_line| with the +@@ -213,7 +219,9 @@ class SuggestionAnswer { + + SuggestionAnswer(); + SuggestionAnswer(const SuggestionAnswer& answer); ++ SuggestionAnswer(SuggestionAnswer&&) noexcept; + SuggestionAnswer& operator=(const SuggestionAnswer& answer); ++ SuggestionAnswer& operator=(SuggestionAnswer&&) noexcept; + ~SuggestionAnswer(); + + // Parses dictionary |answer_json| and fills a SuggestionAnswer containing the +-- +2.21.0 + diff --git a/chromium/chromium/chromium-gn-revert-bug-77.patch b/chromium/chromium/chromium-gn-revert-bug-77.patch deleted file mode 100644 index 6ff5fde..0000000 --- a/chromium/chromium/chromium-gn-revert-bug-77.patch +++ /dev/null @@ -1,918 +0,0 @@ -From 8730b0feb6b991fa47368566501ab9ccfb453c92 Mon Sep 17 00:00:00 2001 -From: Tom Anderson <thomasanderson@chromium.org> -Date: Thu, 16 May 2019 11:00:40 -0700 -Subject: [PATCH] Disallow non-buildable sources in binary targets - -When adding a file that's not a source, header, or object file to a source_set, -loadable_module, shared_library, executable, or static_library, gn will now -generate an error like the following: - -ERROR at //third_party/protobuf/proto_library.gni:369:15: Only source, header, -and object files belong in the sources of a -source_set. //out/Test/pyproto/google_apis/gcm/protocol/mcs_pb2.py is not one of -the valid types. - sources = get_target_outputs(":$action_name") - ^--------------------------------- -See //google_apis/gcm/BUILD.gn:78:1: whence it was called. -proto_library("proto") { -^----------------------- -See //BUILD.gn:89:7: which caused the file to be included. - "//google_apis/gcm:gcm_unit_tests", - ^--------------------------------- - -BUG=77 -R=brettw - -Change-Id: I4ed8da10c48e3e5d74f79e51d8222c998a7b883a -Reviewed-on: https://gn-review.googlesource.com/c/gn/+/4980 -Commit-Queue: Brett Wilson <brettw@google.com> -Reviewed-by: Brett Wilson <brettw@google.com> ---- - tools/gn/binary_target_generator.cc | 32 +++++++++++++++++++++++++++++ - tools/gn/binary_target_generator.h | 1 + - tools/gn/source_dir.cc | 6 +++--- - tools/gn/source_file.cc | 12 ++++++++--- - tools/gn/source_file.h | 7 ++++++- - tools/gn/target_generator.h | 2 +- - 6 files changed, 52 insertions(+), 8 deletions(-) - -diff --git b/tools/gn/binary_target_generator.cc a/tools/gn/binary_target_generator.cc -index 6d8cec92..60af2423 100644 ---- b/tools/gn/tools/gn/binary_target_generator.cc -+++ a/tools/gn/tools/gn/binary_target_generator.cc -@@ -68,38 +68,6 @@ void BinaryTargetGenerator::DoRun() { - return; - } - --bool BinaryTargetGenerator::FillSources() { -- bool ret = TargetGenerator::FillSources(); -- for (std::size_t i = 0; i < target_->sources().size(); ++i) { -- const auto& source = target_->sources()[i]; -- switch (source.type()) { -- case SourceFile::SOURCE_CPP: -- case SourceFile::SOURCE_H: -- case SourceFile::SOURCE_C: -- case SourceFile::SOURCE_M: -- case SourceFile::SOURCE_MM: -- case SourceFile::SOURCE_S: -- case SourceFile::SOURCE_ASM: -- case SourceFile::SOURCE_O: -- // These are allowed. -- break; -- case SourceFile::SOURCE_RC: -- case SourceFile::SOURCE_DEF: -- case SourceFile::SOURCE_RS: -- case SourceFile::SOURCE_GO: -- case SourceFile::SOURCE_UNKNOWN: -- case SourceFile::SOURCE_NUMTYPES: -- *err_ = -- Err(scope_->GetValue(variables::kSources, true)->list_value()[i], -- std::string("Only source, header, and object files belong in " -- "the sources of a ") + -- Target::GetStringForOutputType(target_->output_type()) + -- ". " + source.value() + " is not one of the valid types."); -- } -- } -- return ret; --} -- - bool BinaryTargetGenerator::FillCompleteStaticLib() { - if (target_->output_type() == Target::STATIC_LIBRARY) { - const Value* value = scope_->GetValue(variables::kCompleteStaticLib, true); -diff --git b/tools/gn/binary_target_generator.h a/tools/gn/binary_target_generator.h -index 6cbd11ea..40fc3141 100644 ---- b/tools/gn/tools/gn/binary_target_generator.h -+++ a/tools/gn/tools/gn/binary_target_generator.h -@@ -22,7 +22,6 @@ class BinaryTargetGenerator : public TargetGenerator { - - protected: - void DoRun() override; -- bool FillSources() override; - - private: - bool FillCompleteStaticLib(); -diff --git b/tools/gn/source_dir.cc a/tools/gn/source_dir.cc -index 50b45175..0fd5c75a 100644 ---- b/tools/gn/tools/gn/source_dir.cc -+++ a/tools/gn/tools/gn/source_dir.cc -@@ -98,10 +98,10 @@ SourceFile SourceDir::ResolveRelativeFile( - return ret; - - const std::string& input_string = p.string_value(); -- if (!ValidateResolveInput<std::string>(true, p, input_string, err)) -+ if (!ValidateResolveInput<std::string>(true, p, input_string, err)) { - return ret; -- -- ret.SetValue(ResolveRelative(input_string, value_, true, source_root)); -+ } -+ ret.value_ = ResolveRelative(input_string, value_, true, source_root); - return ret; - } - -diff --git b/tools/gn/source_file.cc a/tools/gn/source_file.cc -index 29232274..7c860d43 100644 ---- b/tools/gn/tools/gn/source_file.cc -+++ a/tools/gn/tools/gn/source_file.cc -@@ -55,19 +55,18 @@ SourceFile::Type GetSourceFileType(const std::string& file) { - SourceFile::SourceFile() : type_(SOURCE_UNKNOWN) {} - - SourceFile::SourceFile(const base::StringPiece& p) -- : value_(p.data(), p.size()) { -+ : value_(p.data(), p.size()), type_(GetSourceFileType(value_)) { - DCHECK(!value_.empty()); - AssertValueSourceFileString(value_); - NormalizePath(&value_); -- type_ = GetSourceFileType(value_); - } - --SourceFile::SourceFile(SwapIn, std::string* value) { -+SourceFile::SourceFile(SwapIn, std::string* value) -+ : type_(GetSourceFileType(*value)) { - value_.swap(*value); - DCHECK(!value_.empty()); - AssertValueSourceFileString(value_); - NormalizePath(&value_); -- type_ = GetSourceFileType(value_); - } - - SourceFile::~SourceFile() = default; -@@ -93,8 +92,3 @@ SourceDir SourceFile::GetDir() const { - base::FilePath SourceFile::Resolve(const base::FilePath& source_root) const { - return ResolvePath(value_, true, source_root); - } -- --void SourceFile::SetValue(const std::string& value) { -- value_ = value; -- type_ = GetSourceFileType(value_); --} -diff --git b/tools/gn/source_file.h a/tools/gn/source_file.h -index d42063d6..bcf5f422 100644 ---- b/tools/gn/tools/gn/source_file.h -+++ a/tools/gn/tools/gn/source_file.h -@@ -97,16 +97,11 @@ class SourceFile { - return value_ < other.value_; - } - -- void swap(SourceFile& other) { -- value_.swap(other.value_); -- std::swap(type_, other.type_); -- } -+ void swap(SourceFile& other) { value_.swap(other.value_); } - - private: - friend class SourceDir; - -- void SetValue(const std::string& value); -- - std::string value_; - Type type_; - -diff --git b/tools/gn/target_generator.h a/tools/gn/target_generator.h -index 8795cbf9..627505da 100644 ---- b/tools/gn/tools/gn/target_generator.h -+++ a/tools/gn/tools/gn/target_generator.h -@@ -47,7 +47,7 @@ class TargetGenerator { - - const BuildSettings* GetBuildSettings() const; - -- virtual bool FillSources(); -+ bool FillSources(); - bool FillPublic(); - bool FillConfigs(); - bool FillOutputs(bool allow_substitutions); --- -2.21.0 - -From 0d038c2e0a32a528713d3dfaf1f1e0cdfe87fd46 Mon Sep 17 00:00:00 2001 -From: Tom Anderson <thomasanderson@chromium.org> -Date: Wed, 15 May 2019 13:00:20 -0700 -Subject: [PATCH] Cache source file type in SourceFile - -This is in preparation for fixing bug 77. Reduces the number of calls to -GetSourceFileType() from ~2 million to ~500 thousand when generating Chromium's -build files. - -BUG=77 -R=brettw - -Change-Id: I044e5b5ebf41ce70769ae3818ea5989206f44453 -Reviewed-on: https://gn-review.googlesource.com/c/gn/+/4960 -Reviewed-by: Brett Wilson <brettw@google.com> -Commit-Queue: Brett Wilson <brettw@google.com> ---- - build/gen.py | 1 - - tools/gn/c_tool.h | 1 - - tools/gn/compile_commands_writer.cc | 20 ++++++----- - tools/gn/general_tool.h | 1 - - tools/gn/header_checker.cc | 8 ++--- - tools/gn/ninja_binary_target_writer.cc | 15 ++++----- - tools/gn/ninja_binary_target_writer.h | 9 ++--- - tools/gn/ninja_c_binary_target_writer.cc | 42 +++++++++++++----------- - tools/gn/source_file.cc | 36 ++++++++++++++++++-- - tools/gn/source_file.h | 24 ++++++++++++++ - tools/gn/source_file_type.cc | 37 --------------------- - tools/gn/source_file_type.h | 34 ------------------- - tools/gn/target.cc | 7 ++-- - tools/gn/tool.cc | 28 ++++++++-------- - tools/gn/tool.h | 4 +-- - tools/gn/toolchain.cc | 6 ++-- - tools/gn/toolchain.h | 7 ++-- - tools/gn/visual_studio_writer.cc | 1 - - 18 files changed, 130 insertions(+), 151 deletions(-) - delete mode 100644 tools/gn/source_file_type.cc - delete mode 100644 tools/gn/source_file_type.h - -diff --git b/build/gen.py a/build/gen.py -index 97e5adb7..874ecbaa 100755 ---- b/tools/gn/build/gen.py -+++ a/tools/gn/build/gen.py -@@ -520,6 +520,7 @@ def WriteGNNinja(path, platform, host, options): - 'tools/gn/setup.cc', - 'tools/gn/source_dir.cc', - 'tools/gn/source_file.cc', -+ 'tools/gn/source_file_type.cc', - 'tools/gn/standard_out.cc', - 'tools/gn/string_utils.cc', - 'tools/gn/substitution_list.cc', -diff --git b/tools/gn/c_tool.h a/tools/gn/c_tool.h -index 07dfcbe2..129a7332 100644 ---- b/tools/gn/tools/gn/c_tool.h -+++ a/tools/gn/tools/gn/c_tool.h -@@ -12,6 +12,7 @@ - #include "tools/gn/label.h" - #include "tools/gn/label_ptr.h" - #include "tools/gn/scope.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/substitution_list.h" - #include "tools/gn/substitution_pattern.h" - #include "tools/gn/tool.h" -diff --git b/tools/gn/compile_commands_writer.cc a/tools/gn/compile_commands_writer.cc -index 208952d2..e4a1a191 100644 ---- b/tools/gn/tools/gn/compile_commands_writer.cc -+++ a/tools/gn/tools/gn/compile_commands_writer.cc -@@ -122,7 +122,7 @@ void WriteCommand(const Target* target, - const CompileFlags& flags, - std::vector<OutputFile>& tool_outputs, - PathOutput& path_output, -- SourceFile::Type source_type, -+ SourceFileType source_type, - const char* tool_name, - EscapeOptions opts, - std::string* compile_commands) { -@@ -144,16 +144,16 @@ void WriteCommand(const Target* target, - } else if (range.type == &CSubstitutionCFlags) { - command_out << flags.cflags; - } else if (range.type == &CSubstitutionCFlagsC) { -- if (source_type == SourceFile::SOURCE_C) -+ if (source_type == SOURCE_C) - command_out << flags.cflags_c; - } else if (range.type == &CSubstitutionCFlagsCc) { -- if (source_type == SourceFile::SOURCE_CPP) -+ if (source_type == SOURCE_CPP) - command_out << flags.cflags_cc; - } else if (range.type == &CSubstitutionCFlagsObjC) { -- if (source_type == SourceFile::SOURCE_M) -+ if (source_type == SOURCE_M) - command_out << flags.cflags_objc; - } else if (range.type == &CSubstitutionCFlagsObjCc) { -- if (source_type == SourceFile::SOURCE_MM) -+ if (source_type == SOURCE_MM) - command_out << flags.cflags_objcc; - } else if (range.type == &SubstitutionLabel || - range.type == &SubstitutionLabelName || -@@ -222,11 +222,9 @@ void CompileCommandsWriter::RenderJSON(const BuildSettings* build_settings, - for (const auto& source : target->sources()) { - // If this source is not a C/C++/ObjC/ObjC++ source (not header) file, - // continue as it does not belong in the compilation database. -- SourceFile::Type source_type = source.type(); -- if (source_type != SourceFile::SOURCE_CPP && -- source_type != SourceFile::SOURCE_C && -- source_type != SourceFile::SOURCE_M && -- source_type != SourceFile::SOURCE_MM) -+ SourceFileType source_type = GetSourceFileType(source); -+ if (source_type != SOURCE_CPP && source_type != SOURCE_C && -+ source_type != SOURCE_M && source_type != SOURCE_MM) - continue; - - const char* tool_name = Tool::kToolNone; -@@ -324,4 +322,4 @@ void CompileCommandsWriter::VisitDeps(const Target* target, - VisitDeps(pair.ptr, visited); - } - } --} -+} -\ No newline at end of file -diff --git b/tools/gn/general_tool.h a/tools/gn/general_tool.h -index 827a48dc..b6e1af0c 100644 ---- b/tools/gn/tools/gn/general_tool.h -+++ a/tools/gn/tools/gn/general_tool.h -@@ -11,6 +11,7 @@ - #include "base/macros.h" - #include "tools/gn/label.h" - #include "tools/gn/label_ptr.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/substitution_list.h" - #include "tools/gn/substitution_pattern.h" - #include "tools/gn/tool.h" -diff --git b/tools/gn/header_checker.cc a/tools/gn/header_checker.cc -index dca7302d..8407bd0f 100644 ---- b/tools/gn/tools/gn/header_checker.cc -+++ a/tools/gn/tools/gn/header_checker.cc -@@ -18,6 +18,7 @@ - #include "tools/gn/err.h" - #include "tools/gn/filesystem_utils.h" - #include "tools/gn/scheduler.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/target.h" - #include "tools/gn/trace.h" - #include "util/worker_pool.h" -@@ -151,10 +152,9 @@ void HeaderChecker::RunCheckOverFiles(const FileMap& files, bool force_check) { - - for (const auto& file : files) { - // Only check C-like source files (RC files also have includes). -- SourceFile::Type type = file.first.type(); -- if (type != SourceFile::SOURCE_CPP && type != SourceFile::SOURCE_H && -- type != SourceFile::SOURCE_C && type != SourceFile::SOURCE_M && -- type != SourceFile::SOURCE_MM && type != SourceFile::SOURCE_RC) -+ SourceFileType type = GetSourceFileType(file.first); -+ if (type != SOURCE_CPP && type != SOURCE_H && type != SOURCE_C && -+ type != SOURCE_M && type != SOURCE_MM && type != SOURCE_RC) - continue; - - if (!check_generated_) { -diff --git b/tools/gn/ninja_binary_target_writer.cc a/tools/gn/ninja_binary_target_writer.cc -index bf3ee355..aca3a247 100644 ---- b/tools/gn/tools/gn/ninja_binary_target_writer.cc -+++ a/tools/gn/tools/gn/ninja_binary_target_writer.cc -@@ -23,23 +23,22 @@ - #include "tools/gn/ninja_utils.h" - #include "tools/gn/scheduler.h" - #include "tools/gn/settings.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/string_utils.h" - #include "tools/gn/substitution_writer.h" - #include "tools/gn/target.h" - - bool NinjaBinaryTargetWriter::SourceFileTypeSet::CSourceUsed() { -- return Get(SourceFile::SOURCE_CPP) || Get(SourceFile::SOURCE_H) || -- Get(SourceFile::SOURCE_C) || Get(SourceFile::SOURCE_M) || -- Get(SourceFile::SOURCE_MM) || Get(SourceFile::SOURCE_RC) || -- Get(SourceFile::SOURCE_S); -+ return Get(SOURCE_CPP) || Get(SOURCE_H) || Get(SOURCE_C) || Get(SOURCE_M) || -+ Get(SOURCE_MM) || Get(SOURCE_RC) || Get(SOURCE_S); - } - - bool NinjaBinaryTargetWriter::SourceFileTypeSet::RustSourceUsed() { -- return Get(SourceFile::SOURCE_RS); -+ return Get(SOURCE_RS); - } - - bool NinjaBinaryTargetWriter::SourceFileTypeSet::GoSourceUsed() { -- return Get(SourceFile::SOURCE_GO); -+ return Get(SOURCE_GO); - } - - NinjaBinaryTargetWriter::NinjaBinaryTargetWriter(const Target* target, -@@ -50,6 +49,10 @@ NinjaBinaryTargetWriter::NinjaBinaryTargetWriter(const Target* target, - NinjaBinaryTargetWriter::~NinjaBinaryTargetWriter() = default; - - void NinjaBinaryTargetWriter::Run() { -+ SourceFileTypeSet used_types; -+ for (const auto& source : target_->sources()) -+ used_types.Set(GetSourceFileType(source)); -+ - NinjaCBinaryTargetWriter writer(target_, out_); - writer.Run(); - } -diff --git b/tools/gn/ninja_binary_target_writer.h a/tools/gn/ninja_binary_target_writer.h -index 24d7ef19..1db9d81f 100644 ---- b/tools/gn/tools/gn/ninja_binary_target_writer.h -+++ a/tools/gn/tools/gn/ninja_binary_target_writer.h -@@ -23,12 +23,11 @@ class NinjaBinaryTargetWriter : public NinjaTargetWriter { - class SourceFileTypeSet { - public: - SourceFileTypeSet() { -- memset(flags_, 0, -- sizeof(bool) * static_cast<int>(SourceFile::SOURCE_NUMTYPES)); -+ memset(flags_, 0, sizeof(bool) * static_cast<int>(SOURCE_NUMTYPES)); - } - -- void Set(SourceFile::Type type) { flags_[static_cast<int>(type)] = true; } -- bool Get(SourceFile::Type type) const { -+ void Set(SourceFileType type) { flags_[static_cast<int>(type)] = true; } -+ bool Get(SourceFileType type) const { - return flags_[static_cast<int>(type)]; - } - -@@ -37,7 +36,7 @@ class NinjaBinaryTargetWriter : public NinjaTargetWriter { - bool GoSourceUsed(); - - private: -- bool flags_[static_cast<int>(SourceFile::SOURCE_NUMTYPES)]; -+ bool flags_[static_cast<int>(SOURCE_NUMTYPES)]; - }; - - NinjaBinaryTargetWriter(const Target* target, std::ostream& out); -diff --git b/tools/gn/ninja_c_binary_target_writer.cc a/tools/gn/ninja_c_binary_target_writer.cc -index 4e8217b5..f6ffd150 100644 ---- b/tools/gn/tools/gn/ninja_c_binary_target_writer.cc -+++ a/tools/gn/tools/gn/ninja_c_binary_target_writer.cc -@@ -24,6 +24,7 @@ - #include "tools/gn/ninja_utils.h" - #include "tools/gn/scheduler.h" - #include "tools/gn/settings.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/string_utils.h" - #include "tools/gn/substitution_writer.h" - #include "tools/gn/target.h" -@@ -66,27 +67,27 @@ void AddSourceSetObjectFiles(const Target* source_set, - if (source_set->GetOutputFilesForSource(source, &tool_name, &tool_outputs)) - obj_files->push_back(tool_outputs[0]); - -- used_types.Set(source.type()); -+ used_types.Set(GetSourceFileType(source)); - } - - // Add MSVC precompiled header object files. GCC .gch files are not object - // files so they are omitted. - if (source_set->config_values().has_precompiled_headers()) { -- if (used_types.Get(SourceFile::SOURCE_C)) { -+ if (used_types.Get(SOURCE_C)) { - const CTool* tool = source_set->toolchain()->GetToolAsC(CTool::kCToolCc); - if (tool && tool->precompiled_header_type() == CTool::PCH_MSVC) { - GetPCHOutputFiles(source_set, CTool::kCToolCc, &tool_outputs); - obj_files->Append(tool_outputs.begin(), tool_outputs.end()); - } - } -- if (used_types.Get(SourceFile::SOURCE_CPP)) { -+ if (used_types.Get(SOURCE_CPP)) { - const CTool* tool = source_set->toolchain()->GetToolAsC(CTool::kCToolCxx); - if (tool && tool->precompiled_header_type() == CTool::PCH_MSVC) { - GetPCHOutputFiles(source_set, CTool::kCToolCxx, &tool_outputs); - obj_files->Append(tool_outputs.begin(), tool_outputs.end()); - } - } -- if (used_types.Get(SourceFile::SOURCE_M)) { -+ if (used_types.Get(SOURCE_M)) { - const CTool* tool = - source_set->toolchain()->GetToolAsC(CTool::kCToolObjC); - if (tool && tool->precompiled_header_type() == CTool::PCH_MSVC) { -@@ -94,7 +95,7 @@ void AddSourceSetObjectFiles(const Target* source_set, - obj_files->Append(tool_outputs.begin(), tool_outputs.end()); - } - } -- if (used_types.Get(SourceFile::SOURCE_MM)) { -+ if (used_types.Get(SOURCE_MM)) { - const CTool* tool = - source_set->toolchain()->GetToolAsC(CTool::kCToolObjCxx); - if (tool && tool->precompiled_header_type() == CTool::PCH_MSVC) { -@@ -118,7 +119,7 @@ void NinjaCBinaryTargetWriter::Run() { - // Figure out what source types are needed. - SourceFileTypeSet used_types; - for (const auto& source : target_->sources()) -- used_types.Set(source.type()); -+ used_types.Set(GetSourceFileType(source)); - - WriteCompilerVars(used_types); - -@@ -234,34 +235,31 @@ void NinjaCBinaryTargetWriter::WriteCompilerVars( - target_->config_values().has_precompiled_headers(); - - EscapeOptions opts = GetFlagOptions(); -- if (used_types.Get(SourceFile::SOURCE_S) || -- used_types.Get(SourceFile::SOURCE_ASM)) { -+ if (used_types.Get(SOURCE_S) || used_types.Get(SOURCE_ASM)) { - WriteOneFlag(target_, &CSubstitutionAsmFlags, false, Tool::kToolNone, - &ConfigValues::asmflags, opts, path_output_, out_); - } -- if (used_types.Get(SourceFile::SOURCE_C) || -- used_types.Get(SourceFile::SOURCE_CPP) || -- used_types.Get(SourceFile::SOURCE_M) || -- used_types.Get(SourceFile::SOURCE_MM)) { -+ if (used_types.Get(SOURCE_C) || used_types.Get(SOURCE_CPP) || -+ used_types.Get(SOURCE_M) || used_types.Get(SOURCE_MM)) { - WriteOneFlag(target_, &CSubstitutionCFlags, false, Tool::kToolNone, - &ConfigValues::cflags, opts, path_output_, out_); - } -- if (used_types.Get(SourceFile::SOURCE_C)) { -+ if (used_types.Get(SOURCE_C)) { - WriteOneFlag(target_, &CSubstitutionCFlagsC, has_precompiled_headers, - CTool::kCToolCc, &ConfigValues::cflags_c, opts, path_output_, - out_); - } -- if (used_types.Get(SourceFile::SOURCE_CPP)) { -+ if (used_types.Get(SOURCE_CPP)) { - WriteOneFlag(target_, &CSubstitutionCFlagsCc, has_precompiled_headers, - CTool::kCToolCxx, &ConfigValues::cflags_cc, opts, path_output_, - out_); - } -- if (used_types.Get(SourceFile::SOURCE_M)) { -+ if (used_types.Get(SOURCE_M)) { - WriteOneFlag(target_, &CSubstitutionCFlagsObjC, has_precompiled_headers, - CTool::kCToolObjC, &ConfigValues::cflags_objc, opts, - path_output_, out_); - } -- if (used_types.Get(SourceFile::SOURCE_MM)) { -+ if (used_types.Get(SOURCE_MM)) { - WriteOneFlag(target_, &CSubstitutionCFlagsObjCc, has_precompiled_headers, - CTool::kCToolObjCxx, &ConfigValues::cflags_objcc, opts, - path_output_, out_); -@@ -321,14 +319,14 @@ void NinjaCBinaryTargetWriter::WritePCHCommands( - - const CTool* tool_c = target_->toolchain()->GetToolAsC(CTool::kCToolCc); - if (tool_c && tool_c->precompiled_header_type() != CTool::PCH_NONE && -- used_types.Get(SourceFile::SOURCE_C)) { -+ used_types.Get(SOURCE_C)) { - WritePCHCommand(&CSubstitutionCFlagsC, CTool::kCToolCc, - tool_c->precompiled_header_type(), input_dep, - order_only_deps, object_files, other_files); - } - const CTool* tool_cxx = target_->toolchain()->GetToolAsC(CTool::kCToolCxx); - if (tool_cxx && tool_cxx->precompiled_header_type() != CTool::PCH_NONE && -- used_types.Get(SourceFile::SOURCE_CPP)) { -+ used_types.Get(SOURCE_CPP)) { - WritePCHCommand(&CSubstitutionCFlagsCc, CTool::kCToolCxx, - tool_cxx->precompiled_header_type(), input_dep, - order_only_deps, object_files, other_files); -@@ -336,7 +334,7 @@ void NinjaCBinaryTargetWriter::WritePCHCommands( - - const CTool* tool_objc = target_->toolchain()->GetToolAsC(CTool::kCToolObjC); - if (tool_objc && tool_objc->precompiled_header_type() == CTool::PCH_GCC && -- used_types.Get(SourceFile::SOURCE_M)) { -+ used_types.Get(SOURCE_M)) { - WritePCHCommand(&CSubstitutionCFlagsObjC, CTool::kCToolObjC, - tool_objc->precompiled_header_type(), input_dep, - order_only_deps, object_files, other_files); -@@ -345,7 +343,7 @@ void NinjaCBinaryTargetWriter::WritePCHCommands( - const CTool* tool_objcxx = - target_->toolchain()->GetToolAsC(CTool::kCToolObjCxx); - if (tool_objcxx && tool_objcxx->precompiled_header_type() == CTool::PCH_GCC && -- used_types.Get(SourceFile::SOURCE_MM)) { -+ used_types.Get(SOURCE_MM)) { - WritePCHCommand(&CSubstitutionCFlagsObjCc, CTool::kCToolObjCxx, - tool_objcxx->precompiled_header_type(), input_dep, - order_only_deps, object_files, other_files); -@@ -478,7 +476,7 @@ void NinjaCBinaryTargetWriter::WriteSources( - deps.resize(0); - const char* tool_name = Tool::kToolNone; - if (!target_->GetOutputFilesForSource(source, &tool_name, &tool_outputs)) { -- if (source.type() == SourceFile::SOURCE_DEF) -+ if (GetSourceFileType(source) == SOURCE_DEF) - other_files->push_back(source); - continue; // No output for this source. - } -@@ -599,7 +597,7 @@ void NinjaCBinaryTargetWriter::WriteLinkerStuff( - const SourceFile* optional_def_file = nullptr; - if (!other_files.empty()) { - for (const SourceFile& src_file : other_files) { -- if (src_file.type() == SourceFile::SOURCE_DEF) { -+ if (GetSourceFileType(src_file) == SOURCE_DEF) { - optional_def_file = &src_file; - implicit_deps.push_back( - OutputFile(settings_->build_settings(), src_file)); -diff --git b/tools/gn/source_file.cc a/tools/gn/source_file.cc -index 7c860d43..79c6eb03 100644 ---- b/tools/gn/tools/gn/source_file.cc -+++ a/tools/gn/tools/gn/source_file.cc -@@ -21,48 +21,18 @@ void AssertValueSourceFileString(const std::string& s) { - DCHECK(!EndsWithSlash(s)) << s; - } - --SourceFile::Type GetSourceFileType(const std::string& file) { -- base::StringPiece extension = FindExtension(&file); -- if (extension == "cc" || extension == "cpp" || extension == "cxx") -- return SourceFile::SOURCE_CPP; -- if (extension == "h" || extension == "hpp" || extension == "hxx" || -- extension == "hh" || extension == "inc") -- return SourceFile::SOURCE_H; -- if (extension == "c") -- return SourceFile::SOURCE_C; -- if (extension == "m") -- return SourceFile::SOURCE_M; -- if (extension == "mm") -- return SourceFile::SOURCE_MM; -- if (extension == "rc") -- return SourceFile::SOURCE_RC; -- if (extension == "S" || extension == "s" || extension == "asm") -- return SourceFile::SOURCE_S; -- if (extension == "o" || extension == "obj") -- return SourceFile::SOURCE_O; -- if (extension == "def") -- return SourceFile::SOURCE_DEF; -- if (extension == "rs") -- return SourceFile::SOURCE_RS; -- if (extension == "go") -- return SourceFile::SOURCE_GO; -- -- return SourceFile::SOURCE_UNKNOWN; --} -- - } // namespace - --SourceFile::SourceFile() : type_(SOURCE_UNKNOWN) {} -+SourceFile::SourceFile() = default; - - SourceFile::SourceFile(const base::StringPiece& p) -- : value_(p.data(), p.size()), type_(GetSourceFileType(value_)) { -+ : value_(p.data(), p.size()) { - DCHECK(!value_.empty()); - AssertValueSourceFileString(value_); - NormalizePath(&value_); - } - --SourceFile::SourceFile(SwapIn, std::string* value) -- : type_(GetSourceFileType(*value)) { -+SourceFile::SourceFile(SwapIn, std::string* value) { - value_.swap(*value); - DCHECK(!value_.empty()); - AssertValueSourceFileString(value_); -diff --git b/tools/gn/source_file.h a/tools/gn/source_file.h -index bcf5f422..f0339875 100644 ---- b/tools/gn/tools/gn/source_file.h -+++ a/tools/gn/tools/gn/source_file.h -@@ -20,28 +20,6 @@ class SourceDir; - // ends in one. - class SourceFile { - public: -- // This should be sequential integers starting from 0 so they can be used as -- // array indices. -- enum Type { -- SOURCE_UNKNOWN = 0, -- SOURCE_ASM, -- SOURCE_C, -- SOURCE_CPP, -- SOURCE_H, -- SOURCE_M, -- SOURCE_MM, -- SOURCE_S, -- SOURCE_RC, -- SOURCE_O, // Object files can be inputs, too. Also counts .obj. -- SOURCE_DEF, -- -- SOURCE_RS, -- SOURCE_GO, -- -- // Must be last. -- SOURCE_NUMTYPES, -- }; -- - enum SwapIn { SWAP_IN }; - - SourceFile(); -@@ -58,7 +36,6 @@ class SourceFile { - - bool is_null() const { return value_.empty(); } - const std::string& value() const { return value_; } -- Type type() const { return type_; } - - // Returns everything after the last slash. - std::string GetName() const; -@@ -103,7 +80,6 @@ class SourceFile { - friend class SourceDir; - - std::string value_; -- Type type_; - - // Copy & assign supported. - }; -diff --git b/tools/gn/source_file_type.cc a/tools/gn/source_file_type.cc -new file mode 100644 -index 00000000..fde1ccaf ---- b/tools/gn/tools/gn/source_file_type.cc -+++ a/tools/gn/tools/gn/source_file_type.cc -@@ -0,0 +1,37 @@ -+// Copyright 2014 The Chromium Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style license that can be -+// found in the LICENSE file. -+ -+#include "tools/gn/source_file_type.h" -+ -+#include "tools/gn/filesystem_utils.h" -+#include "tools/gn/source_file.h" -+ -+SourceFileType GetSourceFileType(const SourceFile& file) { -+ base::StringPiece extension = FindExtension(&file.value()); -+ if (extension == "cc" || extension == "cpp" || extension == "cxx") -+ return SOURCE_CPP; -+ if (extension == "h" || extension == "hpp" || extension == "hxx" || -+ extension == "hh") -+ return SOURCE_H; -+ if (extension == "c") -+ return SOURCE_C; -+ if (extension == "m") -+ return SOURCE_M; -+ if (extension == "mm") -+ return SOURCE_MM; -+ if (extension == "rc") -+ return SOURCE_RC; -+ if (extension == "S" || extension == "s" || extension == "asm") -+ return SOURCE_S; -+ if (extension == "o" || extension == "obj") -+ return SOURCE_O; -+ if (extension == "def") -+ return SOURCE_DEF; -+ if (extension == "rs") -+ return SOURCE_RS; -+ if (extension == "go") -+ return SOURCE_GO; -+ -+ return SOURCE_UNKNOWN; -+} -diff --git b/tools/gn/source_file_type.h a/tools/gn/source_file_type.h -new file mode 100644 -index 00000000..d4054978 ---- b/tools/gn/tools/gn/source_file_type.h -+++ a/tools/gn/tools/gn/source_file_type.h -@@ -0,0 +1,34 @@ -+// Copyright 2014 The Chromium Authors. All rights reserved. -+// Use of this source code is governed by a BSD-style license that can be -+// found in the LICENSE file. -+ -+#ifndef TOOLS_GN_SOURCE_FILE_TYPE_H_ -+#define TOOLS_GN_SOURCE_FILE_TYPE_H_ -+ -+class SourceFile; -+ -+// This should be sequential integers starting from 0 so they can be used as -+// array indices. -+enum SourceFileType { -+ SOURCE_UNKNOWN = 0, -+ SOURCE_ASM, -+ SOURCE_C, -+ SOURCE_CPP, -+ SOURCE_H, -+ SOURCE_M, -+ SOURCE_MM, -+ SOURCE_S, -+ SOURCE_RC, -+ SOURCE_O, // Object files can be inputs, too. Also counts .obj. -+ SOURCE_DEF, -+ -+ SOURCE_RS, -+ SOURCE_GO, -+ -+ // Must be last. -+ SOURCE_NUMTYPES, -+}; -+ -+SourceFileType GetSourceFileType(const SourceFile& file); -+ -+#endif // TOOLS_GN_SOURCE_FILE_TYPE_H_ -diff --git b/tools/gn/target.cc a/tools/gn/target.cc -index 1afd22be..6272b44a 100644 ---- b/tools/gn/tools/gn/target.cc -+++ a/tools/gn/tools/gn/target.cc -@@ -16,6 +16,7 @@ - #include "tools/gn/filesystem_utils.h" - #include "tools/gn/functions.h" - #include "tools/gn/scheduler.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/substitution_writer.h" - #include "tools/gn/tool.h" - #include "tools/gn/toolchain.h" -@@ -486,10 +487,10 @@ bool Target::GetOutputFilesForSource(const SourceFile& source, - outputs->clear(); - *computed_tool_type = Tool::kToolNone; - -- SourceFile::Type file_type = source.type(); -- if (file_type == SourceFile::SOURCE_UNKNOWN) -+ SourceFileType file_type = GetSourceFileType(source); -+ if (file_type == SOURCE_UNKNOWN) - return false; -- if (file_type == SourceFile::SOURCE_O) { -+ if (file_type == SOURCE_O) { - // Object files just get passed to the output and not compiled. - outputs->push_back(OutputFile(settings()->build_settings(), source)); - return true; -diff --git b/tools/gn/tool.cc a/tools/gn/tool.cc -index b040ac20..7a06b032 100644 ---- b/tools/gn/tools/gn/tool.cc -+++ a/tools/gn/tools/gn/tool.cc -@@ -261,27 +261,27 @@ std::unique_ptr<Tool> Tool::CreateTool(const std::string& name) { - } - - // static --const char* Tool::GetToolTypeForSourceType(SourceFile::Type type) { -+const char* Tool::GetToolTypeForSourceType(SourceFileType type) { - switch (type) { -- case SourceFile::SOURCE_C: -+ case SOURCE_C: - return CTool::kCToolCc; -- case SourceFile::SOURCE_CPP: -+ case SOURCE_CPP: - return CTool::kCToolCxx; -- case SourceFile::SOURCE_M: -+ case SOURCE_M: - return CTool::kCToolObjC; -- case SourceFile::SOURCE_MM: -+ case SOURCE_MM: - return CTool::kCToolObjCxx; -- case SourceFile::SOURCE_ASM: -- case SourceFile::SOURCE_S: -+ case SOURCE_ASM: -+ case SOURCE_S: - return CTool::kCToolAsm; -- case SourceFile::SOURCE_RC: -+ case SOURCE_RC: - return CTool::kCToolRc; -- case SourceFile::SOURCE_UNKNOWN: -- case SourceFile::SOURCE_H: -- case SourceFile::SOURCE_O: -- case SourceFile::SOURCE_DEF: -- case SourceFile::SOURCE_GO: -- case SourceFile::SOURCE_RS: -+ case SOURCE_UNKNOWN: -+ case SOURCE_H: -+ case SOURCE_O: -+ case SOURCE_DEF: -+ case SOURCE_GO: -+ case SOURCE_RS: - return kToolNone; - default: - NOTREACHED(); -diff --git b/tools/gn/tool.h a/tools/gn/tool.h -index a6f177d6..ec2eb94c 100644 ---- b/tools/gn/tools/gn/tool.h -+++ a/tools/gn/tools/gn/tool.h -@@ -12,7 +12,7 @@ - #include "tools/gn/label.h" - #include "tools/gn/label_ptr.h" - #include "tools/gn/scope.h" --#include "tools/gn/source_file.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/substitution_list.h" - #include "tools/gn/substitution_pattern.h" - -@@ -171,7 +171,7 @@ class Tool { - Toolchain* toolchain, - Err* err); - -- static const char* GetToolTypeForSourceType(SourceFile::Type type); -+ static const char* GetToolTypeForSourceType(SourceFileType type); - static const char* GetToolTypeForTargetFinalOutput(const Target* target); - - protected: -diff --git b/tools/gn/toolchain.cc a/tools/gn/toolchain.cc -index 0d6cbaf4..b718052c 100644 ---- b/tools/gn/tools/gn/toolchain.cc -+++ a/tools/gn/tools/gn/toolchain.cc -@@ -88,16 +88,16 @@ void Toolchain::ToolchainSetupComplete() { - setup_complete_ = true; - } - --const Tool* Toolchain::GetToolForSourceType(SourceFile::Type type) const { -+const Tool* Toolchain::GetToolForSourceType(SourceFileType type) const { - return GetTool(Tool::GetToolTypeForSourceType(type)); - } - --const CTool* Toolchain::GetToolForSourceTypeAsC(SourceFile::Type type) const { -+const CTool* Toolchain::GetToolForSourceTypeAsC(SourceFileType type) const { - return GetToolAsC(Tool::GetToolTypeForSourceType(type)); - } - - const GeneralTool* Toolchain::GetToolForSourceTypeAsGeneral( -- SourceFile::Type type) const { -+ SourceFileType type) const { - return GetToolAsGeneral(Tool::GetToolTypeForSourceType(type)); - } - -diff --git b/tools/gn/toolchain.h a/tools/gn/toolchain.h -index cc93de54..e36475dd 100644 ---- b/tools/gn/tools/gn/toolchain.h -+++ a/tools/gn/tools/gn/toolchain.h -@@ -12,6 +12,7 @@ - #include "tools/gn/item.h" - #include "tools/gn/label_ptr.h" - #include "tools/gn/scope.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/substitution_type.h" - #include "tools/gn/tool.h" - #include "tools/gn/value.h" -@@ -87,9 +88,9 @@ class Toolchain : public Item { - } - - // Returns the tool for compiling the given source file type. -- const Tool* GetToolForSourceType(SourceFile::Type type) const; -- const CTool* GetToolForSourceTypeAsC(SourceFile::Type type) const; -- const GeneralTool* GetToolForSourceTypeAsGeneral(SourceFile::Type type) const; -+ const Tool* GetToolForSourceType(SourceFileType type) const; -+ const CTool* GetToolForSourceTypeAsC(SourceFileType type) const; -+ const GeneralTool* GetToolForSourceTypeAsGeneral(SourceFileType type) const; - - // Returns the tool that produces the final output for the given target type. - // This isn't necessarily the tool you would expect. For copy target, this -diff --git b/tools/gn/visual_studio_writer.cc a/tools/gn/visual_studio_writer.cc -index 9dbd4b35..f804b444 100644 ---- b/tools/gn/tools/gn/visual_studio_writer.cc -+++ a/tools/gn/tools/gn/visual_studio_writer.cc -@@ -24,6 +24,7 @@ - #include "tools/gn/label_pattern.h" - #include "tools/gn/parse_tree.h" - #include "tools/gn/path_output.h" -+#include "tools/gn/source_file_type.h" - #include "tools/gn/standard_out.h" - #include "tools/gn/target.h" - #include "tools/gn/variables.h" --- -2.21.0 - diff --git a/chromium/chromium/chromium.spec b/chromium/chromium/chromium.spec index fa9897f..c4448ab 100644 --- a/chromium/chromium/chromium.spec +++ b/chromium/chromium/chromium.spec @@ -47,7 +47,7 @@ %bcond_with fedora_compilation_flags Name: chromium -Version: 74.0.3729.169 +Version: 75.0.3770.80 Release: 100%{?dist} Summary: A WebKit (Blink) powered web browser @@ -94,21 +94,14 @@ Patch50: chromium-nacl-llvm-ar.patch Patch60: chromium-python2.patch # Pull upstream patches -Patch70: chromium-gcc8-r641329.patch -Patch71: chromium-gcc8-r641404.patch -Patch72: chromium-gcc8-r642680.patch -Patch73: chromium-gcc8-r647271.patch -Patch74: chromium-gcc8-r647382.patch -Patch75: chromium-gcc8-cl1503254.patch +Patch70: chromium-angle-gcc9.patch +Patch71: chromium-gcc9-r654570.patch +Patch72: chromium-gcc9-r666714.patch # Pull patches from Fedora # https://src.fedoraproject.org/rpms/chromium/c/9071ee2d2f996b84 Patch80: chromium-webrtc-cstring.patch -# Revert upstream patches which cause errors -# https://crbug.com/gn/77 -Patch90: chromium-gn-revert-bug-77.patch - # I don't have time to test whether it work on other architectures ExclusiveArch: x86_64 @@ -251,6 +244,7 @@ find -type f -exec \ third_party/angle/third_party/vulkan-tools \ third_party/angle/third_party/vulkan-validation-layers \ third_party/apple_apsl \ + third_party/axe-core \ third_party/boringssl \ third_party/boringssl/src/third_party/fiat \ third_party/blink \ @@ -272,15 +266,16 @@ find -type f -exec \ third_party/cld_3 \ third_party/closure_compiler \ third_party/crashpad \ + third_party/crashpad/crashpad/third_party/lss \ third_party/crashpad/crashpad/third_party/zlib \ third_party/crc32c \ third_party/cros_system_api \ third_party/dav1d \ + third_party/dawn \ third_party/devscripts \ third_party/dom_distiller_js \ third_party/emoji-segmenter \ third_party/ffmpeg \ - third_party/fips181 \ third_party/flatbuffers \ third_party/flot \ third_party/freetype \ @@ -347,6 +342,7 @@ find -type f -exec \ third_party/pdfium/third_party/libtiff \ third_party/pdfium/third_party/skia_shared \ third_party/perfetto \ + third_party/pffft \ %if !%{with system_ply} third_party/ply \ %endif @@ -644,6 +640,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %changelog +* Fri Jun 07 2019 - Ting-Wei Lan <lantw44@gmail.com> - 75.0.3770.80-100 +- Update to 75.0.3770.80 + * Wed May 22 2019 - Ting-Wei Lan <lantw44@gmail.com> - 74.0.3729.169-100 - Update to 74.0.3729.169 |