/Users/buildslave/jenkins/workspace/coverage/llvm-project/libcxx/src/iostream.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===----------------------------------------------------------------------===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | |
9 | | #include <__locale> |
10 | | #include <__std_stream> |
11 | | #include <new> |
12 | | #include <string> |
13 | | |
14 | | #define _str(s) #s |
15 | | #define str(s) _str(s) |
16 | | #define _LIBCPP_ABI_NAMESPACE_STR str(_LIBCPP_ABI_NAMESPACE) |
17 | | |
18 | | _LIBCPP_BEGIN_NAMESPACE_STD |
19 | | |
20 | | _ALIGNAS_TYPE (istream) _LIBCPP_FUNC_VIS char cin[sizeof(istream)] |
21 | | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
22 | | __asm__("?cin@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_istream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
23 | | #endif |
24 | | ; |
25 | | _ALIGNAS_TYPE (__stdinbuf<char> ) static char __cin[sizeof(__stdinbuf <char>)]; |
26 | | static mbstate_t mb_cin; |
27 | | |
28 | | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
29 | | _ALIGNAS_TYPE (wistream) _LIBCPP_FUNC_VIS char wcin[sizeof(wistream)] |
30 | | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
31 | | __asm__("?wcin@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_istream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
32 | | #endif |
33 | | ; |
34 | | _ALIGNAS_TYPE (__stdinbuf<wchar_t> ) static char __wcin[sizeof(__stdinbuf <wchar_t>)]; |
35 | | static mbstate_t mb_wcin; |
36 | | #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS |
37 | | |
38 | | _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cout[sizeof(ostream)] |
39 | | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
40 | | __asm__("?cout@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
41 | | #endif |
42 | | ; |
43 | | _ALIGNAS_TYPE (__stdoutbuf<char>) static char __cout[sizeof(__stdoutbuf<char>)]; |
44 | | static mbstate_t mb_cout; |
45 | | |
46 | | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
47 | | _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcout[sizeof(wostream)] |
48 | | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
49 | | __asm__("?wcout@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
50 | | #endif |
51 | | ; |
52 | | _ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcout[sizeof(__stdoutbuf<wchar_t>)]; |
53 | | static mbstate_t mb_wcout; |
54 | | #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS |
55 | | |
56 | | _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cerr[sizeof(ostream)] |
57 | | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
58 | | __asm__("?cerr@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
59 | | #endif |
60 | | ; |
61 | | _ALIGNAS_TYPE (__stdoutbuf<char>) static char __cerr[sizeof(__stdoutbuf<char>)]; |
62 | | static mbstate_t mb_cerr; |
63 | | |
64 | | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
65 | | _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcerr[sizeof(wostream)] |
66 | | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
67 | | __asm__("?wcerr@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
68 | | #endif |
69 | | ; |
70 | | _ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcerr[sizeof(__stdoutbuf<wchar_t>)]; |
71 | | static mbstate_t mb_wcerr; |
72 | | #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS |
73 | | |
74 | | _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char clog[sizeof(ostream)] |
75 | | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
76 | | __asm__("?clog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
77 | | #endif |
78 | | ; |
79 | | |
80 | | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
81 | | _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wclog[sizeof(wostream)] |
82 | | #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) |
83 | | __asm__("?wclog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") |
84 | | #endif |
85 | | ; |
86 | | #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS |
87 | | |
88 | | // Pretend we're inside a system header so the compiler doesn't flag the use of the init_priority |
89 | | // attribute with a value that's reserved for the implementation (we're the implementation). |
90 | | #include "iostream_init.h" |
91 | | |
92 | | // On Windows the TLS storage for locales needs to be initialized before we create |
93 | | // the standard streams, otherwise it may not be alive during program termination |
94 | | // when we flush the streams. |
95 | 476 | static void force_locale_initialization() { |
96 | | #if defined(_LIBCPP_MSVCRT_LIKE) |
97 | | static bool once = []() { |
98 | | auto loc = newlocale(LC_ALL_MASK, "C", 0); |
99 | | { |
100 | | __libcpp_locale_guard g(loc); // forces initialization of locale TLS |
101 | | ((void)g); |
102 | | } |
103 | | freelocale(loc); |
104 | | return true; |
105 | | }(); |
106 | | ((void)once); |
107 | | #endif |
108 | 476 | } |
109 | | |
110 | | class DoIOSInit { |
111 | | public: |
112 | | DoIOSInit(); |
113 | | ~DoIOSInit(); |
114 | | }; |
115 | | |
116 | | DoIOSInit::DoIOSInit() |
117 | 476 | { |
118 | 476 | force_locale_initialization(); |
119 | | |
120 | 476 | istream* cin_ptr = ::new(cin) istream(::new(__cin) __stdinbuf <char>(stdin, &mb_cin)); |
121 | 476 | ostream* cout_ptr = ::new(cout) ostream(::new(__cout) __stdoutbuf<char>(stdout, &mb_cout)); |
122 | 476 | ostream* cerr_ptr = ::new(cerr) ostream(::new(__cerr) __stdoutbuf<char>(stderr, &mb_cerr)); |
123 | 476 | ::new(clog) ostream(cerr_ptr->rdbuf()); |
124 | 476 | cin_ptr->tie(cout_ptr); |
125 | 476 | _VSTD::unitbuf(*cerr_ptr); |
126 | 476 | cerr_ptr->tie(cout_ptr); |
127 | | |
128 | 476 | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
129 | 476 | wistream* wcin_ptr = ::new(wcin) wistream(::new(__wcin) __stdinbuf <wchar_t>(stdin, &mb_wcin)); |
130 | 476 | wostream* wcout_ptr = ::new(wcout) wostream(::new(__wcout) __stdoutbuf<wchar_t>(stdout, &mb_wcout)); |
131 | 476 | wostream* wcerr_ptr = ::new(wcerr) wostream(::new(__wcerr) __stdoutbuf<wchar_t>(stderr, &mb_wcerr)); |
132 | 476 | ::new(wclog) wostream(wcerr_ptr->rdbuf()); |
133 | | |
134 | 476 | wcin_ptr->tie(wcout_ptr); |
135 | 476 | _VSTD::unitbuf(*wcerr_ptr); |
136 | 476 | wcerr_ptr->tie(wcout_ptr); |
137 | 476 | #endif |
138 | 476 | } |
139 | | |
140 | | DoIOSInit::~DoIOSInit() |
141 | 0 | { |
142 | 0 | ostream* cout_ptr = reinterpret_cast<ostream*>(cout); |
143 | 0 | cout_ptr->flush(); |
144 | 0 | ostream* clog_ptr = reinterpret_cast<ostream*>(clog); |
145 | 0 | clog_ptr->flush(); |
146 | |
|
147 | 0 | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS |
148 | 0 | wostream* wcout_ptr = reinterpret_cast<wostream*>(wcout); |
149 | 0 | wcout_ptr->flush(); |
150 | 0 | wostream* wclog_ptr = reinterpret_cast<wostream*>(wclog); |
151 | 0 | wclog_ptr->flush(); |
152 | 0 | #endif |
153 | 0 | } |
154 | | |
155 | | ios_base::Init::Init() |
156 | 476 | { |
157 | 476 | static DoIOSInit init_the_streams; // gets initialized once |
158 | 476 | } |
159 | | |
160 | | ios_base::Init::~Init() |
161 | 0 | { |
162 | 0 | } |
163 | | |
164 | | _LIBCPP_END_NAMESPACE_STD |