aboutsummaryrefslogtreecommitdiff
path: root/pw_libcxx
diff options
context:
space:
mode:
Diffstat (limited to 'pw_libcxx')
-rw-r--r--pw_libcxx/BUILD.bazel27
-rw-r--r--pw_libcxx/BUILD.gn33
-rw-r--r--pw_libcxx/__cxa_deleted_virtual.cc15
-rw-r--r--pw_libcxx/__cxa_pure_virtual.cc15
-rw-r--r--pw_libcxx/docs.rst9
-rw-r--r--pw_libcxx/operator_delete.cc37
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();
+}