1#![warn(missing_docs)]
2
3use gaia_assembler::{
4 backends::{Backend, GeneratedFiles},
5 config::GaiaConfig,
6 program::GaiaModule,
7};
8use gaia_types::{
9 helpers::{AbiCompatible, ApiCompatible, Architecture, CompilationTarget},
10 Result,
11};
12use std::collections::HashMap;
13
14pub struct MslGenerator;
15
16impl Backend for MslGenerator {
17 fn name(&self) -> &'static str {
18 "msl"
19 }
20
21 fn primary_target(&self) -> CompilationTarget {
22 CompilationTarget {
23 build: Architecture::X86_64, host: AbiCompatible::MSL,
25 target: ApiCompatible::Metal,
26 }
27 }
28
29 fn match_score(&self, target: &CompilationTarget) -> f32 {
30 if target.host == AbiCompatible::MSL {
31 100.0
32 }
33 else {
34 0.0
35 }
36 }
37
38 fn generate(&self, program: &GaiaModule, _config: &GaiaConfig) -> Result<GeneratedFiles> {
39 let mut files = HashMap::new();
40 let diagnostics = Vec::new();
41
42 let mut module_source = self.msl_header();
43 module_source.push_str("\n");
44
45 for function in &program.functions {
46 for block in &function.blocks {
47 for instruction in &block.instructions {
48 }
50 }
51 }
52
53 files.insert("module.metal".to_string(), Vec::from(module_source.as_bytes()));
54 files.insert("default.metallib".to_string(), vec![0x4d, 0x54, 0x4c, 0x42]); Ok(GeneratedFiles { files, diagnostics })
58 }
59}
60
61impl MslGenerator {
62 fn msl_header(&self) -> String {
63 "#include <metal_stdlib>\nusing namespace metal;".to_string()
64 }
65}