aboutsummaryrefslogtreecommitdiffstats
path: root/debug
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2015-08-26 12:47:25 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2015-08-26 12:47:25 +0200
commite0f1a60f5ff9d2efc8b106b5167f0170b8795dbe (patch)
treefe5c4c0b3da0b30841eef8184dade6e39e2c7407 /debug
parent8d2e4a51d56b7f4d3673a5132edd1adb37a14295 (diff)
parent7cfaf10b604372044f53cb65b03df33c23f8b26d (diff)
downloadcompcert-kvx-e0f1a60f5ff9d2efc8b106b5167f0170b8795dbe.tar.gz
compcert-kvx-e0f1a60f5ff9d2efc8b106b5167f0170b8795dbe.zip
Merge branch 'master' into debug_locations
Conflicts: debug/CtoDwarf.ml debug/DwarfPrinter.ml debug/DwarfTypes.mli
Diffstat (limited to 'debug')
-rw-r--r--debug/CtoDwarf.ml47
-rw-r--r--debug/DwarfPrinter.ml5
2 files changed, 31 insertions, 21 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 *)
diff --git a/debug/DwarfPrinter.ml b/debug/DwarfPrinter.ml
index 85efea6e..cd888a80 100644
--- a/debug/DwarfPrinter.ml
+++ b/debug/DwarfPrinter.ml
@@ -74,7 +74,6 @@ module DwarfPrinter(Target: DWARF_TARGET)(DwarfAbbrevs:DWARF_ABBREVS):
| None -> ()
| Some (LocConst _) -> add_abbr_entry (0x2,location_const_type_abbr) buf
| Some (LocBlock _) -> add_abbr_entry (0x2,location_block_type_abbr) buf
- | Some (LocSymbol _) -> add_abbr_entry (0x2,location_block_type_abbr) buf
(* Dwarf entity to string function *)
let abbrev_string_of_entity entity has_sibling =
@@ -125,7 +124,7 @@ module DwarfPrinter(Target: DWARF_TARGET)(DwarfAbbrevs:DWARF_ABBREVS):
add_abbr_entry (0x1c,value_type_abbr) buf;
add_name buf
| DW_TAG_formal_parameter e ->
- prologue 0x34;
+ prologue 0x5;
add_attr_some e.formal_parameter_file_loc add_file_loc;
add_attr_some e.formal_parameter_artificial (add_abbr_entry (0x34,artificial_type_abbr));
add_location (get_location e.formal_parameter_id) buf;
@@ -341,8 +340,8 @@ module DwarfPrinter(Target: DWARF_TARGET)(DwarfAbbrevs:DWARF_ABBREVS):
let print_compilation_unit oc tag =
let prod_name = sprintf "AbsInt Angewandte Informatik GmbH:CompCert Version %s:%s" Version.version Configuration.arch in
print_string oc (Sys.getcwd ());
- print_addr oc (get_start_addr ());
print_addr oc (get_end_addr ());
+ print_addr oc (get_start_addr ());
print_uleb128 oc 1;
print_string oc tag.compile_unit_name;
print_string oc prod_name;