diff --git a/libs/libxx/0001-uclibxx-use-overload-constructor-of-filebuf-ostream.patch b/libs/libxx/0001-uclibxx-use-overload-constructor-of-filebuf-ostream.patch new file mode 100644 index 0000000000..1b98d13acb --- /dev/null +++ b/libs/libxx/0001-uclibxx-use-overload-constructor-of-filebuf-ostream.patch @@ -0,0 +1,299 @@ +From b9028c8bc1a4cd00feb5328521bdde332fefeda3 Mon Sep 17 00:00:00 2001 +From: zhuyanlin +Date: Mon, 27 Sep 2021 21:47:41 +0800 +Subject: [PATCH] uclibxx: use overload constructor of filebuf & ostream + +Instead of set valiable in Init, use overload constructor in +filebuf & stream class + +Change-Id: I090432b5576eb568f92f3c147b39ad2efd8ba6b0 +--- + include/fstream | 15 +++++++-- + include/ios | 21 +++--------- + include/istream | 4 +++ + include/ostream | 8 +++++ + include/streambuf | 6 ++-- + src/ios.cpp | 84 ++++++++--------------------------------------- + 6 files changed, 44 insertions(+), 94 deletions(-) + +diff --git a/uClibc++/include/fstream uClibc++/include/fstream +index fddfa35..99a016e 100644 +--- a/uClibc++/include/fstream ++++ uClibc++/include/fstream +@@ -53,9 +53,6 @@ namespace std{ + template class _UCXXEXPORT basic_filebuf + : public basic_streambuf + { +-#ifdef __UCLIBCXX_SUPPORT_CDIR__ +- friend ios_base::Init::Init(); //Needed for cout/cin stuff +-#endif + public: + // Types (inherited from basic_streambuf: + typedef typename basic_streambuf::char_type char_type; +@@ -79,6 +76,18 @@ namespace std{ + gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__); + } + ++ _UCXXEXPORT basic_filebuf(FILE *p, ios_base::openmode opdfor) ++ : basic_streambuf(opdfor), fp(p), pbuffer(0), ++ gbuffer(0), append(false) ++ { ++ pbuffer = new char_type[__UCLIBCXX_IOSTREAM_BUFSIZE__]; ++ gbuffer = new char_type[__UCLIBCXX_IOSTREAM_BUFSIZE__]; ++ ++ this->setp(pbuffer, pbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__); ++ //Position get buffer so that there is no data available ++ this->setg(gbuffer, gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__, ++ gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__); ++ } + + _UCXXEXPORT virtual ~basic_filebuf(){ + sync(); +diff --git a/uClibc++/include/ios uClibc++/include/ios +index ac6566a..6d2dd68 100644 +--- a/uClibc++/include/ios ++++ uClibc++/include/ios +@@ -45,15 +45,6 @@ namespace std{ + } + }; + #endif +-#ifdef __UCLIBCXX_SUPPORT_CDIR__ +- class _UCXXLOCAL Init{ +- public: +- _UCXXEXPORT Init(); +- _UCXXEXPORT ~Init(); +- private: +- static int init_cnt; +- }; +-#endif + + public: + +@@ -154,11 +145,7 @@ namespace std{ + protected: + _UCXXEXPORT ios_base() : mLocale(), mformat(dec | skipws ), mstate(goodbit), + mmode(), mdir(), mprecision(6), mwidth(0) +-#ifdef __UCLIBCXX_SUPPORT_CDIR__ +- ,mInit() +-#endif + { +- + } + locale mLocale; + fmtflags mformat; +@@ -167,9 +154,6 @@ namespace std{ + seekdir mdir; + streamsize mprecision; + streamsize mwidth; +-#ifdef __UCLIBCXX_SUPPORT_CDIR__ +- Init mInit; +-#endif + }; + + +@@ -346,7 +330,10 @@ namespace std{ + : fill_char(' '), mtied(0), mstreambuf(0), throw_mask(0) { + init(sb); + } +- ++ explicit _UCXXEXPORT basic_ios(basic_streambuf* sb, basic_ostream* tied) ++ : fill_char(' '), mtied(tied), mstreambuf(0), throw_mask(0) { ++ init(sb); ++ } + basic_ios() : mtied(0), mstreambuf(0){ } + + virtual _UCXXEXPORT ~basic_ios(){ +diff --git a/uClibc++/include/istream uClibc++/include/istream +index 2d58abd..8fa9ad4 100644 +--- a/uClibc++/include/istream ++++ uClibc++/include/istream +@@ -55,6 +55,10 @@ namespace std{ + { + basic_ios::init(sb); + } ++ explicit basic_istream(basic_streambuf* sb, basic_ostream* tied) ++ : basic_ios(sb, tied), count_last_ufmt_input(0) ++ { ++ } + virtual ~basic_istream() { } + + class sentry; +diff --git a/uClibc++/include/ostream uClibc++/include/ostream +index 3072589..086a297 100644 +--- a/uClibc++/include/ostream ++++ uClibc++/include/ostream +@@ -58,6 +58,14 @@ namespace std { + { + basic_ios::init(sb); + } ++ ++ _UCXXEXPORT basic_ostream(basic_streambuf* sb, ios_base::fmtflags fmtfl) ++ : basic_ios(sb) ++ { ++ basic_ios::init(sb); ++ ios_base::setf(fmtfl); ++ } ++ + virtual _UCXXEXPORT ~basic_ostream(); + + class sentry; +diff --git a/uClibc++/include/streambuf uClibc++/include/streambuf +index 0daa388..5327296 100644 +--- a/uClibc++/include/streambuf ++++ uClibc++/include/streambuf +@@ -33,9 +33,6 @@ namespace std{ + + template class _UCXXEXPORT basic_streambuf{ + public: +-#ifdef __UCLIBCXX_SUPPORT_CDIR__ +- friend ios_base::Init::Init(); +-#endif + // Types: + typedef charT char_type; + typedef typename traits::int_type int_type; +@@ -116,6 +113,9 @@ namespace std{ + mgbeg(0), mgnext(0), mgend(0), mpbeg(0), mpnext(0), mpend(0), + openedFor(0) + { } ++ basic_streambuf(ios_base::openmode opdfor) ++ : openedFor(opdfor) ++ { } + basic_streambuf > & operator=(const basic_streambuf > &){ + return *this; + } +diff --git a/uClibc++/src/ios.cpp uClibc++/src/ios.cpp +index 3b85d5b..e6a390f 100644 +--- a/uClibc++/src/ios.cpp ++++ uClibc++/src/ios.cpp +@@ -29,32 +29,31 @@ namespace std{ + + + #ifdef __UCLIBCXX_SUPPORT_CDIR__ +- _UCXXLOCAL int ios_base::Init::init_cnt = 0; //Needed to ensure the static value is created + + //Create buffers first + #ifdef __UCLIBCXX_SUPPORT_COUT__ +- _UCXXEXPORT filebuf _cout_filebuf; ++ _UCXXEXPORT filebuf _cout_filebuf(stdout, ios_base::out); + #endif + #ifdef __UCLIBCXX_SUPPORT_CIN__ +- _UCXXEXPORT filebuf _cin_filebuf; ++ _UCXXEXPORT filebuf _cin_filebuf(stdin, ios_base::in); + #endif + #ifdef __UCLIBCXX_SUPPORT_CERR__ +- _UCXXEXPORT filebuf _cerr_filebuf; ++ _UCXXEXPORT filebuf _cerr_filebuf(stderr, ios_base::out); + #endif + #ifdef __UCLIBCXX_SUPPORT_CLOG__ +- _UCXXEXPORT filebuf _clog_filebuf; ++ _UCXXEXPORT filebuf _clog_filebuf(stderr, ios_base::out); + #endif + #ifdef __UCLIBCXX_SUPPORT_WCOUT__ +- _UCXXEXPORT wfilebuf _wcout_filebuf; ++ _UCXXEXPORT wfilebuf _wcout_filebuf(stdout, ios_base::out); + #endif + #ifdef __UCLIBCXX_SUPPORT_WCIN__ +- _UCXXEXPORT wfilebuf _wcin_filebuf; ++ _UCXXEXPORT wfilebuf _wcin_filebuf(stdin, ios_base::in); + #endif + #ifdef __UCLIBCXX_SUPPORT_WCERR__ +- _UCXXEXPORT wfilebuf _wcerr_filebuf; ++ _UCXXEXPORT wfilebuf _wcerr_filebuf(stderr, ios_base::out); + #endif + #ifdef __UCLIBCXX_SUPPORT_WCLOG__ +- _UCXXEXPORT wfilebuf _wclog_filebuf; ++ _UCXXEXPORT wfilebuf _wclog_filebuf(stderr, ios_base::out); + #endif + + //Then create streams +@@ -62,10 +61,10 @@ namespace std{ + _UCXXEXPORT ostream cout(&_cout_filebuf); + #endif + #ifdef __UCLIBCXX_SUPPORT_CIN__ +- _UCXXEXPORT istream cin(&_cin_filebuf); ++ _UCXXEXPORT istream cin(&_cin_filebuf, &cout); + #endif + #ifdef __UCLIBCXX_SUPPORT_CERR__ +- _UCXXEXPORT ostream cerr(&_cerr_filebuf); ++ _UCXXEXPORT ostream cerr(&_cerr_filebuf, ios_base::unitbuf); + #endif + #ifdef __UCLIBCXX_SUPPORT_CLOG__ + _UCXXEXPORT ostream clog(&_clog_filebuf); +@@ -74,72 +73,15 @@ namespace std{ + _UCXXEXPORT wostream wcout(&_wcout_filebuf); + #endif + #ifdef __UCLIBCXX_SUPPORT_WCIN__ +- _UCXXEXPORT wistream wcin(&_wcin_filebuf); ++ _UCXXEXPORT wistream wcin(&_wcin_filebuf, &wcout); + #endif + #ifdef __UCLIBCXX_SUPPORT_WCERR__ +- _UCXXEXPORT wostream wcerr(&_wcerr_filebuf); ++ _UCXXEXPORT wostream wcerr(&_wcerr_filebuf, ios_base::unitbuf); + #endif + #ifdef __UCLIBCXX_SUPPORT_WCLOG__ + _UCXXEXPORT wostream wclog(&_wclog_filebuf); + #endif + +- +- _UCXXEXPORT ios_base::Init::Init(){ +- if(init_cnt == 0){ //Need to construct cout et al +-#ifdef __UCLIBCXX_SUPPORT_COUT__ +- _cout_filebuf.fp = stdout; +- _cout_filebuf.openedFor = ios_base::out; +-#endif +-#ifdef __UCLIBCXX_SUPPORT_CERR__ +- _cerr_filebuf.fp = stderr; +- _cerr_filebuf.openedFor = ios_base::out; +- cerr.mformat |= ios_base::unitbuf; +-#endif +-#ifdef __UCLIBCXX_SUPPORT_CLOG__ +- _clog_filebuf.fp = stderr; +- _clog_filebuf.openedFor = ios_base::out; +-#endif +-#ifdef __UCLIBCXX_SUPPORT_CIN__ +- _cin_filebuf.fp = stdin; +- _cin_filebuf.openedFor = ios_base::in; +- +-#ifdef __UCLIBCXX_SUPPORT_COUT__ +- cin.tie(&cout); +-#endif +- +-#endif +-#ifdef __UCLIBCXX_SUPPORT_WCOUT__ +- _wcout_filebuf.fp = stdout; +- _wcout_filebuf.openedFor = ios_base::out; +-#endif +-#ifdef __UCLIBCXX_SUPPORT_WCERR__ +- _wcerr_filebuf.fp = stderr; +- _wcerr_filebuf.openedFor = ios_base::out; +- wcerr.mformat |= ios_base::unitbuf; +-#endif +-#ifdef __UCLIBCXX_SUPPORT_WCLOG__ +- _wclog_filebuf.fp = stderr; +- _wclog_filebuf.openedFor = ios_base::out; +-#endif +-#ifdef __UCLIBCXX_SUPPORT_WCIN__ +- _wcin_filebuf.fp = stdin; +- _wcin_filebuf.openedFor = ios_base::in; +- +-#ifdef __UCLIBCXX_SUPPORT_WCOUT__ +- wcin.tie(&wcout); +-#endif +- +-#endif +- } +- init_cnt++; +- } +- +- _UCXXEXPORT ios_base::Init::~Init(){ +- --init_cnt; +- if(init_cnt==0){ +- +- } +- } + #endif + + +-- +2.25.1 + diff --git a/libs/libxx/uClibc++.defs b/libs/libxx/uClibc++.defs index b9bd3405d2..ff99f89531 100644 --- a/libs/libxx/uClibc++.defs +++ b/libs/libxx/uClibc++.defs @@ -28,6 +28,7 @@ $(TOPDIR)/include/uClibc++: $(Q) $(DIRLINK) $(CURDIR)/uClibc++/include $(TOPDIR)/include/uClibc++ $(Q) $(COPYFILE) $(CURDIR)/system_configuration.h $(TOPDIR)/include/uClibc++ $(Q) patch -p0 < 0001-uClibcxx-basic_definitions-fix-GCC-specific-definiti.patch + $(Q) patch -p0 < 0001-uclibxx-use-overload-constructor-of-filebuf-ostream.patch context:: $(TOPDIR)/include/uClibc++