mirror of
https://github.com/open-goal/jak-project
synced 2026-09-08 11:56:11 -04:00
Decompiler fixes + decompiling (#276)
* decomp pad * more decompilation * update * fix test name
This commit is contained in:
@@ -66,7 +66,7 @@ SimpleAtom make_src_atom(Register reg, int idx) {
|
||||
}
|
||||
|
||||
SimpleAtom false_sym() {
|
||||
return SimpleAtom::make_sym_ptr("#f");
|
||||
return SimpleAtom::make_sym_val("#f");
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
@@ -168,7 +168,7 @@ std::unique_ptr<AtomicOp> make_standard_store(const Instruction& i0,
|
||||
SimpleExpression dst;
|
||||
if (i0.get_src(0).is_reg(rs7())) {
|
||||
assert(!is_float);
|
||||
val = SimpleAtom::make_sym_ptr("#f");
|
||||
val = SimpleAtom::make_sym_val("#f");
|
||||
} else if (i0.get_src(0).is_reg(rr0())) {
|
||||
assert(!is_float);
|
||||
val = SimpleAtom::make_int_constant(0);
|
||||
@@ -581,7 +581,7 @@ std::unique_ptr<AtomicOp> convert_sw_1(const Instruction& i0, int idx) {
|
||||
SimpleAtom val;
|
||||
if (i0.get_src(0).is_reg(rs7())) {
|
||||
// store a false
|
||||
val = SimpleAtom::make_sym_ptr("#f");
|
||||
val = SimpleAtom::make_sym_val("#f");
|
||||
} else if (i0.get_src(0).is_reg(rr0())) {
|
||||
// store a 0
|
||||
val = SimpleAtom::make_int_constant(0);
|
||||
@@ -648,14 +648,14 @@ std::unique_ptr<AtomicOp> convert_beql_1(const Instruction& i0, int idx, bool li
|
||||
} else if (i0.get_src(0).is_reg(rs7())) {
|
||||
if (s1 == rs7()) {
|
||||
// (if #f ...) type code?
|
||||
condition = IR2_Condition(IR2_Condition::Kind::FALSE, SimpleAtom::make_sym_ptr("#f"));
|
||||
condition = IR2_Condition(IR2_Condition::Kind::FALSE, SimpleAtom::make_sym_val("#f"));
|
||||
} else {
|
||||
condition = IR2_Condition(IR2_Condition::Kind::FALSE, make_src_atom(s1, idx));
|
||||
}
|
||||
} else if (s1 == rs7()) {
|
||||
// likely a case where somebody wrote (= x #f) or (!= x #f). much rarer than the flipped one
|
||||
condition = IR2_Condition(IR2_Condition::Kind::EQUAL, make_src_atom(s0, idx),
|
||||
SimpleAtom::make_sym_ptr("#f"));
|
||||
SimpleAtom::make_sym_val("#f"));
|
||||
} else {
|
||||
condition =
|
||||
IR2_Condition(IR2_Condition::Kind::EQUAL, make_src_atom(s0, idx), make_src_atom(s1, idx));
|
||||
@@ -676,7 +676,7 @@ std::unique_ptr<AtomicOp> convert_bnel_1(const Instruction& i0, int idx, bool li
|
||||
} else if (s1 == rs7()) {
|
||||
// likely a case where somebody wrote (= x #f) or (!= x #f). much rarer than the flipped one
|
||||
condition = IR2_Condition(IR2_Condition::Kind::NOT_EQUAL, make_src_atom(s0, idx),
|
||||
SimpleAtom::make_sym_ptr("#f"));
|
||||
SimpleAtom::make_sym_val("#f"));
|
||||
} else {
|
||||
condition = IR2_Condition(IR2_Condition::Kind::NOT_EQUAL, make_src_atom(s0, idx),
|
||||
make_src_atom(s1, idx));
|
||||
@@ -855,7 +855,7 @@ std::unique_ptr<AtomicOp> convert_bne_2(const Instruction& i0,
|
||||
} else if (s1 == rs7()) {
|
||||
// likely a case where somebody wrote (= x #f) or (!= x #f). much rarer than the flipped one
|
||||
condition = IR2_Condition(IR2_Condition::Kind::NOT_EQUAL, make_src_atom(s0, idx),
|
||||
SimpleAtom::make_sym_ptr("#f"));
|
||||
SimpleAtom::make_sym_val("#f"));
|
||||
} else {
|
||||
condition = IR2_Condition(IR2_Condition::Kind::NOT_EQUAL, make_src_atom(s0, idx),
|
||||
make_src_atom(s1, idx));
|
||||
@@ -879,14 +879,14 @@ std::unique_ptr<AtomicOp> convert_beq_2(const Instruction& i0,
|
||||
} else if (i0.get_src(0).is_reg(rs7())) {
|
||||
if (s1 == rs7()) {
|
||||
// (if #f ...) type code?
|
||||
condition = IR2_Condition(IR2_Condition::Kind::FALSE, SimpleAtom::make_sym_ptr("#f"));
|
||||
condition = IR2_Condition(IR2_Condition::Kind::FALSE, SimpleAtom::make_sym_val("#f"));
|
||||
} else {
|
||||
condition = IR2_Condition(IR2_Condition::Kind::FALSE, make_src_atom(s1, idx));
|
||||
}
|
||||
} else if (s1 == rs7()) {
|
||||
// likely a case where somebody wrote (= x #f) or (!= x #f). much rarer than the flipped one
|
||||
condition = IR2_Condition(IR2_Condition::Kind::EQUAL, make_src_atom(s0, idx),
|
||||
SimpleAtom::make_sym_ptr("#f"));
|
||||
SimpleAtom::make_sym_val("#f"));
|
||||
} else {
|
||||
condition =
|
||||
IR2_Condition(IR2_Condition::Kind::EQUAL, make_src_atom(s0, idx), make_src_atom(s1, idx));
|
||||
@@ -1081,7 +1081,7 @@ std::unique_ptr<AtomicOp> convert_dsubu_3(const Instruction& i0,
|
||||
// some sort of not gone wrong?
|
||||
result = std::make_unique<SetVarConditionOp>(
|
||||
make_dst_var(dest, idx),
|
||||
IR2_Condition(kind, make_src_atom(a, idx), SimpleAtom::make_sym_ptr("#f")), idx);
|
||||
IR2_Condition(kind, make_src_atom(a, idx), SimpleAtom::make_sym_val("#f")), idx);
|
||||
} else if (b == rr0()) {
|
||||
// not the greatest codegen...
|
||||
result = std::make_unique<SetVarConditionOp>(
|
||||
|
||||
@@ -201,7 +201,7 @@ bool delay_slot_sets_false(BranchElement* branch, SetVarOp& delay) {
|
||||
assert(branch->op()->likely());
|
||||
assert(branch->op()->branch_delay().kind() == IR2_BranchDelay::Kind::NO_DELAY);
|
||||
|
||||
if (delay.src().is_identity() && delay.src().get_arg(0).is_sym_ptr() &&
|
||||
if (delay.src().is_identity() && delay.src().get_arg(0).is_sym_val() &&
|
||||
delay.src().get_arg(0).get_str() == "#f") {
|
||||
return true;
|
||||
}
|
||||
@@ -517,7 +517,7 @@ void convert_cond_no_else_to_compare(FormPool& pool,
|
||||
auto dst = body->dst();
|
||||
auto src_atom = get_atom_src(body->src());
|
||||
assert(src_atom);
|
||||
assert(src_atom->is_sym_ptr());
|
||||
assert(src_atom->is_sym_val());
|
||||
assert(src_atom->get_str() == "#f");
|
||||
assert(cne->entries.size() == 1);
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ bool convert_to_expressions(Form* top_level_form,
|
||||
std::vector<FormElement*> new_entries;
|
||||
if (f.type.last_arg() != TypeSpec("none")) {
|
||||
auto return_var = f.ir2.atomic_ops->end_op().return_var();
|
||||
new_entries = rewrite_to_get_var(stack, pool, return_var);
|
||||
new_entries = rewrite_to_get_var(stack, pool, return_var, f.ir2.env);
|
||||
auto reg_return_type =
|
||||
f.ir2.env.get_types_after_op(f.ir2.atomic_ops->ops.size() - 1).get(return_var.reg());
|
||||
if (!dts.ts.typecheck(f.type.last_arg(), reg_return_type.typespec(), "", false, false)) {
|
||||
@@ -82,7 +82,7 @@ bool convert_to_expressions(Form* top_level_form,
|
||||
new_entries.push_back(cast);
|
||||
}
|
||||
} else {
|
||||
new_entries = stack.rewrite(pool);
|
||||
new_entries = stack.rewrite(pool, f.ir2.env);
|
||||
}
|
||||
assert(!new_entries.empty());
|
||||
top_level_form->clear();
|
||||
|
||||
@@ -229,9 +229,14 @@ std::string write_from_top_level(const Function& top_level,
|
||||
auto deftype_match_result = match(deftype_matcher, &f);
|
||||
if (deftype_match_result.matched) {
|
||||
auto& name = deftype_match_result.maps.strings.at(type_name);
|
||||
result += fmt::format(";; definition of type {}\n", name);
|
||||
result += dts.ts.generate_deftype(dts.ts.lookup_type(name));
|
||||
result += "\n\n";
|
||||
if (dts.ts.fully_defined_type_exists(name)) {
|
||||
result += fmt::format(";; definition of type {}\n", name);
|
||||
result += dts.ts.generate_deftype(dts.ts.lookup_type(name));
|
||||
result += "\n\n";
|
||||
} else {
|
||||
result +=
|
||||
fmt::format(";; type {} defintion, but it is unknown to the decompiler\n\n", name);
|
||||
}
|
||||
something_matched = true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user