static void __attribute__((noreturn)) vm_exit(int status) { clear_exception(); vm_call_method(vm_java_lang_System_exit, status); if (exception_occurred()) vm_print_exception(exception_occurred()); error("System.exit() returned"); }
static void sigsegv_handler(int sig, siginfo_t *si, void *ctx) { if (signal_from_native(ctx)) goto exit; /* Assume that zero-page access is caused by dereferencing a null pointer */ if ((unsigned long)si->si_addr < (unsigned long)getpagesize()) { /* We must be extra caucious here because IP might be invalid */ if (get_signal_source_cu(ctx) == NULL) goto exit; if (install_signal_bh(ctx, throw_null_pointer_exception) == 0) return; fprintf(stderr, "%s: install_signal_bh() failed.\n", __func__); goto exit; } /* Check if exception was triggered by exception guard */ if (si->si_addr == exceptions_guard_page || si->si_addr == trampoline_exceptions_guard_page) { struct vm_object *exception; exception = exception_occurred(); if (exception == NULL) { fprintf(stderr, "%s: spurious exception-test failure\n", __func__); goto exit; } if (si->si_addr == trampoline_exceptions_guard_page) throw_exception_from_trampoline(ctx, exception); else throw_exception_from_signal(ctx, exception); return; } /* Static field access */ if (si->si_addr == static_guard_page) { install_signal_bh(ctx, &static_field_signal_bh); return; } exit: vm_jni_check_trap(si->si_addr); print_backtrace_and_die(sig, si, ctx); }
static int do_compile(struct compilation_unit *cu) { bool ssa_enable; int err; if (opt_print_compilation) print_compilation(cu->method); if (opt_trace_compile) trace_method(cu); err = inline_subroutines(cu->method); if (err) goto out; if (opt_trace_bytecode) trace_bytecode(cu->method); err = analyze_control_flow(cu); if (err) goto out; err = convert_to_ir(cu); if (err) goto out; ssa_enable = opt_ssa_enable && uses_array_ops(cu); if (ssa_enable) { err = compute_dfns(cu); if (err) goto out; } if (opt_trace_cfg) trace_cfg(cu); if (opt_trace_tree_ir) trace_tree_ir(cu); err = select_instructions(cu); if (err) goto out; compute_insn_positions(cu); if (opt_trace_lir) trace_lir(cu); if (ssa_enable) { err = compute_dom(cu); if (err) goto out; err = compute_dom_frontier(cu); if (err) goto out; err = lir_to_ssa(cu); if (err) goto out; if(opt_trace_ssa) trace_ssa(cu); imm_copy_propagation(cu); abc_removal(cu); err = dce(cu); if (err) goto out; err = ssa_to_lir(cu); if (err) goto out; } err = analyze_liveness(cu); if (err) goto out; if (opt_trace_liveness) trace_liveness(cu); err = allocate_registers(cu); if (err) goto out; err = mark_clobbers(cu); if (err) goto out; err = insert_spill_reload_insns(cu); if (err) goto out; if (opt_trace_regalloc) trace_regalloc(cu); err = convert_ic_calls(cu); if (err) goto out; assert(all_insn_have_bytecode_offset(cu)); err = peephole_optimize(cu); if (err) goto out; err = emit_machine_code(cu); if (err) goto out; err = build_bc_offset_map(cu); if (err) goto out; if (opt_trace_machine_code) trace_machine_code(cu); resolve_fixup_offsets(cu); perf_append_cu(cu); out: if (opt_trace_compile) trace_flush(); if (err && !exception_occurred()) compile_error(cu, err); return err; }