diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2024-04-26 15:33:29 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2024-05-08 19:37:29 -0700 |
| commit | 06ee65af9ed6aa5ee4d1d7f4fab9d7acecf66e76 (patch) | |
| tree | 1316711b92a43dd5c599e425b8693fa8e1e0c0b7 /lib/libcxx/src/ostream.cpp | |
| parent | bc6ebc6f2597fda1f98842c6f545751fef2a5334 (diff) | |
| download | zig-06ee65af9ed6aa5ee4d1d7f4fab9d7acecf66e76.tar.gz zig-06ee65af9ed6aa5ee4d1d7f4fab9d7acecf66e76.zip | |
libcxx: update to LLVM 18
release/18.x branch, commit 78b99c73ee4b96fe9ce0e294d4632326afb2db42
This adds the flag `-D_LIBCPP_HARDENING_MODE` which is determined based
on the Zig optimization mode.
This commit also fixes libunwind, libcxx, and libcxxabi to properly
report sub compilation errors.
Diffstat (limited to 'lib/libcxx/src/ostream.cpp')
| -rw-r--r-- | lib/libcxx/src/ostream.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/libcxx/src/ostream.cpp b/lib/libcxx/src/ostream.cpp new file mode 100644 index 0000000000..443dce9a39 --- /dev/null +++ b/lib/libcxx/src/ostream.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <__availability> +#include <__config> +#ifndef _LIBCPP_HAS_NO_FILESYSTEM +# include <fstream> +#endif +#include <ostream> + +#include "std_stream.h" + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_EXPORTED_FROM_ABI FILE* __get_ostream_file(ostream& __os) { + // dynamic_cast requires RTTI, this only affects users whose vendor builds + // the dylib with RTTI disabled. It does not affect users who build with RTTI + // disabled but use a dylib where the RTTI is enabled. + // + // Returning a nullptr means the stream is not considered a terminal and the + // special terminal handling is not done. The terminal handling is mainly of + // importance on Windows. +#ifndef _LIBCPP_HAS_NO_RTTI + auto* __rdbuf = __os.rdbuf(); +# ifndef _LIBCPP_HAS_NO_FILESYSTEM + if (auto* __buffer = dynamic_cast<filebuf*>(__rdbuf)) + return __buffer->__file_; +# endif + + if (auto* __buffer = dynamic_cast<__stdoutbuf<char>*>(__rdbuf)) + return __buffer->__file_; +#endif // _LIBCPP_HAS_NO_RTTI + + return nullptr; +} + +_LIBCPP_END_NAMESPACE_STD |
