summaryrefslogtreecommitdiff
path: root/cparser
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2010-09-01 08:36:03 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2010-09-01 08:36:03 +0000
commit99f47c7a99b11c9cc3429fc0e5d0e21ae3707518 (patch)
treef452a9d6f8ec4c4573a7ca55581a0060d315f510 /cparser
parent1b8e228a2c5d8f63ffa28c1fcef68f64a0408900 (diff)
Adding __builtin_annotation
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1497 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'cparser')
-rw-r--r--cparser/Elab.ml11
1 files changed, 11 insertions, 0 deletions
diff --git a/cparser/Elab.ml b/cparser/Elab.ml
index b3e375c..2ae7c7e 100644
--- a/cparser/Elab.ml
+++ b/cparser/Elab.ml
@@ -778,6 +778,17 @@ let elab_expr loc env a =
let ty = match b3.edesc with ESizeof ty -> ty | _ -> assert false in
{ edesc = ECall(b1, [b2; b3]); etyp = ty }
+(* Hack to treat __builtin_annotation the CompCert way.
+ Arguments are treated as per the prototype (const char *, ...).
+ Result type is type of second argument, or void if only one argument. *)
+ | CALL((VARIABLE "__builtin_annotation" as a1), al) ->
+ let b1 = elab a1 in
+ let bl = List.map elab al in
+ let bl' = elab_arguments 1 bl [Env.fresh_ident "",
+ TPtr(TInt(IChar, [AConst]),[])] true in
+ let tyres = match bl' with _ :: b2 :: _ -> b2.etyp | _ -> TVoid[] in
+ { edesc = ECall(b1, bl'); etyp = tyres }
+
| CALL(a1, al) ->
let b1 =
(* Catch the old-style usage of calling a function without