gaia-assembler 0.1.1

Universal assembler framework for Gaia project
Documentation
pub mod emitter;
pub mod x86;
pub mod x86_64;

use crate::{
    backends::{Backend, GeneratedFiles},
    config::GaiaConfig,
    program::GaiaModule,
};
use gaia_types::{
    helpers::{AbiCompatible, ApiCompatible, Architecture, ArtifactType, CompilationTarget},
    Result,
};

/// Windows Backend implementation (Native PE)
#[derive(Default)]
pub struct WindowsBackend {}

impl Backend for WindowsBackend {
    fn name(&self) -> &'static str {
        "Windows (Native x86_64)"
    }

    fn primary_target(&self) -> CompilationTarget {
        #[cfg(feature = "x86_64-assembler")]
        {
            self.x86_64_backend().primary_target()
        }
        #[cfg(not(feature = "x86_64-assembler"))]
        {
            CompilationTarget { build: Architecture::X86_64, host: AbiCompatible::PE, target: ApiCompatible::MicrosoftVisualC }
        }
    }

    fn artifact_type(&self) -> ArtifactType {
        ArtifactType::Executable
    }

    fn match_score(&self, target: &CompilationTarget) -> f32 {
        if target.host != AbiCompatible::PE {
            return -100.0;
        }

        match target.build {
            Architecture::X86_64 => {
                #[cfg(feature = "x86_64-assembler")]
                {
                    self.x86_64_backend().match_score(target)
                }
                #[cfg(not(feature = "x86_64-assembler"))]
                {
                    0.0
                }
            }
            Architecture::X86 => {
                #[cfg(feature = "x86-assembler")]
                {
                    self.x86_backend().match_score(target)
                }
                #[cfg(not(feature = "x86-assembler"))]
                {
                    0.0
                }
            }
            _ => 0.0,
        }
    }

    fn generate(&self, program: &GaiaModule, config: &GaiaConfig) -> Result<GeneratedFiles> {
        let target = &config.target;
        match target.build {
            Architecture::X86_64 => {
                #[cfg(feature = "x86_64-assembler")]
                {
                    self.x86_64_backend().generate(program, config)
                }
                #[cfg(not(feature = "x86_64-assembler"))]
                {
                    Err(gaia_types::GaiaError::platform_unsupported("Windows x86_64", "x86_64-assembler feature not enabled"))
                }
            }
            Architecture::X86 => {
                #[cfg(feature = "x86-assembler")]
                {
                    self.x86_backend().generate(program, config)
                }
                #[cfg(not(feature = "x86-assembler"))]
                {
                    Err(gaia_types::GaiaError::platform_unsupported("Windows x86", "x86-assembler feature not enabled"))
                }
            }
            _ => {
                #[cfg(feature = "x86_64-assembler")]
                {
                    self.x86_64_backend().generate(program, config)
                }
                #[cfg(not(feature = "x86_64-assembler"))]
                {
                    Err(gaia_types::GaiaError::platform_unsupported("Windows", "x86_64-assembler feature not enabled"))
                }
            }
        }
    }
}

impl WindowsBackend {
    #[cfg(feature = "x86_64-assembler")]
    fn x86_64_backend(&self) -> x86_64::X64Backend {
        x86_64::X64Backend::default()
    }
    #[cfg(feature = "x86-assembler")]
    fn x86_backend(&self) -> x86::X86Backend {
        x86::X86Backend::default()
    }
}