From 6a2d5d0c1c52a6cf7c9600844c55b72b1e9f1fc7 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Wed, 17 Jul 2019 11:17:29 +0200 Subject: [PATCH 01/10] operator new: overload operator new so it can return nullptr instead of throwing an exception without (std::nothrow) --- cores/esp8266/Arduino.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index d962923de8..0e1594266d 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -33,6 +33,25 @@ extern "C" { #include #include +#if defined(__cplusplus) && !defined(__cpp_exceptions) +// this is a hack working with gcc4.8 +// Overload operator new so it can return nullptr instead of throwing an +// exception without (std::nothrow)` +// Requirement (or the constructor is called even on nullptr) +// - "noexcept" is needed +// - "#include " must not be done *before* these definitions +#include +extern "C++" inline void* operator new (std::size_t size) noexcept +{ + return malloc(size); +} +extern "C++" inline void* operator new [] (std::size_t size) noexcept +{ + return malloc(size); +} +#include +#endif // new nothrow nullptr hack + #include "stdlib_noniso.h" #include "binary.h" #include "esp8266_peri.h" From 29b49cd907123899308f381883b2201ebd272519 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 14:35:21 +0200 Subject: [PATCH 02/10] update umm helpers for stack trace --- cores/esp8266/Arduino.h | 18 +++++++++++++----- cores/esp8266/abi.cpp | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 0e1594266d..6fd10bd362 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -33,24 +33,32 @@ extern "C" { #include #include -#if defined(__cplusplus) && !defined(__cpp_exceptions) +#if defined(__cplusplus) \ + && !defined(__cpp_exceptions) \ + && !defined(_NEWHACK) \ + && !defined(CORE_MOCK) // this is a hack working with gcc4.8 // Overload operator new so it can return nullptr instead of throwing an // exception without (std::nothrow)` -// Requirement (or the constructor is called even on nullptr) +// Requirements: (or the constructor is called even on nullptr) // - "noexcept" is needed // - "#include " must not be done *before* these definitions +#define _NEWHACK +#ifdef _NEW +#error Arduino.h must be included before other c++ include files +#endif #include +extern "C" void* _malloc4newabi (size_t size); extern "C++" inline void* operator new (std::size_t size) noexcept { - return malloc(size); + return _malloc4newabi(size); } extern "C++" inline void* operator new [] (std::size_t size) noexcept { - return malloc(size); + return _malloc4newabi(size); } #include -#endif // new nothrow nullptr hack +#endif // _NEWHACK #include "stdlib_noniso.h" #include "binary.h" diff --git a/cores/esp8266/abi.cpp b/cores/esp8266/abi.cpp index 71967e63e5..47ff15c4b0 100644 --- a/cores/esp8266/abi.cpp +++ b/cores/esp8266/abi.cpp @@ -68,5 +68,19 @@ extern "C" void __cxa_guard_abort(__guard* pg) xt_wsr_ps(reinterpret_cast(pg)->ps); } +// Debugging helper, last allocation which returned NULL +extern void *umm_last_fail_alloc_addr; +extern int umm_last_fail_alloc_size; + +void* _malloc4newabi (size_t size) +{ + void* ret = malloc(size); + if (0 != size && 0 == ret) { + umm_last_fail_alloc_addr = __builtin_return_address(0); + umm_last_fail_alloc_size = size; + } + return ret; +} + // TODO: rebuild windows toolchain to make this unnecessary: void* __dso_handle; From eee43ff413c251737e197eae42720d981748e85d Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 14:36:04 +0200 Subject: [PATCH 03/10] reorder include files so Arduino.h is included before c++ (this is going to be a noisy PR) --- cores/esp8266/FS.cpp | 1 + cores/esp8266/FunctionalInterrupt.cpp | 2 +- cores/esp8266/Schedule.cpp | 1 + cores/esp8266/spiffs_api.cpp | 1 + libraries/ESP8266WiFi/src/BearSSLHelpers.cpp | 3 ++- libraries/ESP8266WiFi/src/WiFiClient.h | 2 +- 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/FS.cpp b/cores/esp8266/FS.cpp index 7006a8afaf..e9b874a645 100644 --- a/cores/esp8266/FS.cpp +++ b/cores/esp8266/FS.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "Arduino.h" #include "FS.h" #include "FSImpl.h" diff --git a/cores/esp8266/FunctionalInterrupt.cpp b/cores/esp8266/FunctionalInterrupt.cpp index 665d8043b3..df4d87c208 100644 --- a/cores/esp8266/FunctionalInterrupt.cpp +++ b/cores/esp8266/FunctionalInterrupt.cpp @@ -1,6 +1,6 @@ +#include #include #include -#include "Arduino.h" // Duplicate typedefs from core_esp8266_wiring_digital_c typedef void (*voidFuncPtr)(void); diff --git a/cores/esp8266/Schedule.cpp b/cores/esp8266/Schedule.cpp index ed39736e55..750de81c04 100644 --- a/cores/esp8266/Schedule.cpp +++ b/cores/esp8266/Schedule.cpp @@ -1,6 +1,7 @@ #include +#include "Arduino.h" #include "Schedule.h" #include "PolledTimeout.h" #include "interrupts.h" diff --git a/cores/esp8266/spiffs_api.cpp b/cores/esp8266/spiffs_api.cpp index 833dd3edb0..21e66d698a 100644 --- a/cores/esp8266/spiffs_api.cpp +++ b/cores/esp8266/spiffs_api.cpp @@ -21,6 +21,7 @@ License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "Arduino.h" #include "spiffs_api.h" using namespace fs; diff --git a/libraries/ESP8266WiFi/src/BearSSLHelpers.cpp b/libraries/ESP8266WiFi/src/BearSSLHelpers.cpp index 6dcf0b384d..8cc3d76b82 100644 --- a/libraries/ESP8266WiFi/src/BearSSLHelpers.cpp +++ b/libraries/ESP8266WiFi/src/BearSSLHelpers.cpp @@ -20,13 +20,14 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include #include #include #include #include #include -#include #include #include "BearSSLHelpers.h" diff --git a/libraries/ESP8266WiFi/src/WiFiClient.h b/libraries/ESP8266WiFi/src/WiFiClient.h index 31f6d105a7..15b655c5f1 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.h +++ b/libraries/ESP8266WiFi/src/WiFiClient.h @@ -21,8 +21,8 @@ #ifndef wificlient_h #define wificlient_h -#include #include "Arduino.h" +#include #include "Print.h" #include "Client.h" #include "IPAddress.h" From da5f8cd9ed6fbd8acc946afcc0cbfe69f07d0df2 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 14:45:28 +0200 Subject: [PATCH 04/10] (no need to be rude) --- cores/esp8266/Arduino.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 6fd10bd362..5fa0ad8608 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -45,7 +45,7 @@ extern "C" { // - "#include " must not be done *before* these definitions #define _NEWHACK #ifdef _NEW -#error Arduino.h must be included before other c++ include files +#warning Arduino.h must be included before other c++ include files #endif #include extern "C" void* _malloc4newabi (size_t size); From 319c7899e739c7a46a7e1dde3cb2094d31d9b7d0 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 15:00:52 +0200 Subject: [PATCH 05/10] more Arduino.h --- libraries/ESP8266WiFi/src/ESP8266WiFi.h | 2 ++ libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp | 1 + libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 2 ++ libraries/ESP8266WiFi/src/ESP8266WiFiSTA-WPS.cpp | 1 + libraries/ESP8266WiFi/src/WiFiClient.cpp | 2 ++ libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp | 2 ++ libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp | 2 ++ libraries/ESP8266WiFi/src/WiFiServer.cpp | 2 ++ libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.cpp | 2 ++ libraries/ESP8266WiFi/src/WiFiUdp.cpp | 2 ++ 10 files changed, 18 insertions(+) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.h b/libraries/ESP8266WiFi/src/ESP8266WiFi.h index d26e1db6bd..2874f5584e 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.h @@ -22,6 +22,8 @@ #ifndef WiFi_h #define WiFi_h +#include + #include extern "C" { diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp index 692b214fad..382f7b6b12 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp @@ -22,6 +22,7 @@ */ +#include #include "ESP8266WiFi.h" #include "ESP8266WiFiGeneric.h" #include "ESP8266WiFiAP.h" diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 31daf370a0..8769158b09 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -22,6 +22,8 @@ */ +#include + #include #include #include "ESP8266WiFi.h" diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA-WPS.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA-WPS.cpp index c7a92765be..00e3256191 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA-WPS.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA-WPS.cpp @@ -22,6 +22,7 @@ */ +#include #include "ESP8266WiFi.h" #include "ESP8266WiFiGeneric.h" diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 2d7b5ac46e..a27a278414 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -22,6 +22,8 @@ #define LWIP_INTERNAL +#include + extern "C" { #include "include/wl_definitions.h" diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp index 62b7f0ab8c..0375f3da3c 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp @@ -22,6 +22,8 @@ #define LWIP_INTERNAL +#include + #include "debug.h" #include "ESP8266WiFi.h" #include "WiFiClientSecure.h" diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp index 5691f1cf5d..4376600b3a 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp @@ -22,6 +22,8 @@ #define LWIP_INTERNAL +#include + #include #include #include diff --git a/libraries/ESP8266WiFi/src/WiFiServer.cpp b/libraries/ESP8266WiFi/src/WiFiServer.cpp index d9d47657df..b229db524a 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.cpp +++ b/libraries/ESP8266WiFi/src/WiFiServer.cpp @@ -28,6 +28,8 @@ extern "C" { #include "ets_sys.h" } +#include + #include "debug.h" #include "ESP8266WiFi.h" #include "WiFiClient.h" diff --git a/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.cpp index 087c90b4e8..7c42043929 100644 --- a/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.cpp +++ b/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.cpp @@ -26,6 +26,8 @@ extern "C" { #include "ets_sys.h" } +#include + #include #include "debug.h" #include "ESP8266WiFi.h" diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.cpp b/libraries/ESP8266WiFi/src/WiFiUdp.cpp index a0a5c1d4e4..c895ba596e 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.cpp +++ b/libraries/ESP8266WiFi/src/WiFiUdp.cpp @@ -21,6 +21,8 @@ */ #define LWIP_INTERNAL + +#include #include extern "C" From b7f641b33fe1b708d01d38e67b9a9d8f40aa3c08 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 15:06:18 +0200 Subject: [PATCH 06/10] more Arduino.h --- libraries/ESP8266WiFi/src/WiFiUdp.h | 5 +++++ libraries/ESP8266mDNS/src/LEAmDNS.h | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.h b/libraries/ESP8266WiFi/src/WiFiUdp.h index a1cf42be10..b07c7fd476 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.h +++ b/libraries/ESP8266WiFi/src/WiFiUdp.h @@ -22,9 +22,14 @@ #ifndef WIFIUDP_H #define WIFIUDP_H +#include + +#include + #include #include + #define UDP_TX_PACKET_MAX_SIZE 8192 class UdpContext; diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.h b/libraries/ESP8266mDNS/src/LEAmDNS.h index 3bf16eb10a..dccda3e164 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.h +++ b/libraries/ESP8266mDNS/src/LEAmDNS.h @@ -102,7 +102,6 @@ #ifndef MDNS_H #define MDNS_H -#include // for UdpContext.h #include "WiFiUdp.h" #include "lwip/udp.h" #include "debug.h" From a65862cb30c4a1dd69ed682c22fdb5156ac7fef2 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 15:08:24 +0200 Subject: [PATCH 07/10] more Arduino.h --- cores/esp8266/Schedule.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cores/esp8266/Schedule.h b/cores/esp8266/Schedule.h index 50fc88fc8b..e6a0577483 100644 --- a/cores/esp8266/Schedule.h +++ b/cores/esp8266/Schedule.h @@ -1,6 +1,7 @@ #ifndef ESP_SCHEDULE_H #define ESP_SCHEDULE_H +#include #include #define SCHEDULED_FN_MAX_COUNT 32 From ed2d0059dee183d903d29925bc11ec0d36f516b7 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 15:33:06 +0200 Subject: [PATCH 08/10] more Arduino.h --- libraries/ArduinoOTA/ArduinoOTA.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ArduinoOTA/ArduinoOTA.cpp b/libraries/ArduinoOTA/ArduinoOTA.cpp index 9429518d3f..9d8ae0feaf 100644 --- a/libraries/ArduinoOTA/ArduinoOTA.cpp +++ b/libraries/ArduinoOTA/ArduinoOTA.cpp @@ -1,6 +1,7 @@ #ifndef LWIP_OPEN_SRC #define LWIP_OPEN_SRC #endif +#include #include #include #include "ArduinoOTA.h" From fb6ffad568808d367679094efc9b2b63632debd9 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 15:41:33 +0200 Subject: [PATCH 09/10] allow external build scripts to permanently hide the warning (for devs with constraints who know what they are doing) --- cores/esp8266/Arduino.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 5fa0ad8608..359be24c56 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -44,7 +44,7 @@ extern "C" { // - "noexcept" is needed // - "#include " must not be done *before* these definitions #define _NEWHACK -#ifdef _NEW +#if defined(_NEW) && !defined(_ARDUINO_HIDE_NEWHACK_WARNING) #warning Arduino.h must be included before other c++ include files #endif #include From 00c8242a65ebea388bb4f28d6681b784259dc6de Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Thu, 18 Jul 2019 16:01:15 +0200 Subject: [PATCH 10/10] more reordering --- libraries/ESP8266LLMNR/ESP8266LLMNR.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266LLMNR/ESP8266LLMNR.cpp b/libraries/ESP8266LLMNR/ESP8266LLMNR.cpp index ac8582c579..76e3a937b9 100644 --- a/libraries/ESP8266LLMNR/ESP8266LLMNR.cpp +++ b/libraries/ESP8266LLMNR/ESP8266LLMNR.cpp @@ -36,8 +36,8 @@ */ #include -#include #include +#include #include extern "C" {