gaia-assembler 0.1.1

Universal assembler framework for Gaia project
Documentation
//! Backend compiler module
//!
//! Contains compiler implementations for various target platforms

#[cfg(feature = "clr-assembler")]
pub mod dotnet;
#[cfg(feature = "elf-assembler")]
pub mod elf;
#[cfg(feature = "gcn-assembler")]
pub mod gcn;
#[cfg(feature = "jvm-assembler")]
pub mod jvm;
#[cfg(feature = "llvm-assembler")]
pub mod llvm;
#[cfg(feature = "lua-assembler")]
pub mod lua;
#[cfg(feature = "macho-assembler")]
pub mod macho;
#[cfg(feature = "clr-assembler")]
pub use self::dotnet::msil::ClrBackend;
#[cfg(feature = "msl-assembler")]
pub mod msl;
#[cfg(feature = "nyar-assembler")]
pub mod nyar;
#[cfg(feature = "python-assembler")]
pub mod python;
#[cfg(feature = "sass-assembler")]
pub mod sass;
#[cfg(feature = "spirv-assembler")]
pub mod spirv;
#[cfg(feature = "wasi-assembler")]
pub mod wasi;
#[cfg(any(feature = "pe-assembler", feature = "x86_64-assembler"))]
pub mod windows;

// Re-export backend structs
#[cfg(feature = "clr-assembler")]
pub use self::dotnet::DotNetBackend;
#[cfg(feature = "elf-assembler")]
pub use self::elf::ElfBackend;
#[cfg(feature = "gcn-assembler")]
pub use self::gcn::GcnBackend;
#[cfg(feature = "jvm-assembler")]
pub use self::jvm::JvmBackend;
#[cfg(feature = "llvm-assembler")]
pub use self::llvm::LlvmBackend;
#[cfg(feature = "lua-assembler")]
pub use self::lua::LuaBackend;
#[cfg(feature = "macho-assembler")]
pub use self::macho::MachoBackend;
#[cfg(feature = "msl-assembler")]
pub use self::msl::MslBackend;
#[cfg(feature = "nyar-assembler")]
pub use self::nyar::NyarBackend;
#[cfg(feature = "python-assembler")]
pub use self::python::PythonBackend;
#[cfg(feature = "sass-assembler")]
pub use self::sass::SassBackend;
#[cfg(feature = "spirv-assembler")]
pub use self::spirv::SpirvBackend;
#[cfg(feature = "wasi-assembler")]
pub use self::wasi::WasiBackend;
#[cfg(feature = "x86_64-assembler")]
pub use self::windows::x86_64::X64Backend;
#[cfg(feature = "pe-assembler")]
pub use self::windows::WindowsBackend;

use crate::{config::GaiaConfig, program::GaiaModule};
use gaia_types::{
    helpers::{ArtifactType, CompilationTarget},
    Result,
};
use std::collections::HashMap;

/// Backend compiler trait
pub trait Backend {
    /// Get backend name
    fn name(&self) -> &'static str;

    /// Get the primary compilation target supported by this backend.
    fn primary_target(&self) -> CompilationTarget;

    /// Get the type of artifact generated by this backend.
    fn artifact_type(&self) -> ArtifactType;

    /// Calculate the match score (0-100) for the given compilation target.
    /// A score of 0 indicates that the target is not supported.
    fn match_score(&self, target: &CompilationTarget) -> f32;

    /// Compile Gaia program to target platform
    fn generate(&self, program: &GaiaModule, config: &GaiaConfig) -> Result<GeneratedFiles>;
}

/// Generated files from a backend compilation.
pub struct GeneratedFiles {
    /// The type of artifact generated.
    pub artifact_type: ArtifactType,
    /// The generated files as a map from file name to content.
    pub files: HashMap<String, Vec<u8>>,
    /// Custom artifact data that skips IO and codec.
    pub custom: Option<std::sync::Arc<dyn std::any::Any + Send + Sync>>,
    /// Diagnostics generated during compilation.
    pub diagnostics: Vec<gaia_types::GaiaError>,
}