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,
};
#[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()
}
}