hello_world/
hello_world.rs1use qbe::*;
2
3fn 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}
52
53fn generate_data(module: &mut Module) {
54 let items = vec![
55 (Type::Byte, DataItem::Str("One and one make %d!\\n".into())),
56 (Type::Byte, DataItem::Const(0)),
57 ];
58 let data = DataDef::new(Linkage::private(), "fmt", None, items);
59 module.add_data(data);
60}
61
62fn main() {
63 let mut module = Module::new();
64 generate_add_func(&mut module);
65 generate_main_func(&mut module);
66 generate_data(&mut module);
67 println!("{module}");
68}