@@ -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,8 @@ 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, name_list (Lvar id :: names) rem) in
1176
1184
name_list [] args
1177
1185
1178
1186
@@ -1188,8 +1196,8 @@ let shallow_iter ~tail ~non_tail:f = function
1188
1196
f fn; List. iter f args
1189
1197
| Lfunction {body} ->
1190
1198
f body
1191
- | Llet (_, _k, _id, arg, body)
1192
- | Lmutlet (_k , _id , arg , body ) ->
1199
+ | Llet (_, _k, _id, _duid, arg, body)
1200
+ | Lmutlet (_k , _id , _duid , arg , body ) ->
1193
1201
f arg; tail body
1194
1202
| Lletrec (decl , body ) ->
1195
1203
tail body;
@@ -1213,7 +1221,7 @@ let shallow_iter ~tail ~non_tail:f = function
1213
1221
List. iter f args
1214
1222
| Lstaticcatch (e1 , _ , e2 , _ , _kind ) ->
1215
1223
tail e1; tail e2
1216
- | Ltrywith (e1 , _ , e2 ,_ ) ->
1224
+ | Ltrywith (e1 , _ , _ , e2 ,_ ) ->
1217
1225
f e1; tail e2
1218
1226
| Lifthenelse (e1 , e2 , e3 ,_ ) ->
1219
1227
f e1; tail e2; tail e3
@@ -1248,8 +1256,8 @@ let rec free_variables = function
1248
1256
| Lfunction {body; params} ->
1249
1257
Ident.Set. diff (free_variables body)
1250
1258
(Ident.Set. of_list (List. map (fun p -> p.name) params))
1251
- | Llet (_, _k, id, arg, body)
1252
- | Lmutlet (_k , id , arg , body ) ->
1259
+ | Llet (_, _k, id, _duid, arg, body)
1260
+ | Lmutlet (_k , id , _duid , arg , body ) ->
1253
1261
Ident.Set. union
1254
1262
(free_variables arg)
1255
1263
(Ident.Set. remove id (free_variables body))
@@ -1288,9 +1296,9 @@ let rec free_variables = function
1288
1296
Ident.Set. union
1289
1297
(Ident.Set. diff
1290
1298
(free_variables handler)
1291
- (Ident.Set. of_list (List. map fst params)))
1299
+ (Ident.Set. of_list (List. map fst3 params)))
1292
1300
(free_variables body)
1293
- | Ltrywith (body , param , handler , _ ) ->
1301
+ | Ltrywith (body , param , _duid , handler , _ ) ->
1294
1302
Ident.Set. union
1295
1303
(Ident.Set. remove
1296
1304
param
@@ -1340,15 +1348,15 @@ let staticfail = Lstaticraise (0,[])
1340
1348
1341
1349
let rec is_guarded = function
1342
1350
| Lifthenelse (_cond , _body , Lstaticraise (0 ,[] ),_ ) -> true
1343
- | Llet (_str , _k , _id , _lam , body ) -> is_guarded body
1351
+ | Llet (_str , _k , _id , _duid , _lam , body ) -> is_guarded body
1344
1352
| Levent (lam , _ev ) -> is_guarded lam
1345
1353
| _ -> false
1346
1354
1347
1355
let rec patch_guarded patch = function
1348
1356
| Lifthenelse (cond , body , Lstaticraise (0 ,[] ), kind ) ->
1349
1357
Lifthenelse (cond, body, patch, kind)
1350
- | Llet (str , k , id , lam , body ) ->
1351
- Llet (str, k, id, lam, patch_guarded patch body)
1358
+ | Llet (str , k , id , duid , lam , body ) ->
1359
+ Llet (str, k, id, duid, lam, patch_guarded patch body)
1352
1360
| Levent (lam , ev ) ->
1353
1361
Levent (patch_guarded patch lam, ev)
1354
1362
| _ -> fatal_error " Lambda.patch_guarded"
@@ -1445,26 +1453,29 @@ let build_substs update_env ?(freshen_bound_variables = false) s =
1445
1453
[l] with all the bound variables of the input term in the current
1446
1454
scope, mapped to either themselves or freshened versions of
1447
1455
themselves when [freshen_bound_variables] is set. *)
1448
- let bind id l =
1456
+ let bind id duid l =
1449
1457
let id' = if not freshen_bound_variables then id else Ident. rename id in
1450
- id', Ident.Map. add id id' l
1458
+ (* CR sspies: If [freshen_bound_variables] is set, this code duplicates
1459
+ the debug uids. [freshen_bound_variables] is currently only set by
1460
+ [duplicate] below, which is called from [tmc.ml]. *)
1461
+ id', duid, Ident.Map. add id id' l
1451
1462
in
1452
1463
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)
1464
+ List. fold_right (fun (id , duid , rhs ) (ids' , l ) ->
1465
+ let id', duid', l = bind id duid l in
1466
+ ((id', duid', rhs) :: ids' , l)
1456
1467
) ids ([] , l)
1457
1468
in
1458
1469
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)
1470
+ List. fold_right (fun ( p : lparam ) (params' , l ) ->
1471
+ let name', duid', l = bind p.name p.debug_uid l in
1472
+ ({ p with name = name'; debug_uid = duid' } :: params' , l)
1462
1473
) params ([] , l)
1463
1474
in
1464
1475
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)
1476
+ List. fold_right (fun ( rb : rec_binding ) (ids' , l ) ->
1477
+ let id', duid', l = bind rb.id rb.debug_uid l in
1478
+ ({ rb with id = id'; debug_uid = duid' } :: ids' , l)
1468
1479
) ids ([] , l)
1469
1480
in
1470
1481
let rec subst s l lam =
@@ -1492,12 +1503,12 @@ let build_substs update_env ?(freshen_bound_variables = false) s =
1492
1503
ap_args = subst_list s l ap.ap_args}
1493
1504
| Lfunction lf ->
1494
1505
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)
1506
+ | Llet (str , k , id , duid , arg , body ) ->
1507
+ let id, duid, l' = bind id duid l in
1508
+ Llet (str, k, id, duid, subst s l arg, subst s l' body)
1509
+ | Lmutlet (k , id , duid , arg , body ) ->
1510
+ let id, duid, l' = bind id duid l in
1511
+ Lmutlet (k, id, duid, subst s l arg, subst s l' body)
1501
1512
| Lletrec (decl , body ) ->
1502
1513
let decl, l' = bind_rec decl l in
1503
1514
Lletrec (List. map (subst_decl s l') decl, subst s l' body)
@@ -1519,17 +1530,18 @@ let build_substs update_env ?(freshen_bound_variables = false) s =
1519
1530
let params, l' = bind_many params l in
1520
1531
Lstaticcatch (subst s l body, (id, params),
1521
1532
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)
1533
+ | Ltrywith (body , exn , duid , handler ,kind ) ->
1534
+ let exn , duid, l' = bind exn duid l in
1535
+ Ltrywith (subst s l body, exn , duid, subst s l' handler,kind)
1525
1536
| Lifthenelse (e1 , e2 , e3 ,kind ) ->
1526
1537
Lifthenelse (subst s l e1, subst s l e2, subst s l e3,kind)
1527
1538
| Lsequence (e1 , e2 ) -> Lsequence (subst s l e1, subst s l e2)
1528
1539
| Lwhile lw -> Lwhile { wh_cond = subst s l lw.wh_cond;
1529
1540
wh_body = subst s l lw.wh_body}
1530
1541
| Lfor lf ->
1531
- let for_id, l' = bind lf.for_id l in
1542
+ let for_id, for_duid, l' = bind lf.for_id lf.for_debug_uid l in
1532
1543
Lfor {lf with for_id;
1544
+ for_debug_uid = for_duid;
1533
1545
for_from = subst s l lf.for_from;
1534
1546
for_to = subst s l lf.for_to;
1535
1547
for_body = subst s l' lf.for_body}
@@ -1640,10 +1652,10 @@ let shallow_map ~tail ~non_tail:f = function
1640
1652
}
1641
1653
| Lfunction lfun ->
1642
1654
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)
1655
+ | Llet (str , layout , v , v_duid , e1 , e2 ) ->
1656
+ Llet (str, layout, v, v_duid, f e1, tail e2)
1657
+ | Lmutlet (layout , v , v_duid , e1 , e2 ) ->
1658
+ Lmutlet (layout, v, v_duid, f e1, tail e2)
1647
1659
| Lletrec (idel , e2 ) ->
1648
1660
Lletrec
1649
1661
(List. map (fun rb ->
@@ -1674,8 +1686,8 @@ let shallow_map ~tail ~non_tail:f = function
1674
1686
Lstaticraise (i, List. map f args)
1675
1687
| Lstaticcatch (body , id , handler , r , layout ) ->
1676
1688
Lstaticcatch (tail body, id, tail handler, r, layout)
1677
- | Ltrywith (e1 , v , e2 , layout ) ->
1678
- Ltrywith (f e1, v, tail e2, layout)
1689
+ | Ltrywith (e1 , v , duid , e2 , layout ) ->
1690
+ Ltrywith (f e1, v, duid, tail e2, layout)
1679
1691
| Lifthenelse (e1 , e2 , e3 , layout ) ->
1680
1692
Lifthenelse (f e1, tail e2, tail e3, layout)
1681
1693
| Lsequence (e1 , e2 ) ->
@@ -1706,10 +1718,12 @@ let map f =
1706
1718
1707
1719
(* To let-bind expressions to variables *)
1708
1720
1709
- let bind_with_layout str (var , layout ) exp body =
1721
+ let bind_with_layout str (var , duid , layout ) exp body =
1710
1722
match exp with
1711
1723
Lvar var' when Ident. same var var' -> body
1712
- | _ -> Llet (str, layout, var, exp, body)
1724
+ (* CR sspies: This implicitly assumes that they have the same debug uid,
1725
+ which is probably correct.*)
1726
+ | _ -> Llet (str, layout, var, duid, exp, body)
1713
1727
1714
1728
let negate_integer_comparison = function
1715
1729
| Ceq -> Cne
@@ -2421,7 +2435,7 @@ let compute_expr_layout free_vars_kind lam =
2421
2435
| Lfunction _ -> layout_function
2422
2436
| Lapply { ap_result_layout; _ } -> ap_result_layout
2423
2437
| Lsend (_ , _ , _ , _ , _ , _ , _ , layout ) -> layout
2424
- | Llet (_ , kind , id , _ , body ) | Lmutlet (kind , id , _ , body ) ->
2438
+ | Llet (_ , kind , id , _duid , _ , body ) | Lmutlet (kind , id , _duid , _ , body ) ->
2425
2439
compute_expr_layout (Ident.Map. add id kind kinds) body
2426
2440
| Lletrec (defs , body ) ->
2427
2441
let kinds =
@@ -2432,7 +2446,7 @@ let compute_expr_layout free_vars_kind lam =
2432
2446
| Lprim (p , _ , _ ) ->
2433
2447
primitive_result_layout p
2434
2448
| Lswitch (_, _, _, kind) | Lstringswitch (_, _, _, _, kind)
2435
- | Lstaticcatch (_, _, _, _, kind) | Ltrywith (_, _, _, kind)
2449
+ | Lstaticcatch (_, _, _, _, kind) | Ltrywith (_, _, _, _, kind)
2436
2450
| Lifthenelse (_ , _ , _ , kind ) | Lregion (_ , kind ) ->
2437
2451
kind
2438
2452
| Lstaticraise (_ , _ ) ->
@@ -2555,8 +2569,8 @@ let rec try_to_find_location lam =
2555
2569
| Lsend (_, _, _, _, _, _, loc, _)
2556
2570
| Levent (_ , { lev_loc = loc ; _ } ) ->
2557
2571
loc
2558
- | Llet (_, _, _, lam, _)
2559
- | Lmutlet (_, _, lam, _)
2572
+ | Llet (_, _, _, _, lam, _)
2573
+ | Lmutlet (_, _, _, lam, _)
2560
2574
| Lifthenelse (lam, _, _, _)
2561
2575
| Lstaticcatch (lam, _, _, _, _)
2562
2576
| Lstaticraise (_, lam :: _)
@@ -2566,7 +2580,7 @@ let rec try_to_find_location lam =
2566
2580
| Lifused (_, lam)
2567
2581
| Lregion (lam, _)
2568
2582
| Lexclave lam
2569
- | Ltrywith (lam , _ , _ , _ ) ->
2583
+ | Ltrywith (lam , _ , _ , _ , _ ) ->
2570
2584
try_to_find_location lam
2571
2585
| Lvar _ | Lmutvar _ | Lconst _ | Lletrec _ | Lstaticraise (_ , [] ) ->
2572
2586
Debuginfo.Scoped_location. Loc_unknown
0 commit comments