open! Core
open! Async
(* Generated as per this program:
{[
exception Test
let[@inline never] foo () = ()
let[@inline never] rec raise_after = function
| 0 -> raise Test
| n -> 1 + raise_after (n - 1)
;;
let () =
while true do
let _ =
try raise_after 20 with
| Test -> 0
in
for i = 0 to 1000000 do
Sys.opaque_identity ()
done;
()
done
;;
]}
*)
let%expect_test "A raise_notrace OCaml exception" =
let ocaml_exception_info =
Magic_trace_lib.Ocaml_exception_info.create
~entertraps:[| 0x411030L |]
~pushtraps:[| 0x41100bL |]
~poptraps:[| 0x411026L |]
in
let%map () =
Perf_script.run ~ocaml_exception_info ~trace_scope:Userspace "ocaml_exceptions.perf"
in
[%expect
{|
23860/23860 426567.068172167: 1 branches:uH: call 411021 camlRaise_test__entry+0x71 (foo.so) => 410f70 camlRaise_test__raise_after_265+0x0 (foo.so)
-> 3ns BEGIN camlRaise_test__raise_after_265
-> 6ns BEGIN camlRaise_test__raise_after_265
-> 9ns BEGIN camlRaise_test__raise_after_265
-> 13ns BEGIN camlRaise_test__raise_after_265
-> 13ns BEGIN camlRaise_test__raise_after_265
-> 13ns BEGIN camlRaise_test__raise_after_265
-> 13ns BEGIN camlRaise_test__raise_after_265
-> 14ns BEGIN camlRaise_test__raise_after_265
-> 15ns BEGIN camlRaise_test__raise_after_265
-> 16ns BEGIN camlRaise_test__raise_after_265
-> 16ns BEGIN camlRaise_test__raise_after_265
-> 16ns BEGIN camlRaise_test__raise_after_265
-> 17ns BEGIN camlRaise_test__raise_after_265
-> 18ns BEGIN camlRaise_test__raise_after_265
-> 19ns BEGIN camlRaise_test__raise_after_265
23860/23860 426567.068172190: 1 branches:uH: jmp 410fa0 camlRaise_test__raise_after_265+0x30 (foo.so) => 411030 camlRaise_test__entry+0x80 (foo.so)
-> 20ns BEGIN camlRaise_test__raise_after_265
-> 20ns BEGIN camlRaise_test__raise_after_265
-> 20ns BEGIN camlRaise_test__raise_after_265
-> 21ns BEGIN camlRaise_test__raise_after_265
-> 22ns BEGIN camlRaise_test__raise_after_265
INPUT TRACE STREAM ENDED, any lines printed below this were deferred
-> 0ns BEGIN camlRaise_test__entry [inferred start time]
-> 0ns BEGIN camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 23ns END camlRaise_test__raise_after_265
-> 24ns END camlRaise_test__entry |}]
;;
let%expect_test "a corner case where a call doesn't return directly into a poptrap" =
let ocaml_exception_info =
Magic_trace_lib.Ocaml_exception_info.create
~entertraps:[| 0xffffffL (* not used *) |]
~pushtraps:[| 0xcb457dL |]
~poptraps:[| 0xcb459cL |]
in
let%map () =
Perf_script.run
~ocaml_exception_info
~trace_scope:Userspace
"ocaml_exceptions_poptrap_corner_case.perf"
in
[%expect
{|
8849/8849 175.567417363: 1 branches:uH: call cb4594 Module.get_229_552_code+0xe4 (foo.so) => cb4140 Module.foo_exn_224_547_code+0x1 (foo.so)
8849/8849 175.567417363: 1 branches:uH: return cb4179 Module.foo_exn_224_547_code+0x39 (foo.so) => cb4599 Module.get_229_552_code+0xe9 (foo.so)
INPUT TRACE STREAM ENDED, any lines printed below this were deferred
-> 0ns BEGIN Module.get_229_552_code [inferred start time]
-> 1ns BEGIN Module.foo_exn_224_547_code
-> 14ns END Module.foo_exn_224_547_code
-> 14ns END Module.get_229_552_code |}]
;;
let%expect_test "the same test case above, as if there was no exception block" =
let ocaml_exception_info =
Magic_trace_lib.Ocaml_exception_info.create
~entertraps:[||]
~pushtraps:[||]
~poptraps:[||]
in
let%map () =
Perf_script.run
~ocaml_exception_info
~trace_scope:Userspace
"ocaml_exceptions_poptrap_corner_case.perf"
in
[%expect
{|
8849/8849 175.567417363: 1 branches:uH: call cb4594 Module.get_229_552_code+0xe4 (foo.so) => cb4140 Module.foo_exn_224_547_code+0x1 (foo.so)
8849/8849 175.567417363: 1 branches:uH: return cb4179 Module.foo_exn_224_547_code+0x39 (foo.so) => cb4599 Module.get_229_552_code+0xe9 (foo.so)
INPUT TRACE STREAM ENDED, any lines printed below this were deferred
-> 0ns BEGIN Module.get_229_552_code [inferred start time]
-> 1ns BEGIN Module.foo_exn_224_547_code
-> 14ns END Module.foo_exn_224_547_code
-> 14ns END Module.get_229_552_code |}]
;;