Skip to content

Commit c35dbbe

Browse files
authored
flambda-backend: Fix interaction between probes and ocamldep (#2616)
1 parent 9d39ebf commit c35dbbe

File tree

4 files changed

+85
-43
lines changed

4 files changed

+85
-43
lines changed

parsing/builtin_attributes.ml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -937,3 +937,47 @@ let assume_zero_alloc ~is_check_allowed check : Zero_alloc_utils.Assume_info.t =
937937
Location.prerr_warning loc (Warnings.Attribute_payload (name, msg))
938938
end;
939939
Zero_alloc_utils.Assume_info.none
940+
941+
type tracing_probe =
942+
{ name : string;
943+
name_loc : Location.t;
944+
enabled_at_init : bool;
945+
arg : Parsetree.expression;
946+
}
947+
948+
let get_tracing_probe_payload (payload : Parsetree.payload) =
949+
let ( let* ) = Result.bind in
950+
let* name, name_loc, args =
951+
match payload with
952+
| PStr
953+
([{ pstr_desc =
954+
Pstr_eval
955+
({ pexp_desc =
956+
(Pexp_apply
957+
({ pexp_desc=
958+
(Pexp_constant (Pconst_string(name,_,None)));
959+
pexp_loc = name_loc;
960+
_ }
961+
, args))
962+
; _ }
963+
, _)}]) -> Ok (name, name_loc, args)
964+
| _ -> Error ()
965+
in
966+
let bool_of_string = function
967+
| "true" -> Ok true
968+
| "false" -> Ok false
969+
| _ -> Error ()
970+
in
971+
let* arg, enabled_at_init =
972+
match args with
973+
| [Nolabel, arg] -> Ok (arg, false)
974+
| [Labelled "enabled_at_init",
975+
{ pexp_desc =
976+
Pexp_construct({ txt = Longident.Lident b; _ },
977+
None); _ };
978+
Nolabel, arg] ->
979+
let* enabled_at_init = bool_of_string b in
980+
Ok (arg, enabled_at_init)
981+
| _ -> Error ()
982+
in
983+
Ok { name; name_loc; enabled_at_init; arg }

parsing/builtin_attributes.mli

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,23 @@ val get_zero_alloc_attribute :
272272

273273
val assume_zero_alloc :
274274
is_check_allowed:bool -> zero_alloc_attribute -> Zero_alloc_utils.Assume_info.t
275+
276+
type tracing_probe =
277+
{ name : string;
278+
name_loc : Location.t;
279+
enabled_at_init : bool;
280+
arg : Parsetree.expression;
281+
}
282+
283+
(* Gets the payload of a [probe] extension node. Example syntax of a probe
284+
that's disabled by default:
285+
286+
[%probe "my_probe" arg]
287+
288+
You can use [enabled_at_init] to control whether the probe is enabled
289+
by default:
290+
291+
[%probe "my_probe" ~enabled_at_init:true arg]
292+
*)
293+
val get_tracing_probe_payload :
294+
Parsetree.payload -> (tracing_probe, unit) result

parsing/depend.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,11 @@ let rec add_expr bv exp =
322322
| Pstr_eval ({ pexp_desc = Pexp_construct (c, None) }, _) -> add bv c
323323
| _ -> handle_extension e
324324
end
325+
| Pexp_extension (({ txt = ("probe"|"ocaml.probe"); _ }, payload) as e) ->
326+
begin match Builtin_attributes.get_tracing_probe_payload payload with
327+
| Error () -> handle_extension e
328+
| Ok { arg; _ } -> add_expr bv arg
329+
end
325330
| Pexp_extension e -> handle_extension e
326331
| Pexp_unreachable -> ()
327332

typing/typecore.ml

Lines changed: 16 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6358,49 +6358,22 @@ and type_expect_
63586358
raise (Error (loc, env, Invalid_extension_constructor_payload))
63596359
end
63606360
| Pexp_extension ({ txt = ("probe" | "ocaml.probe"); _ }, payload) ->
6361-
let name, name_loc, args =
6362-
match payload with
6363-
| PStr
6364-
([{ pstr_desc =
6365-
Pstr_eval
6366-
({ pexp_desc =
6367-
(Pexp_apply
6368-
({ pexp_desc=
6369-
(Pexp_constant (Pconst_string(name,_,None)));
6370-
pexp_loc = name_loc;
6371-
_ }
6372-
, args))
6373-
; _ }
6374-
, _)}]) -> name, name_loc, args
6375-
| _ -> raise (Error (loc, env, Probe_format))
6376-
in
6377-
let bool_of_string = function
6378-
| "true" -> true
6379-
| "false" -> false
6380-
| _ -> raise (Error (loc, env, Probe_format))
6381-
in
6382-
let arg, enabled_at_init =
6383-
match args with
6384-
| [Nolabel, arg] -> arg, false
6385-
| [Labelled "enabled_at_init",
6386-
{ pexp_desc =
6387-
Pexp_construct({ txt = Longident.Lident b; _ },
6388-
None); _ };
6389-
Nolabel, arg] -> arg, bool_of_string b
6390-
| _ -> raise (Error (loc, env, Probe_format))
6391-
in
6392-
check_probe_name name name_loc env;
6393-
let env = Env.add_escape_lock Probe env in
6394-
let env = Env.add_share_lock Probe env in
6395-
Env.add_probe name;
6396-
let exp = type_expect env mode_legacy arg
6397-
(mk_expected Predef.type_unit) in
6398-
rue {
6399-
exp_desc = Texp_probe {name; handler=exp; enabled_at_init};
6400-
exp_loc = loc; exp_extra = [];
6401-
exp_type = instance Predef.type_unit;
6402-
exp_attributes = sexp.pexp_attributes;
6403-
exp_env = env }
6361+
begin match Builtin_attributes.get_tracing_probe_payload payload with
6362+
| Error () -> raise (Error (loc, env, Probe_format))
6363+
| Ok { name; name_loc; enabled_at_init; arg; } ->
6364+
check_probe_name name name_loc env;
6365+
let env = Env.add_escape_lock Probe env in
6366+
let env = Env.add_share_lock Probe env in
6367+
Env.add_probe name;
6368+
let exp = type_expect env mode_legacy arg
6369+
(mk_expected Predef.type_unit) in
6370+
rue {
6371+
exp_desc = Texp_probe {name; handler=exp; enabled_at_init};
6372+
exp_loc = loc; exp_extra = [];
6373+
exp_type = instance Predef.type_unit;
6374+
exp_attributes = sexp.pexp_attributes;
6375+
exp_env = env }
6376+
end
64046377
| Pexp_extension ({ txt = ("probe_is_enabled"
64056378
|"ocaml.probe_is_enabled"); _ }, payload) ->
64066379
begin match payload with

0 commit comments

Comments
 (0)