1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
(**************************************************************************)
(* *)
(* The Why platform for program certification *)
(* Copyright (C) 2002-2008 *)
(* Romain BARDOU *)
(* Jean-Franois COUCHOT *)
(* Mehdi DOGGUY *)
(* Jean-Christophe FILLITRE *)
(* Thierry HUBERT *)
(* Claude MARCH *)
(* Yannick MOY *)
(* Christine PAULIN *)
(* Yann RGIS-GIANAS *)
(* Nicolas ROUSSET *)
(* Xavier URBAIN *)
(* *)
(* This software is free software; you can redistribute it and/or *)
(* modify it under the terms of the GNU General Public *)
(* License version 2, as published by the Free Software Foundation. *)
(* *)
(* This software is distributed in the hope that it will be useful, *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *)
(* *)
(* See the GNU General Public License version 2 for more details *)
(* (enclosed in the file GPL). *)
(* *)
(**************************************************************************)
(*i $Id: ctypes.ml,v 1.26 2008/02/05 12:10:47 marche Exp $ i*)
open Format
open Coptions
open Lib
type storage_class = No_storage | Extern | Auto | Static | Register
type sign = Signed | Unsigned
type cinteger =
| Char | Short | Int | Long | LongLong | Bitfield of int64
| ExactInt
type cfloat = Float | Double | LongDouble | Real
type valid = Valid of int64 * int64 | Not_valid
type ctype_node =
| Tvoid
| Tint of (sign * cinteger)
| Tfloat of cfloat
| Tvar of string
| Tarray of valid * ctype * int64 option
| Tpointer of valid * ctype
| Tstruct of string
| Tunion of string
| Tenum of string
| Tfun of ctype list * ctype
and ctype = {
ctype_node : ctype_node;
ctype_storage : storage_class;
ctype_const : bool;
ctype_volatile : bool;
ctype_ghost : bool;
}
let noattr tyn = { ctype_node = tyn;
ctype_storage = No_storage;
ctype_const = false;
ctype_volatile = false;
ctype_ghost = false;
}
let c_void = noattr Tvoid
let c_int = noattr (Tint (Signed, Int))
let c_exact_int = noattr (Tint (Signed, ExactInt))
let c_char = noattr (Tint (Unsigned, Char))
let c_float fk = noattr (Tfloat fk)
let c_string valid = noattr (Tpointer(valid, c_char))
let c_array valid ty = noattr (Tarray (valid,ty,None))
let c_array_size valid ty n = noattr (Tarray (valid,ty,Some n))
let c_pointer valid ty = noattr (Tpointer(valid, ty))
let c_void_star valid = c_pointer valid c_void
let c_real = noattr (Tfloat Real)
let c_addr = noattr (Tvar "addr")
let stack = ref [ref Sset.empty]
let add s = match !stack with
| m :: _ ->
if debug then eprintf "Ctypes.add %s@." s;
m := Sset.add s !m
| [] -> assert false
let _ = add "__builtin_va_list"
let remove s = match !stack with
| m :: _ ->
if debug then eprintf "Ctypes.remove %s@." s;
m := Sset.remove s !m
| [] -> assert false
let mem s = match !stack with
| m :: _ -> Sset.mem s !m
| [] -> assert false
let push () = match !stack with
| (m :: _) as s -> stack := ref !m :: s
| [] -> assert false
let pop () = match !stack with
| _ :: s -> stack := s
| [] -> assert false
let rec ctype fmt ty =
(if ty.ctype_ghost then fprintf fmt "ghost "else ());
(if ty.ctype_const then fprintf fmt "const "else ());
ctype_node fmt ty.ctype_node
and ctype_node fmt = function
| Tvoid -> fprintf fmt "void"
| Tint _ -> fprintf fmt "int"
| Tfloat _ -> fprintf fmt "float"
| Tvar s -> fprintf fmt "%s" s
| Tarray (_,ty, None) -> fprintf fmt "%a[]" ctype ty
| Tarray (_,ty, Some n) -> fprintf fmt "%a[%Ld]" ctype ty n
| Tpointer (_,ty) -> fprintf fmt "%a*" ctype ty
| Tstruct s -> fprintf fmt "struct %s" s
| Tunion s -> fprintf fmt "union %s" s
| Tenum s -> fprintf fmt "enum %s" s
| Tfun _ -> fprintf fmt "<fun>"
let is_pointer ty =
match ty.ctype_node with
| Tarray _ | Tpointer _ -> true
| _ -> false
|