[libcxx-dev] Question on how libc++ defines cin and other streams
Shoaib Meenai via libcxx-dev
libcxx-dev at lists.llvm.org
Wed Nov 28 12:40:28 PST 2018
We have a mangling mismatch between the declaration and definitions of the streams otherwise. https://reviews.llvm.org/D23378 explains it further.
From: libcxx-dev <libcxx-dev-bounces at lists.llvm.org> on behalf of Louis Dionne via libcxx-dev <libcxx-dev at lists.llvm.org>
Reply-To: Louis Dionne <ldionne at apple.com>
Date: Wednesday, November 28, 2018 at 8:36 AM
To: "libcxx-dev at lists.llvm.org" <libcxx-dev at lists.llvm.org>
Subject: [libcxx-dev] Question on how libc++ defines cin and other streams
In src/iostream.cpp, I can find the following beautiful declarations:
_ALIGNAS_TYPE (istream) _LIBCPP_FUNC_VIS char cin[sizeof(istream)]
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
__asm__("?cin@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_istream at DU?$char_traits at D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12 at A")
And then we have this a little lower in src/iostream.cpp:
_LIBCPP_HIDDEN ios_base::Init __start_std_streams;
istream* cin_ptr = ::new(cin) istream(::new(__cin) __stdinbuf <char>(stdin, &mb_cin));
I understand we're basically allocating a char array and then placement newing the stream into it during static initialization. However, why is that dance necessary with Clang-on-Windows?
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the libcxx-dev