-
Notifications
You must be signed in to change notification settings - Fork 98
/
Copy pathocaml_exceptions.ml
138 lines (130 loc) · 5.91 KB
/
ocaml_exceptions.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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 |}]
;;