fixing report bug

This commit is contained in:
mlokr 2024-09-20 11:01:10 +02:00
parent 9e69e53e24
commit b8ff503c14
No known key found for this signature in database
GPG key ID: DEA147DDEE644993
11 changed files with 206 additions and 180 deletions

2
Cargo.lock generated
View file

@ -58,7 +58,7 @@ dependencies = [
[[package]] [[package]]
name = "regalloc2" name = "regalloc2"
version = "0.10.2" version = "0.10.2"
source = "git+https://github.com/jakubDoka/regalloc2#7e74b2fde4f022816cded93ab5685e46f8e3a159" source = "git+https://github.com/jakubDoka/regalloc2#52b2bbe908e78af1715de88f562f62a83e36ca96"
dependencies = [ dependencies = [
"hashbrown", "hashbrown",
"rustc-hash", "rustc-hash",

View file

@ -116,7 +116,7 @@ pub fn disasm(
let prev = *binary; let prev = *binary;
*binary = &binary[..off as usize]; *binary = &binary[off as usize..];
let mut label_count = 0; let mut label_count = 0;
while let Some(&byte) = binary.first() { while let Some(&byte) = binary.first() {
@ -168,7 +168,7 @@ pub fn disasm(
writeln!(out, "{name}:")?; writeln!(out, "{name}:")?;
*binary = &binary[..off as usize]; *binary = &binary[off as usize..];
while let Some(&byte) = binary.first() { while let Some(&byte) = binary.first() {
let offset: i32 = (prev.len() - binary.len()).try_into().unwrap(); let offset: i32 = (prev.len() - binary.len()).try_into().unwrap();
if offset as u32 == off + len { if offset as u32 == off + len {
@ -219,7 +219,9 @@ pub fn disasm(
} else { } else {
let local_has_oob = global_offset < off let local_has_oob = global_offset < off
|| global_offset > off + len || global_offset > off + len
|| instr_from_byte(prev[global_offset as usize]).is_err() || prev
.get(global_offset as usize)
.map_or(true, |&b| instr_from_byte(b).is_err())
|| prev[global_offset as usize] == 0; || prev[global_offset as usize] == 0;
has_oob |= local_has_oob; has_oob |= local_has_oob;
let label = labels.get(&global_offset).unwrap(); let label = labels.get(&global_offset).unwrap();

View file

@ -102,7 +102,7 @@ impl<'a, 'b> Parser<'a, 'b> {
report_to( report_to(
self.lexer.source(), self.lexer.source(),
self.path, self.path,
id.ident, ident::pos(id.ident),
format_args!("undeclared identifier: {}", self.lexer.slice(ident::range(id.ident))), format_args!("undeclared identifier: {}", self.lexer.slice(ident::range(id.ident))),
&mut errors, &mut errors,
); );

View file

@ -1280,6 +1280,9 @@ impl Codegen {
let inps = [VOID, lhs, rhs]; let inps = [VOID, lhs, rhs];
Some(self.ci.nodes.new_node(ty::bin_ret(ty, op), Kind::BinOp { op }, inps)) Some(self.ci.nodes.new_node(ty::bin_ret(ty, op), Kind::BinOp { op }, inps))
} }
Expr::UnOp { pos, op: TokenKind::Band, val } => {
todo!()
}
Expr::UnOp { pos, op, val } => { Expr::UnOp { pos, op, val } => {
let val = self.expr_ctx(val, ctx)?; let val = self.expr_ctx(val, ctx)?;
if !self.tof(val).is_integer() { if !self.tof(val).is_integer() {
@ -1763,20 +1766,23 @@ impl Codegen {
let mut nodes = std::mem::take(&mut self.ci.nodes); let mut nodes = std::mem::take(&mut self.ci.nodes);
let func = Function::new(&mut nodes, &self.tys, sig); let func = Function::new(&mut nodes, &self.tys, sig);
let env = regalloc2::MachineEnv { let mut env = regalloc2::MachineEnv {
preferred_regs_by_class: [ preferred_regs_by_class: [
(1..13).map(|i| regalloc2::PReg::new(i, regalloc2::RegClass::Int)).collect(), (1..12).map(|i| regalloc2::PReg::new(i, regalloc2::RegClass::Int)).collect(),
vec![], vec![],
vec![], vec![],
], ],
non_preferred_regs_by_class: [ non_preferred_regs_by_class: [
(13..64).map(|i| regalloc2::PReg::new(i, regalloc2::RegClass::Int)).collect(), (12..64).map(|i| regalloc2::PReg::new(i, regalloc2::RegClass::Int)).collect(),
vec![], vec![],
vec![], vec![],
], ],
scratch_by_class: Default::default(), scratch_by_class: Default::default(),
fixed_stack_slots: Default::default(), fixed_stack_slots: Default::default(),
}; };
if self.ci.call_count != 0 {
std::mem::swap(&mut env.preferred_regs_by_class, &mut env.non_preferred_regs_by_class);
};
let options = regalloc2::RegallocOptions { verbose_log: false, validate_ssa: true }; let options = regalloc2::RegallocOptions { verbose_log: false, validate_ssa: true };
let output = regalloc2::run(&func, &env, &options).unwrap_or_else(|err| panic!("{err}")); let output = regalloc2::run(&func, &env, &options).unwrap_or_else(|err| panic!("{err}"));
@ -2270,8 +2276,17 @@ impl<'a> Function<'a> {
self.emit_node(node.outputs[0], nid); self.emit_node(node.outputs[0], nid);
} }
Kind::CInt { .. } => { Kind::CInt { .. } => {
let ops = vec![self.drg(nid)]; let unused = node.outputs.into_iter().all(|o| {
self.add_instr(nid, ops); let ond = &self.nodes[o];
matches!(ond.kind, Kind::BinOp { op }
if op.imm_binop(ond.ty.is_signed(), 8).is_some()
&& op.cond_op(ond.ty.is_signed()).is_none())
});
if !unused {
let ops = vec![self.drg(nid)];
self.add_instr(nid, ops);
}
} }
Kind::Phi => {} Kind::Phi => {}
Kind::Tuple { index } => { Kind::Tuple { index } => {
@ -2747,7 +2762,7 @@ mod tests {
if_statements => README; if_statements => README;
loops => README; loops => README;
fb_driver => README; fb_driver => README;
//pointers => README; pointers => README;
//structs => README; //structs => README;
//different_types => README; //different_types => README;
//struct_operators => README; //struct_operators => README;
@ -2768,8 +2783,15 @@ mod tests {
//inline => README; //inline => README;
//inline_test => README; //inline_test => README;
const_folding_with_arg => README; const_folding_with_arg => README;
// FIXME: contains redundant copies
branch_assignments => README; branch_assignments => README;
exhaustive_loop_testing => README; exhaustive_loop_testing => README;
//idk => README;
//comptime_min_reg_leak => README;
//some_generic_code => README;
//integer_inference_issues => README;
//writing_into_string => README;
//request_page => README;
//tests_ptr_to_ptr_copy => README;
//wide_ret => README;
} }
} }

View file

@ -1,16 +1,16 @@
main: main:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -8d
ST r31, r254, 0a, 16h ST r31, r254, 0a, 8h
LI64 r1, 1d LI64 r1, 1d
JNE r2, r1, :0 JNE r2, r1, :0
JMP :1 JMP :1
0: LI64 r32, 0d 0: LI64 r7, 0d
JNE r2, r32, :2 JNE r2, r7, :2
LI64 r1, 2d LI64 r1, 2d
JMP :1 JMP :1
2: LI64 r1, 3d 2: LI64 r1, 3d
1: LD r31, r254, 0a, 16h 1: LD r31, r254, 0a, 8h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 8d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 127 code size: 127
ret: 2 ret: 2

View file

@ -1,18 +1,17 @@
main:
ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h
JAL r31, r0, :foo
CP r32, r1
LI64 r1, 0d
LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a
foo: foo:
ADDI64 r254, r254, -8d ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h ST r31, r254, 0a, 8h
LD r31, r254, 0a, 8h LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d ADDI64 r254, r254, 8d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 146 main:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
JAL r31, r0, :foo
LI64 r1, 0d
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
code size: 143
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,103 +1,106 @@
continue_and_state_change:
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
LI64 r32, 3d
LI64 r33, 4d
LI64 r34, 2d
LI64 r35, 10d
6: JLTU r2, r35, :0
CP r1, r2
JMP :1
0: JNE r2, r34, :2
CP r2, r33
JMP :3
2: JNE r2, r32, :4
LI64 r1, 0d
1: JMP :5
4: ADDI64 r2, r2, 1d
3: JMP :6
5: LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -88d ADDI64 r254, r254, -72d
ST r31, r254, 0a, 88h ST r31, r254, 0a, 72h
LI64 r32, 0d LI64 r12, 0d
CP r2, r32 CP r2, r12
JAL r31, r0, :multiple_breaks JAL r31, r0, :multiple_breaks
CP r32, r12
CP r33, r1 CP r33, r1
LI64 r34, 3d LI64 r1, 3d
JEQ r33, r34, :0 JEQ r33, r1, :0
LI64 r1, 1d LI64 r1, 1d
JMP :1 JMP :1
0: LI64 r35, 4d 0: CP r34, r1
LI64 r35, 4d
CP r2, r35 CP r2, r35
JAL r31, r0, :multiple_breaks JAL r31, r0, :multiple_breaks
CP r36, r1 CP r36, r35
LI64 r37, 10d LI64 r37, 10d
JEQ r36, r37, :2 JEQ r1, r37, :2
LI64 r1, 2d LI64 r1, 2d
JMP :1 JMP :1
2: CP r2, r32 2: CP r2, r32
JAL r31, r0, :state_change_in_break JAL r31, r0, :state_change_in_break
CP r38, r1 CP r38, r1
JEQ r38, r32, :3 CP r1, r32
JEQ r38, r1, :3
CP r1, r34 CP r1, r34
JMP :1 JMP :1
3: CP r2, r35 3: CP r32, r1
CP r2, r36
JAL r31, r0, :state_change_in_break JAL r31, r0, :state_change_in_break
CP r39, r1 JEQ r1, r37, :4
JEQ r39, r37, :4 CP r1, r36
CP r1, r35
JMP :1 JMP :1
4: CP r2, r37 4: CP r2, r37
JAL r31, r0, :continue_and_state_change JAL r31, r0, :continue_and_state_change
CP r40, r1 JEQ r1, r37, :5
JEQ r40, r37, :5
LI64 r1, 5d LI64 r1, 5d
JMP :1 JMP :1
5: CP r2, r34 5: CP r2, r34
JAL r31, r0, :continue_and_state_change JAL r31, r0, :continue_and_state_change
CP r41, r1 CP r39, r1
JEQ r41, r32, :6 CP r1, r32
JEQ r39, r1, :6
LI64 r1, 6d LI64 r1, 6d
JMP :1 JMP :1
6: CP r1, r32 6: CP r1, r32
1: LD r31, r254, 0a, 88h 1: LD r31, r254, 0a, 72h
ADDI64 r254, r254, 88d ADDI64 r254, r254, 72d
JALA r0, r31, 0a
continue_and_state_change:
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
CP r1, r2
LI64 r32, 3d
LI64 r33, 4d
LI64 r34, 2d
LI64 r35, 10d
6: JLTU r1, r35, :0
JMP :1
0: JNE r1, r34, :2
CP r1, r33
JMP :3
2: JNE r1, r32, :4
LI64 r1, 0d
1: JMP :5
4: ADDI64 r33, r1, 1d
CP r1, r33
3: JMP :6
5: LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
state_change_in_break:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
CP r1, r2
LI64 r32, 3d
LI64 r33, 10d
4: JLTU r1, r33, :0
JMP :1
0: JNE r1, r32, :2
LI64 r1, 0d
1: JMP :3
2: ADDI64 r1, r1, 1d
JMP :4
3: LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
multiple_breaks: multiple_breaks:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h ST r31, r254, 0a, 24h
CP r1, r2
LI64 r32, 3d LI64 r32, 3d
LI64 r33, 10d LI64 r33, 10d
4: JLTU r1, r33, :0 4: JLTU r2, r33, :0
CP r1, r2
JMP :1 JMP :1
0: ADDI64 r1, r1, 1d 0: ADDI64 r1, r2, 1d
JNE r1, r32, :2 JNE r1, r32, :2
1: JMP :3 1: JMP :3
2: JMP :4 2: CP r2, r1
JMP :4
3: LD r31, r254, 0a, 24h 3: LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 704 state_change_in_break:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
LI64 r32, 3d
LI64 r33, 10d
4: JLTU r2, r33, :0
CP r1, r2
JMP :1
0: JNE r2, r32, :2
LI64 r1, 0d
1: JMP :3
2: ADDI64 r2, r2, 1d
JMP :4
3: LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a
code size: 713
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,37 +1,45 @@
check_platform:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
JAL r31, r0, :x86_fb_ptr
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -88d ADDI64 r254, r254, -64d
ST r31, r254, 0a, 88h ST r31, r254, 0a, 64h
JAL r31, r0, :check_platform JAL r31, r0, :check_platform
CP r32, r1 LI64 r32, 0d
LI64 r33, 0d LI64 r33, 30d
LI64 r34, 30d LI64 r34, 100d
LI64 r35, 100d CP r35, r32
CP r36, r33 CP r36, r32
CP r37, r33 CP r37, r32
CP r38, r33 5: JLTU r35, r33, :0
5: JLTU r37, r34, :0
ADDI64 r36, r36, 1d ADDI64 r36, r36, 1d
CP r2, r33 CP r2, r32
CP r3, r36 CP r3, r36
CP r4, r34 CP r4, r33
JAL r31, r0, :set_pixel JAL r31, r0, :set_pixel
CP r39, r1 JEQ r1, r37, :1
JEQ r39, r38, :1 CP r1, r32
CP r1, r33
JMP :2 JMP :2
1: JNE r36, r35, :3 1: CP r38, r32
CP r1, r38 JNE r36, r34, :3
CP r1, r37
JMP :2 JMP :2
3: CP r37, r33 3: CP r1, r37
CP r40, r38 CP r35, r38
JMP :4 JMP :4
0: ADDI64 r40, r38, 1d 0: CP r1, r37
ADDI64 r41, r37, 1d CP r38, r32
CP r37, r41 ADDI64 r1, r1, 1d
4: CP r38, r40 ADDI64 r35, r35, 1d
4: CP r32, r38
CP r37, r1
JMP :5 JMP :5
2: LD r31, r254, 0a, 88h 2: LD r31, r254, 0a, 64h
ADDI64 r254, r254, 88d ADDI64 r254, r254, 64d
JALA r0, r31, 0a JALA r0, r31, 0a
set_pixel: set_pixel:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
@ -41,13 +49,6 @@ set_pixel:
LD r31, r254, 0a, 16h LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
check_platform:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
JAL r31, r0, :x86_fb_ptr
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
x86_fb_ptr: x86_fb_ptr:
ADDI64 r254, r254, -8d ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h ST r31, r254, 0a, 8h
@ -55,6 +56,6 @@ x86_fb_ptr:
LD r31, r254, 0a, 8h LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d ADDI64 r254, r254, 8d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 423 code size: 426
ret: 3000 ret: 3000
status: Ok(()) status: Ok(())

View file

@ -1,15 +1,9 @@
main: add_one:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -8d
ST r31, r254, 0a, 24h ST r31, r254, 0a, 8h
LI64 r2, 10d ADDI64 r1, r2, 1d
JAL r31, r0, :add_one LD r31, r254, 0a, 8h
CP r32, r1 ADDI64 r254, r254, 8d
LI64 r2, 20d
JAL r31, r0, :add_two
CP r33, r1
ADD64 r1, r33, r32
LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
add_two: add_two:
ADDI64 r254, r254, -8d ADDI64 r254, r254, -8d
@ -18,13 +12,18 @@ add_two:
LD r31, r254, 0a, 8h LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d ADDI64 r254, r254, 8d
JALA r0, r31, 0a JALA r0, r31, 0a
add_one: main:
ADDI64 r254, r254, -8d ADDI64 r254, r254, -16d
ST r31, r254, 0a, 8h ST r31, r254, 0a, 16h
ADDI64 r1, r2, 1d LI64 r2, 10d
LD r31, r254, 0a, 8h JAL r31, r0, :add_one
ADDI64 r254, r254, 8d CP r32, r1
LI64 r2, 20d
JAL r31, r0, :add_two
ADD64 r1, r1, r32
LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 251 code size: 248
ret: 33 ret: 33
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,22 @@
fib:
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
LI64 r1, 1d
LI64 r32, 2d
JGTU r2, r32, :0
JMP :1
0: CP r33, r2
ADDI64 r2, r33, -1d
CP r34, r33
JAL r31, r0, :fib
CP r2, r34
CP r35, r1
ADDI64 r2, r2, -2d
JAL r31, r0, :fib
ADD64 r1, r1, r35
1: LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -8d ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h ST r31, r254, 0a, 8h
@ -6,24 +25,6 @@ main:
LD r31, r254, 0a, 8h LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d ADDI64 r254, r254, 8d
JALA r0, r31, 0a JALA r0, r31, 0a
fib: code size: 225
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
CP r32, r2
LI64 r1, 1d
LI64 r33, 2d
JGTU r32, r33, :0
JMP :1
0: SUB64 r2, r32, r1
JAL r31, r0, :fib
CP r34, r1
SUB64 r2, r32, r33
JAL r31, r0, :fib
CP r35, r1
ADD64 r1, r35, r34
1: LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
code size: 208
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,19 @@
fib:
ADDI64 r254, r254, -32d
ST r31, r254, 0a, 32h
LI64 r32, 1d
LI64 r33, 0d
CP r1, r33
2: JNE r2, r33, :0
JMP :1
0: ADD64 r34, r32, r1
ADDI64 r2, r2, -1d
CP r1, r32
CP r32, r34
JMP :2
1: LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -8d ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h ST r31, r254, 0a, 8h
@ -6,23 +22,6 @@ main:
LD r31, r254, 0a, 8h LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d ADDI64 r254, r254, 8d
JALA r0, r31, 0a JALA r0, r31, 0a
fib: code size: 202
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
LI64 r32, 1d
LI64 r33, 0d
CP r1, r33
CP r34, r32
2: JNE r2, r33, :0
JMP :1
0: ADD64 r35, r34, r1
SUB64 r2, r2, r32
CP r1, r34
CP r34, r35
JMP :2
1: LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
code size: 198
ret: 55 ret: 55
status: Ok(()) status: Ok(())