Skip to content

Commit

Permalink
[mono][aot] Fix compilation crashes when type load exception is gener…
Browse files Browse the repository at this point in the history
…ated in code (#110078)

* [mono][aot] Fix stack state when emitting type load throw

Method compilation was continuing and we ended up failing with invalid IL.

* [mono][aot] Mark clauses as dead when replacing method code with exception throw

In the final stages of method compilation, when trying to compute clause ranges, we were asserting because the clause bblocks haven't been reached for compilation.
  • Loading branch information
BrzVlad authored Nov 28, 2024
1 parent 3dd006a commit cf66826
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/mono/mono/mini/method-to-ir.c
Original file line number Diff line number Diff line change
Expand Up @@ -6262,6 +6262,9 @@ method_make_alwaysthrow_typeloadfailure (MonoCompile* cfg, MonoClass* klass)
mono_link_bblock (cfg, bb, cfg->bb_exit);

cfg->disable_inline = TRUE;

for (guint i = 0; i < cfg->header->num_clauses; i++)
cfg->clause_is_dead [i] = TRUE;
}

typedef union _MonoOpcodeParameter {
Expand Down Expand Up @@ -12111,14 +12114,13 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
break;
case MONO_CEE_INITOBJ:
klass = mini_get_class (method, token, generic_context);
--sp;
if (CLASS_HAS_FAILURE (klass)) {
HANDLE_TYPELOAD_ERROR (cfg, klass);
inline_costs += 10;
break; // reached only in AOT
}

--sp;

if (mini_class_is_reference (klass))
MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, sp [0]->dreg, 0, 0);
else
Expand Down

0 comments on commit cf66826

Please sign in to comment.