From 2e36924ca27d4ccf928e710b1c2262621f65ff02 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Mon, 3 Feb 2020 11:01:08 +0100
Subject: [PATCH] [Doc] Update developer guide for ACSL extensions

---
 doc/developer/Makefile                        |   3 +-
 doc/developer/advance.tex                     | 226 +++++++++++-------
 .../examples/acsl_extension_ext_types.ml      |  41 ++++
 .../examples/acsl_extension_ext_types.png     | Bin 0 -> 31170 bytes
 ...csl_extension.ml => acsl_extension_foo.ml} |   4 +-
 5 files changed, 187 insertions(+), 87 deletions(-)
 create mode 100644 doc/developer/examples/acsl_extension_ext_types.ml
 create mode 100644 doc/developer/examples/acsl_extension_ext_types.png
 rename doc/developer/examples/{acsl_extension.ml => acsl_extension_foo.ml} (78%)

diff --git a/doc/developer/Makefile b/doc/developer/Makefile
index 4ce9e948e29..12024d9005f 100644
--- a/doc/developer/Makefile
+++ b/doc/developer/Makefile
@@ -46,7 +46,8 @@ else
 		-load-script ./examples/syntactic_check \
 		-load-script ./examples/callstack \
 		-load-script ./examples/use_callstack \
-		-load-script ./examples/acsl_extension \
+		-load-script ./examples/acsl_extension_foo \
+		-load-script ./examples/acsl_extension_ext_types \
 		-load-script ./hello_world/hello_world.ml \
        | tee check.log
 	if grep -e "User Error" check.log; then \
diff --git a/doc/developer/advance.tex b/doc/developer/advance.tex
index 0a09948afd5..8c4e99d5be2 100644
--- a/doc/developer/advance.tex
+++ b/doc/developer/advance.tex
@@ -3917,6 +3917,30 @@ An extension is characterized by its introducing keyword \texttt{kw}, or \texttt
 extension. It is not possible to have the same keyword for two distinct extensions, especially if
 they belong to different categories, as this would lead to ambiguities in the parser.
 
+Once an extension is registered a clause of the form \verb|kw e1,...,en;|, where each \verb|ei| can be
+any syntactically valid ACSL term or predicate, will be treated by the parser as belonging to the
+extension \verb|kw|.
+
+Contract extension clauses must occur after \verb|assumes| and \verb|requires| clauses if any, but
+can be freely mixed with other behavior clauses (post-conditions, \verb|assigns|, \verb|frees| and
+\verb|allocates|).
+
+Similarly, in a loop annotation, \verb|loop kw e1, ..., en;| will be treated as belonging to the
+\verb|kw| extension. In case the loop annotation has a \verb|loop variant|, the extension must 
+occur before. Otherwise, there is no ordering constraint with other loop annotations clauses.
+
+Global extensions can appear either alone in a global annotation, or as part of an axiomatic with
+a set of other global annotations.
+
+Finally, a code annotation extension must appear as a single code annotation, like any code annotation.
+
+Code (and loop) extensions can be made specific to a
+set of existing behaviors using the standard ACSL \verb|for| construction.
+Namely, \verb|for bhv: loop kw e1, ..., en;| will indicate that the
+(loop) extension is supposed to be considered only when behavior \verb|bhv| is
+active (although it is ultimately up to the plugin to decide what to do with
+this information).
+
 An \texttt{acsl\_extension}\scodeidx{Cil\_types}{acsl\_extension} is a triple
 \texttt{(id, kw, ext)} where \texttt{id} is its unique ID, used in annotation tables and generated
 by \scodeidx{Logic\_const}{new\_acsl\_extension}\texttt{Logic\_const.new\_acsl\_extension},
@@ -3940,75 +3964,48 @@ the corresponding list is traversed normally by the visitor
 In order for the extension to be recognized by the parser, it must be
 registered by one of the following functions, depending on its category.
 \begin{itemize}
