(* Import a C header file.
* Copyright (C) 2008 Red Hat Inc., Richard W.M. Jones
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
- * This library is distributed in the hope that it will be useful,
+ * This program 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id$
*)
module P = Bitmatch_persistent
+let (//) = Filename.concat
+
let () =
(* Parse command line arguments. *)
let debug = ref false in
) in
let cmd =
- sprintf "cpp %s -include bitmatch-import-prefix.h %s > %s"
+ sprintf "cpp %s -I %s -include bitmatch-import-prefix.h %s > %s"
(String.concat " " (List.map Filename.quote cpp_args))
+ (Filename.quote (Bitmatch_config.ocamllibdir // "bitmatch"))
(Filename.quote input_file) (Filename.quote tmp) in
if debug then prerr_endline cmd;
if Sys.command cmd <> 0 then (
(* int array with constant length *)
| TArray (basetype, (Some _ as len), _) when isIntegralType basetype ->
- let len = lenOfArray len in
+ let nr_elems = lenOfArray len in
let bitsoffset, totalwidth = bitsOffset ttype offset in
- let bitswidth = totalwidth / len (* of the element *) in
- (*if debug then (
- let name = String.concat "." (List.rev names) in
- Errormsg.log "%s: int array: %d, %d, len %d\n"
- name bitsoffset bitswidth len
- );*)
+ let bitswidth = totalwidth / nr_elems (* of the element *) in
let basetype = unrollType basetype in
let ikind =
match basetype with
| t ->
Errormsg.unimp "%a: unhandled type: %a" d_loc loc d_type t;
IInt in
- let field =
- pattern_field_of_int "" bitsoffset bitswidth ikind endian in
let fname = String.concat "_" (List.rev names) in
- let byteoffset = bitsoffset lsr 3 in
- let bytetotalwidth = totalwidth lsr 3 in
-(*
- printf "--> array %s: byteoffset=%d bytetotalwidth=%d len=%d\n"
- fname byteoffset bytetotalwidth len (* field *);
-*)
- [] (* XXX *)
+
+ (* If the base type is 8 bits then we always translate this to
+ * a string (whether the C type is signed or unsigned). There
+ * is no endianness in bytes so ignore that.
+ *)
+ if bitswidth = 8 then
+ [pattern_field_of_string fname bitsoffset nr_elems]
+ else (
+ (* XXX Realistically we don't handle arrays well at
+ * the moment. Perhaps we should give up and match
+ * this to a bitstring?
+ *)
+ let signed = isSigned ikind in
+ if debug then
+ eprintf "--> array %s: nr_elems=%d signed=%b\n"
+ fname nr_elems signed;
+ [] (* XXX *)
+ )
(* basic integer type *)
| TInt (ikind, _) ->
| TPtr _ ->
let bitsoffset, bitswidth = bitsOffset ttype offset in
let fname = String.concat "_" (List.rev names) in
-(*
- printf "--> pointer %s: bitsoffset=%d bitswidth=%d\n"
- fname bitsoffset bitswidth;
-*)
+ if debug then
+ eprintf "--> pointer %s: bitsoffset=%d bitswidth=%d\n"
+ fname bitsoffset bitswidth;
[] (* XXX *)
| t ->
- Errormsg.unimp "to_fields: %a: unhandled type: %a"
+ Errormsg.warn "pattern_of_struct: %a: unhandled type: %a"
d_loc loc d_type t;
[]
field
+ and pattern_field_of_string fname bitsoffset nr_elems =
+ let _loc = camlp4_loc_of_cil_loc loc in
+ let field = P.create_pattern_field _loc in
+ let field = P.set_lident_patt field fname in
+ let field = P.set_type_string field in
+ let field = P.set_length_int field (nr_elems*8) in
+ let field = P.set_offset_int field bitsoffset in
+ field
+
(* Convert a CIL location into a camlp4 location. Grrr these
* should be compatible!
*)