mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-21 15:10:37 +08:00

Summary: When building with -fvisibility=hidden, some symbols do not get exported from libc++.dylib. This means that some entities are not explicitly given default visibility in the source code, and that we rely on the fact -fvisibility=default is the default. This commit explicitly gives default visibility to those symbols to avoid being dependent on the command line flags used. The commit also remove symbols from the dylib -- those symbols do not actually need to be exported from the dylib and this should not be an ABI break. Finally, in the future, we may want to mark the whole std:: namespace as having hidden visibility (to switch from opt-out to opt-in), in which case the changes done in this commit will be required. Reviewers: EricWF Subscribers: mgorny, christof, dexonsmith, libcxx-commits Differential Revision: https://reviews.llvm.org/D52662 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@345260 91177308-0d34-0410-b5e6-96231b3b80d8
125 lines
4.8 KiB
C++
125 lines
4.8 KiB
C++
//===------------------------ iostream.cpp --------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "__std_stream"
|
|
#include "string"
|
|
#include "new"
|
|
|
|
#define _str(s) #s
|
|
#define str(s) _str(s)
|
|
#define _LIBCPP_NAMESPACE_STR str(_LIBCPP_NAMESPACE)
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
#ifndef _LIBCPP_HAS_NO_STDIN
|
|
_ALIGNAS_TYPE (istream) _LIBCPP_FUNC_VIS char cin[sizeof(istream)]
|
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
|
|
__asm__("?cin@" _LIBCPP_NAMESPACE_STR "@std@@3V?$basic_istream@DU?$char_traits@D@" _LIBCPP_NAMESPACE_STR "@std@@@12@A")
|
|
#endif
|
|
;
|
|
_ALIGNAS_TYPE (__stdinbuf<char> ) static char __cin[sizeof(__stdinbuf <char>)];
|
|
static mbstate_t mb_cin;
|
|
_ALIGNAS_TYPE (wistream) _LIBCPP_FUNC_VIS char wcin[sizeof(wistream)]
|
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
|
|
__asm__("?wcin@" _LIBCPP_NAMESPACE_STR "@std@@3V?$basic_istream@_WU?$char_traits@_W@" _LIBCPP_NAMESPACE_STR "@std@@@12@A")
|
|
#endif
|
|
;
|
|
_ALIGNAS_TYPE (__stdinbuf<wchar_t> ) static char __wcin[sizeof(__stdinbuf <wchar_t>)];
|
|
static mbstate_t mb_wcin;
|
|
#endif
|
|
|
|
#ifndef _LIBCPP_HAS_NO_STDOUT
|
|
_ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cout[sizeof(ostream)]
|
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
|
|
__asm__("?cout@" _LIBCPP_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_NAMESPACE_STR "@std@@@12@A")
|
|
#endif
|
|
;
|
|
_ALIGNAS_TYPE (__stdoutbuf<char>) static char __cout[sizeof(__stdoutbuf<char>)];
|
|
static mbstate_t mb_cout;
|
|
_ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcout[sizeof(wostream)]
|
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
|
|
__asm__("?wcout@" _LIBCPP_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_NAMESPACE_STR "@std@@@12@A")
|
|
#endif
|
|
;
|
|
_ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcout[sizeof(__stdoutbuf<wchar_t>)];
|
|
static mbstate_t mb_wcout;
|
|
#endif
|
|
|
|
_ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cerr[sizeof(ostream)]
|
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
|
|
__asm__("?cerr@" _LIBCPP_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_NAMESPACE_STR "@std@@@12@A")
|
|
#endif
|
|
;
|
|
_ALIGNAS_TYPE (__stdoutbuf<char>) static char __cerr[sizeof(__stdoutbuf<char>)];
|
|
static mbstate_t mb_cerr;
|
|
_ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcerr[sizeof(wostream)]
|
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
|
|
__asm__("?wcerr@" _LIBCPP_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_NAMESPACE_STR "@std@@@12@A")
|
|
#endif
|
|
;
|
|
_ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcerr[sizeof(__stdoutbuf<wchar_t>)];
|
|
static mbstate_t mb_wcerr;
|
|
|
|
_ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char clog[sizeof(ostream)]
|
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
|
|
__asm__("?clog@" _LIBCPP_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_NAMESPACE_STR "@std@@@12@A")
|
|
#endif
|
|
;
|
|
_ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wclog[sizeof(wostream)]
|
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
|
|
__asm__("?wclog@" _LIBCPP_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_NAMESPACE_STR "@std@@@12@A")
|
|
#endif
|
|
;
|
|
|
|
_LIBCPP_HIDDEN ios_base::Init __start_std_streams;
|
|
|
|
ios_base::Init::Init()
|
|
{
|
|
#ifndef _LIBCPP_HAS_NO_STDIN
|
|
istream* cin_ptr = ::new(cin) istream(::new(__cin) __stdinbuf <char>(stdin, &mb_cin));
|
|
wistream* wcin_ptr = ::new(wcin) wistream(::new(__wcin) __stdinbuf <wchar_t>(stdin, &mb_wcin));
|
|
#endif
|
|
#ifndef _LIBCPP_HAS_NO_STDOUT
|
|
ostream* cout_ptr = ::new(cout) ostream(::new(__cout) __stdoutbuf<char>(stdout, &mb_cout));
|
|
wostream* wcout_ptr = ::new(wcout) wostream(::new(__wcout) __stdoutbuf<wchar_t>(stdout, &mb_wcout));
|
|
#endif
|
|
ostream* cerr_ptr = ::new(cerr) ostream(::new(__cerr) __stdoutbuf<char>(stderr, &mb_cerr));
|
|
::new(clog) ostream(cerr_ptr->rdbuf());
|
|
wostream* wcerr_ptr = ::new(wcerr) wostream(::new(__wcerr) __stdoutbuf<wchar_t>(stderr, &mb_wcerr));
|
|
::new(wclog) wostream(wcerr_ptr->rdbuf());
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_STDIN) && !defined(_LIBCPP_HAS_NO_STDOUT)
|
|
cin_ptr->tie(cout_ptr);
|
|
wcin_ptr->tie(wcout_ptr);
|
|
#endif
|
|
_VSTD::unitbuf(*cerr_ptr);
|
|
_VSTD::unitbuf(*wcerr_ptr);
|
|
#ifndef _LIBCPP_HAS_NO_STDOUT
|
|
cerr_ptr->tie(cout_ptr);
|
|
wcerr_ptr->tie(wcout_ptr);
|
|
#endif
|
|
}
|
|
|
|
ios_base::Init::~Init()
|
|
{
|
|
#ifndef _LIBCPP_HAS_NO_STDOUT
|
|
ostream* cout_ptr = reinterpret_cast<ostream*>(cout);
|
|
wostream* wcout_ptr = reinterpret_cast<wostream*>(wcout);
|
|
cout_ptr->flush();
|
|
wcout_ptr->flush();
|
|
#endif
|
|
|
|
ostream* clog_ptr = reinterpret_cast<ostream*>(clog);
|
|
wostream* wclog_ptr = reinterpret_cast<wostream*>(wclog);
|
|
clog_ptr->flush();
|
|
wclog_ptr->flush();
|
|
}
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|