Allow register allocation to fail
This commit is contained in:
414
src/backend.rs
414
src/backend.rs
File diff suppressed because it is too large
Load Diff
@@ -83,6 +83,7 @@ where
|
|||||||
M: ModuleContext,
|
M: ModuleContext,
|
||||||
I: IntoIterator<Item = Operator<L>>,
|
I: IntoIterator<Item = Operator<L>>,
|
||||||
L: Hash + Clone + Eq,
|
L: Hash + Clone + Eq,
|
||||||
|
BrTarget<L>: std::fmt::Display,
|
||||||
{
|
{
|
||||||
fn drop_elements<T>(stack: &mut Vec<T>, depths: std::ops::RangeInclusive<u32>) {
|
fn drop_elements<T>(stack: &mut Vec<T>, depths: std::ops::RangeInclusive<u32>) {
|
||||||
let _ = (|| {
|
let _ = (|| {
|
||||||
@@ -138,6 +139,8 @@ where
|
|||||||
);
|
);
|
||||||
|
|
||||||
while let Some(op) = body.next() {
|
while let Some(op) = body.next() {
|
||||||
|
println!("{}", op);
|
||||||
|
|
||||||
if let Some(Operator::Label(label)) = body.peek() {
|
if let Some(Operator::Label(label)) = body.peek() {
|
||||||
let block = blocks
|
let block = blocks
|
||||||
.get_mut(&BrTarget::Label(label.clone()))
|
.get_mut(&BrTarget::Label(label.clone()))
|
||||||
@@ -324,33 +327,46 @@ where
|
|||||||
(ref mut else_cc @ None, else_to_drop),
|
(ref mut else_cc @ None, else_to_drop),
|
||||||
) => {
|
) => {
|
||||||
let max_params = then_block.params.max(else_block.params);
|
let max_params = then_block.params.max(else_block.params);
|
||||||
let cc = if then_block_should_serialize_args {
|
let virt_cc = if !then_block_should_serialize_args
|
||||||
Left(ctx.serialize_args(max_params))
|
|| !else_block_should_serialize_args
|
||||||
} else if else_block_should_serialize_args {
|
{
|
||||||
Left(ctx.serialize_args(max_params))
|
Some(ctx.virtual_calling_convention())
|
||||||
} else {
|
} else {
|
||||||
Right(ctx.virtual_calling_convention())
|
None
|
||||||
|
};
|
||||||
|
let cc = if then_block_should_serialize_args
|
||||||
|
|| else_block_should_serialize_args
|
||||||
|
{
|
||||||
|
Some(ctx.serialize_args(max_params))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
**then_cc = {
|
**then_cc = if then_block_should_serialize_args {
|
||||||
let mut cc = cc.clone();
|
let mut cc = cc.clone().unwrap();
|
||||||
if let Some(to_drop) = then_to_drop.clone() {
|
if let Some(to_drop) = then_to_drop.clone() {
|
||||||
match &mut cc {
|
drop_elements(&mut cc.arguments, to_drop);
|
||||||
Left(cc) => drop_elements(&mut cc.arguments, to_drop),
|
|
||||||
Right(cc) => drop_elements(&mut cc.stack, to_drop),
|
|
||||||
}
|
}
|
||||||
|
Some(Left(cc))
|
||||||
|
} else {
|
||||||
|
let mut cc = virt_cc.clone().unwrap();
|
||||||
|
if let Some(to_drop) = then_to_drop.clone() {
|
||||||
|
drop_elements(&mut cc.stack, to_drop);
|
||||||
}
|
}
|
||||||
Some(cc)
|
Some(Right(cc))
|
||||||
};
|
};
|
||||||
**else_cc = {
|
**else_cc = if else_block_should_serialize_args {
|
||||||
let mut cc = cc;
|
let mut cc = cc.unwrap();
|
||||||
if let Some(to_drop) = else_to_drop.clone() {
|
if let Some(to_drop) = else_to_drop.clone() {
|
||||||
match &mut cc {
|
drop_elements(&mut cc.arguments, to_drop);
|
||||||
Left(cc) => drop_elements(&mut cc.arguments, to_drop),
|
|
||||||
Right(cc) => drop_elements(&mut cc.stack, to_drop),
|
|
||||||
}
|
}
|
||||||
|
Some(Left(cc))
|
||||||
|
} else {
|
||||||
|
let mut cc = virt_cc.unwrap();
|
||||||
|
if let Some(to_drop) = else_to_drop.clone() {
|
||||||
|
drop_elements(&mut cc.stack, to_drop);
|
||||||
}
|
}
|
||||||
Some(cc)
|
Some(Right(cc))
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
_ => unimplemented!(
|
_ => unimplemented!(
|
||||||
|
|||||||
Reference in New Issue
Block a user