diff options
author | Bernhard Schommer <bernhardschommer@gmail.com> | 2015-08-26 12:47:25 +0200 |
---|---|---|
committer | Bernhard Schommer <bernhardschommer@gmail.com> | 2015-08-26 12:47:25 +0200 |
commit | e0f1a60f5ff9d2efc8b106b5167f0170b8795dbe (patch) | |
tree | fe5c4c0b3da0b30841eef8184dade6e39e2c7407 /debug/CtoDwarf.ml | |
parent | 8d2e4a51d56b7f4d3673a5132edd1adb37a14295 (diff) | |
parent | 7cfaf10b604372044f53cb65b03df33c23f8b26d (diff) | |
download | compcert-e0f1a60f5ff9d2efc8b106b5167f0170b8795dbe.tar.gz compcert-e0f1a60f5ff9d2efc8b106b5167f0170b8795dbe.zip |
Merge branch 'master' into debug_locations
Conflicts:
debug/CtoDwarf.ml
debug/DwarfPrinter.ml
debug/DwarfTypes.mli
Diffstat (limited to 'debug/CtoDwarf.ml')
-rw-r--r-- | debug/CtoDwarf.ml | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/debug/CtoDwarf.ml b/debug/CtoDwarf.ml index ee594d9e..063b0823 100644 --- a/debug/CtoDwarf.ml +++ b/debug/CtoDwarf.ml @@ -187,29 +187,33 @@ and fun_to_dwarf_tag rt args = s.id,((s::others)@et) (* Generate a dwarf tag for the given array type *) -and array_to_dwarf_tag child size = +and array_to_dwarf_tag child size = + let append_opt a b = + match a with + | None -> b + | Some a -> a::b in let size_to_subrange s = - let b = (match s with + match s with | None -> None | Some i -> - let i = Int64.to_int i in - Some (BoundConst i)) in - let s = { - subrange_type = None; - subrange_upper_bound = b; - } in - new_entry (DW_TAG_subrange_type s) in + let i = Int64.to_int (Int64.sub i Int64.one) in + let s = + { + subrange_type = None; + subrange_upper_bound = Some (BoundConst i); + } in + Some (new_entry (DW_TAG_subrange_type s)) in let rec aux t = (match t with | TArray (child,size,_) -> let sub = size_to_subrange size in let t,c,e = aux child in - t,sub::c,e + t,append_opt sub c,e | _ -> let t,e = type_to_dwarf t in t,[],e) in let t,children,e = aux child in let sub = size_to_subrange size in - let children = List.rev (sub::children) in + let children = List.rev (append_opt sub children) in let arr = { array_type_file_loc = None; array_type = t; @@ -271,23 +275,30 @@ and attr_type_to_dwarf typ typ_string = (* Translate a given type to its dwarf representation *) and type_to_dwarf (typ: typ): int * dw_entry list = - let typ = strip_attributes typ in - let typ_string = typ_to_string typ in - try - Hashtbl.find type_table typ_string,[] - with Not_found -> - attr_type_to_dwarf typ typ_string + match typ with + | TStruct (i,_) + | TUnion (i,_) + | TEnum (i,_) -> + let t = get_composite_type i.stamp in + t,[] + | _ -> + let typ = strip_attributes typ in + let typ_string = typ_to_string typ in + try + Hashtbl.find type_table typ_string,[] + with Not_found -> + attr_type_to_dwarf typ typ_string (* Translate a typedef to its corresponding dwarf representation *) let typedef_to_dwarf gloc (name,t) = let i,t = type_to_dwarf t in - Hashtbl.add typedef_table name i; let td = { typedef_file_loc = gloc; typedef_name = name; typedef_type = i; } in let td = new_entry (DW_TAG_typedef td) in + Hashtbl.add typedef_table name td.id; td::t (* Translate a global var to its corresponding dwarf representation *) |