pub struct Function<'a> {
pub linkage: Linkage,
pub name: String,
pub arguments: Vec<(Type<'a>, Value)>,
pub return_ty: Option<Type<'a>>,
pub blocks: Vec<Block<'a>>,
}
Expand description
A QBE function definition.
A function consists of a name, linkage information, arguments, return type, and a collection of blocks containing the function’s implementation.
§Examples
use qbe::{Function, Linkage, Type, Value, Instr, Cmp};
// Create a function that checks if a number is even
let mut is_even = Function::new(
Linkage::public(),
"is_even",
vec![(Type::Word, Value::Temporary("n".to_string()))],
Some(Type::Word), // Returns 1 if even, 0 if odd
);
// Add the start block
let mut start = is_even.add_block("start");
// Calculate n % 2 (by using n & 1)
start.assign_instr(
Value::Temporary("remainder".to_string()),
Type::Word,
Instr::And(
Value::Temporary("n".to_string()),
Value::Const(1),
),
);
// Check if remainder is 0 (even number)
start.assign_instr(
Value::Temporary("is_zero".to_string()),
Type::Word,
Instr::Cmp(
Type::Word,
Cmp::Eq,
Value::Temporary("remainder".to_string()),
Value::Const(0),
),
);
// Return the result
start.add_instr(Instr::Ret(Some(Value::Temporary("is_zero".to_string()))));
Fields§
§linkage: Linkage
Function’s linkage
name: String
Function name
arguments: Vec<(Type<'a>, Value)>
Function arguments
return_ty: Option<Type<'a>>
Return type
blocks: Vec<Block<'a>>
Labelled blocks
Implementations§
Source§impl<'a> Function<'a>
impl<'a> Function<'a>
Sourcepub fn new(
linkage: Linkage,
name: impl Into<String>,
arguments: Vec<(Type<'a>, Value)>,
return_ty: Option<Type<'a>>,
) -> Self
pub fn new( linkage: Linkage, name: impl Into<String>, arguments: Vec<(Type<'a>, Value)>, return_ty: Option<Type<'a>>, ) -> Self
Instantiates an empty function and returns it
Examples found in repository?
examples/hello_world.rs (lines 6-14)
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}
Sourcepub fn add_block(&mut self, label: impl Into<String>) -> &mut Block<'a>
pub fn add_block(&mut self, label: impl Into<String>) -> &mut Block<'a>
Adds a new empty block with a specified label and returns a reference to it
Examples found in repository?
examples/hello_world.rs (line 16)
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}
Sourcepub fn last_block(&mut self) -> &Block<'_>
👎Deprecated since 3.0.0: Use self.blocks.last()
or self.blocks.last_mut()
instead.
pub fn last_block(&mut self) -> &Block<'_>
self.blocks.last()
or self.blocks.last_mut()
instead.Returns a reference to the last block
Sourcepub fn add_instr(&mut self, instr: Instr<'a>)
pub fn add_instr(&mut self, instr: Instr<'a>)
Adds a new instruction to the last block
Examples found in repository?
examples/hello_world.rs (line 22)
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}
Sourcepub fn assign_instr(&mut self, temp: Value, ty: Type<'a>, instr: Instr<'a>)
pub fn assign_instr(&mut self, temp: Value, ty: Type<'a>, instr: Instr<'a>)
Adds a new instruction assigned to a temporary
Examples found in repository?
examples/hello_world.rs (lines 17-21)
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 Function<'a>
impl<'a> Ord for Function<'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 Function<'a>
impl<'a> PartialOrd for Function<'a>
impl<'a> Eq for Function<'a>
impl<'a> StructuralPartialEq for Function<'a>
Auto Trait Implementations§
impl<'a> Freeze for Function<'a>
impl<'a> RefUnwindSafe for Function<'a>
impl<'a> Send for Function<'a>
impl<'a> Sync for Function<'a>
impl<'a> Unpin for Function<'a>
impl<'a> UnwindSafe for Function<'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