pub struct Module<'a> {
pub functions: Vec<Function<'a>>,
pub types: Vec<TypeDef<'a>>,
pub data: Vec<DataDef<'a>>,
}Expand description
A complete QBE IL module.
A module contains all the functions, data definitions, and type definitions that make up a QBE IL file. When converted to a string, it produces valid QBE IL code that can be compiled by QBE.
§Examples
use qbe::{Module, Function, DataDef, TypeDef, Linkage, Type, Value, Instr, DataItem};
// Create a new module
let mut module = Module::new();
// Add a string constant
let hello_str = DataDef::new(
Linkage::private(),
"hello",
None,
vec![
(Type::Byte, DataItem::Str("Hello, World!\n".to_string())),
(Type::Byte, DataItem::Const(0)), // Null terminator
],
);
module.add_data(hello_str);
// Add a main function that prints the string
let mut main = Function::new(
Linkage::public(),
"main",
vec![],
Some(Type::Word),
);
let mut start = main.add_block("start");
// Call printf with the string: %r = call $printf(l $hello)
start.assign_instr(
Value::Temporary("r".to_string()),
Type::Word,
Instr::Call(
"printf".to_string(),
vec![(Type::Long, Value::Global("hello".to_string()))],
None,
),
);
// Return 0
start.add_instr(Instr::Ret(Some(Value::Const(0))));
// Add the function to the module
module.add_function(main);Fields§
§functions: Vec<Function<'a>>§types: Vec<TypeDef<'a>>§data: Vec<DataDef<'a>>Implementations§
Source§impl<'a> Module<'a>
impl<'a> Module<'a>
Sourcepub fn add_function(&mut self, func: Function<'a>) -> &mut Function<'a>
pub fn add_function(&mut self, func: Function<'a>) -> &mut Function<'a>
Adds a function to the module, returning a reference to it for later modification
Examples found in repository?
examples/hello_world.rs (line 24)
5fn generate_add_func(module: &mut Module) {
6 let mut func = Function::new(
7 Linkage::private(),
8 "add",
9 vec![
10 (Type::Word, Value::Temporary("a".into())),
11 (Type::Word, Value::Temporary("b".into())),
12 ],
13 Some(Type::Word),
14 );
15
16 func.add_block("start");
17 func.assign_instr(
18 Value::Temporary("c".into()),
19 Type::Word,
20 Instr::Add(Value::Temporary("a".into()), Value::Temporary("b".into())),
21 );
22 func.add_instr(Instr::Ret(Some(Value::Temporary("c".into()))));
23
24 module.add_function(func);
25}
26
27fn generate_main_func(module: &mut Module) {
28 let mut func = Function::new(Linkage::public(), "main", Vec::new(), Some(Type::Word));
29
30 func.add_block("start");
31 func.assign_instr(
32 Value::Temporary("r".into()),
33 Type::Word,
34 Instr::Call(
35 "add".into(),
36 vec![(Type::Word, Value::Const(1)), (Type::Word, Value::Const(1))],
37 None,
38 ),
39 );
40 func.add_instr(Instr::Call(
41 "printf".into(),
42 vec![
43 (Type::Long, Value::Global("fmt".into())),
44 (Type::Word, Value::Temporary("r".into())),
45 ],
46 Some(1),
47 ));
48 func.add_instr(Instr::Ret(Some(Value::Const(0))));
49
50 module.add_function(func);
51}Trait Implementations§
Source§impl<'a> Ord for Module<'a>
impl<'a> Ord for Module<'a>
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read more
Source§impl<'a> PartialOrd for Module<'a>
impl<'a> PartialOrd for Module<'a>
impl<'a> Eq for Module<'a>
impl<'a> StructuralPartialEq for Module<'a>
Auto Trait Implementations§
impl<'a> Freeze for Module<'a>
impl<'a> RefUnwindSafe for Module<'a>
impl<'a> Send for Module<'a>
impl<'a> Sync for Module<'a>
impl<'a> Unpin for Module<'a>
impl<'a> UnwindSafe for Module<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more