diff --git a/reid-llvm-lib/src/fmt.rs b/reid-llvm-lib/src/fmt.rs index aefea50..411bf9e 100644 --- a/reid-llvm-lib/src/fmt.rs +++ b/reid-llvm-lib/src/fmt.rs @@ -105,12 +105,24 @@ impl BlockHolder { } writeln!(f, "{} ({:?}):", self.data.name, self.value)?; + let mut state = Default::default(); + let mut inner = PadAdapter::wrap(f, &mut state); + for instr in &self.instructions { - let mut state = Default::default(); - let mut inner = PadAdapter::wrap(f, &mut state); instr.builder_fmt(&mut inner, builder, debug)?; } + if let Some(terminator) = &self.data.terminator { + terminator.builder_fmt(&mut inner, builder, debug)?; + } + if let Some(location) = self.data.terminator_location { + writeln!( + inner, + " ^ (At {}) ", + debug.as_ref().unwrap().get_location(location) + )?; + } + Ok(()) } } @@ -155,6 +167,24 @@ impl InstructionHolder { } } +impl TerminatorKind { + fn builder_fmt( + &self, + f: &mut impl std::fmt::Write, + builder: &Builder, + debug: &Option, + ) -> std::fmt::Result { + match self { + TerminatorKind::Ret(instr) => writeln!(f, "ret {:?}", instr), + TerminatorKind::RetVoid => writeln!(f, "ret void"), + TerminatorKind::Br(block) => writeln!(f, "br {:?}", block), + TerminatorKind::CondBr(instr, lhs, rhs) => { + writeln!(f, "condbr {:?}, {:?} or {:?}", instr, lhs, rhs) + } + } + } +} + impl DebugMetadataValue { fn hr(&self, debug: &DebugInformation) -> String { let kind = match debug.get_metadata(*self) { diff --git a/reid/lib/std.reid b/reid/lib/std.reid index 753f323..21e7158 100644 --- a/reid/lib/std.reid +++ b/reid/lib/std.reid @@ -90,4 +90,17 @@ fn str_length(string: *char, position: u32) -> u32 { return 0; } return str_length(string, position + 1) + 1; +} + +pub fn add_num_to_str(string: &mut String, num: u64) { + if num == 0 { add_char(string, '0'); } + else { if num == 1 { add_char(string, '1'); } + else { if num == 2 { add_char(string, '2'); } + else { if num == 3 { add_char(string, '3'); } + else { if num == 4 { add_char(string, '4'); } + else { if num == 5 { add_char(string, '5'); } + else { if num == 6 { add_char(string, '6'); } + else { if num == 7 { add_char(string, '7'); } + else { if num == 8 { add_char(string, '8'); } + else { if num == 9 { add_char(string, '9'); } } } } } } } } } } } \ No newline at end of file diff --git a/reid/src/codegen.rs b/reid/src/codegen.rs index b4adffa..6a7c10d 100644 --- a/reid/src/codegen.rs +++ b/reid/src/codegen.rs @@ -1177,8 +1177,9 @@ impl mir::IfExpression { let opt = else_block.codegen(&mut else_scope, state); + else_scope.block.terminate(Term::Br(after_bb)).ok(); + if let Some(ret) = opt { - else_scope.block.terminate(Term::Br(after_bb)).ok(); Some(ret) } else { None diff --git a/reid/src/token_stream.rs b/reid/src/token_stream.rs index 7f18a81..006ab0b 100644 --- a/reid/src/token_stream.rs +++ b/reid/src/token_stream.rs @@ -167,7 +167,7 @@ impl<'a, 'b> TokenStream<'a, 'b> { match T::parse(clone) { Ok(res) => { #[cfg(debug_assertions)] - dbg!(&res); + // dbg!(&res); let new_pos = ref_pos.max(self.position); Ok((res, new_pos)) } diff --git a/reid_src/hello_world.reid b/reid_src/hello_world.reid index dcd4f5d..cf7661d 100644 --- a/reid_src/hello_world.reid +++ b/reid_src/hello_world.reid @@ -3,12 +3,14 @@ import std::from_str; import std::add_char; import std::set_char; import std::free_string; +import std::add_num_to_str; fn main() -> i32 { let mut test = from_str("hello world"); add_char(&mut test, '!'); set_char(&mut test, 'B', 0); + add_num_to_str(&mut test, 7); print(&test);