let pragma = function
| GPragma(Attr(name,[AStr arg]),_)
| GPragma(Attr(name,[ACons(arg,[])]),_) ->
begin match name with
| "InvariantPolicy" ->
begin match String.lowercase arg with
| "none" -> [Jc_output.JCinvariant_policy Jc_env.InvNone]
| "arguments" ->
[Jc_output.JCinvariant_policy Jc_env.InvArguments]
| "ownership" ->
[Jc_output.JCinvariant_policy Jc_env.InvOwnership]
| _ -> assert false
end
| "SeparationPolicy" ->
begin match String.lowercase arg with
| "none" -> [Jc_output.JCseparation_policy Jc_env.SepNone]
| "regions" -> [Jc_output.JCseparation_policy Jc_env.SepRegions]
| _ -> assert false
end
| "AnnotationPolicy" ->
begin match String.lowercase arg with
| "none" -> [Jc_output.JCannotation_policy Jc_env.AnnotNone]
| "invariants" ->
[Jc_output.JCannotation_policy Jc_env.AnnotInvariants]
| "weakpre" ->
[Jc_output.JCannotation_policy Jc_env.AnnotWeakPre]
| "strongpre" ->
[Jc_output.JCannotation_policy Jc_env.AnnotStrongPre]
| _ -> assert false
end
| "AbstractDomain" ->
begin match String.lowercase arg with
| "none" -> [Jc_output.JCabstract_domain Jc_env.AbsNone]
| "box" -> [Jc_output.JCabstract_domain Jc_env.AbsBox]
| "oct" -> [Jc_output.JCabstract_domain Jc_env.AbsOct]
| "pol" -> [Jc_output.JCabstract_domain Jc_env.AbsPol]
| _ -> assert false
end
| "JessieFloatModel" ->
begin match String.lowercase arg with
| "real" -> float_model := `Real;
[Jc_output.JCfloat_model Jc_env.FMreal]
| "strict" -> float_model := `Strict;
[Jc_output.JCfloat_model Jc_env.FMstrict]
| "full" -> float_model := `Full;
[Jc_output.JCfloat_model Jc_env.FMfull]
| "multirounding" -> float_model := `Multirounding;
[Jc_output.JCfloat_model Jc_env.FMmultirounding]
| s ->
Jessie_options.warning ~current:true
"pragma %s: identifier %s is not a valid value (ignored)."
name s; []
end;
| "JessieFloatRoundingMode" ->
begin match String.lowercase arg with
| "nearest" ->
float_rounding_mode := `Nearest;
[Jc_output.JCfloat_rounding_mode Jc_env.FRMnearest]
| "downward" -> float_rounding_mode := `Downward;
[Jc_output.JCfloat_rounding_mode Jc_env.FRMdownward]
| "upward" -> float_rounding_mode := `Upward;
[Jc_output.JCfloat_rounding_mode Jc_env.FRMupward]
| "towardzero" -> float_rounding_mode := `Towardzero;
[Jc_output.JCfloat_rounding_mode Jc_env.FRMtowardzero]
| "towardawayzero" -> float_rounding_mode := `Towardawayzero;
[Jc_output.JCfloat_rounding_mode Jc_env.FRMtowardawayzero]
| s ->
Jessie_options.warning ~current:true
"pragma %s: identifier %s is not a valid value (ignored)" name s; []
end
| "JessieFloatInstructionSet" ->
begin match String.lowercase arg with
| "x87" ->
[Jc_output.JCfloat_instruction_set "x87"]
| "ieee754" ->
[Jc_output.JCfloat_instruction_set "ieee754"]
| s ->
Jessie_options.warning ~current:true
"pragma %s: identifier %s is not a valid value (ignored)" name s; []
end
| "JessieIntegerModel" ->
begin match String.lowercase arg with
| "exact" | "math" ->
Jessie_options.IntModel.set "exact"
| "strict" ->
Jessie_options.IntModel.set "strict"
| "modulo" ->
Jessie_options.IntModel.set "modulo"
| s ->
Jessie_options.warning ~current:true
"pragma %s: identifier %s is not a valid value (ignored)." name s
end;
[]
| _ ->
Jessie_options.warning ~current:true
"pragma %s is ignored by Jessie." name;
[]
end
| GPragma _ -> []
| _ -> []