@@ -802,8 +802,12 @@ type parameter_attribute = {
802
802
unbox_param : bool ;
803
803
}
804
804
805
+ type debug_uid = Shape.Uid .t
806
+ let debug_uid_none = Shape.Uid. internal_not_actually_unique
807
+
805
808
type lparam = {
806
809
name : Ident .t ;
810
+ debug_uid : debug_uid ;
807
811
layout : layout ;
808
812
attributes : parameter_attribute ;
809
813
mode : locality_mode
@@ -819,18 +823,18 @@ type lambda =
819
823
| Lconst of structured_constant
820
824
| Lapply of lambda_apply
821
825
| Lfunction of lfunction
822
- | Llet of let_kind * layout * Ident .t * lambda * lambda
823
- | Lmutlet of layout * Ident .t * lambda * lambda
826
+ | Llet of let_kind * layout * Ident .t * debug_uid * lambda * lambda
827
+ | Lmutlet of layout * Ident .t * debug_uid * lambda * lambda
824
828
| Lletrec of rec_binding list * lambda
825
829
| Lprim of primitive * lambda list * scoped_location
826
830
| Lswitch of lambda * lambda_switch * scoped_location * layout
827
831
| Lstringswitch of
828
832
lambda * (string * lambda ) list * lambda option * scoped_location * layout
829
833
| Lstaticraise of static_label * lambda list
830
834
| Lstaticcatch of
831
- lambda * (static_label * (Ident .t * layout ) list ) * lambda
835
+ lambda * (static_label * (Ident .t * debug_uid * layout ) list ) * lambda
832
836
* pop_region * layout
833
- | Ltrywith of lambda * Ident .t * lambda * layout
837
+ | Ltrywith of lambda * Ident .t * debug_uid * lambda * layout
834
838
| Lifthenelse of lambda * lambda * lambda * layout
835
839
| Lsequence of lambda * lambda
836
840
| Lwhile of lambda_while
@@ -846,6 +850,7 @@ type lambda =
846
850
847
851
and rec_binding = {
848
852
id : Ident .t ;
853
+ debug_uid : debug_uid ;
849
854
def : lfunction ;
850
855
}
851
856
@@ -867,6 +872,7 @@ and lambda_while =
867
872
868
873
and lambda_for =
869
874
{ for_id : Ident .t ;
875
+ for_debug_uid : debug_uid ;
870
876
for_loc : scoped_location ;
871
877
for_from : lambda ;
872
878
for_to : lambda ;
@@ -1092,20 +1098,20 @@ let make_key e =
1092
1098
Lapply {ap with ap_func = tr_rec env ap.ap_func;
1093
1099
ap_args = tr_recs env ap.ap_args;
1094
1100
ap_loc = Loc_unknown }
1095
- | Llet (Alias,_k ,x ,ex ,e ) -> (* Ignore aliases -> substitute *)
1101
+ | Llet (Alias,_k ,x ,_x_duid , ex ,e ) -> (* Ignore aliases -> substitute *)
1096
1102
let ex = tr_rec env ex in
1097
1103
tr_rec (Ident. add x ex env) e
1098
- | Llet ((Strict | StrictOpt ),_k ,x ,ex ,Lvar v ) when Ident. same v x ->
1104
+ | Llet ((Strict | StrictOpt ),_k ,x ,_x_duid , ex ,Lvar v ) when Ident. same v x ->
1099
1105
tr_rec env ex
1100
- | Llet (str ,k ,x ,ex ,e ) ->
1106
+ | Llet (str ,k ,x ,x_duid , ex ,e ) ->
1101
1107
(* Because of side effects, keep other lets with normalized names *)
1102
1108
let ex = tr_rec env ex in
1103
1109
let y = make_key x in
1104
- Llet (str,k,y,ex,tr_rec (Ident. add x (Lvar y) env) e)
1105
- | Lmutlet (k ,x ,ex ,e ) ->
1110
+ Llet (str,k,y,x_duid, ex,tr_rec (Ident. add x (Lvar y) env) e)
1111
+ | Lmutlet (k ,x ,x_duid , ex ,e ) ->
1106
1112
let ex = tr_rec env ex in
1107
1113
let y = make_key x in
1108
- Lmutlet (k,y,ex,tr_rec (Ident. add x (Lmutvar y) env) e)
1114
+ Lmutlet (k,y,x_duid, ex,tr_rec (Ident. add x (Lmutvar y) env) e)
1109
1115
| Lprim (p ,es ,_ ) ->
1110
1116
Lprim (p,tr_recs env es, Loc_unknown )
1111
1117
| Lswitch (e ,sw ,loc ,kind ) ->
@@ -1120,8 +1126,8 @@ let make_key e =
1120
1126
Lstaticraise (i,tr_recs env es)
1121
1127
| Lstaticcatch (e1 ,xs ,e2 , r , kind ) ->
1122
1128
Lstaticcatch (tr_rec env e1,xs,tr_rec env e2, r, kind)
1123
- | Ltrywith (e1 ,x ,e2 ,kind ) ->
1124
- Ltrywith (tr_rec env e1,x,tr_rec env e2,kind)
1129
+ | Ltrywith (e1 ,x ,x_duid , e2 ,kind ) ->
1130
+ Ltrywith (tr_rec env e1,x,x_duid, tr_rec env e2,kind)
1125
1131
| Lifthenelse (cond ,ifso ,ifnot ,kind ) ->
1126
1132
Lifthenelse (tr_rec env cond,tr_rec env ifso,tr_rec env ifnot,kind)
1127
1133
| Lsequence (e1 ,e2 ) ->
@@ -1163,7 +1169,8 @@ let name_lambda strict arg layout fn =
1163
1169
Lvar id -> fn id
1164
1170
| _ ->
1165
1171
let id = Ident. create_local " let" in
1166
- Llet (strict, layout, id, arg, fn id)
1172
+ let id_debug_uid = debug_uid_none in
1173
+ Llet (strict, layout, id, id_debug_uid, arg, fn id)
1167
1174
1168
1175
let name_lambda_list args fn =
1169
1176
let rec name_list names = function
@@ -1172,7 +1179,10 @@ let name_lambda_list args fn =
1172
1179
name_list (arg :: names) rem
1173
1180
| (arg , layout ) :: rem ->
1174
1181
let id = Ident. create_local " let" in
1175
- Llet (Strict , layout, id, arg, name_list (Lvar id :: names) rem) in
1182
+ let id_debug_uid = debug_uid_none in
1183
+ Llet (Strict , layout, id, id_debug_uid, arg,
1184
+ name_list (Lvar id :: names) rem)
1185
+ in
1176
1186
name_list [] args
1177
1187
1178
1188
@@ -1188,8 +1198,8 @@ let shallow_iter ~tail ~non_tail:f = function
1188
1198
f fn; List. iter f args
1189
1199
| Lfunction {body} ->
1190
1200
f body
1191
- | Llet (_, _k, _id, arg, body)
1192
- | Lmutlet (_k , _id , arg , body ) ->
1201
+ | Llet (_, _k, _id, _duid, arg, body)
1202
+ | Lmutlet (_k , _id , _duid , arg , body ) ->
1193
1203
f arg; tail body
1194
1204
| Lletrec (decl , body ) ->
1195
1205
tail body;
@@ -1213,7 +1223,7 @@ let shallow_iter ~tail ~non_tail:f = function
1213
1223
List. iter f args
1214
1224
| Lstaticcatch (e1 , _ , e2 , _ , _kind ) ->
1215
1225
tail e1; tail e2
1216
- | Ltrywith (e1 , _ , e2 ,_ ) ->
1226
+ | Ltrywith (e1 , _ , _ , e2 ,_ ) ->
1217
1227
f e1; tail e2
1218
1228
| Lifthenelse (e1 , e2 , e3 ,_ ) ->
1219
1229
f e1; tail e2; tail e3
@@ -1248,8 +1258,8 @@ let rec free_variables = function
1248
1258
| Lfunction {body; params} ->
1249
1259
Ident.Set. diff (free_variables body)
1250
1260
(Ident.Set. of_list (List. map (fun p -> p.name) params))
1251
- | Llet (_, _k, id, arg, body)
1252
- | Lmutlet (_k , id , arg , body ) ->
1261
+ | Llet (_, _k, id, _duid, arg, body)
1262
+ | Lmutlet (_k , id , _duid , arg , body ) ->
1253
1263
Ident.Set. union
1254
1264
(free_variables arg)
1255
1265
(Ident.Set. remove id (free_variables body))
@@ -1288,9 +1298,9 @@ let rec free_variables = function
1288
1298
Ident.Set. union
1289
1299
(Ident.Set. diff
1290
1300
(free_variables handler)
1291
- (Ident.Set. of_list (List. map fst params)))
1301
+ (Ident.Set. of_list (List. map fst3 params)))
1292
1302
(free_variables body)
1293
- | Ltrywith (body , param , handler , _ ) ->
1303
+ | Ltrywith (body , param , _duid , handler , _ ) ->
1294
1304
Ident.Set. union
1295
1305
(Ident.Set. remove
1296
1306
param
@@ -1340,15 +1350,15 @@ let staticfail = Lstaticraise (0,[])
1340
1350
1341
1351
let rec is_guarded = function
1342
1352
| Lifthenelse (_cond , _body , Lstaticraise (0 ,[] ),_ ) -> true
1343
- | Llet (_str , _k , _id , _lam , body ) -> is_guarded body
1353
+ | Llet (_str , _k , _id , _duid , _lam , body ) -> is_guarded body
1344
1354
| Levent (lam , _ev ) -> is_guarded lam
1345
1355
| _ -> false
1346
1356
1347
1357
let rec patch_guarded patch = function
1348
1358
| Lifthenelse (cond , body , Lstaticraise (0 ,[] ), kind ) ->
1349
1359
Lifthenelse (cond, body, patch, kind)
1350
- | Llet (str , k , id , lam , body ) ->
1351
- Llet (str, k, id, lam, patch_guarded patch body)
1360
+ | Llet (str , k , id , duid , lam , body ) ->
1361
+ Llet (str, k, id, duid, lam, patch_guarded patch body)
1352
1362
| Levent (lam , ev ) ->
1353
1363
Levent (patch_guarded patch lam, ev)
1354
1364
| _ -> fatal_error " Lambda.patch_guarded"
@@ -1445,26 +1455,26 @@ let build_substs update_env ?(freshen_bound_variables = false) s =
1445
1455
[l] with all the bound variables of the input term in the current
1446
1456
scope, mapped to either themselves or freshened versions of
1447
1457
themselves when [freshen_bound_variables] is set. *)
1448
- let bind id l =
1458
+ let bind id duid l =
1449
1459
let id' = if not freshen_bound_variables then id else Ident. rename id in
1450
- id', Ident.Map. add id id' l
1460
+ id', duid, Ident.Map. add id id' l
1451
1461
in
1452
1462
let bind_many ids l =
1453
- List. fold_right (fun (id , rhs ) (ids' , l ) ->
1454
- let id', l = bind id l in
1455
- ((id', rhs) :: ids' , l)
1463
+ List. fold_right (fun (id , duid , rhs ) (ids' , l ) ->
1464
+ let id', duid', l = bind id duid l in
1465
+ ((id', duid', rhs) :: ids' , l)
1456
1466
) ids ([] , l)
1457
1467
in
1458
1468
let bind_params params l =
1459
- List. fold_right (fun p (params' , l ) ->
1460
- let name', l = bind p.name l in
1461
- ({ p with name = name' } :: params' , l)
1469
+ List. fold_right (fun ( p : lparam ) (params' , l ) ->
1470
+ let name', duid', l = bind p.name p.debug_uid l in
1471
+ ({ p with name = name'; debug_uid = duid' } :: params' , l)
1462
1472
) params ([] , l)
1463
1473
in
1464
1474
let bind_rec ids l =
1465
- List. fold_right (fun rb (ids' , l ) ->
1466
- let id', l = bind rb.id l in
1467
- ({ rb with id = id' } :: ids' , l)
1475
+ List. fold_right (fun ( rb : rec_binding ) (ids' , l ) ->
1476
+ let id', duid', l = bind rb.id rb.debug_uid l in
1477
+ ({ rb with id = id'; debug_uid = duid' } :: ids' , l)
1468
1478
) ids ([] , l)
1469
1479
in
1470
1480
let rec subst s l lam =
@@ -1492,12 +1502,12 @@ let build_substs update_env ?(freshen_bound_variables = false) s =
1492
1502
ap_args = subst_list s l ap.ap_args}
1493
1503
| Lfunction lf ->
1494
1504
Lfunction (subst_lfun s l lf)
1495
- | Llet (str , k , id , arg , body ) ->
1496
- let id, l' = bind id l in
1497
- Llet (str, k, id, subst s l arg, subst s l' body)
1498
- | Lmutlet (k , id , arg , body ) ->
1499
- let id, l' = bind id l in
1500
- Lmutlet (k, id, subst s l arg, subst s l' body)
1505
+ | Llet (str , k , id , duid , arg , body ) ->
1506
+ let id, duid, l' = bind id duid l in
1507
+ Llet (str, k, id, duid, subst s l arg, subst s l' body)
1508
+ | Lmutlet (k , id , duid , arg , body ) ->
1509
+ let id, duid, l' = bind id duid l in
1510
+ Lmutlet (k, id, duid, subst s l arg, subst s l' body)
1501
1511
| Lletrec (decl , body ) ->
1502
1512
let decl, l' = bind_rec decl l in
1503
1513
Lletrec (List. map (subst_decl s l') decl, subst s l' body)
@@ -1519,17 +1529,18 @@ let build_substs update_env ?(freshen_bound_variables = false) s =
1519
1529
let params, l' = bind_many params l in
1520
1530
Lstaticcatch (subst s l body, (id, params),
1521
1531
subst s l' handler, r, kind)
1522
- | Ltrywith (body , exn , handler ,kind ) ->
1523
- let exn , l' = bind exn l in
1524
- Ltrywith (subst s l body, exn , subst s l' handler,kind)
1532
+ | Ltrywith (body , exn , duid , handler ,kind ) ->
1533
+ let exn , duid, l' = bind exn duid l in
1534
+ Ltrywith (subst s l body, exn , duid, subst s l' handler,kind)
1525
1535
| Lifthenelse (e1 , e2 , e3 ,kind ) ->
1526
1536
Lifthenelse (subst s l e1, subst s l e2, subst s l e3,kind)
1527
1537
| Lsequence (e1 , e2 ) -> Lsequence (subst s l e1, subst s l e2)
1528
1538
| Lwhile lw -> Lwhile { wh_cond = subst s l lw.wh_cond;
1529
1539
wh_body = subst s l lw.wh_body}
1530
1540
| Lfor lf ->
1531
- let for_id, l' = bind lf.for_id l in
1541
+ let for_id, for_duid, l' = bind lf.for_id lf.for_debug_uid l in
1532
1542
Lfor {lf with for_id;
1543
+ for_debug_uid = for_duid;
1533
1544
for_from = subst s l lf.for_from;
1534
1545
for_to = subst s l lf.for_to;
1535
1546
for_body = subst s l' lf.for_body}
@@ -1640,10 +1651,10 @@ let shallow_map ~tail ~non_tail:f = function
1640
1651
}
1641
1652
| Lfunction lfun ->
1642
1653
Lfunction (map_lfunction f lfun)
1643
- | Llet (str , layout , v , e1 , e2 ) ->
1644
- Llet (str, layout, v, f e1, tail e2)
1645
- | Lmutlet (layout , v , e1 , e2 ) ->
1646
- Lmutlet (layout, v, f e1, tail e2)
1654
+ | Llet (str , layout , v , v_duid , e1 , e2 ) ->
1655
+ Llet (str, layout, v, v_duid, f e1, tail e2)
1656
+ | Lmutlet (layout , v , v_duid , e1 , e2 ) ->
1657
+ Lmutlet (layout, v, v_duid, f e1, tail e2)
1647
1658
| Lletrec (idel , e2 ) ->
1648
1659
Lletrec
1649
1660
(List. map (fun rb ->
@@ -1674,8 +1685,8 @@ let shallow_map ~tail ~non_tail:f = function
1674
1685
Lstaticraise (i, List. map f args)
1675
1686
| Lstaticcatch (body , id , handler , r , layout ) ->
1676
1687
Lstaticcatch (tail body, id, tail handler, r, layout)
1677
- | Ltrywith (e1 , v , e2 , layout ) ->
1678
- Ltrywith (f e1, v, tail e2, layout)
1688
+ | Ltrywith (e1 , v , duid , e2 , layout ) ->
1689
+ Ltrywith (f e1, v, duid, tail e2, layout)
1679
1690
| Lifthenelse (e1 , e2 , e3 , layout ) ->
1680
1691
Lifthenelse (f e1, tail e2, tail e3, layout)
1681
1692
| Lsequence (e1 , e2 ) ->
@@ -1706,10 +1717,10 @@ let map f =
1706
1717
1707
1718
(* To let-bind expressions to variables *)
1708
1719
1709
- let bind_with_layout str (var , layout ) exp body =
1720
+ let bind_with_layout str (var , duid , layout ) exp body =
1710
1721
match exp with
1711
1722
Lvar var' when Ident. same var var' -> body
1712
- | _ -> Llet (str, layout, var, exp, body)
1723
+ | _ -> Llet (str, layout, var, duid, exp, body)
1713
1724
1714
1725
let negate_integer_comparison = function
1715
1726
| Ceq -> Cne
@@ -2421,7 +2432,7 @@ let compute_expr_layout free_vars_kind lam =
2421
2432
| Lfunction _ -> layout_function
2422
2433
| Lapply { ap_result_layout; _ } -> ap_result_layout
2423
2434
| Lsend (_ , _ , _ , _ , _ , _ , _ , layout ) -> layout
2424
- | Llet (_ , kind , id , _ , body ) | Lmutlet (kind , id , _ , body ) ->
2435
+ | Llet (_ , kind , id , _duid , _ , body ) | Lmutlet (kind , id , _duid , _ , body ) ->
2425
2436
compute_expr_layout (Ident.Map. add id kind kinds) body
2426
2437
| Lletrec (defs , body ) ->
2427
2438
let kinds =
@@ -2432,7 +2443,7 @@ let compute_expr_layout free_vars_kind lam =
2432
2443
| Lprim (p , _ , _ ) ->
2433
2444
primitive_result_layout p
2434
2445
| Lswitch (_, _, _, kind) | Lstringswitch (_, _, _, _, kind)
2435
- | Lstaticcatch (_, _, _, _, kind) | Ltrywith (_, _, _, kind)
2446
+ | Lstaticcatch (_, _, _, _, kind) | Ltrywith (_, _, _, _, kind)
2436
2447
| Lifthenelse (_ , _ , _ , kind ) | Lregion (_ , kind ) ->
2437
2448
kind
2438
2449
| Lstaticraise (_ , _ ) ->
@@ -2555,8 +2566,8 @@ let rec try_to_find_location lam =
2555
2566
| Lsend (_, _, _, _, _, _, loc, _)
2556
2567
| Levent (_ , { lev_loc = loc ; _ } ) ->
2557
2568
loc
2558
- | Llet (_, _, _, lam, _)
2559
- | Lmutlet (_, _, lam, _)
2569
+ | Llet (_, _, _, _, lam, _)
2570
+ | Lmutlet (_, _, _, lam, _)
2560
2571
| Lifthenelse (lam, _, _, _)
2561
2572
| Lstaticcatch (lam, _, _, _, _)
2562
2573
| Lstaticraise (_, lam :: _)
@@ -2566,7 +2577,7 @@ let rec try_to_find_location lam =
2566
2577
| Lifused (_, lam)
2567
2578
| Lregion (lam, _)
2568
2579
| Lexclave lam
2569
- | Ltrywith (lam , _ , _ , _ ) ->
2580
+ | Ltrywith (lam , _ , _ , _ , _ ) ->
2570
2581
try_to_find_location lam
2571
2582
| Lvar _ | Lmutvar _ | Lconst _ | Lletrec _ | Lstaticraise (_ , [] ) ->
2572
2583
Debuginfo.Scoped_location. Loc_unknown
0 commit comments