d3a25d37创建于 2024年6月4日历史提交
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      |}]
;;