hello_world/
hello_world.rs

1use qbe::*;
2
3// Represents the hello world example from https://c9x.me/compile/
4
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}
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}