blob: 05580e67f361094b183dbbd8cb4cb0a64e2a9fd1 [file] [log] [blame]
# Copyright 2022 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/function_internal.h b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/function_internal.h
--- a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/function_internal.h
+++ b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/function_internal.h
@@ -15,6 +15,8 @@
#include <utility>
#include "nullable.h"
+#include "pw_assert/assert.h"
+#include "pw_preprocessor/compiler.h"
namespace fit {
namespace internal {
@@ -41,7 +43,7 @@ template <typename Result, typename... Args>
struct target<decltype(nullptr),
/*is_inline=*/true, /*is_shared=*/false, Result, Args...>
final {
- static Result invoke(void* /*bits*/, Args... /*args*/) { __builtin_abort(); }
+ static Result invoke(void* /*bits*/, Args... /*args*/) { PW_ASSERT(false); }
static const target_ops<Result, Args...> ops;
};
@@ -319,7 +321,8 @@ class function_base<inline_target_size, require_inline, Result(Args...)> {
// 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") {
return storage_.ops->invoke(&storage_.bits, std::forward<Args>(args)...);
}
@@ -430,7 +433,7 @@ class function_base<inline_target_size, require_inline, Result(Args...)> {
void check_target_type() const {
if (target_type<Callable>::ops.target_type_id(nullptr, &target_type<Callable>::ops) !=
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 <type_traits>
#include <utility>
+#include "pw_assert/assert.h"
+
namespace fit {
// Determines whether a type can be compared with nullptr.
@@ -130,28 +132,28 @@ class nullable<T, true> 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);
}
}