aboutsummaryrefslogtreecommitdiffstats
path: root/debug/CtoDwarf.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2015-09-16 11:10:28 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2015-09-16 11:10:28 +0200
commit3344bcf59acb1ae8d43a0d15acb4b824689e706d (patch)
treea5621a5d30ee7e39e2e6d2a95e02ab018e8ef846 /debug/CtoDwarf.ml
parent36fe88d4cc2022947474a2fcc0b650e22f41ee3e (diff)
downloadcompcert-3344bcf59acb1ae8d43a0d15acb4b824689e706d.tar.gz
compcert-3344bcf59acb1ae8d43a0d15acb4b824689e706d.zip
Add the debug interface file.
The new file Debug.ml contains the interface for generating and printing debug information. In order to generate debug information the init function initializes the necessary functions depending on the -g flag. If the -g is not there all functions are dummy functions which do nothing.
Diffstat (limited to 'debug/CtoDwarf.ml')
-rw-r--r--debug/CtoDwarf.ml46
1 files changed, 44 insertions, 2 deletions
diff --git a/debug/CtoDwarf.ml b/debug/CtoDwarf.ml
index dce8d81e..3a325665 100644
--- a/debug/CtoDwarf.ml
+++ b/debug/CtoDwarf.ml
@@ -19,9 +19,8 @@ open DwarfTypes
open DwarfUtil
open Env
open Set
-open DebugInformation
-(* Functions to translate a C Ast into Dwarf 2 debugging information *)
+(* Functions to translate a C Ast into Dwarf 2 debugging information *)
(* Hashtable from type name to entry id *)
let type_table: (string, int) Hashtbl.t = Hashtbl.create 7
@@ -40,6 +39,49 @@ module IntSet = Set.Make(struct type t = int let compare = compare end)
(* Set of all declared composite_types *)
let composite_defined: IntSet.t ref = ref IntSet.empty
+(* Helper functions for the attributes *)
+let strip_attributes typ =
+ let strip = List.filter (fun a -> a = AConst || a = AVolatile) in
+ match typ with
+ | TVoid at -> TVoid (strip at)
+ | TInt (k,at) -> TInt (k,strip at)
+ | TFloat (k,at) -> TFloat(k,strip at)
+ | TPtr (t,at) -> TPtr(t,strip at)
+ | TArray (t,s,at) -> TArray(t,s,strip at)
+ | TFun (t,arg,v,at) -> TFun(t,arg,v,strip at)
+ | TNamed (n,at) -> TNamed(n,strip at)
+ | TStruct (n,at) -> TStruct(n,strip at)
+ | TUnion (n,at) -> TUnion(n,strip at)
+ | TEnum (n,at) -> TEnum(n,strip at)
+
+let strip_last_attribute typ =
+ let rec hd_opt l = match l with
+ [] -> None,[]
+ | AConst::rest -> Some AConst,rest
+ | AVolatile::rest -> Some AVolatile,rest
+ | _::rest -> hd_opt rest in
+ match typ with
+ | TVoid at -> let l,r = hd_opt at in
+ l,TVoid r
+ | TInt (k,at) -> let l,r = hd_opt at in
+ l,TInt (k,r)
+ | TFloat (k,at) -> let l,r = hd_opt at in
+ l,TFloat (k,r)
+ | TPtr (t,at) -> let l,r = hd_opt at in
+ l,TPtr(t,r)
+ | TArray (t,s,at) -> let l,r = hd_opt at in
+ l,TArray(t,s,r)
+ | TFun (t,arg,v,at) -> let l,r = hd_opt at in
+ l,TFun(t,arg,v,r)
+ | TNamed (n,at) -> let l,r = hd_opt at in
+ l,TNamed(n,r)
+ | TStruct (n,at) -> let l,r = hd_opt at in
+ l,TStruct(n,r)
+ | TUnion (n,at) -> let l,r = hd_opt at in
+ l,TUnion(n,r)
+ | TEnum (n,at) -> let l,r = hd_opt at in
+ l,TEnum(n,r)
+
(* Get the type id of a composite_type *)
let get_composite_type (name: int): int =
try