diff options
Diffstat (limited to 'pw_libcxx')
-rw-r--r-- | pw_libcxx/BUILD.bazel | 27 | ||||
-rw-r--r-- | pw_libcxx/BUILD.gn | 33 | ||||
-rw-r--r-- | pw_libcxx/__cxa_deleted_virtual.cc | 15 | ||||
-rw-r--r-- | pw_libcxx/__cxa_pure_virtual.cc | 15 | ||||
-rw-r--r-- | pw_libcxx/docs.rst | 9 | ||||
-rw-r--r-- | pw_libcxx/operator_delete.cc | 37 |
6 files changed, 136 insertions, 0 deletions
diff --git a/pw_libcxx/BUILD.bazel b/pw_libcxx/BUILD.bazel new file mode 100644 index 000000000..0ef580840 --- /dev/null +++ b/pw_libcxx/BUILD.bazel @@ -0,0 +1,27 @@ +# 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. + +load( + "//pw_build:pigweed.bzl", + "pw_cc_library", +) + +pw_cc_library( + name = "pw_libcxx", + srcs = [ + "__cxa_deleted_virtual.cc", + "__cxa_pure_virtual.cc", + "operator_delete.cc", + ], +) diff --git a/pw_libcxx/BUILD.gn b/pw_libcxx/BUILD.gn new file mode 100644 index 000000000..4083abf4c --- /dev/null +++ b/pw_libcxx/BUILD.gn @@ -0,0 +1,33 @@ +# 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. + +import("//build_overrides/pigweed.gni") +import("$dir_pw_build/cc_library.gni") +import("$dir_pw_docgen/docs.gni") +import("$dir_pw_unit_test/test.gni") + +pw_static_library("pw_libcxx") { + sources = [ + "__cxa_deleted_virtual.cc", + "__cxa_pure_virtual.cc", + "operator_delete.cc", + ] +} + +pw_test_group("tests") { +} + +pw_doc_group("docs") { + sources = [ "docs.rst" ] +} diff --git a/pw_libcxx/__cxa_deleted_virtual.cc b/pw_libcxx/__cxa_deleted_virtual.cc new file mode 100644 index 000000000..6f02ab1ed --- /dev/null +++ b/pw_libcxx/__cxa_deleted_virtual.cc @@ -0,0 +1,15 @@ +// 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. + +extern "C" void __cxa_deleted_virtual() { __builtin_trap(); } diff --git a/pw_libcxx/__cxa_pure_virtual.cc b/pw_libcxx/__cxa_pure_virtual.cc new file mode 100644 index 000000000..b0c73b510 --- /dev/null +++ b/pw_libcxx/__cxa_pure_virtual.cc @@ -0,0 +1,15 @@ +// 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. + +extern "C" void __cxa_pure_virtual() { __builtin_trap(); } diff --git a/pw_libcxx/docs.rst b/pw_libcxx/docs.rst new file mode 100644 index 000000000..4243fee74 --- /dev/null +++ b/pw_libcxx/docs.rst @@ -0,0 +1,9 @@ +.. _module-pw_libcxx: + +--------- +pw_libcxx +--------- +The ``pw_libcxx`` module provides libcxx symbols, and will eventually facilitate +pulling in headers as well. Currently, none of the library is built from +upstream LLVM libcxx, instead the symbols provided should just crash in +an embedded context. diff --git a/pw_libcxx/operator_delete.cc b/pw_libcxx/operator_delete.cc new file mode 100644 index 000000000..a545f525d --- /dev/null +++ b/pw_libcxx/operator_delete.cc @@ -0,0 +1,37 @@ +// 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. + +#include <new> + +// fxbug.dev/132869: We should look into compiler changes to avoid emitting +// references to these symbols. +// These operator delete implementations are provided to satisfy references from +// the vtable for the deleting destructor. In practice, these will never be +// reached because users should not be using new/delete. + +void operator delete(void*) noexcept { __builtin_trap(); } +void operator delete[](void*) noexcept { __builtin_trap(); } + +void operator delete(void*, std::align_val_t) noexcept { __builtin_trap(); } +void operator delete[](void*, std::align_val_t) noexcept { __builtin_trap(); } + +void operator delete(void*, std::size_t) noexcept { __builtin_trap(); } +void operator delete[](void*, std::size_t) noexcept { __builtin_trap(); } + +void operator delete(void*, std::size_t, std::align_val_t) noexcept { + __builtin_trap(); +} +void operator delete[](void*, std::size_t, std::align_val_t) noexcept { + __builtin_trap(); +} |