Skip to main content

gaia_assembler/backends/
mod.rs

1//! Backend compiler module
2//!
3//! Contains compiler implementations for various target platforms
4
5#[cfg(feature = "clr-assembler")]
6pub mod dotnet;
7#[cfg(feature = "elf-assembler")]
8pub mod elf;
9#[cfg(feature = "gcn-assembler")]
10pub mod gcn;
11#[cfg(feature = "jvm-assembler")]
12pub mod jvm;
13#[cfg(feature = "llvm-assembler")]
14pub mod llvm;
15#[cfg(feature = "lua-assembler")]
16pub mod lua;
17#[cfg(feature = "macho-assembler")]
18pub mod macho;
19#[cfg(feature = "clr-assembler")]
20pub use self::dotnet::msil::ClrBackend;
21#[cfg(feature = "msl-assembler")]
22pub mod msl;
23#[cfg(feature = "nyar-assembler")]
24pub mod nyar;
25#[cfg(feature = "python-assembler")]
26pub mod python;
27#[cfg(feature = "sass-assembler")]
28pub mod sass;
29#[cfg(feature = "spirv-assembler")]
30pub mod spirv;
31#[cfg(feature = "wasi-assembler")]
32pub mod wasi;
33#[cfg(any(feature = "pe-assembler", feature = "x86_64-assembler"))]
34pub mod windows;
35
36// Re-export backend structs
37#[cfg(feature = "clr-assembler")]
38pub use self::dotnet::DotNetBackend;
39#[cfg(feature = "elf-assembler")]
40pub use self::elf::ElfBackend;
41#[cfg(feature = "gcn-assembler")]
42pub use self::gcn::GcnBackend;
43#[cfg(feature = "jvm-assembler")]
44pub use self::jvm::JvmBackend;
45#[cfg(feature = "llvm-assembler")]
46pub use self::llvm::LlvmBackend;
47#[cfg(feature = "lua-assembler")]
48pub use self::lua::LuaBackend;
49#[cfg(feature = "macho-assembler")]
50pub use self::macho::MachoBackend;
51#[cfg(feature = "msl-assembler")]
52pub use self::msl::MslBackend;
53#[cfg(feature = "nyar-assembler")]
54pub use self::nyar::NyarBackend;
55#[cfg(feature = "python-assembler")]
56pub use self::python::PythonBackend;
57#[cfg(feature = "sass-assembler")]
58pub use self::sass::SassBackend;
59#[cfg(feature = "spirv-assembler")]
60pub use self::spirv::SpirvBackend;
61#[cfg(feature = "wasi-assembler")]
62pub use self::wasi::WasiBackend;
63#[cfg(feature = "x86_64-assembler")]
64pub use self::windows::x86_64::X64Backend;
65#[cfg(feature = "pe-assembler")]
66pub use self::windows::WindowsBackend;
67
68use crate::{config::GaiaConfig, program::GaiaModule};
69use gaia_types::{
70    helpers::{ArtifactType, CompilationTarget},
71    Result,
72};
73use std::collections::HashMap;
74
75/// Backend compiler trait
76pub trait Backend {
77    /// Get backend name
78    fn name(&self) -> &'static str;
79
80    /// Get the primary compilation target supported by this backend.
81    fn primary_target(&self) -> CompilationTarget;
82
83    /// Get the type of artifact generated by this backend.
84    fn artifact_type(&self) -> ArtifactType;
85
86    /// Calculate the match score (0-100) for the given compilation target.
87    /// A score of 0 indicates that the target is not supported.
88    fn match_score(&self, target: &CompilationTarget) -> f32;
89
90    /// Compile Gaia program to target platform
91    fn generate(&self, program: &GaiaModule, config: &GaiaConfig) -> Result<GeneratedFiles>;
92}
93
94/// Generated files from a backend compilation.
95pub struct GeneratedFiles {
96    /// The type of artifact generated.
97    pub artifact_type: ArtifactType,
98    /// The generated files as a map from file name to content.
99    pub files: HashMap<String, Vec<u8>>,
100    /// Custom artifact data that skips IO and codec.
101    pub custom: Option<std::sync::Arc<dyn std::any::Any + Send + Sync>>,
102    /// Diagnostics generated during compilation.
103    pub diagnostics: Vec<gaia_types::GaiaError>,
104}