Files
klubhaus-doorbell/libraries/FastLED/ci/SYMBOL_ANALYSIS.md
2026-02-12 00:45:31 -08:00

314 lines
8.4 KiB
Markdown

# FastLED Symbol Analysis
This document describes the new generic symbol analysis functionality that works across all supported platforms including UNO, ESP32, and others.
## Overview
The symbol analysis tool provides comprehensive analysis of compiled ELF files to help identify optimization opportunities and understand binary size allocation. Unlike the previous ESP32-specific implementation, this tool:
-**Works on ALL platforms** (UNO, ESP32, Teensy, STM32, etc.)
-**Pulls ALL symbols** without filtering or classification
-**No FastLED-specific filtering** - analyzes everything
-**Generic and extensible** for any platform with build_info.json
## Quick Start
### Analyze a specific platform
```bash
cd ci
uv run symbol_analysis.py --board uno
uv run symbol_analysis.py --board esp32dev
```
### Run analysis on all available platforms
```bash
uv run demo_symbol_analysis.py
```
### Use in GitHub Actions
```bash
uv run symbol_analysis_runner.py --board uno --example Blink
```
## Files
- **`symbol_analysis.py`** - Main generic symbol analysis tool
- **`symbol_analysis_runner.py`** - GitHub Actions wrapper
- **`demo_symbol_analysis.py`** - Demonstration script for multiple platforms
- **`SYMBOL_ANALYSIS.md`** - This documentation file
## Example Output
### UNO Platform Results
```
================================================================================
UNO SYMBOL ANALYSIS REPORT
================================================================================
SUMMARY:
Total symbols: 51
Total symbol size: 3767 bytes (3.7 KB)
LARGEST SYMBOLS (all symbols, sorted by size):
1. 1204 bytes - ClocklessController<...>::showPixels(...)
2. 572 bytes - CFastLED::show(unsigned char) [clone .constprop.18]
3. 460 bytes - main
4. 204 bytes - CPixelLEDController<...>::show(...)
5. 168 bytes - CPixelLEDController<...>::showColor(...)
SYMBOL TYPE BREAKDOWN:
t: 19 symbols, 2710 bytes (2.6 KB)
T: 14 symbols, 904 bytes (0.9 KB)
b: 15 symbols, 89 bytes (0.1 KB)
d: 3 symbols, 64 bytes (0.1 KB)
```
### ESP32 Platform Results
```
================================================================================
ESP32DEV SYMBOL ANALYSIS REPORT
================================================================================
SUMMARY:
Total symbols: 2503
Total symbol size: 237092 bytes (231.5 KB)
LARGEST SYMBOLS (all symbols, sorted by size):
1. 12009 bytes - _vfprintf_r
2. 11813 bytes - _svfprintf_r
3. 8010 bytes - _vfiprintf_r
4. 7854 bytes - _svfiprintf_r
5. 4192 bytes - port_IntStack
SYMBOL TYPE BREAKDOWN:
T: 1240 symbols, 156230 bytes (152.6 KB)
t: 371 symbols, 45841 bytes (44.8 KB)
d: 475 symbols, 13032 bytes (12.7 KB)
D: 60 symbols, 9421 bytes (9.2 KB)
W: 126 symbols, 5209 bytes (5.1 KB)
```
### ESP32S3 Platform Results
```
================================================================================
ESP32S3 SYMBOL ANALYSIS REPORT
================================================================================
SUMMARY:
Total symbols: 2831
Total symbol size: 260710 bytes (254.6 KB)
LARGEST SYMBOLS (all symbols, sorted by size):
1. 11309 bytes - _vfprintf_r
2. 11118 bytes - _svfprintf_r
3. 7337 bytes - _svfiprintf_r
4. 7265 bytes - _vfiprintf_r
5. 4192 bytes - port_IntStack
6. 1164 bytes - printBeforeSetupInfo()
7. 828 bytes - fl::RmtController5::loadPixelData(PixelIterator&)
SYMBOL TYPE BREAKDOWN:
T: 1416 symbols, 172591 bytes (168.5 KB)
t: 429 symbols, 48854 bytes (47.7 KB)
d: 529 symbols, 14189 bytes (13.9 KB)
D: 72 symbols, 9831 bytes (9.6 KB)
W: 122 symbols, 5457 bytes (5.3 KB)
```
## Output Files
The tool generates JSON files with complete symbol data:
- `.build/{board}_symbol_analysis.json` - Complete analysis results
### JSON Structure
```json
{
"summary": {
"board": "uno",
"total_symbols": 51,
"total_size": 3767,
"largest_symbols": [...],
"type_breakdown": {...},
"dependencies": {...}
},
"all_symbols_sorted_by_size": [
{
"address": "00001240",
"size": 1204,
"type": "t",
"name": "_ZN19ClocklessController...",
"demangled_name": "ClocklessController<...>::showPixels(...)"
},
...
],
"dependencies": {
"module.cpp.o": ["symbol1", "symbol2", ...]
}
}
```
## Supported Platforms
The tool automatically detects and works with any platform that has:
- A `build_info.json` file in `.build/{platform}/`
- Standard toolchain tools (nm, c++filt) in the build info aliases
Successfully tested platforms:
-**UNO** (AVR) - 51 symbols, 3.7 KB
-**ESP32DEV** (Xtensa) - 2503 symbols, 231.5 KB
-**ESP32S3** (Xtensa) - 2831 symbols, 254.6 KB
-**TEENSY31** (ARM Cortex-M4) - 238 symbols, 10.9 KB
-**TEENSYLC** (ARM Cortex-M0+) - 241 symbols, 9.1 KB
-**DIGIX** (ARM Cortex-M3) - 298 symbols, 17.9 KB
-**STM32** (ARM Cortex-M3) - 311 symbols, 15.6 KB
## Key Improvements
### From ESP32-specific to Generic
**Before (ESP32 only):**
```python
# Hard-coded ESP32 board detection
esp32_boards = ["esp32dev", "esp32", "esp32s2", ...]
# FastLED-specific filtering
if any(keyword in search_text for keyword in [
"fastled", "cfastled", "crgb", "hsv", ...]):
fastled_symbols.append(symbol_info)
```
**After (Generic):**
```python
# Auto-detect any platform with build_info.json
for item in build_dir.iterdir():
if item.is_dir() and (item / "build_info.json").exists():
available_boards.append((build_info_file, item.name))
# No filtering - analyze ALL symbols
symbols.append(symbol_info) # Everything included
```
### Symbol Analysis Improvements
1. **No Classification** - All symbols are included without filtering
2. **Complete Demangling** - All C++ symbols are properly demangled
3. **Platform Agnostic** - Works with any toolchain (AVR, ARM, Xtensa, etc.)
4. **Size-based Sorting** - All results sorted by symbol size for easy optimization targeting
## GitHub Actions Integration
The `symbol_analysis_runner.py` script provides GitHub Actions compatibility:
```yaml
- name: Run Symbol Analysis
run: python ci/symbol_analysis_runner.py --board uno --example Blink
```
This runner:
- Validates build_info.json exists
- Handles errors gracefully with `--skip-on-failure`
- Provides proper exit codes for CI/CD
## Migration from ESP32 Analysis
If you were using the old ESP32-specific analysis:
**Old command:**
```bash
cd ci/ci && python esp32_symbol_analysis.py
```
**New command:**
```bash
cd ci && uv run symbol_analysis.py --board esp32dev
```
The new tool provides all the same information plus:
- Support for more platforms
- ALL symbols instead of just FastLED ones
- Better error handling
- Cleaner output format
## Advanced Usage
### Analyzing Custom Platforms
To add support for a new platform:
1. Ensure the platform builds correctly with PlatformIO
2. Verify `build_info.json` is generated in `.build/{platform}/`
3. Run: `uv run symbol_analysis.py --board {platform}`
### Batch Analysis
```bash
# Analyze all available platforms
uv run demo_symbol_analysis.py
# Analyze specific platforms in sequence
for board in uno esp32dev teensy31; do
uv run symbol_analysis.py --board $board
done
```
### Integration with Build Systems
```python
# In your Python build script
from ci.ci.symbol_analysis import main as analyze_symbols
import sys
# Override arguments
sys.argv = ["symbol_analysis.py", "--board", "uno"]
analyze_symbols()
```
## Troubleshooting
### Common Issues
1. **"build_info.json not found"**
- Solution: Compile the platform first: `uv run ci/ci-compile.py {board} --examples Blink`
2. **"KeyError: 'board_name'"**
- Solution: The board name in the directory doesn't match the key in build_info.json
- Check: `cat .build/{board}/build_info.json | jq 'keys'`
3. **"Tool not found"**
- Solution: The toolchain isn't installed or path is incorrect in build_info.json
### Debug Mode
To debug issues, run with verbose Python output:
```bash
uv run python -v symbol_analysis.py --board uno
```
## Contributing
When adding new features:
1. Maintain platform independence
2. Don't add filtering logic
3. Test on multiple platforms
4. Update this documentation
5. Add tests to verify functionality
## Performance
Platform analysis times (approximate):
- **UNO**: < 1 second (51 symbols)
- **Teensy**: < 2 seconds (238-241 symbols)
- **STM32**: < 3 seconds (311 symbols)
- **ESP32**: < 10 seconds (2503 symbols)
The tool scales well with symbol count and provides progress feedback during demangling.