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 (dotnet#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 and mikelle-rogers committed Dec 4, 2024
1 parent 54c8808 commit c94fa28
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 c94fa28

Please sign in to comment.