Skip to content

Commit 88c9759

Browse files
committed
Read definitions of tag types in the DWARF
1 parent 1c0c242 commit 88c9759

File tree

1 file changed

+52
-32
lines changed

1 file changed

+52
-32
lines changed

src/boot/me/dwarf.ml

+52-32
Original file line numberDiff line numberDiff line change
@@ -2953,40 +2953,60 @@ let rec extract_mod_items
29532953

29542954
| DW_TAG_structure_type ->
29552955
begin
2956-
let is_num_idx s =
2957-
let len = String.length s in
2958-
if len >= 2 && s.[0] = '_'
2956+
if Array.length die.die_children == 2 &&
2957+
die.die_children.(1).die_tag =
2958+
DW_TAG_variant_part then begin
2959+
(* FIXME: will infinite loop on iso-recursive tags! *)
2960+
let ty_tag = Hashtbl.create 0 in
2961+
let variant_part = die.die_children.(1) in
2962+
let parse_variant die =
2963+
assert (die.die_tag = DW_TAG_variant);
2964+
assert (Array.length die.die_children == 1);
2965+
let name = Ast.NAME_base (Ast.BASE_ident (get_name die)) in
2966+
let ty_tup =
2967+
match get_ty die.die_children.(0) with
2968+
Ast.TY_tup ty_tup -> ty_tup
2969+
| _ -> bug () "tag variant of non-tuple type"
2970+
in
2971+
Hashtbl.add ty_tag name ty_tup
2972+
in
2973+
Array.iter parse_variant variant_part.die_children;
2974+
Ast.TY_tag ty_tag
2975+
end else
2976+
let is_num_idx s =
2977+
let len = String.length s in
2978+
if len >= 2 && s.[0] = '_'
2979+
then
2980+
let ok = ref true in
2981+
String.iter
2982+
(fun c -> ok := (!ok) && '0' <= c && c <= '9')
2983+
(String.sub s 1 (len-1));
2984+
!ok
2985+
else
2986+
false
2987+
in
2988+
let members = arr_map_partial
2989+
die.die_children
2990+
begin
2991+
fun child ->
2992+
if child.die_tag = DW_TAG_member
2993+
then Some child
2994+
else None
2995+
end
2996+
in
2997+
if Array.length members == 0 ||
2998+
is_num_idx (get_name members.(0))
29592999
then
2960-
let ok = ref true in
2961-
String.iter
2962-
(fun c -> ok := (!ok) && '0' <= c && c <= '9')
2963-
(String.sub s 1 (len-1));
2964-
!ok
3000+
let tys = Array.map get_referenced_ty members in
3001+
Ast.TY_tup tys
29653002
else
2966-
false
2967-
in
2968-
let members = arr_map_partial
2969-
die.die_children
2970-
begin
2971-
fun child ->
2972-
if child.die_tag = DW_TAG_member
2973-
then Some child
2974-
else None
2975-
end
2976-
in
2977-
if Array.length members == 0 ||
2978-
is_num_idx (get_name members.(0))
2979-
then
2980-
let tys = Array.map get_referenced_ty members in
2981-
Ast.TY_tup tys
2982-
else
2983-
let entries =
2984-
Array.map
2985-
(fun member_die -> ((get_name member_die),
2986-
(get_referenced_ty member_die)))
2987-
members
2988-
in
2989-
Ast.TY_rec entries
3003+
let entries =
3004+
Array.map
3005+
(fun member_die -> ((get_name member_die),
3006+
(get_referenced_ty member_die)))
3007+
members
3008+
in
3009+
Ast.TY_rec entries
29903010
end
29913011

29923012
| DW_TAG_interface_type ->

0 commit comments

Comments
 (0)