-\item \texttt{Logic\_typing.register\_behavior\_extension}%
-\scodeidx{Logic\_typing}{register\_behavior\_extension}
-\item \texttt{Logic\_typing.register\_global\_extension}%
-\scodeidx{Logic\_typing}{register\_global\_extension}
-\item \texttt{Logic\_typing.register\_code\_annot\_extension}%
-\scodeidx{Logic\_typing}{register\_code\_annot\_extension}
-\item \texttt{Logic\_typing.register\_code\_annot\_next\_stmt\_extension}%
-\scodeidx{Logic\_typing}{register\_code\_annot\_next\_stmt\_extension}
-\item \texttt{Logic\_typing.register\_code\_annot\_next\_loop\_extension}%
-\scodeidx{Logic\_typing}{register\_code\_annot\_next\_both\_extension}
-\item \texttt{Logic\_typing.register\_code\_annot\_next\_both\_extension}%
-\scodeidx{Logic\_typing}{register\_code\_annot\_next\_loop\_extension}
+\item \texttt{Acsl\_extension.register\_behavior}%
+\scodeidx{Acsl\_extension}{register\_behavior}
+\item \texttt{Acsl\_extension.register\_global}%
+\scodeidx{Acsl\_extension}{register\_global}
+\item \texttt{Acsl\_extension.register\_code\_annot}%
+\scodeidx{Acsl\_extension}{register\_code\_annot}
+\item \texttt{Acsl\_extension.register\_code\_annot\_next\_stmt}%
+\scodeidx{Acsl\_extension}{register\_code\_annot\_next\_stmt}
+\item \texttt{Acsl\_extension.register\_code\_annot\_next\_loop}%
+\scodeidx{Acsl\_extension}{register\_code\_annot\_next\_both}
+\item \texttt{Acsl\_extension.register\_code\_annot\_next\_both}%
+\scodeidx{Acsl\_extension}{register\_code\_annot\_next\_loop}
 \end{itemize}
 
-Each function takes three arguments:
+Each function takes the following mandatory arguments:
 \begin{itemize}
 \item \texttt{kw} the name of the extension,
-\item \texttt{status}, a boolean flag indicating whether the extended annotation
-  may have a validity status, and
-\item \texttt{f} the type-checking function itself.
-\end{itemize}
-
-After a call to the appropriate registration function,
-a clause of the form \verb|kw e1,...,en;|, where each \verb|ei| can be
-any syntactically valid ACSL term or predicate,
-will be treated by the parser
-as belonging to the extension \verb|kw|. Contract extension clauses must occur after
-\verb|assumes| and \verb|requires| clauses if any, but can be freely
-mixed with other behavior clauses (post-conditions, \verb|assigns|,
-\verb|frees| and \verb|allocates|).
-
-Similarly, in a loop annotation,
-\verb|loop kw e1, ..., en;| will be treated as belonging to the \verb|kw|
-extension. In case the loop annotation has a \verb|loop variant|, the
-extension must occur before. Otherwise, there is no ordering constraint with
-other loop annotations clauses.
-
-Global extensions can appear either alone in a global annotation, or as part of an axiomatic with
-a set of other global annotations.
-
-Finally, a code annotation extension must appear as a single code annotation, like any code annotation.
+\item \texttt{typer} the type-checking function itself.
+\item \texttt{status}, a boolean flag indicating whether the extended
+  annotation may have a validity status, and
 
-Code (and loop) extensions can be made specific to a
-set of existing behaviors using the standard ACSL \verb|for| construction.
-Namely, \verb|for bhv: loop kw e1, ..., en;| will indicate that the
-(loop) extension is supposed to be considered only when behavior \verb|bhv| is
-active (although it is ultimately up to the plugin to decide what to do with
-this information).
+\end{itemize}
 
-During type-checking,
-the list \verb|[e1;...;en]| will be given to \verb|f|, together
-with the current typing environment (which allows discriminating
+During type-checking, the list \verb|[e1;...;en]| will be given to \verb|typer|,
+together with the current typing environment (which allows discriminating
 between contract and loop extensions and will have the appropriate logic labels
-set in the local environment). \verb|f| must return the corresponding
+set in the local environment). \verb|typer| must return the corresponding
 \verb|acsl_extension_kind| (possibly adding an entry for key \verb|id|
 in an internal table if it chooses to return \verb|Ext_id id|).
 
-The first argument of \verb|f| is a \verb|Logic_typing.typing_context|%
-\scodeidx{Logic\_typing}{typing\_context}
-which provides lookup functions for the various kinds of identifiers that are
-present in the environment, as well as extensible type-checking functions for
-predicates, terms, and assigns clauses. Indeed, these functions take themselves
-as argument a \verb|typing_context| \verb|ctxt| and will use the functions
-of \verb|ctxt| to type-check the children of the current node. Extensions
-can take advantage of this open recursion to recognize only subtrees of an
-otherwise normal ACSL predicate or term. For instance, the following code will
-let extension \verb|foo| replace all occurrences of \verb|\foo| by \verb|42|.
+The first argument of \verb|typer| is a \verb|Logic_typing.typing_context|%
+\scodeidx{Logic\_typing}{typing\_context} which provides lookup functions for the
+various kinds of identifiers that are present in the environment, as well as
+extensible type-checking functions for predicates, terms, and assigns clauses.
+Indeed, these functions take themselves as argument a \verb|typing_context|
+\verb|ctxt| and will use the functions of \verb|ctxt| to type-check the children
+of the current node. Extensions can take advantage of this open recursion to
+recognize only subtrees of an otherwise normal ACSL predicate or term. For
+instance, the following code will let extension \verb|foo| replace all
+occurrences of \verb|\foo| by \verb|42|.
 
