diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2010-09-01 08:36:03 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2010-09-01 08:36:03 +0000 |
commit | 99f47c7a99b11c9cc3429fc0e5d0e21ae3707518 (patch) | |
tree | f452a9d6f8ec4c4573a7ca55581a0060d315f510 /cparser | |
parent | 1b8e228a2c5d8f63ffa28c1fcef68f64a0408900 (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.ml | 11 |
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 |