Skip to content

Commit fb9a9f4

Browse files
authored
Port runtime of #1682 (#2050)
1 parent 42db003 commit fb9a9f4

File tree

5 files changed

+53
-1
lines changed

5 files changed

+53
-1
lines changed

ocaml/runtime/amd64.S

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,14 @@ CFI_STARTPROC
10321032
CFI_ENDPROC
10331033
ENDFUNCTION(G(caml_ml_array_bound_error))
10341034

1035+
FUNCTION(G(caml_ml_array_align_error))
1036+
CFI_STARTPROC
1037+
ENTER_FUNCTION
1038+
LEA_VAR(caml_array_align_error_asm, %rax)
1039+
jmp LBL(caml_c_call)
1040+
CFI_ENDPROC
1041+
ENDFUNCTION(G(caml_ml_array_align_error))
1042+
10351043
FUNCTION(G(caml_assert_stack_invariants))
10361044
CFI_STARTPROC
10371045
/* CHECK_STACK_ALIGNMENT */

ocaml/runtime/amd64nt.asm

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
EXTRN caml_apply3: NEAR
2626
EXTRN caml_program: NEAR
2727
EXTRN caml_array_bound_error_asm: NEAR
28-
EXTRN caml_stash_backtrace: NEAR
28+
EXTRN caml_array_align_error: NEAR
29+
EXTRN caml_stash_backtrace: NEAR
2930

3031
INCLUDE domain_state64.inc
3132

@@ -423,6 +424,12 @@ caml_ml_array_bound_error:
423424
lea rax, caml_array_bound_error_asm
424425
jmp caml_c_call
425426

427+
PUBLIC caml_ml_array_align_error
428+
ALIGN 16
429+
caml_ml_array_align_error:
430+
lea rax, caml_array_align_error_asm
431+
jmp caml_c_call
432+
426433
PUBLIC caml_system__code_end
427434
caml_system__code_end:
428435

ocaml/runtime/caml/fail.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ CAMLnoreturn_start
145145
CAMLextern void caml_array_bound_error (void)
146146
CAMLnoreturn_end;
147147

148+
CAMLnoreturn_start
149+
CAMLextern void caml_array_align_error (void)
150+
CAMLnoreturn_end;
151+
148152
CAMLnoreturn_start
149153
CAMLextern void caml_raise_sys_blocked_io (void)
150154
CAMLnoreturn_end;

ocaml/runtime/fail_byt.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ CAMLexport void caml_array_bound_error(void)
163163
caml_invalid_argument("index out of bounds");
164164
}
165165

166+
CAMLexport void caml_array_align_error(void)
167+
{
168+
caml_invalid_argument("address was misaligned");
169+
}
170+
166171
CAMLexport void caml_raise_out_of_memory(void)
167172
{
168173
check_global_data("Out_of_memory");

ocaml/runtime/fail_nat.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,34 @@ void caml_array_bound_error_asm(void)
222222
caml_raise_exception(Caml_state, array_bound_exn());
223223
}
224224

225+
static value array_align_exn(void)
226+
{
227+
static atomic_uintnat exn_cache = ATOMIC_UINTNAT_INIT(0);
228+
const value* exn = (const value*)atomic_load_acquire(&exn_cache);
229+
if (!exn) {
230+
exn = caml_named_value("Pervasives.array_align_error");
231+
if (!exn) {
232+
fprintf(stderr, "Fatal error: exception "
233+
"Invalid_argument(\"address was misaligned\")\n");
234+
exit(2);
235+
}
236+
atomic_store_release(&exn_cache, (uintnat)exn);
237+
}
238+
return *exn;
239+
}
240+
241+
void caml_array_align_error(void)
242+
{
243+
caml_raise(array_align_exn());
244+
}
245+
246+
void caml_array_align_error_asm(void)
247+
{
248+
/* This exception is raised directly from ocamlopt-compiled OCaml,
249+
not C, so we jump directly to the OCaml handler (and avoid GC) */
250+
caml_raise_exception(Caml_state, array_align_exn());
251+
}
252+
225253
int caml_is_special_exception(value exn) {
226254
return exn == (value) caml_exn_Match_failure
227255
|| exn == (value) caml_exn_Assert_failure

0 commit comments

Comments
 (0)