Files
hakorune/docs/development/design/legacy/backend-llvm-implementation-guide.md

191 lines
5.1 KiB
Markdown
Raw Normal View History

# LLVM Backend Implementation Guide
## Overview
The LLVM backend provides native code compilation for Nyash programs through the inkwell LLVM wrapper. This document covers the implementation completed in Phase 9.78 Week 1.
## Current Implementation Status
### ✅ Completed (Phase 9.78 Week 1)
- **Infrastructure Setup**: Complete LLVM backend directory structure
- **Mock Implementation**: Fully functional mock that demonstrates all integration points
- **CLI Integration**: `--backend llvm` option support
- **MIR Integration**: Connection between MIR compiler and LLVM backend
- **Error Handling**: Proper error messages and user feedback
### 🔄 In Progress/Planned
- **Real LLVM Integration**: Requires LLVM development libraries
- **Advanced Code Generation**: Full MIR instruction set support
- **Optimization Passes**: LLVM optimization pipeline integration
## Architecture
### Directory Structure
```
src/backend/llvm/
├── mod.rs # Main module interface and exports
├── context.rs # LLVM context, module, and target management
└── compiler.rs # MIR to LLVM IR compilation logic
```
### Key Components
1. **LLVMCompiler**: Main compilation orchestrator
2. **CodegenContext**: LLVM context and target machine management
3. **Integration Layer**: Connects with existing MIR → Backend pipeline
## Usage
### Mock Implementation (Current)
```bash
# Run with mock LLVM backend
cargo run -- --backend llvm test_program.nyash
# This will:
# 1. Parse Nyash source to AST
# 2. Compile AST to MIR
# 3. Analyze MIR structure (mock)
# 4. Display mock compilation results
# 5. Return appropriate exit code
```
### Real Implementation (Future)
```bash
# Install LLVM development libraries first
sudo apt install llvm-17-dev clang-17
# Enable LLVM feature and build
cargo build --features llvm --release
# Run with real LLVM backend
cargo run --features llvm -- --backend llvm test_program.nyash
# This will:
# 1. Parse Nyash source to AST
# 2. Compile AST to MIR
# 3. Generate LLVM IR from MIR
# 4. Compile to object file
# 5. Link with system linker
# 6. Execute native binary
```
## Test Cases
### Basic Return Test
**File**: `local_tests/test_return_42.nyash`
```nyash
static box Main {
main() {
return 42
}
}
```
**Expected Behavior**:
- Mock: Analyzes MIR and returns appropriate exit code
- Real: Compiles to native code that returns exit code 42
### Running Tests
```bash
# Test mock implementation
cargo run -- --backend llvm local_tests/test_return_42.nyash
echo "Exit code: $?"
# Should show mock execution and exit code 0 (42 when real implementation is complete)
```
## Implementation Details
### Mock vs Real Implementation
The current implementation uses conditional compilation to provide both mock and real implementations:
```rust
#[cfg(feature = "llvm")]
// Real inkwell-based implementation
use inkwell::context::Context;
#[cfg(not(feature = "llvm"))]
// Mock implementation for demonstration
pub struct CodegenContext { /* ... */ }
```
### MIR Integration
The LLVM backend integrates with the existing MIR compilation pipeline:
1. **AST → MIR**: Uses existing `MirCompiler`
2. **MIR → LLVM**: New `LLVMCompiler` handles MIR instruction translation
3. **LLVM → Native**: Uses LLVM's code generation and system linker
### Error Handling
The implementation provides comprehensive error handling:
- **Environment Errors**: Missing LLVM libraries, compilation failures
- **User Feedback**: Clear messages about requirements and next steps
- **Graceful Degradation**: Mock implementation when LLVM unavailable
## Dependencies
### System Requirements
- **LLVM 17+**: Development libraries and headers
- **Clang**: System C compiler for linking
- **Target Support**: Native target architecture support
### Rust Dependencies
```toml
[dependencies]
inkwell = { version = "0.5", features = ["target-x86"], optional = true }
[features]
llvm = ["dep:inkwell"]
```
## Future Enhancements
### Week 2+ Roadmap
1. **Real LLVM Integration**: Replace mock with inkwell implementation
2. **Instruction Support**: Complete MIR instruction set coverage
3. **Type System**: Proper LLVM type mapping for Nyash Box types
4. **Optimization**: LLVM optimization pass integration
5. **Debug Info**: Debug symbol generation for debugging support
### Performance Goals
- **Compilation Speed**: Sub-second compilation for small programs
- **Runtime Performance**: 2x+ improvement over VM backend
- **Binary Size**: Reasonable binary sizes with optional optimization
## Contributing
### Development Setup
1. Install LLVM development libraries
2. Enable LLVM feature flag
3. Run tests with `cargo test --features llvm`
4. Implement missing MIR instruction handlers
### Code Style
- Follow existing Nyash code patterns
- Use conditional compilation for feature gates
- Provide comprehensive error messages
- Include tests for new functionality
## References
- [inkwell Documentation](https://thedan64.github.io/inkwell/)
- [LLVM Language Reference](https://llvm.org/docs/LangRef.html)
- [Nyash MIR Specification](../mir/README.md)
- [Phase 9.78 Implementation Plan](../../予定/native-plan/llvm/issue/001-setup-inkwell-hello-world.md)