|
| 1 | +# Migración de GCC a LLVM/Clang |
| 2 | + |
| 3 | +Esta rama (`llvm`) contiene una migración experimental del vitasdk de GCC a LLVM/Clang como compilador principal. |
| 4 | + |
| 5 | +## Cambios principales |
| 6 | + |
| 7 | +### 1. Reemplazo del compilador |
| 8 | +- **Antes**: GCC 15.2.0 |
| 9 | +- **Ahora**: LLVM/Clang 19.1.7 |
| 10 | + |
| 11 | +### 2. Herramientas de compilación cruzada |
| 12 | +Las siguientes variables han sido actualizadas para usar LLVM: |
| 13 | + |
| 14 | +- `CC_FOR_TARGET`: `clang` (antes `arm-vita-eabi-gcc`) |
| 15 | +- `CXX_FOR_TARGET`: `clang++` (antes `arm-vita-eabi-g++`) |
| 16 | +- `AR_FOR_TARGET`: `llvm-ar` (antes `arm-vita-eabi-ar`) |
| 17 | +- `RANLIB_FOR_TARGET`: `llvm-ranlib` (antes `arm-vita-eabi-ranlib`) |
| 18 | +- `OBJCOPY_FOR_TARGET`: `llvm-objcopy` (antes `arm-vita-eabi-objcopy`) |
| 19 | +- `OBJDUMP_FOR_TARGET`: `llvm-objdump` (antes `arm-vita-eabi-objdump`) |
| 20 | +- `NM_FOR_TARGET`: `llvm-nm` (antes `arm-vita-eabi-nm`) |
| 21 | +- `STRIP_FOR_TARGET`: `llvm-strip` (antes `arm-vita-eabi-strip`) |
| 22 | +- `READELF_FOR_TARGET`: `llvm-readelf` (antes `arm-vita-eabi-readelf`) |
| 23 | + |
| 24 | +### 3. Binutils |
| 25 | +Se mantiene binutils para las siguientes herramientas: |
| 26 | +- `ld` (linker) - Se usa el linker de binutils por compatibilidad |
| 27 | +- `as` (assembler) - Se usa el ensamblador de binutils por compatibilidad |
| 28 | + |
| 29 | +Nota: LLD (el linker de LLVM) está disponible pero no se usa por defecto en esta primera versión. |
| 30 | + |
| 31 | +### 4. Componentes LLVM incluidos |
| 32 | +- **clang**: Compilador de C/C++ |
| 33 | +- **lld**: Linker (disponible pero no usado por defecto) |
| 34 | +- **compiler-rt**: Runtime del compilador para builtins ARM |
| 35 | + |
| 36 | +### 5. Configuración de LLVM |
| 37 | +```cmake |
| 38 | +-DLLVM_TARGETS_TO_BUILD=ARM |
| 39 | +-DLLVM_DEFAULT_TARGET_TRIPLE=arm-vita-eabi |
| 40 | +-DLLVM_ENABLE_PROJECTS=clang;lld;compiler-rt |
| 41 | +-DCOMPILER_RT_BUILD_BUILTINS=ON |
| 42 | +-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON |
| 43 | +``` |
| 44 | + |
| 45 | +### 6. Dependencias |
| 46 | +LLVM requiere menos dependencias de build que GCC: |
| 47 | +- ✅ Mantiene: zlib |
| 48 | +- ❌ No requiere: GMP, MPFR, MPC, ISL (solo para GCC) |
| 49 | + |
| 50 | +## Estado actual |
| 51 | + |
| 52 | +### ✅ Completado |
| 53 | +- [x] Configuración básica de LLVM |
| 54 | +- [x] Integración de clang como compilador principal |
| 55 | +- [x] Actualización de variables de herramientas de compilación cruzada |
| 56 | +- [x] Actualización de dependencias (newlib, pthread-embedded, vita-headers) |
| 57 | +- [x] Comentar código de GCC (preservado para referencia) |
| 58 | + |
| 59 | +### 🚧 En pruebas |
| 60 | +- [ ] Compilación completa del vitasdk en macOS |
| 61 | +- [ ] Verificación de compatibilidad con vita-headers |
| 62 | +- [ ] Compilación de samples |
| 63 | +- [ ] Pruebas en otras plataformas (Linux, Windows) |
| 64 | + |
| 65 | +### 📋 Por hacer |
| 66 | +- [ ] Optimizar flags de compilación para ARM Cortex-A9 |
| 67 | +- [ ] Evaluar el uso de LLD en lugar de ld de binutils |
| 68 | +- [ ] Documentar diferencias de comportamiento con GCC |
| 69 | +- [ ] Benchmarks de rendimiento GCC vs LLVM |
| 70 | + |
| 71 | +## Compilación |
| 72 | + |
| 73 | +### macOS (nativo) |
| 74 | +```bash |
| 75 | +mkdir build |
| 76 | +cd build |
| 77 | +cmake .. |
| 78 | +make -j$(sysctl -n hw.ncpu) |
| 79 | +``` |
| 80 | + |
| 81 | +### Linux (nativo) |
| 82 | +```bash |
| 83 | +mkdir build |
| 84 | +cd build |
| 85 | +cmake .. |
| 86 | +make -j$(nproc) |
| 87 | +``` |
| 88 | + |
| 89 | +## Notas técnicas |
| 90 | + |
| 91 | +### Diferencias de flags con GCC |
| 92 | +LLVM/Clang puede requerir flags diferentes o tener comportamientos distintos: |
| 93 | +- Los warnings pueden ser diferentes |
| 94 | +- La generación de código puede optimizarse de forma distinta |
| 95 | +- Algunas extensiones de GCC pueden no estar disponibles |
| 96 | + |
| 97 | +### Compatibilidad con código existente |
| 98 | +- El código que usa extensiones específicas de GCC puede necesitar ajustes |
| 99 | +- Las pragmas y attributes pueden comportarse de forma diferente |
| 100 | +- Se recomienda probar thoroughly antes de usar en producción |
| 101 | + |
| 102 | +## Problemas conocidos |
| 103 | + |
| 104 | +1. **Primera compilación**: LLVM tarda más en compilar que GCC (especialmente en macOS) |
| 105 | +2. **Tamaño del build**: LLVM requiere más espacio de disco durante la compilación |
| 106 | +3. **Compatibilidad**: Algunos proyectos pueden requerir ajustes para compilar con Clang |
| 107 | + |
| 108 | +## Contribuir |
| 109 | + |
| 110 | +Si encuentras problemas o mejoras, por favor: |
| 111 | +1. Documenta el problema/mejora |
| 112 | +2. Crea un issue en el repositorio |
| 113 | +3. Propón una solución si es posible |
| 114 | + |
| 115 | +## Referencias |
| 116 | + |
| 117 | +- [LLVM Project](https://llvm.org/) |
| 118 | +- [Clang Documentation](https://clang.llvm.org/docs/) |
| 119 | +- [VitaSDK Documentation](https://vitasdk.org/) |
0 commit comments