diff --git a/esphome/components/esp8266/__init__.py b/esphome/components/esp8266/__init__.py index d975d08f25..d95cbd239b 100644 --- a/esphome/components/esp8266/__init__.py +++ b/esphome/components/esp8266/__init__.py @@ -444,6 +444,8 @@ async def to_code(config: ConfigType) -> None: cg.add_build_flag("-DUSE_ARDUINO") cg.add_build_flag("-DUSE_ESP8266_FRAMEWORK_ARDUINO") cg.add_build_flag("-Wno-nonnull-compare") + # .rodata is linked into RAM on ESP8266; keep switch lookup tables (CSWTCH) out of it + cg.add_build_flag("-fno-tree-switch-conversion") if use_platformio: cg.add_platformio_option("framework", "arduino") cg.add_platformio_option("platform", conf[CONF_PLATFORM_VERSION]) diff --git a/tests/component_tests/esp8266/__init__.py b/tests/component_tests/esp8266/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/component_tests/esp8266/config/minimal.yaml b/tests/component_tests/esp8266/config/minimal.yaml new file mode 100644 index 0000000000..79fde0157b --- /dev/null +++ b/tests/component_tests/esp8266/config/minimal.yaml @@ -0,0 +1,5 @@ +esphome: + name: test + +esp8266: + board: d1_mini diff --git a/tests/component_tests/esp8266/test_build_flags.py b/tests/component_tests/esp8266/test_build_flags.py new file mode 100644 index 0000000000..938089333b --- /dev/null +++ b/tests/component_tests/esp8266/test_build_flags.py @@ -0,0 +1,17 @@ +"""Tests for ESP8266 build flags.""" + +from __future__ import annotations + +from collections.abc import Callable +from pathlib import Path + +from esphome.core import CORE + + +def test_esp8266_keeps_switches_out_of_ram( + generate_main: Callable[[str | Path], str], + component_config_path: Callable[[str], Path], +) -> None: + generate_main(component_config_path("minimal.yaml")) + + assert "-fno-tree-switch-conversion" in CORE.build_flags