2 * Copyright 2010, INRIA, University of Copenhagen
3 * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
4 * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
5 * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
6 * This file is part of Coccinelle.
8 * Coccinelle is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, according to version 2 of the License.
12 * Coccinelle is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Coccinelle. If not, see <http://www.gnu.org/licenses/>.
20 * The authors reserve the right to distribute this or future versions of
21 * Coccinelle under other licenses.
25 module Ast
= Ast_cocci
26 module TC
= Type_cocci
28 (* --------------------------------------------------------------------- *)
31 type arity
= OPT
| UNIQUE
| NONE
34 { tline_start
: int; tline_end
: int;
35 left_offset
: int; right_offset
: int }
36 let default_token_info =
37 { tline_start
= -1; tline_end
= -1; left_offset
= -1; right_offset
= -1 }
39 (* MIXED is like CONTEXT, since sometimes MIXED things have to revert to
40 CONTEXT - see insert_plus.ml *)
43 MINUS
of (Ast.anything
Ast.replacement
* token_info
) ref
45 | CONTEXT
of (Ast.anything
Ast.befaft
* token_info
* token_info
) ref
46 | MIXED
of (Ast.anything
Ast.befaft
* token_info
* token_info
) ref
48 type position_info
= { line_start
: int; line_end
: int;
49 logical_start
: int; logical_end
: int;
50 column
: int; offset
: int; }
52 type info
= { pos_info
: position_info
;
53 attachable_start
: bool; attachable_end
: bool;
54 mcode_start
: mcodekind list
; mcode_end
: mcodekind list
;
55 (* the following are only for + code *)
56 strings_before
: (Ast.added_string
* position_info
) list
;
57 strings_after
: (Ast.added_string
* position_info
) list
}
59 (* adjacency index is incremented when we skip over dots or nest delimiters
60 it is used in deciding how much to remove, when two adjacent code tokens are
63 'a
* arity
* info
* mcodekind
* meta_pos list
ref (* pos, - only *) *
64 int (* adjacency_index *)
65 (* int ref is an index *)
70 mcodekind
: mcodekind
ref;
71 exp_ty
: TC.typeC
option ref; (* only for expressions *)
72 bef_aft
: dots_bef_aft
; (* only for statements *)
73 true_if_arg
: bool; (* true if "arg_exp", only for exprs *)
74 true_if_test
: bool; (* true if "test position", only for exprs *)
75 true_if_test_exp
: bool;(* true if "test_exp from iso", only for exprs *)
76 (*nonempty if this represents the use of an iso*)
77 iso_info
: (string*anything
) list
}
80 NoDots
| AddingBetweenDots
of statement
| DroppingBetweenDots
of statement
82 (* for iso metavariables, true if they can only match nonmodified terms with
83 all metavariables unitary
84 for SP metavariables, true if the metavariable is unitary (valid up to
85 isomorphism phase only)
86 In SP, the only options are impure and context
88 and pure
= Impure
| Pure
| Context
| PureContext
(* pure and only context *)
90 (* --------------------------------------------------------------------- *)
91 (* --------------------------------------------------------------------- *)
99 and 'a dots
= 'a base_dots wrap
101 (* --------------------------------------------------------------------- *)
106 | MetaId
of Ast.meta_name mcode
* Ast.idconstraint
* Ast.seed
* pure
107 | MetaFunc
of Ast.meta_name mcode
* Ast.idconstraint
* pure
108 | MetaLocalFunc
of Ast.meta_name mcode
* Ast.idconstraint
* pure
109 | DisjId
of string mcode
* ident list
*
110 string mcode list
(* the |s *) * string mcode
112 | UniqueIdent
of ident
114 and ident
= base_ident wrap
116 (* --------------------------------------------------------------------- *)
119 and base_expression
=
121 | Constant
of Ast.constant mcode
122 | FunCall
of expression
* string mcode
(* ( *) *
123 expression dots
* string mcode
(* ) *)
124 | Assignment
of expression
* Ast.assignOp mcode
* expression
*
125 bool (* true if it can match an initialization *)
126 | CondExpr
of expression
* string mcode
(* ? *) * expression
option *
127 string mcode
(* : *) * expression
128 | Postfix
of expression
* Ast.fixOp mcode
129 | Infix
of expression
* Ast.fixOp mcode
130 | Unary
of expression
* Ast.unaryOp mcode
131 | Binary
of expression
* Ast.binaryOp mcode
* expression
132 | Nested
of expression
* Ast.binaryOp mcode
* expression
133 | Paren
of string mcode
(* ( *) * expression
*
135 | ArrayAccess
of expression
* string mcode
(* [ *) * expression
*
137 | RecordAccess
of expression
* string mcode
(* . *) * ident
138 | RecordPtAccess
of expression
* string mcode
(* -> *) * ident
139 | Cast
of string mcode
(* ( *) * typeC
* string mcode
(* ) *) *
141 | SizeOfExpr
of string mcode
(* sizeof *) * expression
142 | SizeOfType
of string mcode
(* sizeof *) * string mcode
(* ( *) *
143 typeC
* string mcode
(* ) *)
144 | TypeExp
of typeC
(* type name used as an expression, only in args *)
145 | MetaErr
of Ast.meta_name mcode
* constraints
* pure
146 | MetaExpr
of Ast.meta_name mcode
* constraints
*
147 TC.typeC list
option * Ast.form
* pure
148 | MetaExprList
of Ast.meta_name mcode
(* only in arg lists *) *
150 | EComma
of string mcode
(* only in arg lists *)
151 | DisjExpr
of string mcode
* expression list
*
152 string mcode list
(* the |s *) * string mcode
153 | NestExpr
of string mcode
* expression dots
* string mcode
*
154 expression
option * Ast.multi
155 | Edots
of string mcode
(* ... *) * expression
option
156 | Ecircles
of string mcode
(* ooo *) * expression
option
157 | Estars
of string mcode
(* *** *) * expression
option
158 | OptExp
of expression
159 | UniqueExp
of expression
161 and expression
= base_expression wrap
165 | NotIdCstrt
of Ast.reconstraint
166 | NotExpCstrt
of expression list
167 | SubExpCstrt
of Ast.meta_name list
170 MetaListLen
of Ast.meta_name mcode
174 (* --------------------------------------------------------------------- *)
178 ConstVol
of Ast.const_vol mcode
* typeC
179 | BaseType
of Ast.baseType
* string mcode list
180 | Signed
of Ast.sign mcode
* typeC
option
181 | Pointer
of typeC
* string mcode
(* * *)
182 | FunctionPointer
of typeC
*
183 string mcode
(* ( *)*string mcode
(* * *)*string mcode
(* ) *)*
184 string mcode
(* ( *)*parameter_list
*string mcode
(* ) *)
185 | FunctionType
of typeC
option *
186 string mcode
(* ( *) * parameter_list
*
188 | Array
of typeC
* string mcode
(* [ *) *
189 expression
option * string mcode
(* ] *)
190 | EnumName
of string mcode
(*enum*) * ident
option (* name *)
191 | EnumDef
of typeC
(* either StructUnionName or metavar *) *
192 string mcode
(* { *) * expression dots
* string mcode
(* } *)
193 | StructUnionName
of Ast.structUnion mcode
* ident
option (* name *)
194 | StructUnionDef
of typeC
(* either StructUnionName or metavar *) *
195 string mcode
(* { *) * declaration dots
* string mcode
(* } *)
196 | TypeName
of string mcode
197 | MetaType
of Ast.meta_name mcode
* pure
198 | DisjType
of string mcode
* typeC list
* (* only after iso *)
199 string mcode list
(* the |s *) * string mcode
201 | UniqueType
of typeC
203 and typeC
= base_typeC wrap
205 (* --------------------------------------------------------------------- *)
206 (* Variable declaration *)
207 (* Even if the Cocci program specifies a list of declarations, they are
208 split out into multiple declarations of a single variable each. *)
210 and base_declaration
=
211 MetaDecl
of Ast.meta_name mcode
* pure
(* variables *)
212 (* the following are kept separate from MetaDecls because ultimately
213 they don't match the same thin at all. Consider whether there
214 should be a separate type for fields, as in the C AST *)
215 | MetaField
of Ast.meta_name mcode
* pure
(* structure fields *)
216 | MetaFieldList
of Ast.meta_name mcode
* listlen
* pure
(* structure fields *)
217 | Init
of Ast.storage mcode
option * typeC
* ident
* string mcode
(*=*) *
218 initialiser
* string mcode
(*;*)
219 | UnInit
of Ast.storage mcode
option * typeC
* ident
* string mcode
(* ; *)
220 | TyDecl
of typeC
* string mcode
(* ; *)
221 | MacroDecl
of ident
(* name *) * string mcode
(* ( *) *
222 expression dots
* string mcode
(* ) *) * string mcode
(* ; *)
223 | Typedef
of string mcode
(* typedef *) * typeC
* typeC
* string mcode
(*;*)
224 | DisjDecl
of string mcode
* declaration list
*
225 string mcode list
(* the |s *) * string mcode
226 (* Ddots is for a structure declaration *)
227 | Ddots
of string mcode
(* ... *) * declaration
option (* whencode *)
228 | OptDecl
of declaration
229 | UniqueDecl
of declaration
231 and declaration
= base_declaration wrap
233 (* --------------------------------------------------------------------- *)
236 and base_initialiser
=
237 MetaInit
of Ast.meta_name mcode
* pure
238 | MetaInitList
of Ast.meta_name mcode
* listlen
* pure
239 | InitExpr
of expression
240 | InitList
of string mcode
(*{*) * initialiser_list
* string mcode
(*}*) *
241 (* true if ordered, as for array, false if unordered, as for struct *)
244 designator list
(* name *) * string mcode
(*=*) *
245 initialiser
(* gccext: *)
246 | InitGccName
of ident
(* name *) * string mcode
(*:*) *
248 | IComma
of string mcode
(* , *)
249 | Idots
of string mcode
(* ... *) * initialiser
option (* whencode *)
250 | OptIni
of initialiser
251 | UniqueIni
of initialiser
254 DesignatorField
of string mcode
(* . *) * ident
255 | DesignatorIndex
of string mcode
(* [ *) * expression
* string mcode
(* ] *)
257 string mcode
(* [ *) * expression
* string mcode
(* ... *) *
258 expression
* string mcode
(* ] *)
260 and initialiser
= base_initialiser wrap
262 and initialiser_list
= initialiser dots
264 (* --------------------------------------------------------------------- *)
267 and base_parameterTypeDef
=
269 | Param
of typeC
* ident
option
270 | MetaParam
of Ast.meta_name mcode
* pure
271 | MetaParamList
of Ast.meta_name mcode
* listlen
* pure
272 | PComma
of string mcode
273 | Pdots
of string mcode
(* ... *)
274 | Pcircles
of string mcode
(* ooo *)
275 | OptParam
of parameterTypeDef
276 | UniqueParam
of parameterTypeDef
278 and parameterTypeDef
= base_parameterTypeDef wrap
280 and parameter_list
= parameterTypeDef dots
282 (* --------------------------------------------------------------------- *)
283 (* #define Parameters *)
285 and base_define_param
=
287 | DPComma
of string mcode
288 | DPdots
of string mcode
(* ... *)
289 | DPcircles
of string mcode
(* ooo *)
290 | OptDParam
of define_param
291 | UniqueDParam
of define_param
293 and define_param
= base_define_param wrap
295 and base_define_parameters
=
297 | DParams
of string mcode
(*( *) * define_param dots
* string mcode
(* )*)
299 and define_parameters
= base_define_parameters wrap
301 (* --------------------------------------------------------------------- *)
305 Decl
of (info
* mcodekind
) (* before the decl *) * declaration
306 | Seq
of string mcode
(* { *) * statement dots
*
308 | ExprStatement
of expression
option * string mcode
(*;*)
309 | IfThen
of string mcode
(* if *) * string mcode
(* ( *) *
310 expression
* string mcode
(* ) *) *
311 statement
* (info
* mcodekind
) (* after info *)
312 | IfThenElse
of string mcode
(* if *) * string mcode
(* ( *) *
313 expression
* string mcode
(* ) *) *
314 statement
* string mcode
(* else *) * statement
*
316 | While
of string mcode
(* while *) * string mcode
(* ( *) *
317 expression
* string mcode
(* ) *) *
318 statement
* (info
* mcodekind
) (* after info *)
319 | Do
of string mcode
(* do *) * statement
*
320 string mcode
(* while *) * string mcode
(* ( *) *
321 expression
* string mcode
(* ) *) *
323 | For
of string mcode
(* for *) * string mcode
(* ( *) *
324 expression
option * string mcode
(*;*) *
325 expression
option * string mcode
(*;*) *
326 expression
option * string mcode
(* ) *) * statement
*
327 (info
* mcodekind
) (* after info *)
328 | Iterator
of ident
(* name *) * string mcode
(* ( *) *
329 expression dots
* string mcode
(* ) *) *
330 statement
* (info
* mcodekind
) (* after info *)
331 | Switch
of string mcode
(* switch *) * string mcode
(* ( *) *
332 expression
* string mcode
(* ) *) * string mcode
(* { *) *
333 statement
(*decl*) dots
*
334 case_line dots
* string mcode
(* } *)
335 | Break
of string mcode
(* break *) * string mcode
(* ; *)
336 | Continue
of string mcode
(* continue *) * string mcode
(* ; *)
337 | Label
of ident
* string mcode
(* : *)
338 | Goto
of string mcode
(* goto *) * ident
* string mcode
(* ; *)
339 | Return
of string mcode
(* return *) * string mcode
(* ; *)
340 | ReturnExpr
of string mcode
(* return *) * expression
*
342 | MetaStmt
of Ast.meta_name mcode
* pure
343 | MetaStmtList
of Ast.meta_name mcode
(*only in statement lists*) * pure
344 | Exp
of expression
(* only in dotted statement lists *)
345 | TopExp
of expression
(* for macros body *)
346 | Ty
of typeC
(* only at top level *)
347 | TopInit
of initialiser
(* only at top level *)
348 | Disj
of string mcode
* statement dots list
*
349 string mcode list
(* the |s *) * string mcode
350 | Nest
of string mcode
* statement dots
* string mcode
*
351 (statement dots
,statement
) whencode list
* Ast.multi
352 | Dots
of string mcode
(* ... *) *
353 (statement dots
,statement
) whencode list
354 | Circles
of string mcode
(* ooo *) *
355 (statement dots
,statement
) whencode list
356 | Stars
of string mcode
(* *** *) *
357 (statement dots
,statement
) whencode list
358 | FunDecl
of (info
* mcodekind
) (* before the function decl *) *
359 fninfo list
* ident
(* name *) *
360 string mcode
(* ( *) * parameter_list
* string mcode
(* ) *) *
361 string mcode
(* { *) * statement dots
*
363 | Include
of string mcode
(* #include *) * Ast.inc_file mcode
(* file *)
364 | Undef
of string mcode
(* #define *) * ident
(* name *)
365 | Define
of string mcode
(* #define *) * ident
(* name *) *
366 define_parameters
(*params*) * statement dots
367 | OptStm
of statement
368 | UniqueStm
of statement
371 FStorage
of Ast.storage mcode
373 | FInline
of string mcode
374 | FAttr
of string mcode
376 and ('a
,'b
) whencode
=
379 | WhenModifier
of Ast.when_modifier
380 | WhenNotTrue
of expression
381 | WhenNotFalse
of expression
383 and statement
= base_statement wrap
386 Default
of string mcode
(* default *) * string mcode
(*:*) * statement dots
387 | Case
of string mcode
(* case *) * expression
* string mcode
(*:*) *
389 | DisjCase
of string mcode
* case_line list
*
390 string mcode list
(* the |s *) * string mcode
391 | OptCase
of case_line
393 and case_line
= base_case_line wrap
395 (* --------------------------------------------------------------------- *)
399 MetaPos
of Ast.meta_name mcode
* Ast.meta_name list
* Ast.meta_collect
401 (* --------------------------------------------------------------------- *)
406 | TOPCODE
of statement dots
407 | CODE
of statement dots
408 | FILEINFO
of string mcode
(* old file *) * string mcode
(* new file *)
409 | ERRORWORDS
of expression list
410 | OTHER
of statement
(* temporary, disappears after top_level.ml *)
412 and top_level
= base_top_level wrap
413 and rule
= top_level list
417 (rule
* Ast.metavar list
*
418 (string list
* string list
* Ast.dependency
* string * Ast.exists
)) *
419 (rule
* Ast.metavar list
) * Ast.ruletype
420 | ScriptRule
of string (* name *) *
421 string * Ast.dependency
*
422 (Ast.script_meta_name
* Ast.meta_name
* Ast.metavar
) list
*
423 Ast.meta_name list
(*script vars*) *
425 | InitialScriptRule
of string (* name *) *string * Ast.dependency
* string
426 | FinalScriptRule
of string (* name *) *string * Ast.dependency
* string
428 (* --------------------------------------------------------------------- *)
431 DotsExprTag
of expression dots
432 | DotsInitTag
of initialiser dots
433 | DotsParamTag
of parameterTypeDef dots
434 | DotsStmtTag
of statement dots
435 | DotsDeclTag
of declaration dots
436 | DotsCaseTag
of case_line dots
438 | ExprTag
of expression
439 | ArgExprTag
of expression
(* for isos *)
440 | TestExprTag
of expression
(* for isos *)
442 | ParamTag
of parameterTypeDef
443 | InitTag
of initialiser
444 | DeclTag
of declaration
445 | StmtTag
of statement
446 | CaseLineTag
of case_line
447 | TopTag
of top_level
448 | IsoWhenTag
of Ast.when_modifier
449 | IsoWhenTTag
of expression
450 | IsoWhenFTag
of expression
451 | MetaPosTag
of meta_pos
453 let dotsExpr x
= DotsExprTag x
454 let dotsParam x
= DotsParamTag x
455 let dotsInit x
= DotsInitTag x
456 let dotsStmt x
= DotsStmtTag x
457 let dotsDecl x
= DotsDeclTag x
458 let dotsCase x
= DotsCaseTag x
459 let ident x
= IdentTag x
460 let expr x
= ExprTag x
461 let typeC x
= TypeCTag x
462 let param x
= ParamTag x
463 let ini x
= InitTag x
464 let decl x
= DeclTag x
465 let stmt x
= StmtTag x
466 let case_line x
= CaseLineTag x
469 (* --------------------------------------------------------------------- *)
470 (* Avoid cluttering the parser. Calculated in compute_lines.ml. *)
473 { line_start
= -1; line_end
= -1;
474 logical_start
= -1; logical_end
= -1;
475 column
= -1; offset
= -1; }
477 let default_info _
= (* why is this a function? *)
478 { pos_info = pos_info;
479 attachable_start
= true; attachable_end
= true;
480 mcode_start
= []; mcode_end
= [];
481 strings_before
= []; strings_after
= [] }
483 let default_befaft _
=
484 MIXED
(ref (Ast.NOTHING
,default_token_info,default_token_info))
485 let context_befaft _
=
486 CONTEXT
(ref (Ast.NOTHING
,default_token_info,default_token_info))
487 let minus_befaft _
= MINUS
(ref (Ast.NOREPLACEMENT
,default_token_info))
491 info
= default_info();
493 mcodekind
= ref (default_befaft());
497 true_if_test
= false;
498 true_if_test_exp
= false;
502 info
= default_info();
504 mcodekind
= ref (context_befaft());
508 true_if_test
= false;
509 true_if_test_exp
= false;
511 let unwrap x
= x
.node
512 let unwrap_mcode (x
,_
,_
,_
,_
,_
) = x
513 let rewrap model x
= { model
with node
= x
}
514 let rewrap_mcode (_
,arity
,info
,mcodekind
,pos
,adj
) x
=
515 (x
,arity
,info
,mcodekind
,pos
,adj
)
516 let copywrap model x
=
517 { model
with node
= x
; index
= ref !(model
.index
);
518 mcodekind
= ref !(model
.mcodekind
); exp_ty
= ref !(model
.exp_ty
)}
519 let get_pos (_
,_
,_
,_
,x
,_
) = !x
520 let get_pos_ref (_
,_
,_
,_
,x
,_
) = x
521 let set_pos pos
(m
,arity
,info
,mcodekind
,_
,adj
) =
522 (m
,arity
,info
,mcodekind
,ref pos
,adj
)
523 let get_info x
= x
.info
524 let set_info x info
= {x
with info
= info
}
525 let get_line x
= x
.info
.pos_info.line_start
526 let get_line_end x
= x
.info
.pos_info.line_end
527 let get_index x
= !(x
.index
)
528 let set_index x i
= x
.index
:= i
529 let get_mcodekind x
= !(x
.mcodekind
)
530 let get_mcode_mcodekind (_
,_
,_
,mcodekind
,_
,_
) = mcodekind
531 let get_mcodekind_ref x
= x
.mcodekind
532 let set_mcodekind x mk
= x
.mcodekind
:= mk
533 let set_type x t
= x
.exp_ty
:= t
534 let get_type x
= !(x
.exp_ty
)
535 let get_dots_bef_aft x
= x
.bef_aft
536 let set_dots_bef_aft x dots_bef_aft
= {x
with bef_aft
= dots_bef_aft
}
537 let get_arg_exp x
= x
.true_if_arg
538 let set_arg_exp x
= {x
with true_if_arg
= true}
539 let get_test_pos x
= x
.true_if_test
540 let set_test_pos x
= {x
with true_if_test
= true}
541 let get_test_exp x
= x
.true_if_test_exp
542 let set_test_exp x
= {x
with true_if_test_exp
= true}
543 let get_iso x
= x
.iso_info
544 let set_iso x i
= if !Flag.track_iso_usage
then {x
with iso_info
= i
} else x
545 let set_mcode_data data
(_
,ar
,info
,mc
,pos
,adj
) = (data
,ar
,info
,mc
,pos
,adj
)
547 (* --------------------------------------------------------------------- *)
549 (* unique indices, for mcode and tree nodes *)
550 let index_counter = ref 0
551 let fresh_index _
= let cur = !index_counter in index_counter := cur + 1; cur
553 (* --------------------------------------------------------------------- *)
561 (* --------------------------------------------------------------------- *)
563 let rec ast0_type_to_type ty
=
565 ConstVol
(cv
,ty
) -> TC.ConstVol
(const_vol cv
,ast0_type_to_type ty
)
566 | BaseType
(bty
,strings
) ->
567 TC.BaseType
(baseType bty
)
568 | Signed
(sgn
,None
) ->
569 TC.SignedT
(sign sgn
,None
)
570 | Signed
(sgn
,Some ty
) ->
571 let bty = ast0_type_to_type ty
in
572 TC.SignedT
(sign sgn
,Some
bty)
573 | Pointer
(ty
,_
) -> TC.Pointer
(ast0_type_to_type ty
)
574 | FunctionPointer
(ty
,_
,_
,_
,_
,params
,_
) ->
575 TC.FunctionPointer
(ast0_type_to_type ty
)
576 | FunctionType _
-> TC.Unknown
(*failwith "not supported"*)
577 | Array
(ety
,_
,_
,_
) -> TC.Array
(ast0_type_to_type ety
)
578 | EnumName
(su
,Some tag
) ->
579 (match unwrap tag
with
581 TC.EnumName
(TC.Name
(unwrap_mcode tag
))
582 | MetaId
(tag
,_
,_
,_
) ->
584 "warning: enum with a metavariable name detected.\n";
586 "For type checking assuming the name of the metavariable is the name of the type\n";
587 TC.EnumName
(TC.MV
(unwrap_mcode tag
,TC.Unitary
,false)))
588 | _
-> failwith
"unexpected enum type name")
589 | EnumName
(su
,None
) -> failwith
"nameless enum - what to do???"
590 | EnumDef
(ty
,_
,_
,_
) -> ast0_type_to_type ty
591 | StructUnionName
(su
,Some tag
) ->
592 (match unwrap tag
with
594 TC.StructUnionName
(structUnion su
,TC.Name
(unwrap_mcode tag
))
595 | MetaId
(tag
,Ast.IdNoConstraint
,_
,_
) ->
597 "warning: struct/union with a metavariable name detected.\n";
599 "For type checking assuming the name of the metavariable is the name of the type\n";
600 TC.StructUnionName
(structUnion su
,
601 TC.MV
(unwrap_mcode tag
,TC.Unitary
,false)))
602 | MetaId
(tag
,_
,_
,_
) ->
603 (* would have to duplicate the type in type_cocci.ml?
604 perhaps polymorphism would help? *)
605 failwith
"constraints not supported on struct type name"
606 | _
-> failwith
"unexpected struct/union type name")
607 | StructUnionName
(su
,None
) -> failwith
"nameless structure - what to do???"
608 | StructUnionDef
(ty
,_
,_
,_
) -> ast0_type_to_type ty
609 | TypeName
(name
) -> TC.TypeName
(unwrap_mcode name
)
610 | MetaType
(name
,_
) ->
611 TC.MetaType
(unwrap_mcode name
,TC.Unitary
,false)
612 | DisjType
(_
,types
,_
,_
) ->
614 "disjtype not supported in smpl type inference, assuming unknown";
616 | OptType
(ty
) | UniqueType
(ty
) ->
619 and baseType
= function
620 Ast.VoidType
-> TC.VoidType
621 | Ast.CharType
-> TC.CharType
622 | Ast.ShortType
-> TC.ShortType
623 | Ast.IntType
-> TC.IntType
624 | Ast.DoubleType
-> TC.DoubleType
625 | Ast.FloatType
-> TC.FloatType
626 | Ast.LongType
-> TC.LongType
627 | Ast.LongLongType
-> TC.LongLongType
628 | Ast.SizeType
-> TC.SizeType
629 | Ast.SSizeType
-> TC.SSizeType
630 | Ast.PtrDiffType
-> TC.PtrDiffType
633 match unwrap_mcode t
with
634 Ast.Struct
-> TC.Struct
635 | Ast.Union
-> TC.Union
638 match unwrap_mcode t
with
639 Ast.Signed
-> TC.Signed
640 | Ast.Unsigned
-> TC.Unsigned
643 match unwrap_mcode t
with
644 Ast.Const
-> TC.Const
645 | Ast.Volatile
-> TC.Volatile
647 (* --------------------------------------------------------------------- *)
648 (* this function is a rather minimal attempt. the problem is that information
649 has been lost. but since it is only used for metavariable types in the isos,
650 perhaps it doesn't matter *)
651 and make_mcode x
= (x
,NONE
,default_info(),context_befaft(),ref [],-1)
652 let make_mcode_info x info
= (x
,NONE
,info
,context_befaft(),ref [],-1)
653 and make_minus_mcode x
=
654 (x
,NONE
,default_info(),minus_befaft(),ref [],-1)
658 let rec reverse_type ty
=
660 TC.ConstVol
(cv
,ty
) ->
661 ConstVol
(reverse_const_vol cv
,context_wrap(reverse_type ty
))
662 | TC.BaseType
(bty) ->
663 BaseType
(reverse_baseType
bty,[(* not used *)])
664 | TC.SignedT
(sgn
,None
) -> Signed
(reverse_sign sgn
,None
)
665 | TC.SignedT
(sgn
,Some
bty) ->
666 Signed
(reverse_sign sgn
,Some
(context_wrap(reverse_type ty
)))
668 Pointer
(context_wrap(reverse_type ty
),make_mcode
"*")
669 | TC.EnumName
(TC.MV
(name
,_
,_
)) ->
672 Some
(context_wrap(MetaId
(make_mcode name
,Ast.IdNoConstraint
,Ast.NoVal
,
674 | TC.EnumName
(TC.Name tag
) ->
675 EnumName
(make_mcode
"enum",Some
(context_wrap(Id
(make_mcode tag
))))
676 | TC.StructUnionName
(su
,TC.MV
(name
,_
,_
)) ->
679 (reverse_structUnion su
,
680 Some
(context_wrap(MetaId
(make_mcode name
,Ast.IdNoConstraint
,Ast.NoVal
,
681 Impure
(*not really right*)))))
682 | TC.StructUnionName
(su
,TC.Name tag
) ->
684 (reverse_structUnion su
,
685 Some
(context_wrap(Id
(make_mcode tag
))))
686 | TC.TypeName
(name
) -> TypeName
(make_mcode name
)
687 | TC.MetaType
(name
,_
,_
) ->
688 MetaType
(make_mcode name
,Impure
(*not really right*))
691 and reverse_baseType
= function
692 TC.VoidType
-> Ast.VoidType
693 | TC.CharType
-> Ast.CharType
694 | TC.BoolType
-> Ast.IntType
695 | TC.ShortType
-> Ast.ShortType
696 | TC.IntType
-> Ast.IntType
697 | TC.DoubleType
-> Ast.DoubleType
698 | TC.FloatType
-> Ast.FloatType
699 | TC.LongType
-> Ast.LongType
700 | TC.LongLongType
-> Ast.LongLongType
701 | TC.SizeType
-> Ast.SizeType
702 | TC.SSizeType
-> Ast.SSizeType
703 | TC.PtrDiffType
-> Ast.PtrDiffType
706 and reverse_structUnion t
=
709 TC.Struct
-> Ast.Struct
710 | TC.Union
-> Ast.Union
)
715 TC.Signed
-> Ast.Signed
716 | TC.Unsigned
-> Ast.Unsigned
)
718 and reverse_const_vol t
=
721 TC.Const
-> Ast.Const
722 | TC.Volatile
-> Ast.Volatile
)
724 (* --------------------------------------------------------------------- *)
728 (Impure
,_
) | (_
,Impure
) -> Impure
729 | (Pure
,Context
) | (Context
,Pure
) -> Impure
730 | (Pure
,_
) | (_
,Pure
) -> Pure
731 | (_
,Context
) | (Context
,_
) -> Context
734 (* --------------------------------------------------------------------- *)
736 let rule_name = ref "" (* for the convenience of the parser *)