Skip to main content

oxilean_codegen/llvm_backend/
llvmfunc_traits.rs

1//! # LlvmFunc - Trait Implementations
2//!
3//! This module contains trait implementations for `LlvmFunc`.
4//!
5//! ## Implemented Traits
6//!
7//! - `Display`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11use crate::lcnf::*;
12
13use super::types::{LlvmFunc, LlvmLinkage};
14use std::fmt;
15
16impl fmt::Display for LlvmFunc {
17    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18        if self.is_declare {
19            write!(f, "declare")?;
20        } else {
21            write!(f, "define")?;
22        }
23        if self.linkage != LlvmLinkage::External {
24            write!(f, " {}", self.linkage)?;
25        }
26        write!(f, " {} @{}(", self.ret_ty, self.name)?;
27        for (i, (ty, name)) in self.params.iter().enumerate() {
28            if i > 0 {
29                write!(f, ", ")?;
30            }
31            if self.is_declare {
32                write!(f, "{}", ty)?;
33            } else {
34                write!(f, "{} %{}", ty, name)?;
35            }
36        }
37        write!(f, ")")?;
38        for attr in &self.attrs {
39            write!(f, " {}", attr)?;
40        }
41        if self.is_declare {
42            writeln!(f)?;
43        } else {
44            writeln!(f, " {{")?;
45            for instr in &self.body {
46                writeln!(f, "{}", instr)?;
47            }
48            writeln!(f, "}}")?;
49        }
50        Ok(())
51    }
52}