@@ -2953,40 +2953,60 @@ let rec extract_mod_items
2953
2953
2954
2954
| DW_TAG_structure_type ->
2955
2955
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 ))
2959
2999
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
2965
3002
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
2990
3010
end
2991
3011
2992
3012
| DW_TAG_interface_type ->
0 commit comments