# Copyright 2023 The Pigweed Authors # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # Patch the fit::function implementation for use in Pigweed: # # - Use PW_ASSERT instead of __builtin_abort. # - Temporarily disable sanitizers when invoking a function for b/241567321. # diff --git a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/function.h b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/function.h --- a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/function.h +++ b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/function.h @@ -18,6 +18,8 @@ #include #include "../nullable.h" +#include "pw_assert/assert.h" +#include "pw_preprocessor/compiler.h" namespace fit { namespace internal { @@ -87,7 +89,7 @@ inline const void* unshared_target_type_id(void* /*bits*/, const void* impl_ops) // elsewhere in the header as an inline variable. template struct null_target { - static void invoke(void* /*bits*/) { __builtin_abort(); } + static void invoke(void* /*bits*/) { PW_ASSERT(false); } static const target_ops ops; @@ -493,7 +495,8 @@ class function_base // Note that fit::callback will release the target immediately after // invoke() (also affecting any share()d copies). // Aborts if the function's target is empty. - Result invoke(Args... args) const { + // TODO(b/241567321): Remove "no sanitize" after pw_protobuf is fixed. + Result invoke(Args... args) const PW_NO_SANITIZE("function") { // Down cast the ops to the derived type that this function was instantiated // with, which includes the invoke function. // @@ -523,7 +526,7 @@ class function_base template void copy_shared_target_to(SharedFunction& copy) { copy.destroy_target(); - assert(base::ops() == &shared_target_type::ops); + PW_ASSERT(base::ops() == &shared_target_type::ops); shared_target_type::copy_shared_ptr(base::bits(), copy.bits()); copy.set_ops(base::ops()); } @@ -553,7 +556,7 @@ class function_base void check_target_type() const { if (target_type::ops.target_type_id(nullptr, &target_type::ops) != base::target_type_id()) { - __builtin_abort(); + PW_ASSERT(false); } } }; diff --git a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/nullable.h b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/nullable.h --- a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/nullable.h +++ b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/nullable.h @@ -11,6 +11,8 @@ #include #include +#include "pw_assert/assert.h" + namespace fit { // Determines whether a type can be compared with nullptr. @@ -130,28 +132,28 @@ class nullable final { if (has_value()) { return value_; } else { - __builtin_abort(); + PW_ASSERT(false); } } constexpr const T& value() const& { if (has_value()) { return value_; } else { - __builtin_abort(); + PW_ASSERT(false); } } constexpr T&& value() && { if (has_value()) { return std::move(value_); } else { - __builtin_abort(); + PW_ASSERT(false); } } constexpr const T&& value() const&& { if (has_value()) { return std::move(value_); } else { - __builtin_abort(); + PW_ASSERT(false); } } diff --git a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/result.h b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/result.h --- a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/result.h +++ b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/result.h @@ -55,6 +55,8 @@ // // fit::result with a different "success" vluae type (or // // fit::result). +#include "pw_assert/assert.h" + namespace fit { // Convenience type to indicate failure without elaboration. @@ -280,25 +282,25 @@ class LIB_FIT_NODISCARD result { if (is_error()) { return storage_.error_or_value.error; } - __builtin_abort(); + PW_ASSERT(false); } constexpr const E& error_value() const& { if (is_error()) { return storage_.error_or_value.error; } - __builtin_abort(); + PW_ASSERT(false); } constexpr E&& error_value() && { if (is_error()) { return std::move(storage_.error_or_value.error); } - __builtin_abort(); + PW_ASSERT(false); } constexpr const E&& error_value() const&& { if (is_error()) { return std::move(storage_.error_or_value.error); } - __builtin_abort(); + PW_ASSERT(false); } // Moves the underlying error and returns it as an instance of fit::error, simplifying @@ -309,7 +311,7 @@ class LIB_FIT_NODISCARD result { if (is_error()) { return error(std::move(storage_.error_or_value.error)); } - __builtin_abort(); + PW_ASSERT(false); } // Accessors for the underlying value. @@ -319,25 +321,25 @@ class LIB_FIT_NODISCARD result { if (is_ok()) { return storage_.error_or_value.value; } - __builtin_abort(); + PW_ASSERT(false); } constexpr const T& value() const& { if (is_ok()) { return storage_.error_or_value.value; } - __builtin_abort(); + PW_ASSERT(false); } constexpr T&& value() && { if (is_ok()) { return std::move(storage_.error_or_value.value); } - __builtin_abort(); + PW_ASSERT(false); } constexpr const T&& value() const&& { if (is_ok()) { return std::move(storage_.error_or_value.value); } - __builtin_abort(); + PW_ASSERT(false); } // Moves the underlying value and returns it as an instance of fit::success, simplifying @@ -348,7 +350,7 @@ class LIB_FIT_NODISCARD result { if (is_ok()) { return success(std::move(storage_.error_or_value.value)); } - __builtin_abort(); + PW_ASSERT(false); } // Contingent accessors for the underlying value. @@ -377,13 +379,13 @@ class LIB_FIT_NODISCARD result { if (is_ok()) { return ::fit::internal::arrow_operator::forward(storage_.error_or_value.value); } - __builtin_abort(); + PW_ASSERT(false); } constexpr decltype(auto) operator->() const { if (is_ok()) { return ::fit::internal::arrow_operator::forward(storage_.error_or_value.value); } - __builtin_abort(); + PW_ASSERT(false); } // Accessors for the underlying value. This is a syntax sugar for value(). @@ -406,7 +408,7 @@ class LIB_FIT_NODISCARD result { storage_.error_or_value.error += std::move(error.value_); return *this; } - __builtin_abort(); + PW_ASSERT(false); } // Maps a result to a result by transforming the error through @@ -517,25 +519,25 @@ class LIB_FIT_NODISCARD result { if (is_error()) { return storage_.error_or_value.error; } - __builtin_abort(); + PW_ASSERT(false); } constexpr const E& error_value() const& { if (is_error()) { return storage_.error_or_value.error; } - __builtin_abort(); + PW_ASSERT(false); } constexpr E&& error_value() && { if (is_error()) { return std::move(storage_.error_or_value.error); } - __builtin_abort(); + PW_ASSERT(false); } constexpr const E&& error_value() const&& { if (is_error()) { return std::move(storage_.error_or_value.error); } - __builtin_abort(); + PW_ASSERT(false); } // Moves the underlying error and returns it as an instance of fit::error, simplifying @@ -546,7 +548,7 @@ class LIB_FIT_NODISCARD result { if (is_error()) { return error(std::move(storage_.error_or_value.error)); } - __builtin_abort(); + PW_ASSERT(false); } // Augments the error value of the result with the given value. The operator E::operator+=(F) must @@ -560,7 +562,7 @@ class LIB_FIT_NODISCARD result { storage_.error_or_value.error += std::move(error.value_); return *this; } - __builtin_abort(); + PW_ASSERT(false); } // Maps a result to a result by transforming the error through