-\ocamlinput{./examples/acsl_extension.ml}
+\ocamlinput{./examples/acsl_extension_foo.ml}
 
 With this extension enabled, \framac will interpret the following clause in
 a given source file:
@@ -4020,32 +4017,93 @@ as the following type-checked AST fragment:
 /*@ foo 84 == 42 + 42; */
 \end{lstlisting}
 
-If all the information of the extended clause is contained in
-the predicate list \verb|preds|, no other registration is needed beyond
-the parsing and type-checking: the pretty-printer will output \verb|preds|
-as a comma-separated list preceded by \verb|kw| (or \verb|loop kw| if
-the extension is a loop annotation), and the visitor will traverse
-each \verb|preds| as well as any predicate present in the AST. However, if
-some information is present in the internal state of the plugin, two more
-functions may be required for pretty-printing and visiting the extending
-clause respectively.
-
-First,
-\texttt{Cil\_printer.register\_behavior\_extension}%
-\scodeidx{Cil\_printer}{register\_behavior\_extension}
-registers a new pretty-printer \verb|pp| for a given extension \verb|kw|.
-Together with the \verb|acsl_extension_kind| of the extended clause,
-\verb|pp| is given the current pretty-printer and the formatter where to
-output the result.
-
-Second,
-\texttt{Cil.register\_behavior\_extension}%
-\scodeidx{Cil}{register\_behavior\_extension}
-registers a custom visitor \verb|vext| for a given extension \verb|kw|.
-\verb|vext| is given the content of the extended clause and the current
-visitor, and must return a \texttt{Cil.visitAction}
-(if all the information is in the plugin's own table, it can
-return \texttt{SkipChildren}).
+If the extended clause is of kind \verb|Ext_preds l| or \verb|Ext_terms l|,
+and all the information of the extension is contained in the list \verb|l|,
+no other function than the typing function needs to be registered. The parsing
+will use the standard way to parse untyped predicates and terms, and after
+typing, the visitor will traverse each element of \verb|l| as well as any
+predicate or term present in the AST, and the pretty-printer will output these
+elements as a comma-separated list preceded by \verb|kw| (or \verb|loop kw| if
+the extension is a loop annotation).
+
+However, depending on the situation, the following optional functions can be
+provided to the registration function in order to modify how ACSL extensions
+are handled by Frama-C:
+
+\begin{itemize}
+\item \texttt{preprocessor} a transformer to apply on the untyped term or
+  predicate read during the parsing phase,
+\item \texttt{visitor} the visitor function to be applied when visiting
+  the extension,
+\item \texttt{printer} the pretty-printing function associated to the
+  extension,
+\item \texttt{short\_printer} a function used to provide a brief textual
+  representation of an extension.
+\end{itemize}
+
+The \verb|preprocessor| function is applied just after parsing the extension
+terms. It takes the list of untyped terms or predicates and can either return
+the same list (but reading it to do some stuff) or return a new list. By
+default, this function is the identity.
+
+The \verb|visitor| function is used by the Frama-C visitors. It takes the
+current visitor, together with the \verb|acsl_extension_kind| of the extended
+clause and must returns a \verb|Cil.visitAction|. By default, this function
+just returns \verb|Cil.DoChildren|.
+
+The \verb|printer| function is used by the \verb|Cil_printer.pp_extended|
+function. It takes the current pretty-printer, the formatter, together with
+the \verb|acsl_extension_kind| of the extended clause. By default, it prints
+the list of terms or predicates if the kind is \verb|Ext_preds l| or
+\verb|Ext_terms l|. If the kind is \verb|Ext_id i|, it only prints the
+integer \verb|i|.
+
+The \verb|short_printer| function is a function that can be useful for
+debugging or user-feedback. As an alternative to \verb|Cil_printer.pp_extended|,
+the \verb|Cil_printer.pp_short_extended| can be used to get brief description
+of the content of the extension. It is for example used by the GUI to get
+a more informative name for the extension in the file tree. By default, it
+does not print anything about the content of the extension, so that the
+result is \verb|"kwd"| or \verb|"loop kwd"|.
+
+When the extension kind is \verb|Ext_id|, it is common that the plugin
+defining the extension contains a table that associates some data to this
+identifier. In such a case, a \verb|printer| might be needed to reconstruct
+the source code from the data so that a pretty printed code can be parsed
+again. For the same reason, an extension that registers a \verb|preprocessor|
+that modifies the AST should probably register a \verb|printer| to recover
+the original content.
+
+It is also common, when the kind is \verb|Ext_id|, to define a particular
+visitor for the extension, either to ignore the content of the extension as
+it is in an internal table of the plugin (thus returning a \verb|SkipChildren|
+action) or, on the opposite, to give the possibility to a user defined visitor
+to get an access to this content.
+
+The following code provide a more complete extension example. It provides the
+user a way to load some types (assumed to be external to Frama-C) so that they
+can be used in ACSL specification.
+
+\ocamlinput{./examples/acsl_extension_ext_types.ml}
+
+Namely, specification:
+
+\begin{lstlisting}[language=C,alsolanguage=ACSL]
+/*@ ext_type load: foo ; */
+/*@ 
+  axiomatic Pred {
+    predicate P(foo f) reads \nothing ;
+  }
+*/
+/*@ lemma X: \forall foo f ; P(f) ; */
+\end{lstlisting}
+
+is correctly parsed and typed by Frama-C and leads to the following displayed
+version in the interface:
+
+\includegraphics[width=\textwidth]{examples/acsl_extension_ext_types}
+
+
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
diff --git a/doc/developer/examples/acsl_extension_ext_types.ml b/doc/developer/examples/acsl_extension_ext_types.ml
new file mode 100644
index 00000000000..504b903633e
--- /dev/null
+++ b/doc/developer/examples/acsl_extension_ext_types.ml
@@ -0,0 +1,41 @@
+open Logic_ptree
+open Logic_typing
+open Cil_types
+
+let preprocessor =
+  List.map (fun e -> begin match e with
+      | { lexpr_node = PLnamed ("load", { lexpr_node = PLvar s}) } ->
+        if not (Logic_env.is_logic_type s) then Logic_env.add_typename s
+        else Kernel.error "Type already exists %s" s
+      | _ -> ()
+    end ; e)
+
+module Ts = struct
+  let id = ref 0
+  let types = Hashtbl.create 5
+
+  let add t = let i = !id in Hashtbl.add types i t ; id := i + 1 ; i
+  let find = Hashtbl.find types
+end
+
+let typer ctxt loc = function
+  | [ { lexpr_node = PLnamed ("load", { lexpr_node = PLvar s}) } ] ->
+    let ti = { lt_name = s ; lt_params = [] ; lt_def = None ; lt_attr = []} in
+    ctxt.add_logic_type s ti ;
+    Ext_id (Ts.add ti)
+  | _ ->
+    ctxt.error loc "Expected type loader"
+
+let visitor _ _ = Cil.SkipChildren
+
+let gen_printer s _pp fmt = function
+  | Ext_id i ->
+    Format.fprintf fmt "%s%s" (if s then "" else "load: ") (Ts.find i).lt_name
+  | _ -> assert false
+
+let printer = gen_printer false
+let short_printer = gen_printer true
+
+let () =
+  Acsl_extension.register_global
+    "ext_type" ~preprocessor typer ~visitor ~printer ~short_printer false
\ No newline at end of file
diff --git a/doc/developer/examples/acsl_extension_ext_types.png b/doc/developer/examples/acsl_extension_ext_types.png
new file mode 100644
index 0000000000000000000000000000000000000000..10943fd6b17151f8c5cc60cc9557a0b4d8c6b31c
GIT binary patch
literal 31170
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

literal 0
HcmV?d00001

diff --git a/doc/developer/examples/acsl_extension.ml b/doc/developer/examples/acsl_extension_foo.ml
similarity index 78%
rename from doc/developer/examples/acsl_extension.ml
rename to doc/developer/examples/acsl_extension_foo.ml
index 9c677e00200..239ccd00b7a 100644
--- a/doc/developer/examples/acsl_extension.ml
+++ b/doc/developer/examples/acsl_extension_foo.ml
@@ -2,7 +2,7 @@ open Logic_ptree
 open Cil_types
 open Logic_typing
 
-let type_foo ~typing_context ~loc:_loc l =
+let type_foo typing_context _loc l =
   let type_term ctxt env expr =
     match expr.lexpr_node with
       | PLvar "\\foo" -> Logic_const.tinteger ~loc:expr.lexpr_loc 42
@@ -14,4 +14,4 @@ let type_foo ~typing_context ~loc:_loc l =
   in
   Ext_terms res
 
-let () = Logic_typing.register_behavior_extension "foo" false type_foo
+let () = Acsl_extension.register_behavior "foo" type_foo false
-- 
GitLab