diff --git a/doc/pdg/.gitignore b/doc/pdg/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..144038366c79af13135b3357ed21da6c83ac23a1
--- /dev/null
+++ b/doc/pdg/.gitignore
@@ -0,0 +1,6 @@
+biblio.bib
+frama-c-book.cls
+frama-c-cover.pdf
+frama-c-left.pdf
+frama-c-right.pdf
+main.pdf
diff --git a/doc/pdg/Makefile b/doc/pdg/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..de8bc6307421bec04bd8fab929978e1191a8f78e
--- /dev/null
+++ b/doc/pdg/Makefile
@@ -0,0 +1,70 @@
+.PHONY: all clean
+
+all: main.pdf
+
+GENERATED=biblio.bib
+GENERATED+=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf
+include ../MakeLaTeXModern
+
+DWNLDDIR=../manuals
+DOCNAME=pdg-documentation-fr.pdf
+TEST_DIR=../../tests/pdg/
+
+BIB_FILE = ../slicing/bib-slicing.bib
+main.bbl : $(BIB_FILE)
+	@echo "=== Fichier .bib plus récent -> effacement du .bbl"
+	rm -f $(SRC).bbl
+
+main.pdf: $(FRAMAC_MODERN) $(BIB_FILE) \
+	main.tex pdg.tex macros_pdg.tex \
+	intro.tex conclusion.tex \
+	data.tex ctrl.tex calls.tex utilisation.tex mark.tex impact.tex \
+	../images/cealistlogo.jpg \
+	exple-call.c call-f.pdf call-g.pdf \
+	ctrl-dpds.pdf ex-goto.pdf goto.pdf pdg-call.pdf
+
+###############################################################################
+
+GENERATED+=call-f.fig call-g.fig
+%.fig : %.dot
+	dot -Tfig $< > $@
+
+GENERATED+=call-f.pdf call-g.pdf
+%.pdf : %.fig
+	fig2dev -L pdf $< $@
+
+GENERATED+=call-f.dot call-g.dot
+call-%.dot : $(TEST_DIR)/call.%.dot
+	cp $< $@
+
+call-%.dot :
+	@echo
+	@echo "ERROR : $@ not found : you should run PDG tests to have it"
+	@echo "  Run : cd ../.. ; make pdg_tests ; cd - "
+	@echo
+	exit 1
+
+GENERATED+=exple-call.c
+exple-%.c : $(TEST_DIR)/%.c
+	sed "1,/BDOC/d" $< > $@
+
+###############################################################################
+
+%.pdf: %.tex
+	pdflatex $*
+	bibtex $*
+	pdflatex $*
+	pdflatex $*
+
+install: main.pdf
+	@echo "copying main.pdf    in $(DWNLDDIR)/$(DOCNAME)"
+	@rm -f "$(DWNLDDIR)/$(DOCNAME)"
+	@cp main.pdf "$(DWNLDDIR)/$(DOCNAME)"
+
+clean:
+	rm -rf *~ *.aux *.log *.nav *.out *.snm *.toc *.lof *.pp *.bnf \
+		*.haux  *.hbbl *.htoc \
+                *.cb *.cb2 *.cm? *.bbl *.blg *.idx *.ind *.ilg \
+		$(GENERATED)
+
+###############################################################################
diff --git a/doc/pdg/calls.tex b/doc/pdg/calls.tex
new file mode 100644
index 0000000000000000000000000000000000000000..f50ff876f08f1daceddb482f80f1e291fd2892bd
--- /dev/null
+++ b/doc/pdg/calls.tex
@@ -0,0 +1,209 @@
+\chapter{Dépendances interprocédurales}\label{sec-intro-call}
+
+On a vu qu'un PDG est associé à une fonction.
+La question se pose donc de savoir
+comment calculer des dépendances interprocédurales, c'est-à-dire comment mettre
+en relation les appels de fonctions et les dépendances des fonctions appelées.
+
+Nous allons tout d'abord voir qu'un appel de fonction
+est représenté par plusieurs éléments dans le PDG (\S\ref{sec-call}).
+Puis, nous allons voir que pour mettre en relation des appels et les fonctions
+appelées, ils faut ajouter d'autres éléments à chaque fonction
+(\S\ref{sec-fct-inout}).
+
+\section{Appels de fonction}\label{sec-call}
+
+L'instruction contenant l'appel est représentée par plusieurs
+éléments dans le graphe de dépendances
+afin de pouvoir plus précisément mettre en relation les appels aux
+fonctions appelées.
+
+Les éléments créés sont les suivants~:
+\begin{itemize}
+\item un élément pour chaque paramètre de la fonction appelée;
+  les dépendances sont crées par une simulation
+  de l'affectation des arguments d'appel dans les paramètres formels,
+\item un élément représentant le contrôle du point d'entrée de la fonction
+  appelée (un peu comme si l'appel était dans un bloc et que ce noeud
+  représentait ce bloc),
+\item un élément pour chaque sortie, dépendant des entrées correspondantes.
+\end{itemize}
+
+Pour ne pas avoir à calculer les flots de données de toutes les fonctions de
+l'application, il a été décidé d'utiliser les dépendances ({\it from})
+calculées indépendamment par \ppc.
+La liste des entrées et des sorties, ainsi que les dépendances entre les unes et
+les autres sont extraites des spécifications des fonctions appelées, et non de
+leur PDG\footnote{c'est peut-être un problème
+si on fait de la coupure de branche, car les dépendances peuvent être réduites
+par une telle spécialisation.}.
+Ceci est vrai également pour les
+fonctions dont le code est absent de l'application étudiée
+car cela permet d'être cohérent avec les autres analyses.
+Cela permettra en particulier, d'utiliser d'éventuelles propriétés
+fournies par la suite par l'utilisateur.
+
+\begin{exemple}
+\begin{tabular}{m{0.35\textwidth} m{0.6\textwidth}}
+\begin{verbatim}
+struct {int a;
+        int b; } G;
+
+/*@ assigns \result {a},
+            G.a {G, a} */
+int g (int a);
+
+int f (int x, int y) {
+  G.b = x;
+  x = g (x+y);
+  return x + G.b;
+}
+\end{verbatim}
+&
+Ici, pour représenter l'appel à \verbtt{g} dans \verbtt{f} dans le PDG,
+on va avoir~:
+\begin{itemize}
+  \item un élément représentant le point d'entrée dans \verbtt{g},
+  \item un élément $e_1$ pour représenter \verbtt{a = x+y},
+    c'est-à-dire l'affectation de l'argument de l'appel
+    dans le paramètre formel de \verbtt{g},
+  \item un élément $e_2$ pour calculer la valeur de retour de \verbtt{g},
+    qui dépend de la valeur de $e_1$
+    (utilisation de la spécification de $g$),
+
+\item et enfin, un élément $e_3$ qui représente la seconde sortie de \verbtt{g}~:
+\verbtt{G.a} qui dépend du paramètre \verbtt{a} et donc de $e_1$
+    et de des éléments $\{ e_G \}$
+    correspondant à
+    la valeur de $G$ avant l'appel
+(selon la spécification de $g$).
+\end{itemize}
+\end{tabular}
+\end{exemple}
+
+On note que, contrairement à ce qui était fait dans la version précédente,
+on ne crée par d'élément pour l'entrée implicite $G$ de $g$ dans $f$.
+Cela permet d'améliorer la précision des dépendances lorsque
+l'ajout d'un tel noeud conduisait au regroupement de plusieurs données.
+
+Ainsi, dans l'exemple précédent, on ne crée pas d'élément pour
+représenter la valeur de $G$ avant l'appel, même si l'élément $e_3$ en dépend,
+et on conserve donc l'information que $G.b$ ne dépend que de l'affectation
+précédent l'appel.
+
+
+\section{Entrées/sorties d'une fonction}\label{sec-fct-inout}
+
+Pour relier un appel de fonction au PDG de la fonction appelée,
+il faut ajouter des éléments représentant ses entrées/sorties,
+c'est-à-dire~:
+
+\begin{itemize}
+  \item un élément correspondant au point de contrôle d'entrée
+dans la fonction,
+\item deux éléments pour chaque paramètre (cf. \S\ref{sec-decl-param}),
+\item un élément pour les entrées implicites (cf. \S\ref{sec-impl-in}),
+\item un élément pour la sortie de la fonction si celle-ci retourne
+  quelque chose.
+\end{itemize}
+
+On note que, contrairement à ce qui était fait dans la version précédente,
+on ne crée par d'élément pour les sorties implicites de la fonction.
+Cela permet d'améliorer la précision des dépendances lorsque
+l'ajout d'un tel noeud conduisait au regroupement de plusieurs données.
+
+C'est par exemple le cas lorsqu'une fonction calcule $G.a$,
+puis $G.a.x$ car un élément de sortie regrouperait les deux alors que
+si par la suite on s'intéresse juste à $G.a.x$ à la sortie de la fonction,
+le fait de ne pas avoir créé cet élément permet de retrouver l'information plus
+précise.
+
+\subsection{Entrées implicites}\label{sec-impl-in}
+
+Au cours du calcul du PDG, on mémorise l'utilisation des données
+qui ne sont pas préalablement définies.
+Cela permet par la suite que créer des éléments pour ces entrées dites
+implicites. On ne crée pas d'élément pour les variables locales non
+initialisées, mais un message d'avertissement est émis.
+Il est possible que ce soit une fausse alerte dans le cas où l'initialisation
+est faite dans une branche dont la condition est forcement vrai à chaque
+exécution où l'on passe par la suite par l'utilisation.
+
+Diverses stratégies de regroupement de ces entrées peuvent être utilisées.
+A ce jour, l'outil construit tous les éléments lui permettant d'avoir une
+meilleure précision. C'est-à-dire que deux éléments peuvent représenter les
+données qui ont une intersection.
+
+\subsection{Déclaration des paramètres formels}\label{sec-decl-param}
+
+En plus de l'élément représentant la valeur des paramètres,
+on crée un second élément qui représente sa déclaration,
+le premier dépendant du second.
+
+Cette représentation peut permettre d'avoir une meilleure précision
+dans le cas où certains calcul ne dépendent pas de la valeur du
+paramètre, mais uniquement de sa déclaration.
+
+\begin{exemple}
+\begin{tabular}{m{5cm} m{\linewidth - 6cm}}
+\begin{verbatim}
+int g (int a) {
+  G = 2 * a;
+  a = calcul_a ();
+  return a;
+}
+int f (void) {
+  int x = calcul_x ();
+  return g (x);
+}
+\end{verbatim}
+&
+On voit que la valeur de retour de \verbtt{g} ne nécessite pas la valeur initiale
+de \verbtt{a}, mais seulement sa déclaration. La valeur de retour de \verbtt{f}
+ne dépend donc pas de l'appel à \verbtt{calcul\_x}.
+\end{tabular}
+\end{exemple}
+
+Ce point n'est pas encore implémenté dans la version actuelle,
+car dans des cas plus complexe, il est délicat de savoir ce qu'il faut
+garder dans la fonction appelante. Le plus simple serait sans doute
+de transformer le paramètre formel en une variable locale,
+mais le filtrage permet à l'heure actuelle de garder ou d'effacer des
+éléments existants, mais pas d'effectuer des transformations de code...
+
+\section{Fonctions à nombre d'arguments variable}
+
+Pour l'instant, on ne calcule pas le PDG des fonctions à nombre
+d'arguments variable, c'est-à-dire que pour le reste de l'application,
+tout se passe comme si on n'avait pas le code source de ces fonctions.\\
+
+En revanche, les appels à de telles fonctions sont gérées de manière semblable à
+ce qui est fait pour les autres appels, c'est-à-dire~:
+\begin{itemize}
+  \item création d'un noeud d'entrée pour chaque argument d'appel,
+    (il y en a donc éventuellement plus que que paramètres formels dans le
+    déclaration de la fonction appelée)
+  \item utilisation des informations {\it from} pour créer les éventuelles
+    entrées implicites, les sorties, et les liens de dépendance.
+\end{itemize}
+
+\section{Exemple}
+
+\begin{exemple}
+
+\lstinputlisting[language=c]{exple-call.c}
+\end{exemple}
+
+Graphe de la fonction \verbtt{f}: \\
+
+\includegraphics[width=0.6\textwidth]{call-f}
+\\
+
+\clearpage
+
+Graphe de la fonction \verbtt{g}: \\
+
+\includegraphics[width=1\textwidth]{call-g}
+\\
+
+Les graphes sont ceux qui sont effectivement produits par l'outil.
diff --git a/doc/pdg/conclusion.tex b/doc/pdg/conclusion.tex
new file mode 100644
index 0000000000000000000000000000000000000000..646d2642d4a8a9dcebc3c31aa079b976331333a9
--- /dev/null
+++ b/doc/pdg/conclusion.tex
@@ -0,0 +1,22 @@
+\chapter{Conclusion}
+
+La version actuelle de ce greffon semble fonctionner.
+Elle est utilisée par les greffons {\sc Security}, {\sc Sparecode} et
+{\sc Slicing}. Ces résultats peuvent également être visualisés
+graphiquement en utilisant la fonction d'exportation
+au format {\tt .dot}.\\
+
+D'autres information relatives au développement peuvent être trouvées dans la documentation du code dont un point d'entrée
+est~:
+
+\centerline{\tt doc/code/pdg/index.html}
+
+\section{Limitations}
+
+Les fonctions ayant un nombre d'arguments variable 
+ne sont pas traitées (mais les appels à de telles fonctions sont gérés).
+
+Par ailleurs, les calculs se basant sur l'analyse de valeur,
+et sur le calcul des dépendances fonctionnelles (\from)
+il hérite des limitations de ces modules.
+
diff --git a/doc/pdg/ctrl-dpds.fig b/doc/pdg/ctrl-dpds.fig
new file mode 100644
index 0000000000000000000000000000000000000000..d41477b617f390b1c3fb6fc1f10e5ea6da28a72b
--- /dev/null
+++ b/doc/pdg/ctrl-dpds.fig
@@ -0,0 +1,106 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #ffffff
+6 4410 2610 5355 3195
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 4417 2645 5314 2645 5314 3165 4417 3165 4417 2645
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 4417 2645 5314 2645 5314 3165 4417 3165 4417 2645
+4 1 0 0 0 16 17 0.0000 6 180 810 4866 2976 START\001
+-6
+6 5715 6210 6120 6795
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 5728 6236 6082 6236 6082 6755 5728 6755 5728 6236
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 5728 6236 6082 6236 6082 6755 5728 6755 5728 6236
+4 1 0 0 0 16 17 0.0000 6 180 165 5905 6566 B\001
+-6
+6 7470 4860 7965 5445
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 7488 4889 7960 4889 7960 5409 7488 5409 7488 4889
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 7488 4889 7960 4889 7960 5409 7488 5409 7488 4889
+4 1 0 0 0 16 17 0.0000 6 180 300 7724 5220 S2\001
+-6
+6 5715 4860 6120 5445
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 5740 4889 6094 4889 6094 5409 5740 5409 5740 4889
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 5740 4889 6094 4889 6094 5409 5740 5409 5740 4889
+4 1 0 0 0 16 17 0.0000 6 180 150 5917 5220 Z\001
+-6
+6 4725 5715 5220 6255
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 4748 5716 5220 5716 5220 6236 4748 6236 4748 5716
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 4748 5716 5220 5716 5220 6236 4748 6236 4748 5716
+4 1 0 0 0 16 17 0.0000 6 180 285 4984 6047 Z1\001
+-6
+6 6435 5715 6975 6255
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 6472 5716 6968 5716 6968 6236 6472 6236 6472 5716
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 6472 5716 6968 5716 6968 6236 6472 6236 6472 5716
+4 1 0 0 0 16 17 0.0000 6 180 285 6720 6047 Z2\001
+-6
+6 4455 7155 5220 7740
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 4464 7181 5196 7181 5196 7700 4464 7700 4464 7181
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 4464 7181 5196 7181 5196 7700 4464 7700 4464 7181
+4 1 0 0 0 16 17 0.0000 6 180 675 4830 7511 STOP\001
+-6
+6 6480 3375 6885 3960
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 6519 3401 6874 3401 6874 3921 6519 3921 6519 3401
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 6519 3401 6874 3401 6874 3921 6519 3921 6519 3401
+4 1 0 0 0 16 17 0.0000 6 180 165 6696 3732 A\001
+-6
+6 4725 4185 5220 4725
+2 3 0 1 32 32 0 -1 20 0.000 0 0 0 0 0 5
+	 4745 4204 5194 4204 5194 4724 4745 4724 4745 4204
+2 3 0 1 0 0 0 0 -1 0.000 0 0 0 0 0 5
+	 4745 4204 5194 4204 5194 4724 4745 4724 4745 4204
+4 1 0 0 0 16 17 0.0000 6 180 300 4970 4535 S1\001
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5310 2925 6345 2925 6705 3420
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 4500 3150 4275 5445 4680 7200
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6525 3600 5175 3600 4950 4185
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6885 3600 7245 3600 7650 4905
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5175 4455 5625 4455 5895 4905
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5760 5175 5310 5175 4950 5715
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6075 5175 6480 5175 6750 5715
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 4950 6210 4995 6390 5715 6615
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6750 6210 6705 6390 6075 6615
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 7650 5400 7650 6300 5175 7425
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5850 6750 5850 6975 5175 7290
diff --git a/doc/pdg/ctrl.tex b/doc/pdg/ctrl.tex
new file mode 100644
index 0000000000000000000000000000000000000000..a5bbd5d16174dd5e11243856d77c73963b2301ec
--- /dev/null
+++ b/doc/pdg/ctrl.tex
@@ -0,0 +1,747 @@
+\newcommand{\text}[1]{\mbox{#1}}
+\newcommand{\impl}{\Rightarrow}
+\newcommand{\et}{\wedge}
+\newcommand{\ou}{\vee}
+\newcommand{\define}{\Leftrightarrow{def}}
+\newcommand{\mssi}{\Leftrightarrow}
+
+\newcommand{\llb}{\llbracket}
+\newcommand{\ch}[1]{[#1]}
+\newcommand{\mch}[1]{[#1[}
+\newcommand{\allch}[1]{\llb #1] }
+\newcommand{\allmch}[1]{\llb #1[}
+
+\newcommand{\n}[1]{\ensuremath{\mathfrak{#1}}}
+\newcommand{\nE}{\n{E}}
+\renewcommand{\P}[1]{\ensuremath{\mathit{P}(\n{#1})}}
+\newcommand{\D}[2]{\ensuremath{\mathit{D}(\n{#1},\n{#2})}}
+\newcommand{\Pd}[1]{\ensuremath{\mathit{Pd}(\n{#1})}}
+\newcommand{\Pdi}[1]{\ensuremath{\mathit{Pd}^{\infty}(\n{#1})}}
+\newcommand{\Pda}[1]{\ensuremath{\mathit{Pd}^{+}(\n{#1})}}
+\newcommand{\dpdc}[1]{\ensuremath{\mathit{DpdC}(\n{#1})}}
+\newcommand{\codpdc}[1]{\ensuremath{\mathit{CoDpdC}(\n{#1})}}
+\renewcommand{\succ}[1]{\ensuremath{\mathit{Succ}(\n{#1})}}
+\newcommand{\succl}[1]{\ensuremath{\mathit{Succ_{L}}(\n{#1})}}
+
+\newcommand{\ssi}{si et seulement si }
+
+\chapter{Dépendances de contrôle}\label{sec-cdg}
+
+\section{Introduction}
+
+Intuitivement, un noeud \n{n} du PDG a une dépendance de contrôle sur un noeud
+\n{c}
+si le fait d'exécuter \n{n} dépend du résultat de l'exécution de \n{c}.
+Typiquement, \n{c} est un noeud qui a plusieurs successeurs, comme un {\sc if} par
+exemple,
+et en fonction de la branche qui est choisie, \n{n} est exécuté ou non.
+
+Nous allons voir qu'il existe de nombreuses façons de calculer ces
+dépendances de contrôle, mais que nous avons du les adapter car
+elle ne correspondent pas exactement à ce que l'on souhaitait faire.
+Le principal problème est que
+nous nous proposons d'analyser correctement
+toute fonction, même en présence de sauts quelconques, voire de boucles
+infinies; ce qui, comme nous allons le voir,
+pose des problèmes particuliers au niveau des dépendances de contrôle.
+
+\section{Etat de l'art}
+
+Commençons tout d'abord par rappeler quelques définitions
+et rapporter les résultats que l'on trouve dans la littérature.
+
+\subsection{CFG}
+
+Le \indexdef{graphe de flot de contrôle} est un graphe orienté qui définit l'ordre
+d'exécution des instructions. Un noeud \n{a} est connecté à un noeud \n{b}
+si l'instruction \n{b} peut suivre immédiatement
+l'instruction \n{a} dans une trace l'exécution.
+On dit que \n{b} est un \indexdef{successeur} de \n{a}.
+On représente l'ensemble des successeurs d'un noeud \n{a} par $\succ{a}$.
+On dit aussi que \n{a} est un \indexdef{prédécesseur} de \n{b}.\\
+
+Un noeud est considéré comme une entrée dans le CFG s'il n'a pas de prédécesseur.
+Il est généralement considéré qu'il y a un unique noeud d'entrée,
+et que tous les noeuds du CFG sont atteignables depuis ce point d'entrée.
+Cette hypothèse semble raisonnable car on s'intéresse au CFG d'une fonction
+qui a bien un seul point d'entrée, et les instructions non atteignables depuis
+le point d'entrée sont du
+code mort que l'on peut donc ignorer dans les analyses.\\
+
+Un noeud est considéré comme une sortie du CFG s'il n'a pas de successeur.
+Son unicité et son accessibilité sont discutées plus loin.
+
+
+\subsection{Postdominateurs}
+
+La plupart des algorithmes de calcul des dépendances de contrôle
+se basent
+sur un CFG dans lequel sont ajoutés deux noeuds spéciaux {\sc start} et
+{\sc stop} (on notera \nE{} ce dernier),
+et sur la notion de  \indexdef{postdominateur} dont une définition est
+la suivante~:
+
+\begin{definition}{postdominateur}
+  Une instruction \n{a} est {\bf postdominée} par une instruction \n{b}
+  (\n{b} est un {\bf postdominateur} de \n{a})
+  si tous les chemins qui vont de \n{a} au noeud \nE{} contiennent \n{b}.
+\end{definition}
+
+En d'autres termes, si on passe par l'instruction \n{a},
+on passe forcement par tous ses postdominateurs avant de sortir.
+Ou encore,
+toutes les traces partant de \n{a} et allant à \nE{} passent par \n{b}.\\
+
+
+Certains auteurs définissent également
+le \indextxtdef{premier postdominateur}{postdominateur!premier}
+(appelé aussi \indextxtdef{postdominateur immédiat}{postdominateur!immédiat})
+de la façon suivante~:
+
+\begin{definition}{premier postdominateur}
+  \n{b} est le premier postdominateur de \n{a} \ssi~:
+\begin{itemize}
+  \item \n{b} postdomine \n{a},
+  \item et \n{b} est postdominé par tous les autres postdominateurs de \n{a}.
+\end{itemize}
+\n{b} est donc unique.
+\end{definition}
+
+Cela permet de construire un arbre (appelé PDT pour {\it Post-Dominator Tree})
+représentant cette relation dans lequel les noeuds sont les mêmes que
+ceux du CFG et le père de chaque noeud est son premier postdominateur.\\
+
+L'ensemble des postdominateurs d'un noeud \n{a} est donné par~:
+$$
+\Pd{a} = \{a\} \bigcup \bigcap_{s \in \succ{a}} \Pd{s}
+$$
+qui traduit le fait que \n{b} postdomine \n{a} \ssi $\n{b} = \n{a}$
+ou \n{b} postdomine tous les successeurs de \n{a}.
+La méthode de calcul consiste à initialiser tous les ensembles à $\top$,
+et à itérer jusqu'à stabilisation.
+La fonction étant décroissante, la convergence est assurée.\\
+
+
+La notion classique de postdominateurs suppose que le CFG ait un point unique de
+sortie \nE,
+et que celui-ci soit atteignable depuis tous les autres points du graphe.
+Si ce n'est pas le cas, à la fin de ce calcul,
+pour les \n{a} n'ayant pas de chemin vers \nE, on a~: $\Pd{a} = \top$.\\
+
+
+\subsection{Dépendances de contrôle}
+
+Intuitivement, on dit qu'une instruction \n{a} a une \indextxtdef{dépendance de
+contrôle}{dépendance!contrôle} sur une instruction \n{c}
+si, en fonction du choix que l'on fait en \n{c}, on passe ou non en \n{a}.
+Cela suppose donc qu'il y ait un choix à faire en \n{c},
+c'est-à-dire que le noeud correspondant dans le CFG
+ait plusieurs successeurs.\\
+
+Les dépendances de contrôle sont définies par \cite{Ferrante87}
+de la façon suivante~:
+
+\begin{definition}{dépendances de contrôle selon \cite{Ferrante87}}
+  Pour deux noeuds \n{a} et \n{b} du CFG, \n{b} dépend de \n{a} ssi~:
+\begin{itemize}
+  \item il existe un chemin P de \n{a} a \n{b}
+    tel que tout noeud Z de P, différent de \n{a} et de \n{b}, est postdominé
+    par \n{b},
+  \item et \n{a} n'est pas postdominé par \n{b}.
+\end{itemize}
+\end{definition}
+
+Ce qui signifie que~:
+\begin{itemize}
+  \item plusieurs chemins partent de \n{a},
+  \item qu'il existe un chemin qui passe par \n{b},
+  \item et qu'il existe aussi un chemin qui ne passe pas par \n{b}
+    (sinon, \n{a} serait postdominé par \n{b}).
+\end{itemize}
+
+Ce qui conduit à une autre
+définition, équivalente à la précédente~:
+
+\begin{definition}{dépendance de contrôle}
+  Une instruction \n{b} a une {\bf dépendance de contrôle} vis à vis de \n{a} si~:
+\begin{itemize}
+  \item \n{b} postdomine certains successeurs de \n{a},
+  \item \n{b} ne postdomine pas tous les successeurs de \n{a}.
+\end{itemize}
+\end{definition}
+
+Pour calculer le CDG, l'algorithme de référence est le suivant~:
+
+\begin{algo}{calcul du CDG selon \cite{Ferrante87}}
+\begin{itemize}
+\item soit ACFG le CFG (+ START et {\sc stop}) dans lequel sont ajoutés~:
+  \begin{itemize}
+    \item un noeud ENTRY,
+    \item une arrête (ENTRY,START),
+    \item une arrête (ENTRY,
+      {\sc stop}),
+  \end{itemize}
+\item soit S l'ensemble des arrêtes (\n{a},\n{b}) de ACFG
+  telles que \n{b} ne postdomine pas \n{a}, \\
+  (c'est-à-dire les arrêtes partant des noeuds \n{a} qui ont plusieurs successeurs)
+\item soit \n{l} le plus petit ancêtre commun à \n{a} et \n{b} dans PDT\\
+  (on peut montrer que soit \n{l}=\n{a}, soit \n{l} est le père de \n{a} dans PDT)
+  \begin{itemize}
+    \item si \n{l} est le père de \n{a} dans PDT, tous les noeuds du PDT sur le chemin
+      entre \n{l} et \n{b} (\n{b} compris, mais pas \n{l}) dépendent de \n{a},
+    \item si \n{l} = \n{a}, tous les noeuds du PDT sur le chemin
+      entre \n{a} et \n{b} (\n{a} et \n{b} compris) dépendent de \n{a}.
+  \end{itemize}
+\end{itemize}
+En fait, il est plus simple de dire que  tous les noeuds du PDT sur le chemin
+entre \n{b} et le père de \n{a} (\n{b} compris, mais pas le père de \n{a}) dépendent de
+\n{a}.
+\end{algo}
+
+La relation de dépendance étant transitive, on peut choisir de calculer
+uniquement les dépendances directes ou d'inclure les dépendances indirectes.
+
+\begin{exemple}
+\begin{tabular}{m{8cm}m{4cm}}
+  Dans le CFG ci-contre, \n{b} a bien une dépendance de contrôle sur \n{a}.
+  On remarque que, par contre, Z1 ou Z2 ne dépendent pas directement de \n{a},
+  car ils ne postdominent pas S2. En revanche, il y a néanmoins une dépendance
+  indirecte, comme on pouvait s'y attendre, car Z dépend de \n{a}, et Z1 et Z2
+  dépendent de Z.
+&
+\includegraphics[width=0.3\textwidth]{ctrl-dpds}
+\end{tabular}
+\end{exemple}
+
+En fait, \n{a} dépend directement de c si
+\n{a} est forcement atteint si on passe par l'un des successeurs de c,
+mais il y a des chemins qui partent de c et qui ne passe pas pas \n{a}.
+
+\subsection{Cas particuliers}
+
+Ce qui a été présenté ci-dessus s'applique bien à des programmes bien
+structurés, mais nécessite des adaptations si on s'intéresse~:
+
+\begin{itemize}
+  \item aux instructions qui modifie le flot de contrôle telles que les sauts,
+  \item aux CFG qui contiennent des noeuds pour lesquels il n'y a pas de chemin
+    vers le noeud de sortie.
+\end{itemize}
+
+Nous allons étudier plus précisément ces deux points ci-dessous.
+
+\section{Nos définitions}
+
+\subsection{Chemins}
+
+Dans ce qui suit, on utilise beaucoup la notion de \indexdef{chemin}~:
+un chemin est une liste de noeuds du CFG telle que si deux noeuds \n{a} et \n{b}
+se suivent dans la liste, \n{b} est un successeur de \n{a}.
+Nous appelons \indexdef{trace} un chemin qui se termine par un noeud
+n'ayant pas de successeur, ou un chemin qui est infini.
+
+On définit quelques notations pour désigner les chemins~:
+\begin{itemize}
+  \item $\ch{a, b}$  un chemin allant de \n{a} à \n{b}
+  \item $\mch{a, b}$ une trace partant de \n{a} et passant par \n{b}
+  \item $\mch{a, -}$ une trace partant de \n{a},
+  \item $\ch{a, b, c}$ un chemin allant de \n{a} à \n{c} en passant par \n{b},
+  \item $\ch{a;s, b}$
+    un chemin allant de \n{a} à \n{b} en passant par $\n{s} \in \succ{a}$,
+  \item $\mch{a, \neg b}$
+    une trace partant de \n{a} et ne passant pas par \n{b},
+\end{itemize}
+et des ensembles de chemins :
+\begin{itemize}
+  \item $\allmch{a, -}$ toutes les traces partant de \n{a},
+  \item $\allmch{a, b}$ toutes les traces partant de \n{a} et passant
+    par \n{b},
+  \item ...
+\end{itemize}
+
+On dit qu'un noeud appartient à un chemin, et on écrit - un peu abusivement -
+$\n{x} \in \ch{a, b}$ si \n{x} apparaît au moins une fois
+dans la liste qui décrit le chemin.
+
+\subsection{Postdominateurs}
+
+Avec les notations ci-dessus,
+on peut définir \Pd{a} l'ensemble des postdominateurs de \n{a},
+de la façon suivante~:
+$$
+  \n{b} \in \Pd{a} \define \forall t \in \allch{a, \nE}, \n{b} \in t
+$$
+
+On remarque que si on applique la définition ci-dessus à un CFG
+qui contient des noeuds tels qu'il n'y a pas de chemin vers la sortie,
+on a ~:
+$$
+\forall \n{a}, \allch{a, \nE} = \emptyset \impl \forall \n{b}, \n{b} \in \Pd{a}
+$$
+c'est-à-dire que l'on considère que de tels noeuds sont postdominés par tous les
+autres, ce qui n'est pas très intéressant en terme de trace d'exécution~!\\
+
+Dans ce qui suit, on note \P{a} l'ensemble des noeuds qui sont forcement
+atteints quand on passe par \n{a},
+et nous laisserons volontairement cette notion
+un peu floue pour l'instant. Sa définition sera précisée en \S\ref{sec-pda}.
+
+\subsection{Dépendances de contrôle} \label{sec-dpdc-if}
+
+On définit \D{c}{s} comme
+l'ensemble des noeuds qui sont forcement atteints si on passe par
+\n{s}, mais pas forcement si on passe par \n{c}.
+Plus formellement~:
+$$
+\D{c}{s} = \P{s} - \P{c}
+$$
+Par exemple, dans une séquence simple, si \n{c} représente un
+\verbtt{if} et \n{s} la première instruction de l'une des branche, \D{c}{s}
+donne les instructions de cette branche qui dépendent de la condition.\\
+
+On définit alors $\dpdc{a}$,
+l'ensemble des dépendances de contrôle de \n{a}, par~:
+$$
+\n{c} \in \dpdc{a} \define \n{a} \in \bigcup_{ \n{s} \in \succ{c}} \D{c}{s}
+$$
+Il est sans doute plus naturel de définir \codpdc{c},
+l'ensemble des co-dépendances de contrôle de \n{c},
+comme l'ensemble des noeuds ayant une dépendance de contrôle sur \n{c},
+c'est-à-dire~:
+$$
+  \n{a} \in \codpdc{c} \define \n{c} \in \dpdc{a}
+$$
+On a alors~:
+$$
+\codpdc{c} = \bigcup_{ \n{s} \in \succ{c}}  \D{c}{s}
+$$
+
+
+On remarque que cette définition ne suppose pas que \n{c} ait plusieurs
+successeurs, mais si \n{c} n'a qu'un successeur \n{s}~:
+$$
+\succ{c} = \{ \n{s} \} \impl
+\codpdc{c} = \{\n{x} | (\exists t \in \allmch{c, -}, \n{x} \notin t)
+\et (\forall t \in \allmch{s, -}, \n{x} \in t) \}
+$$
+or, comme \n{c} n'a qu'un successeur~:
+$$
+\forall t \in \allmch{c, -}, t = \mch{c; s, -}
+$$
+donc~:
+$$
+\forall t_s \in \allmch{s, -}, \n{x} \in t_s
+\impl \forall t_c \in \allmch{c, -}, \n{x} \in t_c
+$$
+$$
+\forall t_s \in \allmch{s, -}, \n{x} \in t_s
+\impl \nexists t_c \in \allmch{c, -}, \n{x} \notin t_c
+$$
+et donc, finalement~:
+$$
+\succ{c} = \{ \n{s} \} \impl \codpdc{c} = \{\}
+$$
+Donc, un noeud n'ayant qu'un seul successeur ne peut pas être une dépendance de
+contrôle. {\bf Attention}~: ceci n'est pas vrai pour les saut inconditionnels,
+car ceux-ci donne lieu à un traitement spécial décrit en \S\ref{sec-goto}.
+
+
+\section{Les sauts inconditionnels}\label{sec-goto}
+
+\subsection{Présentation du problème}
+
+Comme on l'a vu,
+la définitions précédente des dépendances de contrôle conduit à
+ne construire des dépendances que sur les noeuds ayant plusieurs successeurs,
+c'est-à-dire ceux qui présente une forme de choix dans le CFG.
+Or certaines instructions n'ayant qu'un successeur
+peuvent aussi, par leur présence, modifier le flot de contrôle.
+En C, c'est le cas par exemple des \verbtt{goto} explicites,
+mais aussi des  \verbtt{break}, \verbtt{continue} ou \verbtt{return}.
+Dans CIL, c'est aussi le cas des boucles puisqu'elles sont toutes transformées
+en \verbtt{while(1)}.
+
+Lorsque l'on souhaite utiliser le CDG pour calculer une réduction,
+on aimerait
+qu'il contienne également les liens nécessaires sur ces instructions
+afin de déterminer si elles peuvent être supprimées,
+ou si elles doivent être présentes dans le programme réduit.\\
+
+L'exemple simple suivant, tiré de \cite{Choi94}, met en évidence ce problème~:
+
+\begin{exemple}
+\begin{tabular}{m{4cm}m{5cm}}
+\begin{clisting}
+1 : <entry>
+2 : if (Q) goto 5;
+3 : x = 4;
+4 : goto 6;
+5 : x = 5;
+6 : y = x;
+7 : <exit>
+\end{clisting}
+&
+\includegraphics[width=0.5\textwidth]{ex-goto}
+\end{tabular}
+
+\begin{tabular}{p{5cm} p{7cm}}
+Réduction (fausse) \\
+par rapport à <y,7>~:
+\begin{clisting}
+1 : <entry>
+2 : if (Q) goto 5;
+3 : x = 4;
+
+5 : x = 5;
+6 : y = x;
+7 : <exit>
+\end{clisting}
+&
+On voit que dans le graphe de dépendances (PDG), personne ne dépend de 4,
+et la réduction de ce programme par rapport au noeud 6 donne le résultat
+erroné ci-contre qui donne \verbtt{y=5} même lorsque $Q$ est faux.
+\end{tabular}
+\end{exemple}
+
+\subsection{Etat de l'art}
+
+La plupart des solutions proposées pour résoudre ce problème
+utilisent la notion de \indexdef{successeur lexical} (sous différents noms).
+
+\begin{definition}{successeur lexical immédiat  selon \cite{agrawal94slicing}}
+A statement, S', is said to be {\bf the immediate lexical successor}
+of a statement, S, in a program, if deleting S from the program
+will cause the control to pass to S'
+whenever it reaches the corresponding location in the new program.
+
+If is a compound statement,
+such as an If or a While statement, delleting means
+delleting it allong with the statements that constitute its body.\\
+\end{definition}
+
+\cite{Choi94} présente une méthode qui ajoute un pseudo-lien dans le CFG
+entre les \verbtt{goto} et leur successeur lexical immédiat,
+et qui se sert de ce CFG modifié pour calculer les dépendances
+de contrôle selon la méthode classique.
+En fait, c'est un peu comme s'il remplaçait les \verb!goto L;!
+par \verbtt{if (1) goto L;} pour mettre en évidence le chemin
+qui apparaît dans le CFG si on supprime l'instruction.\\
+
+
+\cite{agrawal94slicing} donne un algorithme qui permet de traiter
+les \verbtt{goto} après un \slicing{} "normal".
+Il s'agit, pour chaque \verbtt{goto} (G) non visible,
+de déterminer si son premier postdominateur
+présent dans la réduction est différent du premier successeur lexical.
+Si c'est le cas, il faut rentre (G) visible ainsi que toutes ses dépendances.
+Ceci donne les mêmes résultats que l'algorithme précédent,
+mais il permet de ne modifier ni le CFG, ni le PDT.
+Par contre, le calcul doit être fait pour chaque réduction.\\
+
+\cite{harman98new} propose un algorithme qui donne des résultats
+plus précis que les deux précédents dans certains cas.\\
+
+Enfin, \cite{kumar02better} présente un algorithme qui prend
+en compte le problème spécifique des \verbtt{switch} et donne
+également de meilleurs résultats sur certains exemples.
+
+\subsection{Discussion}\label{sec-dpdc-goto}
+
+Dans un premier temps, l'algorithme de \cite{Choi94} semble simple à
+implémenter, mais il nous oblige à calculer un nouveau CFG et le PDT
+correspondant, ce que nous ne souhaitons pas faire car ces informations sont
+utilisées par différents modules de l'outil.
+Par ailleurs, l'algorithme de \cite{agrawal94slicing}
+est à appliquer à chaque nouvelle réduction, ce qui n'est pas très intéressant
+dans un environnement interactif, d'autant plus que l'on peut vouloir utiliser
+les dépendances de contrôle pour autre chose que le \slicing.\\
+
+Voyons donc plus précisément ce que l'on veut obtenir~:
+
+\begin{monenv}{Le problème}
+  \begin{tabularx}{\linewidth}{p{2cm}X}
+  \begin{center}
+    \includegraphics[width=1.5cm]{goto}
+  \end{center}
+&
+\begin{itemize}
+\item soit un programme P,
+\item soit \n{g} un noeud du CFG de P correspondant à un  \verbtt{goto},
+\item soit \n{l} le noeud correspondant au successeur de \n{g} (label du \verbtt{goto}),
+\item soit P', le programme P dans lequel on remplace le \verbtt{goto}
+par un ';' (NOP),
+\item soit \n{g}' le noeud correspondant dans le CFG de P',
+\item soit \n{s} le successeur lexical de \n{g}.
+\end{itemize}
+\bigskip
+On veut qu'un noeud \n{a} ait une dépendance de contrôle sur \n{g}
+\ssi \n{a} postdomine soit \n{g}, soit \n{s}, mais pas les deux.
+\end{tabularx}
+\end{monenv}
+Examinons les différents cas~:
+\begin{enumerate}
+  \item si \n{s}=\n{l}, cela signifie que le \verbtt{goto} ne sert à rien,
+    personne ne dépend donc de \n{g},
+  \item si \n{l} postdomine \n{s}, \n{s} dépend de \n{g}, ainsi que tous les postdominateurs
+    de \n{s} qui ne postdomine pas \n{l},
+  \item si \n{l} ne postdomine pas \n{s}, 
+  tous les \n{a} qui postdominent \n{s}, mais pas \n{l} ou l'inverse, dépendent de \n{g}.
+\end{enumerate}
+
+Donc, de manière générale, on peut calculer~:
+$$
+  \codpdc{g} = (\P{s} \cup \P{l}) - (\P{s} \cap \P{l})
+$$
+ce qui nous donne bien les noeuds atteints par l'une ou l'autre des branches,
+mais pas par les deux.
+
+On peut d'ailleurs montrer qu'on obtient la même chose que si on calcule \codpdc{g^*}
+sur CFG$^*$ où CFG$^*$ est le CFG dans lequel le noeud \n{g} est remplacé par un
+noeud \n{g^*} correspondant à une instruction
+\verbtt{if (true) goto L;}\\
+
+
+
+\section{Boucle infinie et exit}
+
+Comme on l'a vu,
+la plupart des définitions de dépendance de contrôle se basent
+sur le CFG, la notion de postdominateurs, et utilisent l'hypothèse
+que le CFG a un unique noeud de sortie \nE{} atteignable depuis tous les
+autres points du graphe. Or, comme l'explique très bien \cite{ranganath04new},
+cette hypothèse ne tient plus dans les programmes contenant
+des boucles infinies ou des \verbtt{exit} (ou même des exceptions,
+mais pour le langage C, nous n'avons pas le problème).
+Cet article présente également avec beaucoup de détails 
+différents types de dépendances et des algorithmes pour les calculer,
+mais il s'avère probablement trop complexe pour ce que l'on souhaite faire.\\
+
+Le fait qu'une fonction n'atteigne pas forcement un point de sortie pose deux
+problèmes différents~:
+\begin{itemize}
+  \item la préservation de la non-terminaison,
+  \item le calcul des dépendances de contrôle pour les instructions
+    n'ayant pas de chemin vers la sortie.
+\end{itemize}
+
+\subsection{Préservation de la non-terminaison}
+
+La question qui se pose est de savoir s'il faut ajouter des dépendances de
+contrôle sur les instructions qui, potentiellement, ne terminent pas.
+
+\begin{exemple}
+    \begin{tabular}{p{4.5cm}p{\linewidth-5.5cm}}
+\begin{clisting}
+while (f(x) > 0) x++;
+L: y = 3;
+\end{clisting}
+&
+Si l'on s'intéresse au calcul de {\tt y} en {\tt L}, on peut se demander si
+cette instruction a une dépendance de contrôle sur la boucle,
+car si dans certains cas, la boucle ne termine pas,
+{\tt L} n'est pas atteint le même nombre de fois
+dans le programme source P, et dans le programme P' dans lequel la boucle est
+remplacée par un NOP.
+
+\end{tabular}
+\end{exemple}
+
+Pour prendre en compte ce type de problème et permettre d'effectuer par la suite
+des analyses sensibles à la non-terminaison ({\it non-terminaison sensitive}),
+il faut ajouter des dépendances à toutes les instructions qui suivent
+une construction qui peut ne pas terminer comme un appel de fonction,
+ou une boucle dont on ne sait pas déterminer la terminaison.
+Dans l'absolu, il faudrait aussi s'intéresser aux autres instructions qui ont
+une terminaison anormale (\verbtt{Segmentation Fault} par exemple) mais il semble
+raisonnable de considérer que ces instructions ne sont jamais présentes exprès,
+et que leur absence doit être vérifiée par ailleurs.
+
+\subsection{Postdominateurs généralisés}
+
+\subsubsection{Définition}
+
+En cas de boucle infinie, le CFG contient des noeuds pour lesquels
+il n'existe pas de chemin vers la sortie.
+Or, pour un tel noeud \n{a},
+les postdominateurs tels que définis plus haut me peuvent pas être utilisé
+pour déterminer les dépendances de contrôle.
+En effet, on ne peut pas parler des instructions qui vont être
+forcement exécutées entre \n{a} et \nE{} car il n'existe pas de telles traces.\\
+
+La plupart des travaux existants travaillent dans ce cas sur un CFG augmenté
+dans lequel le noeud \nE{} est ajouté, ainsi que des arrêtes pour le rendre
+accessible. Outre le fait que certaines analyses n'aient pas besoin de cette
+hypothèse, et qu'une telle modification vienne ``polluer'' le CFG,
+il semble difficile (impossible ?) de ne pas ajouter
+de dépendances parasites dans le cas des boucles infinies.\\
+
+Pourtant, même si \n{a} est dans une boucle infinie,
+on a intuitivement une notion de postdominateurs. On aimerait bien dire
+qu'une instruction \n{b} postdomine une instruction \n{a} \ssi \n{b} appartient
+à tous les chemins {\bf partant de \n{a}}, c'est-à-dire~:
+
+\begin{definition}{postdominateurs généralisés}
+$$ \n{b} \in \Pdi{a} \define \forall t \in \allmch{a, -}, \n{b} \in t $$
+\end{definition}
+
+
+On ne considère donc plus uniquement les chemins qui atteignent la sortie,
+mais toutes les traces d'exécution possible.
+
+
+\subsubsection{Méthode de calcul}
+
+
+Intuitivement, si on souhaite connaître tous les noeuds qui ont b comme
+postdominateurs en considérant tous les chemins,
+on peut calculer les ensembles suivants~:
+$$
+E_b (a) = \left\{
+\begin{array}{ll}
+  {b} & \text{si } b = a\\
+  \bigcap_{s \in \succ{a}} E_b(s) & \text{sinon.}
+\end{array}\right.
+$$
+en partant d'ensembles initialement vides.
+Ce calcul termine car il est croissant.
+
+A la fin du calcul, on a :
+$$
+  \forall b, E_a (b) = \{ a \} \vee E_a (b) = \bot
+$$
+et $E_a (b) = \{ a \}$ veut bien dire que $a$ est dans tous les chemins entre
+$b$ et $a$.\\
+
+On peut faire ce calcul pour tous les points du CFG, et faire l'union de tous
+les résultats obtenus~:
+$$
+\Pdi(a) = \bigcup_{b \in CFG} E_b(a)
+$$
+Bien sûr, ce n'est pas la manière la plus efficace de faire le calcul,
+mais on voit trivialement que c'est le résultat que l'on souhaite obtenir.\\
+
+Il suffit maintenant de trouver un calcul équivalent,
+moins coûteux, mais qui termine néanmoins...
+
+En fait, il suffit de faire directement
+l'union des résultats au fur et à mesure du calcul,
+mais comment prouver la terminaison~?
+
+\subsubsection{Discussion}
+
+On remarque que cette définition ne donne pas
+les mêmes postdominateurs que précédemment
+dès qu'il y a une boucle dans le CFG, même qui la sortie \nE{} est accessible
+depuis tous les noeuds,
+car il existe alors un chemin possible qui consiste à boucler indéfiniment.
+Par conséquent, les instructions situées après la boucle ne postdomine pas les
+instructions de la boucle puisqu'il existe un chemin pour lequel on y passe pas.
+Cela traduit le fait que l'exécution de ces instructions dépend du fait que la
+boucle termine...
+
+Si on utilise cette définition des postdominateurs pour calculer des dépendances
+de contrôle, on va donc ajouter des liens entre la boucle et tout ce qui suit.
+Ces nouvelles dépendances traduisent la possible non-terminaison de la boucle,
+et peuvent donc servir dans le cadre d'une analyse préservant la non-terminaison
+comme on l'a vu précédemment.
+Mais on ne souhaite pas nécessairement ajouter toutes ces dépendances,
+car en pratique, on peut montrer par ailleurs que la plupart des boucles
+d'un programme terminent.
+
+\subsection{Postdominateurs augmentés}\label{sec-pda}
+
+On peut essayer de faire un mélange des postdominateurs classiques et des
+postdominateurs généralisés en supposant que toutes les boucles ayant une
+sortie se terminent (attention : on considère pour l'instant qu'il y a un chemin
+possible entre cette sortie et \nE), mais en considérant néanmoins
+les traces infinies dans les cas où une boucle n'a pas de sortie.
+
+\begin{definition}{postdominateurs augmentés}
+$$
+\Pda{a} = \left\{
+\begin{array}{ll}
+\{ b | \forall t \in \allmch{a, -}, b \in t \}
+  & \text{si } \allch{a, \nE} = \{\}\\
+\{ b | \forall t \in \allmch{a, \nE}, b \in t \}
+  & \text{sinon.}
+\end{array}\right.
+$$
+\end{definition}
+
+
+\subsubsection{Méthode de calcul}
+
+\newcommand{\ToRet}[1]{\ensuremath{\mathit{ToRet}(\n{#1})}}
+
+Pour faire ce calcul, il faut être capable de distinguer les chemins qui mènent
+à \nE{} des autres.
+On note \ToRet{a} la propriété qui dit que \n{a} a un chemin vers \nE.
+
+Après un calcul classique des postdominateurs (en partant de \nE),
+les postdominateurs des noeuds tels que  \ToRet{a} sont établis.
+Reste à calculer l'information pour les autres noeuds, c'est-à-dire ceux qui
+ont les postdominateurs à $\top$.
+
+Pour ceux-là, on fait un calcul similaire~:
+$$
+\Pda{x} = \{\n{x}\} \bigcup \bigcap^a_{s \in \succ{x}} \Pda{s}
+$$
+en redéfinissant simplement l'intersection utilisée de la façon suivante~:
+$$
+\Pda{a} \cap^a \Pda{b} =  \left\{
+\begin{array}{ll}
+  \Pda{a} \cap \Pda{b} & \text{si } \ToRet{a} = \ToRet{b}\\
+  \Pda{a}              & \text{si } \ToRet{a} \et \neg\ToRet{b}\\
+  \Pda{b}              & \text{si } \neg\ToRet{a} \et \ToRet{b}\\
+\end{array}\right.
+$$
+
+
+\subsubsection{Discussion}
+
+On remarque qu'avec cette définition, il existe des noeuds \n{a} tels que~:
+$$
+\succ{a} = \{\n{s1}, \n{s2}\} \et \Pda{a} \neq \Pda{s1} \cap \Pda{s2}
+$$
+dans le cas où on atteint la sortie à partir de l'un des successeurs, mais pas
+de l'autre.
+
+Par exemple, si on considère un noeud \n{c} correspondant à un {\sc IF}
+dont l'une des branche est une boucle infinie et que l'autre permet d'atteindre
+la sortie, la boucle infinie dépendra de \n{c}, alors que l'accès à la sortie
+n'en dépendra pas.
+
+
+\section{En résumé}
+
+Pour calculer les dépendances de contrôle, on commence donc par calculer les
+postdominateurs augmentés définis en \S\ref{sec-pda}.
+Puis, pour chaque saut, on calcule ses co-dépendances de contrôle de la façon
+suivante~:
+
+\begin{itemize}
+  \item pour un {\sc IF},
+    on applique la définition donné en \S\ref{sec-dpdc-if},
+    c'est-à-dire~:
+$$
+\codpdc{c} = \bigcup_{ \n{s} \in \succ{c}} \Pda{s} - \Pda{c}
+$$
+
+  \item pour un saut inconditionnel (\verbtt{goto}, \verbtt{break}, etc),
+    comme mentionné en \S\ref{sec-dpdc-goto}, on calcule~:
+$$
+\codpdc{g} = (\Pda{s} \cup \Pda{l}) - (\Pda{s} \cap \Pda{l})
+\text{  où } \left\{\begin{array}{l}
+\n{s} = \succl{g} \\
+\n{l} = \succ{g}
+\end{array}\right.
+$$
+Si on considère \n{s} et \n{l} comme deux pseudo-successeurs de \n{g},
+les pseudo-postdominateurs de \n{g} sont donnés par
+$(\Pda{s} \cap \Pda{l})$, et on retrouve bien la formule précédente.
+
+  \item pour les boucles, comme dans CIL, elles sont toutes infinies,
+on traite la séquence \verbtt{while(1) S;}
+comme si on avait \verbtt{L : S; goto L;}
+
+\end{itemize}
diff --git a/doc/pdg/data.tex b/doc/pdg/data.tex
new file mode 100644
index 0000000000000000000000000000000000000000..4cee0f9f7a085c2caeccefe1d805e5b3cca092cc
--- /dev/null
+++ b/doc/pdg/data.tex
@@ -0,0 +1,138 @@
+\chapter{Dépendances liées aux données}
+
+Le calcul de dépendances de données et d'adresse consiste principalement
+à retrouver les éléments de flot correspondant aux données utilisées dans les
+expressions.
+Mais comme les données peuvent être incluses les unes dans les
+autres, il ne suffit pas de retrouver les éléments de flot qui calculent
+exactement ces données, mais aussi ceux qui ont une intersection possible.
+
+Par exemple, dans la séquence~:\\
+  \centerline{\verbtt{d = d0; x = d.a;}}
+
+il faut être capable de voir que \verbtt{x} dépend de \verbtt{d0}.
+
+Autre exemple~: dans la séquence~:\\
+\centerline{\verbtt{d0.a = a; d0.b = b; d = d0;}}
+
+il faut voir que \verbtt{d} dépend éventuellement de la valeur initiale de \verbtt{d0}
+(si \verbtt{d0} contient d'autres champs que \verbtt{.a} et \verbtt{.b}), mais aussi
+de \verbtt{a}, et de \verbtt{b}.\\
+
+\section{Recherche arrière}
+
+Le premier calcul mis en {\oe}uvre procédait par recherche en arrière
+des éléments de la table ayant une intersection avec les données présentes en
+partie droite de l'instruction. Mais cette recherche était compliquée en cas de
+dépendances partielles comme dans le second exemple ci-dessus. Cette solution a
+donc été abandonnée.
+
+\section{Propagation avant d'un état}\label{sec-propagation-etat}
+
+La méthode finalement choisie pour calculer ces dépendances
+consiste à propager en avant, par une analyse du type flot de données,
+un \indexdef{état des données}
+qui contient pour chaque donnée, une liste de liens vers les éléments
+du graphe qui ont permis de déterminer sa valeur en ce point.
+
+Cet état doit avoir les propriétés suivantes~:
+\begin{itemize}
+\item on veut pouvoir associer un nouveau noeud à une donnée
+en précisant s'il faut faire l'union avec l'ensemble précédemment stocké.
+Par exemple~;
+\begin{itemize}
+\item pour l'instruction \verbtt{x = 3;} on construit un nouvel élément
+dans le PDG, et on mémorise dans l'état que \verbtt{x} est maintenant associé
+à cet élément. L'ancienne association est perdue.
+\item  pour l'instruction \verbtt{*p = 3;} si \verbtt{p} peut pointer sur \verbtt{x},
+il faut mémoriser que  \verbtt{x} peut être défini par l'élément du PDG
+correspondant, mais comme ce n'est pas sûr, il faut faire l'union avec
+ce qui était précédemment stocké pour \verbtt{x}.
+\end{itemize}
+\item lorsque l'on demande l'ensemble associé à une donnée,
+le résultat doit contenir au moins ce qu'on a stocké
+(il peut contenir plus d'élément en cas de perte de précision),
+\item la consultation ne doit pas modifier l'état,
+\item il faut savoir faire l'union de deux états.
+\end{itemize}
+
+La structure de donnée du module \verbtt{Lmap} de \ppc correspond à ces critères,
+et peut donc être utilisée pour ce calcul.\\
+
+\section{Propagation arrière d'un état}
+
+Une autre solution aurait pu être de propager en arrière
+un état contenant les utilisations
+de variables, et mettre à jour le graphe en rencontrant la définition.
+Le coût de ce calcul semble être le même que le précèdent,
+mais la propagation avant nous permet d'avoir, à chaque point de programme,
+un état donnant la correspondance entre une donnée et les éléments du graphe,
+même si cette donnée n'est pas utilisée à ce point.
+Cette information nous permet par la suite de définir des critères
+de \slicing moins restrictifs.
+
+\section{Traitement de l'affectation}
+
+Le principe de l'algorithme du traitement d'une affectation
+\verbtt{lval = exp;} est donc le suivant~:
+
+\begin{itemize}
+\item recherche des données $\{d_v\}$
+utilisées dans \verbtt{exp} à l'aide des résultats de l'analyse d'alias préalable,
+\item calcul de {\it dpdv},
+c'est-à-dire l'union des ensembles associées à ces données $d_v$ dans l'état,
+\item recherche des données $\{d_a\}$
+utilisées pour calculer l'adresse de {\it lval},
+\item calcul de {\it dpda}
+c'est-à-dire l'union des ensembles associées à ces données $d_a$ dans l'état,
+\item recherche de l'élément $e$
+correspondant à cette instruction dans le graphe,
+      et création de cet élément s'il n'existe pas,
+\item ajout des dépendances {\it dpdv} et  {\it dpda} à $e$,
+\item recherche des données $\{d_x\}$
+potentiellement modifiées par cette affectation,
+\item calcul du nouvel état (après l'instruction)
+en ajoutant dans l'ancien état un lien entre les $\{d_x\}$ et $e$.
+\end{itemize}
+
+\section{Déclarations}
+
+Les déclarations de variable doivent être traitées séparément
+des valeurs, car on peut parfois dépendre de l'adresse d'une variable
+sans dépendre de ce qu'elle contient.
+
+C'est par exemple le cas lorsque la variable apparaît à gauche
+d'une affectation (\verbtt{x = 3;})
+ou encore quand on n'utilise que son adresse (\verbtt{p = \&x;}).
+
+On garde donc une table qui permet de retrouver les éléments
+du graphe de dépendances qui correspondent aux déclarations.
+
+
+\section{Calcul de conditions}
+
+Les noeuds du graphe de dépendances représentant
+les calculs de condition des \verbtt{if} ou \verbtt{switch}
+ont des dépendances de donnée sur les données utilisées.
+
+\section{Dépendances de donnée dans les boucles}
+
+Pour les boucles {\it explicites}, il suffirait d'effectuer deux tours
+de la boucle pour obtenir toutes les dépendances de donnée car le premier
+capture les dépendances avec les données provenant d'avant la boucle,
+ou interne à un tour, et le second capture les dépendances entre un tour et le
+suivant.
+
+Mais comme les boucles peuvent être introduites par la présence de sauts
+quelconques,
+le plus simple est dans un premier temps d'itérer jusqu'à obtenir un point fixe
+sur l'état des données. Il faut noter que les noeuds ne sont créés que lors de la
+première itération, les suivantes n'ajoutant que de nouvelles dépendances entre
+ces noeuds. Le nombre de noeuds étant fini (de l'ordre de grandeur du nombre
+d'instruction de la fonction), l'atteignabilité du point fixe est
+garantie.
+
+\section{Appels de fonction}
+
+Le traitement des appels de fonction est présenté
+dans le chapitre \ref{sec-intro-call}
diff --git a/doc/pdg/ex-goto.fig b/doc/pdg/ex-goto.fig
new file mode 100644
index 0000000000000000000000000000000000000000..aa846c27d6b2dfef2503555170d7640267570887
--- /dev/null
+++ b/doc/pdg/ex-goto.fig
@@ -0,0 +1,113 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 3195 2160 8010 5130
+6 3195 2385 4950 4950
+6 3195 2385 3780 2790
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 3465 2565 270 180 3465 2565 3735 2745
+4 1 0 50 -1 0 12 0.0000 4 150 390 3465 2610 entry\001
+-6
+6 3195 3105 3780 3510
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 3465 3285 270 180 3465 3285 3735 3465
+4 1 0 50 -1 0 12 0.0000 4 135 90 3465 3330 2\001
+-6
+6 3195 3825 3780 4230
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 3465 4005 270 180 3465 4005 3735 4185
+4 1 0 50 -1 0 12 0.0000 4 135 90 3465 4050 5\001
+-6
+6 4365 3105 4950 3510
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 4635 3285 270 180 4635 3285 4905 3465
+4 1 0 50 -1 0 12 0.0000 4 135 90 4635 3330 3\001
+-6
+6 4365 3825 4950 4230
+6 4590 3915 4680 4050
+4 1 0 50 -1 0 12 0.0000 4 135 90 4635 4050 4\001
+-6
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 4635 4005 270 180 4635 4005 4905 4185
+-6
+6 3195 4545 3780 4950
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 3465 4725 270 180 3465 4725 3735 4905
+4 1 0 50 -1 0 12 0.0000 4 135 90 3465 4770 6\001
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3465 2745 3465 3105
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3465 3465 3465 3825
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3465 4185 3465 4545
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 4635 3465 4635 3825
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3735 3285 4365 3285
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 4545 4185 3735 4725
+-6
+6 5715 2385 7470 4950
+6 5715 2385 6300 2790
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 5985 2565 270 180 5985 2565 6255 2745
+4 1 0 50 -1 0 12 0.0000 4 150 390 5985 2610 entry\001
+-6
+6 5715 3105 6300 3510
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 5985 3285 270 180 5985 3285 6255 3465
+4 1 0 50 -1 0 12 0.0000 4 135 90 5985 3330 2\001
+-6
+6 5715 3825 6300 4230
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 5985 4005 270 180 5985 4005 6255 4185
+4 1 0 50 -1 0 12 0.0000 4 135 90 5985 4050 5\001
+-6
+6 6885 3105 7470 3510
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 7155 3285 270 180 7155 3285 7425 3465
+4 1 0 50 -1 0 12 0.0000 4 135 90 7155 3330 3\001
+-6
+6 5715 4545 6300 4950
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 5985 4725 270 180 5985 4725 6255 4905
+4 1 0 50 -1 0 12 0.0000 4 135 90 5985 4770 6\001
+-6
+6 6885 3825 7470 4230
+6 7110 3915 7200 4050
+4 1 0 50 -1 0 12 0.0000 4 135 90 7155 4050 4\001
+-6
+1 1 0 1 0 7 50 -1 -1 0.000 1 0.0000 7155 4005 270 180 7155 4005 7425 4185
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 5985 2745 5985 3105
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 5985 3465 5985 3825
+2 1 1 2 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 5985 4185 5985 4545
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 6255 3285 6885 3285
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 6255 3285 7155 3825
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 7515 4860 7965 4860
+2 1 1 2 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 7515 5085 7965 5085
+2 1 1 2 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 6975 3375 6255 4725
+4 1 0 50 -1 2 12 0.0000 4 135 375 4365 2295 CFG\001
+4 1 0 50 -1 2 12 0.0000 4 135 390 6885 2295 PDG\001
+4 1 0 50 -1 2 10 0.0000 4 150 675 7065 4860 CDG edge\001
+4 1 0 50 -1 2 10 0.0000 4 150 690 7065 5085 DDG edge\001
+-6
diff --git a/doc/pdg/goto.fig b/doc/pdg/goto.fig
new file mode 100644
index 0000000000000000000000000000000000000000..ac14cc5a0d07c360da3514b4e19bb0a49bfe7832
--- /dev/null
+++ b/doc/pdg/goto.fig
@@ -0,0 +1,35 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4
+100.000000
+Single
+-2
+1200 2
+0 32 #ffffff
+6 0 0 0 0
+1 1 0 1 32 32 0 0 20 0.000000 1 0.0 5722 1299 767 472 0 0 0 0
+1 1 0 1 0 -1 0 0 -1 0.000000 1 0.0 5722 1299 767 472 0 0 0 0
+4 1 0 0 0 16 22.762205 0.0 6 0.0 0.0 5722 1393 G\001
+-6
+6 0 0 0 0
+1 1 0 1 32 32 0 0 20 0.000000 1 0.0 5090 3622 767 472 0 0 0 0
+1 1 0 1 0 -1 0 0 -1 0.000000 1 0.0 5090 3622 767 472 0 0 0 0
+4 1 0 0 0 16 22.762205 0.0 6 0.0 0.0 5090 3716 S\001
+-6
+6 0 0 0 0
+2 1 0 1 0 0 0 0 -1 0.000000 0 0 0 1 0 4
+  0 0 3.149606 236.220472 236.220472
+	6490 1299 6962 1299 6962 5756 6490 5756 
+-6
+6 0 0 0 0
+1 1 0 1 32 32 0 0 20 0.000000 1 0.0 5722 5756 767 472 0 0 0 0
+1 1 0 1 0 -1 0 0 -1 0.000000 1 0.0 5722 5756 767 472 0 0 0 0
+4 1 0 0 0 16 22.762205 0.0 6 0.0 0.0 5722 5851 L\001
+-6
+6 0 0 0 0
+2 1 1 1 0 0 0 0 -1 12.598425 0 0 0 1 0 4
+  0 0 3.149606 236.220472 377.952756
+	5722 1771 5722 2460 5090 2460 5090 3149 
+-6
diff --git a/doc/pdg/impact.tex b/doc/pdg/impact.tex
new file mode 100644
index 0000000000000000000000000000000000000000..0913b6f62d7edd6102b9aa3f8016ed7a20b4da8d
--- /dev/null
+++ b/doc/pdg/impact.tex
@@ -0,0 +1,205 @@
+\chapter{Aide à l'analyse d'impact}\label{sec-impact}
+
+Le document \cite{baudinImpact} spécifie un outil d'aide à l'analyse d'impact
+après avoir analysé les besoins dans ce domaine.
+L'exploitation du graphe de dépendances est présenté comme étant 
+un composant important de cet outil.
+Nous reprenons ici les éléments de spécification 
+décrits dans le paragraphe 5.3 de ce document,
+auxquels nous ajoutons quelques nouveaux critères.\\
+
+
+\section{Définition d'ensembles}\label{sec-ensembles}\label{sec-defR}
+
+\newcommand{\remitem}[1]{\begin{itemize}\item #1 \end{itemize}}
+\newcommand{\warnitem}[1]{\begin{itemize}\item[$\blacktriangle$] #1
+                          \end{itemize}}
+\newcommand{\question}[1]{\begin{itemize}\item[{\bf ?}] #1 \end{itemize}}
+\newcommand{\smilitem}[1]{\begin{itemize}\item[$\smiley$] #1 \end{itemize}}
+\newcommand{\frownitem}[1]{\begin{itemize}\item[$\frownie$] #1 \end{itemize}}
+
+
+Il s'agit de définir des sous-ensembles d'instructions
+répondant à différents critères.
+
+Donnons tout d'abord quelques notations :
+\begin{itemize}
+\item S : un ensemble d'instructions,
+\item L : un point de programme,
+\item V : une zone mémoire (le V se réfère à {\bf V}ariable,
+mais il peut s'agir d'une donnée quelconque comme un champ de structure ou
+un élément de tableau),
+\end{itemize}
+
+Les ensembles sont tous relatifs à un point de programme $L$,
+et peuvent se classer en deux catégories~:
+\begin{itemize}
+\item ceux qui contiennent des instructions situées {\bf avant} $L$~: 
+ils portent un indice 0,
+\item et ceux qui contiennent des instructions situées {\bf après} $L$~:
+ils portent un indice 1.\\
+\end{itemize}
+
+\begin{description}
+\item[$R_0(S,L)$]  : sous-ensemble d'instructions de S depuis lesquelles 
+L est accessible.
+\warnitem{mais L ne postdomine pas forcement toutes les instructions de cet ensemble.} 
+
+\item[$R_{1}(S,L)$] : sous-ensemble d'instructions de S 
+qui sont (éventuellement) accessibles depuis L.
+
+\item[$R_{L0}(S,L)$] : accessibilité à un point du code.
+\remitem{il s'agit du sous-ensemble des instructions de $R_0(S,L)$
+qui conditionnent le passage en L,
+c'est-à-dire les instructions de branchement 
+et les dépendances de ces conditions de branchement.
+}
+
+%\item[$R_{L1}(S,L)$] : ?
+
+\item[$R_{V0}(S,L,V)$] : contenu d'une zone mémoire en un point du code.
+\remitem{il s'agit du critère traditionnel de \slicing,
+c'est-à-dire que cet ensemble contient les instructions de $S$ qui 
+ont une influence sur la valeur de $V$ en $L$.
+}
+
+\item[$R_{V1}(S,L,V)$] : utilisation d'une zone mémoire.
+\remitem{il s'agit du sous-ensemble des instructions de $R_{1}(S,L)$
+influencées par la valeur qu'à la zone mémoire $V$ a en $L$.}
+
+\item[$R_{DV0}(S,L,V)$] : définition de la valeur d'une variable à un point de
+programme.
+\remitem{il s'agit de l'ensemble des instructions qui {\bf définissent}
+tout ou partie de la valeur de $V$ en $L$. Ces instructions 
+sont donc nécessairement des affectations ou des appels de fonction.
+
+On note que~: $R_{DV0}(S,L,V) \subseteq R_{V0}(S,L,V)$
+}
+\warnitem{
+Il serait probablement utile d'avoir un élément spécial 
+qui indique qu'il existe 
+un ou plusieurs chemin menant à $L$ pour le(s)quel(s) 
+$V$ n'est pas entièrement défini.
+}
+
+\item[$R_{DV1}(S,L,V)$] : modification de la valeur d'une variable.
+\remitem{il s'agit de trouver les instructions $I_i$ accessibles depuis L
+qui modifient la valeur de $V$,
+et telles qu'il existe un chemin entre $L$ et $I_i$
+le long duquel $V$ n'est pas modifiée.
+Cela signifie que ces instructions sont les premières à modifier la valeur
+de $V$ sur les chemins partant de $L$.}
+\remitem{Il n'est pas sûr que cet ensemble soit très utile.
+L'ensemble $R_{P1}(S,L,V)$ ci-dessous en sans doute plus intéressant.
+}
+
+\item[$R_{P0}(S,L,V)$] : 
+portée arrière de la valeur d'une variable à un point de programme.
+\remitem{il s'agit d'un sous-ensemble de $R_{L0}(S,L)$
+contenant les instructions $I_i$ pour lesquelles la valeur de $V$
+n'a été modifiée sur aucun chemin entre le point qui précède $I_i$ et $L$.
+C'est-à-dire que la valeur de $V$ en $L$ est la même qu'avant chacune de ces
+instructions, et qu'elle n'est pas modifiée entre les deux.
+}
+
+\item[$R_{P1}(S,L,V)$] : 
+portée de la valeur d'une variable à un point de programme~.
+\remitem{il s'agit d'un sous-ensemble de $R_{1}(S,L)$
+contenant les instructions $I_i$ pour lesquelles la valeur de $V$ 
+n'a été modifiée sur aucun chemin entre $L$ et le point de programme 
+qui précède $I_i$.
+}
+
+\item[$R_{PV0}(S,L,V)$] : utilisation arrière d'une zone mémoire dans sa portée.
+\remitem{il s'agit du sous-ensemble des instructions $R_{P0}(S,L,V)$
+qui sont influencées, directement ou non, par $V$. 
+}
+
+\item[$R_{PV1}(S,L,V)$] : utilisation d'une zone mémoire dans sa portée.
+\remitem{il s'agit du sous-ensemble 
+         des instructions influencées, directement ou non, 
+         par la valeur de $V$ en $L$
+         qui sont dans la portée de cette valeur.
+
+         On a donc : $R_{PV1}(S,L,V) = R_{V1}(S,L,V) \cap R_{P1}(S,L,V)$
+        }
+
+\end{description}
+
+\begin{exemple1}
+On montre ici différents ensembles relatifs au point $L$
+et à la variable $v$~:
+\end{exemple1}
+
+\begin{center}
+\begin{scriptsize}
+\begin{tabular}{|l||c|c|c|c|c|c||c|c|c|c|c| }
+\hline
+S & $R_{0}$ & $R_{L0}$ & $R_{V0}$ & $R_{DV0}$ & $R_{P0}$ & $R_{VP0}$
+            & $R_{1}$ & $R_{V1}$ & $R_{DV1}$ & $R_{P1}$ & $R_{VP1}$ \\
+\hline
+\verb!!                      &   &   &   &   &   &   &   &   &   &   &  \\
+\verb!v = a; !               & X & X & X & X &   &   &   &   &   &   &  \\
+\verb!x = b; !               & X &   & X &   &   &   &   &   &   &   &  \\
+\verb!z = c; !               & X &   &   &   &   &   &   &   &   &   &  \\
+\verb!if (c1>v) { !          & X & X & X &   &   &   &   &   &   &   &  \\
+\verb!  z++;    !            &   &   &   &   &   &   &   &   &   &   &  \\
+\verb!  }       !            &   &   &   &   &   &   &   &   &   &   &  \\
+\verb!else {    !            &   &   &   &   &   &   &   &   &   &   &  \\
+\verb!  if (c2) !            & X & X & X &   &   &   &   &   &   &   &  \\
+\verb!    v += x; !          & X & X & X & X &   &   &   &   &   &   &  \\
+\verb!    if (c3) { !        & X & X & X &   & X &   &   &   &   &   &  \\
+\verb!      z += v; !        & X & X &   &   & X & X &   &   &   &   &  \\
+\hline
+{\tt\bf L:}
+  \verb!    y = v; !         &   &   &   &   &   &   & X & X &   & X & X \\
+\verb!       z++;   !        &   &   &   &   &   &   & X &   &   & X &   \\
+\verb!       v++; !          &   &   &   &   &   &   & X & X &   & X & X \\
+\verb!       } !             &   &   &   &   &   &   &   &   &   &   &   \\
+\verb!  z += 2*y; !          &   &   &   &   &   &   & X & X &   &   &   \\
+\verb!  }      !             &   &   &   &   &   &   &   &   &   &   &   \\
+\verb!z += x;  !             &   &   &   &   &   &   & X & X &   &   &   \\
+\verb!v = 0; !               &   &   &   &   &   &   &   &   & X &   &   \\
+\verb!!                      &   &   &   &   &   &   &   &   &   &   &   \\
+\hline
+\end{tabular}\end{scriptsize}\end{center}
+\begin{exemple2}
+\end{exemple2}
+
+La construction des ensembles ci-dessus exploite le CFG (le flot de contrôle)
+et le PDG (les dépendances).\\
+
+La construction des ensembles ci-dessous exploite en plus la sémantique du
+programme car elle utilise une contrainte $C(...v_i...)$ portant
+sur les valeurs des données en $L$~:
+
+\begin{description}
+\item[$R_{C0}(S,L,C(...v_i...))$] :
+accessibilité contrainte à un point.
+\remitem{il s'agit de déterminer l'ensemble des instructions
+qui, si elles sont présentes, rendent fausse la contrainte $C$ au point $L$.
+En fait, il s'agit de déplacer $C$ pour essayer de couper des branches.
+La condition de branchement sera alors éventuellement
+remplacée par un \verbtt{assert}.
+}
+\smilitem{Dans la séquence \verbtt{int x = 0; x=x-1; L:} pour laquelle
+on a une contrainte $x \ge 0$, il ne s'agit pas de supprimer l'instruction
+\verbtt{x=x-1;} mais bien de dire que cette branche est impossible...}
+
+\item[$R_{C1}(S,L,C(...v_i...))$] : accessibilité contrainte depuis un point.
+\remitem{il s'agit de déterminer le sous-ensemble des instructions de
+$R_{1}(S,L)$ qui ne peuvent pas être atteintes si l'état en L est tel que 
+$C$ est satisfaite.\\
+
+
+On notera que certaines instructions n'appartenant ni à $R_{L0}$, ni à $R_{1}$
+peuvent également ne pas être atteintes du fait de la contrainte.\\
+
+}
+\end{description}
+
+\section{Exploitation du graphe pour le calcul d'ensembles}
+
+La plupart des ensembles définis en \ref{sec-ensembles}
+peuvent être calculés simplement en exploitant le flot de contrôle
+et les fonction du graphe de dépendances présentées en \$\ref{sec-find}.
diff --git a/doc/pdg/intro.tex b/doc/pdg/intro.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8336e2eca54b41a5e94587291088e31301e9763f
--- /dev/null
+++ b/doc/pdg/intro.tex
@@ -0,0 +1,246 @@
+\chapter{Introduction}
+
+\section{Objectif}
+
+L'objectif initial a été de réaliser un module de \slicing
+dans le cadre d'un outil généraliste d'analyse de programme (voir
+\cite{ppcSlicing}).
+Or, la plupart des réductions à effectuer se basent sur l'analyse des
+dépendances entre les données du programme.
+En effet, si l'utilisateur demande la sélection
+d'une instruction \verb!return x;!, il va falloir retrouver ce qui permet de
+calculer cette valeur de \verbtt{x} dans les instructions qui précèdent.\\
+
+Il s'agit donc de calculer le \indexdef{graphe de dépendances} d'une fonction
+(appelé \indexdef{PDG}~: {\it Program Dependence Graph} dans la littérature)
+c'est-à-dire de représenter finement les liens de
+dépendances entre les différentes instructions qui la composent.
+Le résultat ce calcul est un graphe dans lequel les sommets
+représentent les instructions,
+éventuellement décomposées en plusieurs noeuds représentant
+le calcul d'informations élémentaires.\\
+
+Dans le cadre de l'outil de \slicing,
+l'intérêt de ce calcul préalable est de pouvoir
+travailler en plusieurs passes lors de l'application des
+requêtes de réduction sans avoir à
+refaire ce calcul qui peut être lourd (alias, dépendances partielles, etc). En
+effet, même si l'on souhaite à terme calculer des réductions qui utilisent
+davantage la sémantique du programme, les réductions à l'aide des dépendances
+peuvent simplifier le problème.\\
+
+Par la suite, il a été jugé intéressant de considérer ce calcul
+comme un module à part entière car il peut avoir d'autres
+utilités comme étudier la
+propagation du flot d'information pour des analyses de sécurité, par exemple.
+
+\section{Spécifications du PDG}\label{sec-flot}
+
+Le PDG que l'on souhaite calculer comporte plusieurs types de dépendances~:
+
+\subsection{Dépendances sur la valeur des données}
+
+Les \indextxtdef{dépendances sur la valeur}{dépendance!valeur}
+d'une donnée sont les plus intuitives.
+
+\begin{exemple}
+  \begin{tabular}{m{3.5cm}m{\linewidth-4.3cm}}
+\begin{clisting}
+x = a + b;
+\end{clisting}
+&
+Ici, \verbtt{x} dépend de
+\verbtt{a} et \verbtt{b} car la valeur de \verbtt{x} après cette instruction dépend
+des valeurs de \verbtt{a} et \verbtt{b} avant.
+\end{tabular}
+\end{exemple}
+
+La question se pose néanmoins de définir la granularité à laquelle
+on s'intéresse aux données.
+L'utilisation d'autres analyses et structures de données de \ppc
+conduit à choisir la même précision
+(pour plus de détail, voir par exemple l'analyse de valeurs de \ppc).
+
+\subsection{Dépendances de calcul d'adresse}
+
+Pour les affectations, la valeur qui est écrite en mémoire dépend de la partie
+droite, mais le choix de l'adresse à laquelle on l'écrit peut également dépendre
+de variables qui apparaissent dans la partie gauche.
+
+\begin{exemple}
+\begin{tabular}{m{3.5cm}m{\linewidth-4.3cm}}
+\begin{clisting}
+*p = x;
+\end{clisting}
+&
+Ici, la valeur de la donnée modifiée dépend de \verbtt{x},
+mais le choix de la case dans laquelle on la range dépend de \verbtt{p}.
+En effet, si $p$ pointe sur $a$ ou $b$, c'est soit  \verbtt{a} soit \verbtt{b} qui
+va être modifié. 
+\end{tabular}
+\end{exemple}
+
+On parle alors de \indextxtdef{dépendances sur l'adresse}{dépendance!adresse}.
+
+\subsection{Dépendances de contrôle}
+
+Lorsqu'une donnée peut-être modifiée par plusieurs chemins d'exécution,
+elle dépend des conditions qui permettent de choisir le chemin.
+
+\begin{exemple}
+\begin{tabular}{m{3.5cm}m{\linewidth-4.3cm}}
+\begin{clisting}
+if (c) 
+  x = a;
+L :
+\end{clisting}
+& 
+La valeur de \verbtt{x} en \verbtt{L} dépend de \verbtt{a}, mais aussi de \verbtt{c}.\\
+\end{tabular}
+\end{exemple}
+
+Il s'agit d'une \indextxtdef{dépendance de contrôle}{dépendance!contrôle}.
+
+\subsection{Dépendances sur les déclarations}
+
+Lorsque des variables sont utilisées dans une instruction, celle-ci dépend de
+leurs déclarations, car si on veut la compiler, il faut que les variables
+existent.
+
+Les déclarations des variables lues (partie droite d'une affectation) sont
+considérées comme participant au calcul de la valeur.
+Les déclarations des
+variables utilisées pour déterminer la case affectée (partie gauche d'une
+affectation) sont considérées comme des dépendances sur l'adresse.
+
+\begin{exemple}
+\begin{tabular}{m{3.5cm}m{\linewidth-4.3cm}}
+\begin{clisting}
+/* 1 */ int x;
+/* 2 */ int y;
+...
+/* i */ x = 3;
+/* j */ y = 4;
+...
+/* n */ x = y;
+\end{clisting}
+&
+L'instruction (n) a une dépendance d'adresse sur la déclaration de x (1),
+et des dépendances de donnée sur l'affectation de y (j)
+et sa déclaration (2). Dans ce cas, on aurait pu se passer de de cette dernière
+dépendance car (j) dépend déjà de (2), mais ce n'est pas forcement le cas
+en présence d'alias.
+\end{tabular}
+\end{exemple}
+
+\subsection{Résumé}
+
+On voit donc qu'on distingue trois types de dépendances~:
+\begin{itemize}
+\item les calculs de valeurs,
+\item les calculs d'adresses,
+ \item le contrôle.
+\end{itemize}
+
+
+\section{État de l'art}\label{sec-lart}
+
+Voyons tout d'abord ce que dit la littérature sur ce sujet
+afin de voir les solutions qui peuvent répondre à notre besoin,
+et les points à modifier.
+
+\subsection{Origine}
+
+Les graphes de dépendances ont principalement été étudiés dans le cadre du
+\slicing{}, mais ils sont aussi utilisés dans les travaux sur la compilation.
+
+\subsection{Graphes de dépendances}
+
+\cite{Ottenstein84}, puis \cite{Ferrante87}
+introduisent la notion de PDG ({\it Program Dependence Graph}).
+Un tel graphe est utilisé pour représenter les différentes dépendances
+entre les instructions d'un programme.
+Ils l'exploitent pour calculer les instructions
+qui influencent la valeur des variables en un point.\\
+
+Cette représentation, initialement intraprocédurale, a été étendue
+à l'analyse interprocédurale dans \cite{horwitz88interprocedural} où elle
+porte le nom de SDG ({\it System Dependance Graph}).
+Elle est maintenant, à quelques variantes près,
+quasiment universellement utilisée.
+
+\subsection{Exploitation du graphe}
+
+Lorsque l'on utilise le graphe de dépendance pour faire du \slicing,
+le calcul se résume à un problème d'accessibilité à un noeud car comme le dit
+Susan Horwitz~:
+
+\begin{definition}{slicing selon \cite{horwitz88interprocedural}}
+A slice of a program with respect to program point p and variable x
+consists of a set of statements of the program that might affect
+the value of x at p.
+\end{definition}
+
+c'est-à-dire qu'il faut garder toutes les instructions correspondant à des
+noeuds du graphe pour lesquels il existe un chemin vers le noeud représentant le
+calcul de {\tt x} en {\tt p}.
+Mais le problème est que ce noeud n'existe que si {\tt x} est défini
+par l'instruction située en {\tt p}.
+
+Nous verrons que cette limitation peut être levée si l'on garde
+(ou recalcule) les structures de données utilisées
+lors de la construction du graphe.\\
+
+Le traitement des appels de fonction est souvent compliqué par le fait qu'il
+est également ramené à un problème d'accessibilité dans un graphe qui,
+cette fois, représente toute l'application. Or, dans un tel graphe,
+si on ne prend pas de précautions supplémentaires,
+on parcourt des chemins impossibles qui entrent dans une fonction
+par un appel, et sortent par un autre site d'appel.
+Ces chemins existent en effet dans le graphe,
+mais pas dans la réalité.
+
+Comme nous nous proposons de traiter ce problème de manière modulaire,
+nous devrions échapper à une partie de ce problème.
+Mais nous verrons par la suite que l'utilisation d'une analyse d'alias globale
+produit néanmoins quelques effets de bord indésirables.
+
+\subsection{Programmes non structurés}
+
+Les premiers algorithmes utilisés fonctionnent
+correctement sur des programmes structurés,
+mais produisent des résultats erronés en présence de \verbtt{goto}.
+
+Le problème vient du fait que ces instructions ne modifient pas de données~:
+il n'y a donc pas de dépendance de donnée~; et il n'y a pas
+de dépendance de contrôle non plus car dans le CFG,
+une seule branche sort du noeud pour aller vers le point de branchement.
+
+Plusieurs personnes (\cite{Choi94},  \cite{agrawal94slicing},
+\cite{harman98new},  \cite{kumar02better} entre autres)
+se sont donc intéressées
+aux sauts (\verbtt{goto}) qui brisaient la structure du programme.
+Ce point, qui nous intéresse tout particulièrement, est présenté en détail
+en \S\ref{sec-cdg}.
+
+\subsection{Pointeurs et données structurées}
+
+De nombreux articles s'intéressent aux traitements des données structurées,
+et plus encore des pointeurs. Dans le cadre de cette étude,
+nous n'avons pas exploré ces recherches étant donné que
+nous nous appuyons déjà sur une analyse d'alias précise.
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+\section{Plan}
+
+Les trois chapitres suivants
+exposent comment est calculé notre graphe de dépendances.
+
+Puis, nous verrons au chapitre \ref{sec-find} comment
+exploiter les informations calculées et au chapitre
+\ref{sec-mark} comment associer des informations aux éléments
+et les propager dans le graphe.
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/pdg/macros_pdg.tex b/doc/pdg/macros_pdg.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8741fa85bf26ba576ae7c68f2b2e1910dd5f3286
--- /dev/null
+++ b/doc/pdg/macros_pdg.tex
@@ -0,0 +1,130 @@
+%==============================================================================
+\usepackage{tabularx}
+\usepackage{wasysym}
+\usepackage{stmaryrd}
+
+%------------------------------------------------------------------------------
+\newcommand{\setenvclass}[2]{}
+
+\usepackage{listings}
+% TODO :
+\lstdefinestyle{clststyle}{}
+\lstnewenvironment{clisting}
+  {
+   \setenvclass{lstlisting}{clisting}
+   \lstset{language=C, style=clststyle}}
+  {}
+%-----------------------------------------------
+% Commandes pour mettre des ref dans l'index :
+\newcommand{\idb}[1]{\textbf{#1}}
+\newcommand{\indextxt}[1]{\index{#1}{\bf #1}}
+\newcommand{\indexdef}[1]{\index{#1|idb}{{\bf #1}}}
+\newcommand{\indextxtdef}[2]{\index{#2|idb}{{\bf #1}}}
+
+%-----------------------------------------------
+% quelques "mots" spéciaux
+\newcommand{\slicing}{{\it slicing}\xspace}
+\newcommand{\slicingb}{{\it slicing\ }}
+           % permet de corriger les cas où \slicing est suivi d'une {
+           % car il semble que xspace gère mal ce cas.
+\newcommand{\caml}{{\sc Ocaml}\xspace}
+\newcommand{\caveat}{{\sc Caveat}\xspace}
+\newcommand{\cil}{{\sc CIL}\xspace}
+\newcommand{\ppc}{{\sc Frama-C}\xspace}
+\newcommand{\from}{{\sc From}\xspace}
+
+\newcommand{\mylet}{\text{\it let }}
+\newcommand{\myin}{\text{\it in }}
+%------------------------------------------------------------------------------
+\newcommand{\verbtt}[1]{{\small{\tt{#1}}}}
+%------------------------------------------------------------------------------
+% Légende des figures :
+\usepackage[hang,small]{caption}
+\renewcommand{\captionfont}{\it}
+\renewcommand{\captionlabelfont}{\it \bf \small}
+%\renewcommand{\captionlabeldelim}{ : }
+%-----------------------------------------------
+% prend le nom du fichier
+% et éventuellement un facteur d'échelle (1 par défaut)
+\newcommand{\uneimage}[2][1]{
+    \includegraphics[width=(#1)\textwidth]{#2}
+}
+%--------------------------------
+\newcommand{\labcenterepsfig}[3]{
+  \begin{center}
+  \begin{figure}[hbt]
+    \centering{
+    \leavevmode
+    \uneimage{#1}
+    }
+    \caption{\label{#3} #2}
+  \end{figure}
+  \end{center}
+  }
+%------------------------------------------------------------------------------
+\newenvironment{debutenv}[1]
+  {
+    \vspace{5mm}
+    \begin{footnotesize}
+      \setenvclass{minipage}{myminipage}
+      \noindent\begin{minipage}[t]{\textwidth}
+      \fbox{\bf #1} \hrule
+    \vspace{3mm}
+  }
+  {
+    \end{minipage}
+    \end{footnotesize}
+  }
+\newenvironment{finenv}
+  {
+    \begin{footnotesize}
+      \setenvclass{minipage}{myminipage}
+    \noindent\begin{minipage}[t]{\textwidth}
+  }
+  {
+    \hrule
+    \
+    \end{minipage}
+    \end{footnotesize}
+    \vspace{5mm}
+  }
+\newenvironment{monenv}[1]
+  {\begin{debutenv}{#1}}
+  {\end{debutenv}
+   \par
+   \begin{finenv}
+   \end{finenv}}
+
+\newcounter{numexemple}
+\newcommand{\titreexemple}{%
+  \stepcounter{numexemple}{Exemple \arabic{numexemple}}}
+
+\newenvironment{exemple}
+  {\begin{monenv}{\titreexemple}}
+  {\end{monenv}}
+
+\newenvironment{exemple1}
+  {\begin{debutenv}{\titreexemple}}
+    {\end{debutenv}}
+
+\newenvironment{exemple2}
+  {\begin{finenv}}
+    {\end{finenv}}
+
+\newenvironment{astuce}
+  {\begin{monenv}{Astuce}}
+  {\end{monenv}}
+
+\newenvironment{definition}[1]
+  {\begin{monenv}{Definition (#1)}}
+  {\end{monenv}}
+
+\newenvironment{algo}[1]
+  {\begin{monenv}{Algorithme (#1)}}
+  {\end{monenv}}
+
+\newcounter{numrque}
+\newenvironment{remarque}[1]
+  {\refstepcounter{numrque}{\bf Remarque \arabic{numrque}} :\label{#1}}
+  {}
+%==============================================================================
diff --git a/doc/pdg/main.tex b/doc/pdg/main.tex
new file mode 100644
index 0000000000000000000000000000000000000000..3c36466ebbccfe3fbfc8290100bcd25276579c4c
--- /dev/null
+++ b/doc/pdg/main.tex
@@ -0,0 +1,27 @@
+\documentclass[a4paper,11pt,twoside,openright,web,lang=french]{frama-c-book}
+
+\input{macros_pdg.tex}
+%==============================================================================
+\begin{document}
+
+\coverpage{PDG --- Documentation technique}
+
+\begin{titlepage}
+\begin{flushleft}
+\includegraphics[height=14mm]{../images/cealistlogo.jpg}
+\end{flushleft}
+\vfill
+\title{Documentation du greffon PDG}{Calcul de dépendances dans un programme C}
+\author{Anne Pacalet et Patrick Baudin}
+\begin{tabular}{l}
+CEA LIST, Laboratoire de Sûreté et Sécurité des Logiciels, Saclay, F-91191 \\
+\end{tabular}
+\vfill
+\begin{flushleft}
+  \textcopyright 2007-2020 CEA LIST
+
+\end{flushleft}
+\end{titlepage}
+\input{pdg.tex}
+
+\end{document}
diff --git a/doc/pdg/mark.tex b/doc/pdg/mark.tex
new file mode 100644
index 0000000000000000000000000000000000000000..4e78cbd66eabf5fbce3835af9acfdb9a45a994cc
--- /dev/null
+++ b/doc/pdg/mark.tex
@@ -0,0 +1,159 @@
+\chapter{Marquage générique}\label{sec-mark}
+
+\section{Objectif}
+
+On souhaite pouvoir associer une information à certains éléments d'un PDG,
+propager cette information dans les dépendances de ces éléments,
+et calculer ce qu'il faut propager dans les autres PDG de l'application
+pour avoir un traitement interprocédural cohérent. \\
+
+Par exemple, l'information peut être un simple booléen qui indique si l'élément
+correspondant est visible ou non. Pour qu'un élément soit visible, il faut que
+toutes ses dépendances le soit aussi.
+On voit dans cet exemple qu'on s'intéresse dans un premier temps à une
+propagation arrière.\\
+
+Comme un PDG est associé à une fonction, la propagation s'arrête aux entrées
+de la fonction. Par ailleurs, les appels de fonction sont traités localement,
+sans descendre dans la fonction appelée.
+Pour gérer la propagation interprocédurale, les fonctions élémentaires de
+marquage doivent fournir l'information à propager aussi bien dans les fonctions
+appelées que dans les appelants.
+
+\section{Marquage générique}
+
+Le marquage pouvant être utilisé pour différents besoins,
+les marques peuvent être définies par l'utilisateur.
+Il lui suffit de définir comment en faire l'union.
+
+On utilise deux types d'union~:
+\begin{itemize}
+  \item l'une permet de faire une simple union de deux marques,
+  \item l'autre permet d'ajouter une marque à un élément de programme~:
+    elle calcule donc une nouvelle marque à partir de l'ancienne,
+    et de la marque à ajouter et fournit aussi la marque à propager dans les
+    dépendances.
+\end{itemize}
+
+\section{Propagation arrière}
+
+\subsection{Marquage intraprocédural}
+
+La propagation arrière s'effectue très simplement en suivant les dépendances,
+en ajoutant la marque propagée à la marque existante,
+et en s'arrêtant quand la marque à propager rendue par la fonction de marquage
+est $m_{\bot}$.\\
+
+En cours de propagation, lorsque l'on traite un élément correspondant à la
+sortie d'un appel de fonction, ou à une entrée de la fonction courante,
+la marque à propager ainsi que l'identifiant de l'élément sont stockés.
+A l'issu du marquage, on a donc~:
+\begin{itemize}
+  \item un ensemble de couple (entrée de la fonction, marque à propager),
+  \item une liste des appels de fonction, avec pour chacun un ensemble de
+    couples (sortie de l'appel, marque à propager).
+\end{itemize}
+
+C'est cette information qui permettra de faire la propagation interprocédurale.
+
+\subsection{Propagation interprocédurale}
+
+\subsubsection{Méthode automatique}
+
+Le module de marquage permet de faire automatiquement
+la propagation interprocédurale si on le souhaite.
+Il est utilisé de cette façon dans la détection de code mort par exemple.\\
+
+L'utilisateur peut, s'il le souhaite,
+donner des fonctions de transformation des marques~:
+\begin{itemize}
+  \item une qui est utilisée pour transformer les marques des entrées d'une
+    fonction avant la propagation dans les appelants,
+  \item une autre qui est utilisée pour transformer les marques des sorties
+    d'un appel de fonction avant propagation dans la fonction appelée.
+\end{itemize}
+Dans les cas les plus simples, ces fonctions ne font rien, et rendent
+simplement la marque qui leur est passée.
+
+\subsubsection{Méthode manuelle}
+
+Dans certains cas, il est souhaitable de gérer cette propagation à la main.
+C'est par exemple le cas dans le \slicing{} où une fonction source est associée
+à plusieurs marquages différents.\\
+
+Des fonctions aident néanmoins à retrouver les éléments à marquer dans les
+autres fonctions à partir du résultat fourni par le marquage intraprocédural.
+Ces fonctions traduisent les informations~:
+\begin{itemize}
+  \item (entrée de la fonction, marque à propager) en un ensemble d'éléments à
+    marquer dans une~- ou toutes les~- fonction(s) appelante(s),
+  \item (appel, \{(sortie de l'appel, marque à propager)\})
+    en un ensemble d'éléments à marquer dans la fonction appelée.
+\end{itemize}
+Les éléments rendu sont les nouveaux points de départ de marquages
+intraprocéduraux.
+L'utilisateur peut, comme lors de la propagation automatique,
+donner des fonctions de transformation des marques aux traductions.
+
+\subsubsection{Données non définies}
+
+Lorsque les points de départ marquage initial sont des éléments du PDG,
+toutes les propagations s'effectueront a priori sur des éléments existant.
+Mais ce n'est pas forcement le cas lorsqu'il s'agit de marquer les données
+qui n'interviennent pas dans les calculs. Par exemple~:
+
+\begin{exemple}
+  \begin{verbatim}
+int X1, X2;
+
+void f (int x) { /*@ assert X1 >= 0; */ return x + 1; }
+
+void f2 (void)  { X2 = f (2); }
+
+void main (void) { X1 = 0; X2 = 0; f2 (); }
+  \end{verbatim}
+
+  Ici, si on s'intéresse à l'assertion de \verbtt{f}, il faut sélectionner
+  \verbtt{X1} à l'entrée de \verbtt{f}, propager cette information à travers
+  \verbtt{f2} pour enfin marquer l'affectation à \verbtt{X1} dans le \verbtt{main}
+  alors que cette donnée n'apparaît pas dans les PDG de \verbtt{f} et \verbtt{f2}.
+\end{exemple}
+
+On voit donc que dans les informations fournies et calculées
+pour gérer l'interprocédural, il peut y avoir des éléments ne correspondant
+pas à des noeuds de PDG.
+
+\subsubsection{Terminaison}
+
+La terminaison du processus dépend de la définition des marques.
+C'est donc à l'utilisateur de s'assurer que celle-ci permet la stabilisation du
+marquage.
+
+\section{Propagation avant}
+
+La propagation avant n'est pas effectuée automatiquement à l'heure actuelle.
+
+La propagation intraprocédurale ne pose pas de problèmes particuliers,
+car elle est très semblable au calcul en arrière~: il suffit simplement de
+parcourir les liens de dépendance dans l'autre sens.\\
+
+La partie interprocédurale semble un peu plus délicate,
+car il n'y a aucun point de repère dans le PDG
+pour identifier les endroits à partir desquels il faut propager
+(hormis le noeud correspondant au \verbtt{return}
+pour la propagation vers les appelants et les arguments explicites pour
+la propagation dans les appels de fonction).
+
+Des fonctions supplémentaires sont donc fournies pour~:
+\begin{itemize}
+  \item trouver les noeuds d'entrées d'une fonction qui doivent être
+    sélectionnés à partir des noeuds sélectionnés dans l'appelant,
+  \item trouver les noeuds de sortie d'un appel de fonction
+    qui doivent être
+    sélectionnés à partir des noeuds sélectionnés dans la fonction appelée.
+\end{itemize}
+
+En cas d'utilisation intensive de ces fonctionnalités,
+il serait sans doute intéressant de mémoriser les liens entre les
+différents PDG (cela est également vrai pour la propagation interprocédurale
+arrière...).\\
diff --git a/doc/pdg/pdg-call.fig b/doc/pdg/pdg-call.fig
new file mode 100644
index 0000000000000000000000000000000000000000..f55a683a25f4ca4cd7ef67f8bd4c8f96db2e0eaf
--- /dev/null
+++ b/doc/pdg/pdg-call.fig
@@ -0,0 +1,151 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 7830 3330 8820 3780
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 0 0 0 7
+	 8190 3702 8301 3534 8211 3354 8010 3342 7899 3510 7989 3690
+	 8190 3702
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 0 0 0 7
+	 8640 3690 8751 3522 8661 3342 8460 3330 8349 3498 8439 3678
+	 8640 3690
+4 1 0 50 -1 0 12 0.0000 4 135 150 8100 3600 f0\001
+4 1 0 50 -1 0 12 0.0000 4 135 150 8550 3600 f1\001
+-6
+6 7650 2880 8010 3150
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 7650 2880 8010 2880 8010 3150 7650 3150 7650 2880
+4 1 0 50 -1 0 12 0.0000 4 90 90 7830 3060 a\001
+-6
+6 8550 2880 8910 3150
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 8550 2880 8910 2880 8910 3150 8550 3150 8550 2880
+4 1 0 50 -1 0 12 0.0000 4 135 90 8730 3060 b\001
+-6
+6 8190 1440 8730 1980
+1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 8460 1710 180 180 8460 1890 8460 1530
+4 1 0 50 -1 0 12 0.0000 4 135 135 8460 1800 G\001
+-6
+6 8550 2340 9090 2790
+1 2 0 1 0 7 50 -1 -1 4.000 1 0.0000 8820 2565 180 135 8640 2430 9000 2700
+4 1 0 50 -1 0 12 0.0000 4 90 90 8820 2610 z\001
+-6
+6 7380 2340 8010 2790
+1 2 0 1 0 7 50 -1 -1 4.000 1 0.0000 7695 2565 225 135 7470 2430 7920 2700
+4 1 0 50 -1 0 12 0.0000 4 135 330 7740 2610 x+y \001
+-6
+6 7290 1800 7650 2250
+1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 7470 2025 135 135 7470 2160 7470 1890
+4 1 0 50 -1 0 12 0.0000 4 90 90 7470 2070 x\001
+-6
+6 7740 1800 8100 2250
+1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 7920 2025 135 135 7920 2160 7920 1890
+4 1 0 50 -1 0 12 0.0000 4 135 90 7920 2070 y\001
+-6
+6 7650 3780 8010 4230
+1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 7830 4005 135 135 7830 4140 7830 3870
+4 1 0 50 -1 0 12 0.0000 4 90 90 7830 4050 z\001
+-6
+6 4770 1620 6390 3870
+6 4860 1800 5220 2790
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4860 1800 5220 1800 5220 2070 4860 2070 4860 1800
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4860 2430 5220 2430 5040 2790 4860 2430 4860 2430
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5040 2070 5040 2430
+4 1 0 50 -1 0 12 0.0000 4 90 90 5040 1980 a\001
+4 1 0 50 -1 0 12 0.0000 4 90 90 5040 2610 a\001
+-6
+6 5400 1800 5760 2790
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5400 1800 5760 1800 5760 2070 5400 2070 5400 1800
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5400 2430 5760 2430 5580 2790 5400 2430 5400 2430
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5580 2070 5580 2430
+4 1 0 50 -1 0 12 0.0000 4 135 90 5580 2610 b\001
+4 1 0 50 -1 0 12 0.0000 4 135 90 5580 1980 b\001
+-6
+6 5940 2430 6300 2790
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5940 2430 6300 2430 6120 2790 5940 2430 5940 2430
+4 1 0 50 -1 0 12 0.0000 4 135 135 6120 2610 G\001
+-6
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 6390 3870 6390 1620 4770 1620 4770 3870 6390 3870
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6030 1620 6390 1980
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 7
+	 5490 3780 5601 3612 5511 3432 5310 3420 5199 3588 5289 3768
+	 5490 3780
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 7
+	 6051 3780 6162 3612 6072 3432 5871 3420 5760 3588 5850 3768
+	 6051 3780
+3 0 2 2 0 7 50 -1 -1 4.500 0 0 0 3
+	 6120 2790 6210 3240 6030 3420
+	 0.000 1.000 0.000
+3 0 2 2 0 7 50 -1 -1 4.500 0 0 0 3
+	 5580 2790 5400 3060 5940 3420
+	 0.000 1.000 0.000
+3 0 2 2 0 7 50 -1 -1 4.500 0 0 0 3
+	 6120 2790 5940 3060 5490 3420
+	 0.000 1.000 0.000
+3 0 2 2 0 7 50 -1 -1 4.500 0 0 0 3
+	 5040 2790 4950 3150 5310 3420
+	 0.000 1.000 0.000
+4 0 0 50 -1 0 12 0.0000 4 135 60 6210 1800 f\001
+4 1 0 50 -1 0 12 0.0000 4 135 90 5400 3690 0\001
+4 1 0 50 -1 0 12 0.0000 4 135 90 5940 3690 1\001
+-6
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7830 3150 8010 3330
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8730 3150 8640 3330
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8820 2700 8730 2880
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7740 2700 7830 2880
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8370 1890 8190 3330
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8460 1890 8460 3330
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7560 2160 7650 2430
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7830 2160 7740 2430
+2 4 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5
+	 9180 3780 9180 2340 7290 2340 7290 3780 9180 3780
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8100 3690 7920 3870
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 8550 3690 8730 4050
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 9270 1800 8820 1350
+2 4 0 1 0 7 50 -1 -1 4.000 0 0 7 0 0 5
+	 9270 4500 9270 1350 7200 1350 7200 4500 9270 4500
+4 1 0 50 -1 0 12 0.0000 4 135 90 9090 1530 g\001
+4 1 0 50 -1 14 12 0.0000 4 180 1365 8370 1170 z = f(x+y,z);\001
+4 1 0 50 -1 0 12 0.0000 4 135 1245 4050 2610 Valeurs initiales\001
+4 1 0 50 -1 0 12 0.0000 4 135 975 4050 1980 D\351clarations\001
+4 1 0 50 -1 0 12 0.0000 4 135 540 4050 3690 Sorties\001
+4 1 0 50 -1 14 12 0.0000 4 165 1890 5580 1350 T1 f (T2 a, T3 b);\001
+4 1 0 50 -1 3 12 0.0000 4 150 1845 5580 4140 \\res From a , G.a, G.b;\001
+4 1 0 50 -1 3 12 0.0000 4 150 1050 5580 4410 G From b, G;\001
diff --git a/doc/pdg/pdg.tex b/doc/pdg/pdg.tex
new file mode 100644
index 0000000000000000000000000000000000000000..92fca55150bc4bfe1a28c3e0d343fce776b66439
--- /dev/null
+++ b/doc/pdg/pdg.tex
@@ -0,0 +1,78 @@
+%===============================================================================
+% Versions
+\section*{Versions}
+
+\begin{small}
+Seules les versions Vx.0 sont des documents achevés~;
+les autres sont à considérer comme des brouillons.
+
+\begin{enumerate}
+  \item[V3.0 -] 2 novembre 2020~:
+    \begin{itemize}
+    \item Document sous licence Creative Commons
+      ``Attribution-ShareAlike 4.0 International''
+      \url{https://creativecommons.org/licenses/by/4.0/}.
+    \end{itemize}
+  \item[V2.0 -] 3 décembre 2008~:
+    \begin{itemize}
+      \item réorganisation,
+      \item mise à jour,
+      \item partie sur l'utilisation.
+    \end{itemize}
+  \item[V1.4 - ] 30 mai 2008~:
+    \begin{itemize}
+      \item ajout d'une partie sur le marquage.
+    \end{itemize}
+  \item[V1.3 - ] 22 novembre 2007~:
+    \begin{itemize}
+      \item mise à jour de la partie sur l'interprocédural.
+    \end{itemize}
+  \item[V1.2 - ] 07 novembre 2007~:
+    \begin{itemize}
+      \item mise à jour de la partie sur les dépendances de contrôle.
+    \end{itemize}
+  \item[V1.1 - ] 20 septembre 2007~:
+    \begin{itemize}
+      \item réorganisation complète,
+      \item développement de la partie sur les dépendances de contrôle,
+      \item discussion au sujet des boucles infinies.
+    \end{itemize}
+  \item[V1.0 - ] 26 juin 2007~:
+    \begin{itemize}
+      \item relecture et petites corrections.
+    \end{itemize}
+  \item[V0.2 - ] 24 mai 2007~:
+    \begin{itemize}
+      \item révision générale,
+    \end{itemize}
+  \item[V0.1 - ] 23 mars 2007~:
+    \begin{itemize}
+      \item création du module de calcul de PDG,
+      \item extraction de la documentation du PDG du rapport sur le {\it
+	slicing}.
+    \end{itemize}
+\end{enumerate}
+\end{small}
+%===============================================================================
+\cleardoublepage
+\tableofcontents
+%===============================================================================
+\cleardoublepage\input{intro.tex}
+\cleardoublepage\input{data.tex}
+\cleardoublepage\input{ctrl.tex}
+\cleardoublepage\input{calls.tex}
+\cleardoublepage\input{utilisation.tex}
+\cleardoublepage\input{mark.tex}
+\cleardoublepage\input{conclusion.tex}
+%===============================================================================
+\appendix
+%--------------------------------------
+\cleardoublepage \input{impact.tex}
+%-------------------------------------------------------------------------------
+\cleardoublepage
+\bibliographystyle{abbrvnat}
+\bibliography{../slicing/bib-slicing}
+%--------------------------------------
+\cleardoublepage
+\printindex
+%===============================================================================
diff --git a/doc/pdg/utilisation.tex b/doc/pdg/utilisation.tex
new file mode 100644
index 0000000000000000000000000000000000000000..2b0d0794efaa27389a37391b59aefbe3d298729e
--- /dev/null
+++ b/doc/pdg/utilisation.tex
@@ -0,0 +1,49 @@
+\chapter{Retrouver l'information}\label{sec-find}
+
+Jusqu'à présent, on a vu comment calculer le graphe de dépendances.
+Dans ce chapitre, nous présentons les fonctions fournies pour
+trouver des éléments du PDG suivant un certain nombre de critères.
+L'annexe \ref{sec-impact} rappelle certains objectifs initiaux
+d'une utilisation de ces fonctions pour effectuer une analyse d'impact.\\
+
+Par ailleurs, outre la manipulation d'ensemble d'éléments du PDG,
+un système de gestion et de propagation de marques est également proposé.
+Il est présenté au chapitre \ref{sec-mark}.
+
+\section{A partir de leur clé}
+
+Au cours du calcul, chaque élément du PDG est associé à une clé
+qui correspond à l'élément de programme qu'il représente (cf. {\tt
+pdgIndex.mli}).
+On peut par la suite retrouver un élément à partir de cette clé
+comme par exemple l'élément correspondant à une instruction simple,
+à un paramètre d'entrée, à une déclaration locale, etc.
+
+\section{A partir d'une zone mémoire}
+
+Grâce à l'état qui est propagé lors de la construction
+des dépendances de données (cf. \S\ref{sec-propagation-etat})
+on peut retrouver les éléments qui participent au calcul
+d'une zone mémoire à un point de programme.
+
+Cette fonction doit également vérifier si les éléments trouvés
+définissent complètement la donnée recherchée ou non,
+et si ce n'est pas le cas, indiquer la zone susceptible de ne pas être
+complètement définie au point considéré.
+
+\section{A partir de propriétés}
+
+D'autres fonctionnalités de \ppc permettent d'interpréter une propriété
+du programme et d'en extraire les zones mémoire nécessaires à son évaluation.
+Comme on sait par ailleurs trouver les éléments qui correspondent
+a une zone mémoire en un point de programme (voir ci-dessus),
+on peut ainsi trouver par exemple les éléments dont dépendent une assertion
+ou tout autre propriété.
+
+\section{En exploitant les dépendances}
+
+Après avoir retrouver des éléments dans le graphe, on veut en général exploiter
+leurs dépendances. On peut facilement retrouver les dépendances avant ou
+arrière,
+avec ou sans filtrage sur leur type (donnée, contrôle,...),
+récursivement ou non.
diff --git a/doc/slicing/.gitignore b/doc/slicing/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..91ebc66bd3c739930507edb3c2f09a066b922fbf
--- /dev/null
+++ b/doc/slicing/.gitignore
@@ -0,0 +1,11 @@
+biblio.bib
+frama-c-book.cls
+frama-c-cover.pdf
+frama-c-left.pdf
+frama-c-right.pdf
+main.pdf
+call.pdf
+choose_call.pdf
+exple2.pdf
+propagation.pdf
+propagation.pdf
diff --git a/doc/slicing/Makefile b/doc/slicing/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..b09932ac72db4cf6512927e70d60debfe827927c
--- /dev/null
+++ b/doc/slicing/Makefile
@@ -0,0 +1,50 @@
+.PHONY: all clean
+
+all: main.pdf
+
+GENERATED=biblio.bib
+GENERATED+=frama-c-book.cls frama-c-cover.pdf frama-c-left.pdf frama-c-right.pdf
+include ../MakeLaTeXModern
+
+DWNLDDIR=../manuals
+DOCNAME=slicing-documentation-fr.pdf
+
+BIB_FILE = bib-slicing.bib
+main.bbl : $(BIB_FILE)
+	@echo "=== Fichier .bib plus récent -> effacement du .bbl"
+	rm -f $(SRC).bbl
+
+main.pdf: $(FRAMAC_MODERN) $(BIB_FILE) \
+	main.tex macros_slicing.tex slicing.tex \
+	intro.tex conclusion.tex \
+	fonction.tex interproc.tex interproc2.tex man.tex \
+	algo.tex interexples.tex intercmds.tex projets.tex \
+	algoH.mli algo.ml \
+	call.pdf choose_call.pdf exple2.pdf propagation.pdf propagation.pdf
+
+###############################################################################
+
+GENERATED+=call.pdf choose_call.pdf exple2.pdf propagation.pdf propagation.pdf
+%.pdf : %.fig
+	fig2dev -L pdf $< $@
+
+###############################################################################
+
+%.pdf: %.tex
+	pdflatex $*
+	bibtex $*
+	pdflatex $*
+	pdflatex $*
+
+install: main.pdf
+	@echo "copying main.pdf    in $(DWNLDDIR)/$(DOCNAME)"
+	@rm -f "$(DWNLDDIR)/$(DOCNAME)"
+	@cp main.pdf "$(DWNLDDIR)/$(DOCNAME)"
+
+clean:
+	rm -rf *~ *.aux *.log *.nav *.out *.snm *.toc *.lof *.pp *.bnf \
+		*.haux  *.hbbl *.htoc \
+                *.cb *.cb2 *.cm? *.bbl *.blg *.idx *.ind *.ilg \
+		$(GENERATED)
+
+###############################################################################
diff --git a/doc/slicing/algo.ml b/doc/slicing/algo.ml
new file mode 100644
index 0000000000000000000000000000000000000000..35755d65866f27523d34355ed7ebcfb7cb07225a
--- /dev/null
+++ b/doc/slicing/algo.ml
@@ -0,0 +1,22 @@
+(* On nomme H le module des hypothèses. *)
+module H = AlgoH ;;
+
+(* produit une nouvelle fonction spécialisée en partant de [ff]
+   en marquant l'élément [e] et toutes ses dépendances avec la marque [m]. *)
+let rec mark_rec_pdg_elem pdg stmt_elems m e ff =
+  let new_ff = add_elem_mark pdg stmt_elems m e ff in
+  let dpds = H.get_dpds e pdg in
+    List.fold_right (mark_rec_pdg_elem pdg stmt_elems m) dpds new_ff
+  (* ;; *)
+and
+(* [add_elem_mark] ajoute la marque [m] à l'instruction correspondant à
+   l'élément [e] et marque les autres éléments éventuels comme superflus. *)
+      add_elem_mark pdg stmt_elems m e ff = 
+  let stmt = H.get_stmt e stmt_elems in
+  let old_m = H.get_stmt_mark stmt ff in
+  let new_m = H.combine_mark old_m m in
+  let new_ff = H.replace_stmt_mark ff stmt new_m in
+  let elems = H.get_elems stmt stmt_elems in
+  let (_, other_elems) = List.partition (fun elem -> elem = e) elems in
+  let mark_spare_elem e ff = mark_rec_pdg_elem pdg stmt_elems H.spare_mark e ff in
+    List.fold_right mark_spare_elem other_elems new_ff
diff --git a/doc/slicing/algo.tex b/doc/slicing/algo.tex
new file mode 100644
index 0000000000000000000000000000000000000000..c27c2edc736c88d84f7aa080e80cd5feead8c087
--- /dev/null
+++ b/doc/slicing/algo.tex
@@ -0,0 +1,22 @@
+\chapter{Algorithmes}
+
+\section{Hypothèses}
+
+On se donne quelques types et fonctions de base~:\\
+
+\camlListingInput{algoH.mli}
+
+\section{Marquage d'une fonction}\label{sec-algo-mark-fct}
+
+Il s'agit de voir comment sont marquées les instructions d'une fonction
+à partir d'une requête donnant un élément du PDG et une marque.\\
+
+L'algorithme présenté ici est une version simplifiée
+de celui qui existe dans
+l'outil afin d'être plus facilement compréhensible.
+Il est très inefficace et risque de boucler car on ne teste pas
+si l'instruction à marquer contient déjà la nouvelle marque (test d'arrêt).
+
+Il s'agit de plus d'une version sans spécialisation des appels de fonction.\\
+
+\camlListingInput{algo.ml}
diff --git a/doc/slicing/algoH.mli b/doc/slicing/algoH.mli
new file mode 100644
index 0000000000000000000000000000000000000000..a514d3fedd1df4b77162a9b5d10ae67d66f29c14
--- /dev/null
+++ b/doc/slicing/algoH.mli
@@ -0,0 +1,59 @@
+(* Point de programme *)
+type t_program_point ;;
+
+(* Instruction *)
+type t_stmt ;;
+
+(* l'instruction située à un point de contrôle (après) *)
+val get_pp_stmt : t_program_point -> t_stmt ;;
+
+(* CFG : control flow graph *)
+type t_cfg ;;
+(* successeurs dans le cfg. *)
+val get_cfg_succ : t_cfg -> t_stmt -> t_stmt list ;;
+(* predecesseurs dans le cfg. *)
+val get_cfg_prev : t_cfg -> t_stmt -> t_stmt list ;;
+
+(* PDG : program dependences graph *)
+type t_pdg ;;
+(* element composant le PDG *)
+type t_elem ;;
+(* donne la liste des dépendances directes de l'élément dans le PDG *)
+val get_dpds : t_elem -> t_pdg -> t_elem list ;;
+val get_all_dpds : t_pdg -> t_elem -> t_elem list ;;
+val get_list_all_dpds : t_pdg -> t_elem list -> t_elem list ;;
+val get_list_control_dpds : t_pdg -> t_elem list -> t_elem list ;;
+val get_list_all_control_dpds : t_pdg -> t_elem list -> t_elem list ;;
+val merge :  t_elem list -> t_elem list -> t_elem list ;;
+
+val get_pp_elems : t_pdg -> t_program_point -> t_elem list ;;
+
+(* correspondance entre les instructions et les éléments du PDG *)
+type t_stmt_elems ;;
+
+(* retrouver l'instruction correspondant à un élément *)
+val get_stmt : t_elem -> t_stmt_elems -> t_stmt ;;
+(* retrouver les instructions correspondant aux éléments *)
+val get_stmts : t_elem list -> t_stmt_elems -> t_stmt list ;;
+(* retrouver les éléments correspondant à une instruction *)
+val get_elems : t_stmt -> t_stmt_elems -> t_elem list ;;
+
+type t_state 
+
+type t_data
+
+val get_state : t_program_point -> t_state ;;
+val get_defs_data : t_state -> t_data ->  t_elem list ;;
+(* type des marques *)
+type t_mark ;;
+(* la marque correspondant à mS : superflu. *)
+val spare_mark : t_mark ;;
+(* combinaison de deux marques *)
+val combine_mark : t_mark -> t_mark -> t_mark ;;
+
+(* type correspondant au marquage des instructions d'une fonction. *)
+type t_ff ;;
+(* lire la marque associée à une instruction dans le marquage *)
+val get_stmt_mark : t_stmt -> t_ff -> t_mark ;;
+(* remplacer la marque associée à une instruction dans le marquage *)
+val replace_stmt_mark : t_ff -> t_stmt -> t_mark -> t_ff ;;
diff --git a/doc/slicing/bib-slicing.bib b/doc/slicing/bib-slicing.bib
new file mode 100644
index 0000000000000000000000000000000000000000..1ecf02cac03b72ab4ba1eb123e2db5e587c5928c
--- /dev/null
+++ b/doc/slicing/bib-slicing.bib
@@ -0,0 +1,519 @@
+%--------------------------------------------
+% voir aussi : http://www.infosun.fmi.uni-passau.de/st/staff/krinke/slicing/
+% pour une énorme biblio.
+%===============================================================================
+% Nos documents :
+%--------------------------------------------
+@techreport{ CEAlocations,
+  author = "Anne Pacalet",
+  title = "Emplacements, pointeurs, et opérations associées",
+  INSTITUTION = "CEA",
+  number = "DTSI/SLA/03-49/AP",
+  month = "janvier",
+  year = "2003"
+}
+%--------------------------------------------
+@techreport{ baudinImpact,
+  author = "P. Baudin",
+  title = "Analyse d'impact~: spécification de l'outil",
+  INSTITUTION = "CEA",
+  number = "DTSI/SOL/04-187",
+  month = "juin",
+  year = "2004"
+}
+%--------------------------------------------
+@techreport{ slicingCaveat,
+  author = "A. Pacalet and P. Baudin", 
+  title = "Analyse d'impact ; L'outil de slicing",
+  INSTITUTION = "CEA",
+  number = "DTSI/SOL/05-141",
+  month = "mai",
+  year = "2005",
+  note = "(Note : {\it Il existe, en interne,  une version plus récente de ce document})."
+}
+%--------------------------------------------
+@techreport{ ppcPdg,
+  author = "A. Pacalet",
+  title = "Calcul de dépendances dans un programme C",
+  INSTITUTION = "INRIA",
+  month = "juin",
+  year = "2007",
+  note = "(Note : {\it document de travail en cours d'évolution})"
+}
+%--------------------------------------------
+@techreport{ ppcSlicing,
+  author = "A. Pacalet",
+  title = "Conception d'un outil de slicing",
+  INSTITUTION = "INRIA",
+  month = "juin",
+  year = "2007",
+  note = "(Note : {\it document de travail en cours d'évolution})"
+}
+
+%===============================================================================
+% Etat de l'art sur le slicing en 1995
+@article{ tip95survey,
+    author = "F. Tip",
+    title = "A survey of program slicing techniques",
+    journal = "Journal of programming languages",
+    volume = "3",
+    pages = "121--189",
+    year = "1995",
+    url = "http://citeseer.nj.nec.com/tip95survey.html" 
+}
+%--------------------------------------------
+@misc{wwwSlicing,
+  key = "SlicingWebLinks",
+  title = "Slicing Web Links",
+  url = "http://www.infosun.fmi.uni-passau.de/st/staff/krinke/slicing/"
+}
+%--------------------------------------------
+@inproceedings{873584,
+  author = {Andrea De Lucia and Mark Harman and Robert Hierons and Jens
+    Krinke},
+  title = {Unions of Slices Are Not Slices},
+  booktitle = {CSMR '03: Proceedings of the Seventh European Conference on
+    Software Maintenance and Reengineering},
+  year = {2003},
+  isbn = {0-7695-1902-4},
+  pages = {363},
+  publisher = {IEEE Computer Society},
+  address = {Washington, DC, USA},
+}
+%--------------------------------------------
+% Travaux de M. Ernst :
+% VDG (Value Dependance Graph) pour representer le programme 
+% afin de faciliter le slicing. Traitement de tout ANSI-C (sauf longjump)
+% Utilise une analyse d'alias (point-to, flow-insensitive ?) 
+% mais elle n'est pas détaillée.
+% Traite des structures, 
+% mais pas de précision sur le traitement des éléments de tableaux...
+% Dans l'un des articles, représentation intéressante de l'état mémoire 
+% considéré dans son ensemble  avec fonctions Lookup/Update.
+% Traitement des appels de fonctions en utilisant les "froms".
+% A LIRE plus en détail.
+@techreport{Ernst95,
+   author = {Michael D. Ernst},
+   title = {Slicing pointers and procedures (abstract)},
+   institution = {Microsoft Research},
+   number = {MSR-TR-95-23},
+   address = {Redmond, WA},
+   month = {January~13,},
+   year = {1995},
+   url = "http://pag.csail.mit.edu/~mernst/pubs/slicing-tr9523-abstract.html"
+}
+@inproceedings{177907,
+ author = {Daniel Weise and Roger F. Crew and Michael Ernst and Bjarne Steensgaard},
+ title = {Value dependence graphs: representation without taxation},
+ booktitle = {POPL '94: Proceedings of the 21st ACM SIGPLAN-SIGACT symposium on Principles of programming languages},
+ year = {1994},
+ isbn = {0-89791-636-0},
+ pages = {297--310},
+ location = {Portland, Oregon, United States},
+ url = {http://doi.acm.org/10.1145/174675.177907},
+ doi = {10.1145/174675.177907},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+@techreport{Ernst94,
+  author = "Michael D. Ernst",
+  title = "Practical fine-grained static slicing of optimized code",
+  institution = "Microsoft Research",
+  number = "MSR-TR-94-14",
+  month = "July",
+  year = "1994",
+  address = {Redmond, WA},
+  url = "http://pag.csail.mit.edu/~mernst/pubs/slicing-tr9414-abstract.html"
+}
+%--------------------------------------------
+% notion d'intersection entre les données pour traitement 
+% des champs de structure et des éléments de tableau 
+% (traitement de a[i] pas clair)
+% Presentation d'un slicing static, 
+% mais considère que les pointeurs peuvent sont potentiellement en alias 
+% avec n'importe quoi ! En fait, leur but est de faire du slicing dynamique, 
+% ça résoud donc le problème.
+@inproceedings{ agrawal91dynamic,
+    author = "Hiralal Agrawal and Richard A. {DeMillo} and Eugene H. Spafford",
+    title = "Dynamic Slicing in the Presence of Unconstrained Pointers",
+    booktitle = "Symposium on Testing, Analysis, and Verification",
+    pages = "60--73",
+    year = "1991",
+    url = "http://citeseer.nj.nec.com/agrawal91dynamic.html" 
+}
+
+%--------------------------------------------
+% Attention : une version de 88 + version révisée de 1990
+% System dependance graph et discussion sur l'interprocedural
+@inproceedings{ horwitz88interprocedural,
+    author = "Susan Horwitz and Thomas Reps and David Binkley",
+    title = "Interprocedural slicing using dependence graphs",
+    booktitle = "Proceedings of the {ACM} {SIGPLAN} '88 Conference on Programming Language Design and Implementation",
+    journal = "SIGPLAN Notices",
+    volume = "23-7",
+    month = "June",
+    address = "Atlanta, GA",
+    pages = "35--46",
+    year = "1988",
+    url = "http://citeseer.nj.nec.com/horwitz90interprocedural.html" 
+}
+%--------------------------------------------
+% Critère original :
+% "Statements are removed if they cannot lead to satisfaction of the negation
+% of the postcondition when executed in an initial state
+% which satisfies the precondition".
+% En gros, on veux vérifier une post, et on élimine déjà les cas
+% où on arrive à voir qu'elle est déjà vérifier pour ne garder que les
+% bouts de programme o`la vérif demande plus de travail.
+% Si le programme satisfait le pré-post, la réduction est vide.
+@inproceedings{Harman2001,
+ title = {Pre/Post Conditioned Slicing},
+  author = "Mark Harman and Rob Hierons and Chris Fox and Sebastian Danicic and John Howroyd",
+ booktitle = {ICSM '01: Proceedings of the IEEE International Conference on Software Maintenance (ICSM'01)},
+ year = {2001},
+ isbn = {0-7695-1189-9},
+ pages = {138},
+ publisher = {IEEE Computer Society},
+ address = {Washington, DC, USA},
+ }
+%--------------------------------------------
+% le slicing utiliser pour confronter deux versions d'un programme.
+@article{65980,
+ author = {Susan Horwitz and Jan Prins and Thomas Reps},
+ title = {Integrating noninterfering versions of programs},
+ journal = {ACM Trans. Program. Lang. Syst.},
+ volume = {11},
+ number = {3},
+ year = {1989},
+ issn = {0164-0925},
+ pages = {345--387},
+ url = {http://doi.acm.org/10.1145/65979.65980},
+ doi = {10.1145/65979.65980},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ comment = {Slicing to compare two versions of a program},
+ }
+%--------------------------------------------
+@article{Ferrante87,
+ author = {Jeanne Ferrante and Karl J. Ottenstein and Joe D. Warren},
+ title = {The program dependence graph and its use in optimization},
+ journal = {ACM Trans. Program. Lang. Syst.},
+ volume = {9},
+ number = {3},
+ year = {1987},
+ issn = {0164-0925},
+ pages = {319--349},
+ url = {http://doi.acm.org/10.1145/24039.24041},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ comment = {Introduce the function PDG (program dependence graph)},
+ }
+%--------------------------------------------
+@inproceedings{Ottenstein84,
+ author = {Karl J. Ottenstein and Linda M. Ottenstein},
+ title = {The program dependence graph in a software development environment},
+ booktitle = {SDE 1: Proceedings of the first ACM SIGSOFT/SIGPLAN software engineering symposium on Practical software development environments},
+ year = {1984},
+ isbn = {0-89791-131-8},
+ pages = {177--184},
+ url = {http://doi.acm.org/10.1145/800020.808263},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+%--------------------------------------------
+@inproceedings{ sinha99systemdependencegraphbased,
+    author = "Saurabh Sinha and Mary Jean Harrold and Gregg Rothermel",
+    title = "System-Dependence-Graph-Based Slicing of Programs with Arbitrary Interprocedural Control Flow",
+    booktitle = "International Conference on Software Engineering",
+    pages = "432--441",
+    year = "1999",
+    url = "http://citeseer.nj.nec.com/article/sinha98systemdependencegraphbased.html" 
+}
+
+
+%--------------------------------------------
+@misc{ reps93wisconsin,
+  author = "T. Reps",
+  title = "The wisconsin program-integration system reference manual: Release",
+  text = "T. Reps. The wisconsin program-integration system reference manual: Release
+    2.0. Technical Report Unpublished report, University of Wisconsin, Madison,
+    WI, July 1993.",
+  year = "1993",
+  url = "http://citeseer.nj.nec.com/reps93wisconsin.html" 
+}
+
+%--------------------------------------------
+@inproceedings{ lyle97using,
+  author = "J. Lyle and D. Wallace",
+  title = "Using the Unravel Program Slicing Tool to Evaluate High Integrity Software",
+  booktitle = "Proceedings of Software Quality Week",
+  month = "May",
+  year = "1997",
+  url = "http://citeseer.ist.psu.edu/lyle97using.html" 
+}
+%--------------------------------------------
+@misc{unravel, 
+  key = "Unravel",
+  title = "Unravel",
+  url = "http://www.itl.nist.gov/div897/sqg/unravel/unravel.html"
+}
+%--------------------------------------------
+@misc{CodeSurfeur, 
+  key = "CodeSurfeur",
+  title = "CodeSurfeur",
+  url = "http://www.codesurfer.com/" 
+}
+%--------------------------------------------
+@PHDTHESIS{ weiser79,
+  author = "Mark Weiser",
+  title = "Program slices: formal, psychological, and practical investigations
+    of an automatic program abstraction method.",
+  school = "University of Michigan, Ann Arbor",
+  year = "1979"
+  }
+%--------------------------------------------
+@inproceedings{weiser81,
+ author = {Mark Weiser},
+ title = {Program slicing},
+ booktitle = {ICSE '81: Proceedings of the 5th international conference on Software engineering},
+ year = {1981},
+ isbn = {0-89791-146-6},
+ pages = {439--449},
+ location = {San Diego, California, United States},
+ publisher = {IEEE Press},
+ address = {Piscataway, NJ, USA},
+ }
+%--------------------------------------------
+% A LIRE : discution sur différents types de flots de données.
+@inproceedings{ cartwright89semantics,
+    author = "R. Cartwright and M. Felleisen",
+    title = "The semantics of program dependence",
+    booktitle = "Proceedings of the {ACM} {SIGPLAN} '89 Conference on Programming Language Design and Implementation",
+    journal = "SIGPLAN Notices",
+    volume = "24-7",
+    month = "June",
+    address = "Portland, OR",
+    pages = "13--27",
+    year = "1989",
+    url = "http://citeseer.ist.psu.edu/cartwright89semantic.html" 
+}
+%--------------------------------------------
+% Bonne idée de slicing avec des Pre/Post mais ne dit pas grand chose...
+% Je ne comprend pas bien comment on peut enlever des affectations 
+% en propageant une precondition en avant...
+@inproceedings{Chung-2001,
+ author = {I. S. Chung and W. K. Lee and G. S. Yoon and Y. R. Kwon},
+ title = {Program slicing based on specification},
+ booktitle = {SAC '01: Proceedings of the 2001 ACM symposium on Applied computing},
+ year = {2001},
+ isbn = {1-58113-287-5},
+ pages = {605--609},
+ location = {Las Vegas, Nevada, United States},
+ url = {http://doi.acm.org/10.1145/372202.372784},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+
+%--------------------------------------------
+@article{survey2005,
+ author = {Baowen Xu and Ju Qian and Xiaofang Zhang and Zhongqiang Wu and Lin Chen},
+ title = {A brief survey of program slicing},
+ journal = {SIGSOFT Softw. Eng. Notes},
+ volume = {30},
+ number = {2},
+ year = {2005},
+ issn = {0163-5948},
+ pages = {1--36},
+ url = {http://doi.acm.org/10.1145/1050849.1050865},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+%--------------------------------------------
+% Article très clair avec une bonne introduction (def. CFG, PDG, postdom, ...)
+% Deux méthodes pour calculer un slicing en présence de GOTO.
+% Définition et preuve d'une "correct executable slice"
+@article{Choi94,
+ author = {Jong-Deok Choi and Jeanne Ferrante},
+ title = {Static slicing in the presence of goto statements},
+ journal = {ACM Trans. Program. Lang. Syst.},
+ volume = {16},
+ number = {4},
+ year = {1994},
+ issn = {0164-0925},
+ pages = {1097--1113},
+ url = {http://doi.acm.org/10.1145/183432.183438},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ }
+%--------------------------------------------
+% Traitement des goto après slicing normal : bonne idée.
+% On ne modifie pas les graphes de dépendances,
+% mais on sélectionne après coup les GOTO dont le 1er postdominateur sélectionné% diffère du 1er successeur lexical sélectionné.
+@inproceedings{ agrawal94slicing,
+    author = "Hiralal Agrawal",
+    title = "On Slicing Programs with Jump Statements",
+    booktitle = "{SIGPLAN} Conference on Programming Language Design and Implementation",
+    pages = "302--312",
+    year = "1994",
+    url = "http://citeseer.ist.psu.edu/agrawal94slicing.html" 
+}
+%--------------------------------------------
+% A LIRE : amélioration de agrawal94slicing
+@misc{ harman98new,
+  author = "M. Harman and S. Danicic",
+  title = "A new algorithm for slicing unstructured programs",
+  text = "Harman, M. and Danicic, S. (1998). A new algorithm for slicing unstructured
+    programs. Journal of Software Maintenance, 10(6):415-441.",
+  year = "1998",
+  url = "http://citeseer.ist.psu.edu/harman98new.html" 
+}
+%--------------------------------------------
+% A LIRE : amélioration récente (2002) du traitement des goto
+% + traitement spécifique des switch.
+@inproceedings{ kumar02better,
+    author = "Sumit Kumar and Susan Horwitz",
+    title = "Better Slicing of Programs with Jumps and Switches",
+    booktitle = "Fundamental Approaches to Software Engineering",
+    pages = "96--112",
+    year = "2002",
+    url = "http://citeseer.ist.psu.edu/kumar02better.html" 
+}
+%--------------------------------------------
+% Très bon résumé de la problématique des dépendances de contrôle.
+% Traitement des cas sans point unique de sortie
+% Slicing préservant la non-terminaison et la terminaison prématurée (exit)
+% version courte publiée à ESOP2005.
+@techreport{ ranganath04new,
+  author = "V. Ranganath and T. Amtoft and A. Banerjee and M. Dwyer and J.
+Hatcliff",
+  title = "A new foundation for control-dependence and slicing for modern
+program structures",
+  institution = "SAnToS Lab., Kansas State University",
+  number = "8",
+  year = "2004",
+  url = "citeseer.ist.psu.edu/ranganath05new.html", 
+  note = "(Note : {\it Une version courte de ce document a été publiée à ESOP'2005})."
+}
+%--------------------------------------------
+% Intéressant : à étudier plus en détail en ce qui concerne les transformations
+%  code et les problèmes que ça pose.
+@misc{ danicic-syntaxdirected,
+  author = "Sebastian Danicic and Mark Harman and Malcolm Munro and Dave Binkley and
+    Mohammed Daoudi and Lin Hu and Xingyuan Zhang",
+  title = "Syntax-Directed Amorphous Slicing",
+  url = "http://citeseer.ist.psu.edu/579941.html" 
+}
+%--------------------------------------------
+% Slicing avec transformation des instructions 
+% Règles de transformation 
+%+ détail de 2 cas d'étude (A LIRE)
+@article{harman03,
+  author = "Mark Harman, David Binkley and Sebastian Danicic",
+  title = "Amorphous Program Slicing",
+  journal = "Journal of Systems and Software",
+  volume = "68",
+  number = "1",
+  pages = "45--64",  
+  year = "2003"
+}
+%--------------------------------------------
+@inproceedings{ harman01gustt,
+    author = "Mark Harman and Lin Hu and Malcolm C. Munro and Xingyuan Zhang",
+    title = "{GUSTT}: An Amorphous Slicing System which Combines Slicing and Transformation",
+    booktitle = "Working Conference on Reverse Engineering",
+    pages = "271--280",
+    year = "2001",
+    url = "http://citeseer.ist.psu.edu/harman01gustt.html" 
+}
+%--------------------------------------------
+% 
+@misc{ daoudi-consus,
+  author = "M. Daoudi and L. Ouarbya and J. Howroyd and S. Danicic and Mark Marman
+    and Chris Fox and M. P. Ward",
+  title = "ConSUS: A Scalable Approach to Conditional Slicing",
+  year = "2002",
+  url = "http://citeseer.ist.psu.edu/daoudi02consus.html"
+}
+%--------------------------------------------
+% Intro bien intéressante : A LIRE !
+@misc{ ward2002,
+  author = "Ward, Martin",
+  title = "Program Slicing via FermaT Transformations",
+  year = "2002",
+  url = "http://citeseer.ist.psu.edu/ward02program.html" }
+%--------------------------------------------
+% Description détaillée d'un outil de slicing conditionel 
+% sur un sous ensemble 'simple' de C.
+% différence entre
+% * "Control Dependance Sensive"
+%   = suppression des instructions qui ne sont pas executées 
+%     lorsque les entrées satisfont la pré
+% * et "Control Dependance Inensive"
+  % = suppression de tout ce qui est inutile pour que le pg slicé 
+% et le programme d'origine donnent les mêmes résultats en tout point 
+% lorsque les entrées satisfont la pré 
+% (par exemple, on peut supprimer un if si on sait dans quelle branche on passe)
+
+@article{fox-consit,
+  author = "Chris Fox and Sebastian Danicic and Mark Harman and Robert M. Hierons",
+  title = "ConSIT: A Fully Automated Conditioned Program Slicer",
+  journal = "Software: Practice and Experience",
+ volume = {34}, 
+ number = {1},
+ year = {2004},
+ pages = {15--46},
+ url = {http://dx.doi.org/10.1002/spe.556}
+}
+%--------------------------------------------
+@inproceedings{Field95,
+ author = {John Field and G. Ramalingam and Frank Tip},
+ title = {Parametric program slicing},
+ booktitle = {POPL '95: Proceedings of the 22nd ACM SIGPLAN-SIGACT symposium on Principles of programming languages},
+ year = {1995},
+ isbn = {0-89791-692-1},
+ pages = {379--392},
+ address = {San Francisco, California, United States},
+ url = {http://doi.acm.org/10.1145/199448.199534},
+ publisher = {ACM Press},
+ }
+%--------------------------------------------
+@article{176473,
+ author = {David Binkley},
+ title = {Precise executable interprocedural slices},
+ journal = {ACM Lett. Program. Lang. Syst.},
+ volume = {2},
+ number = {1-4},
+ year = {1993},
+ issn = {1057-4514},
+ pages = {31--45},
+ url = {http://doi.acm.org/10.1145/176454.176473},
+ publisher = {ACM Press},
+ address = {New York, NY, USA},
+ comment = {about generating a program slice that is compilable},
+ }
+%--------------------------------------------
+@inproceedings{Comuzzi,
+ author = {Joseph J. Comuzzi and Johnson M. Hart},
+ title = {Program Slicing Using Weakest Preconditions},
+ booktitle = {FME '96: Proceedings of the Third International Symposium of Formal Methods Europe on Industrial Benefit and Advances in Formal Methods},
+ year = {1996},
+ isbn = {3-540-60973-3},
+ pages = {557--575},
+ publisher = {Springer-Verlag},
+ address = {London, UK},
+url = {http://portal.acm.org/citation.cfm?id=729684},
+ comment = {about a slicing that keeps all that impact a property ?},
+ }
+%--------------------------------------------
+@inproceedings{ fox01backward,
+  author = "C. Fox and M. Harman and R. Hierons and S. Danicic",
+ title = {Backward Conditioning: A New Program Specialisation Technique and Its Application to Program Comprehension},
+ booktitle = {IWPC '01: Proceedings of the 9th International Workshop on Program Comprehension},
+ year = {2001},
+ pages = {89--97},
+ publisher = {IEEE Computer Society},
+ address = {Washington, DC, USA},
+ url = "http://citeseer.ist.psu.edu/fox01backward.html" 
+}
+%--------------------------------------------
+%--------------------------------------------
diff --git a/doc/slicing/call.fig b/doc/slicing/call.fig
new file mode 100644
index 0000000000000000000000000000000000000000..1d2f99cf6ff2918c92c73adf0f8ae8f7379be5c6
--- /dev/null
+++ b/doc/slicing/call.fig
@@ -0,0 +1,78 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 4320 5670 4680 6030
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4410 5850 45 45 4365 5850 4455 5850
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4590 5850 45 45 4545 5850 4635 5850
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4500 5850 162 162 4500 5850 4635 5940
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4500 5670 4500 6030
+-6
+6 4770 7020 5130 7380
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4860 7200 45 45 4815 7200 4905 7200
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 5040 7200 45 45 4995 7200 5085 7200
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4950 7200 162 162 4950 7200 5085 7290
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4950 7020 4950 7380
+-6
+6 6570 5895 6930 6255
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 6660 6075 45 45 6615 6075 6705 6075
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 6840 6075 45 45 6795 6075 6885 6075
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 6750 6075 162 162 6750 6075 6885 6165
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6750 5895 6750 6255
+-6
+6 7020 6570 7380 6930
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 7110 6750 45 45 7065 6750 7155 6750
+1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 7290 6750 45 45 7245 6750 7335 6750
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 7200 6750 162 162 7200 6750 7335 6840
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 7200 6570 7200 6930
+-6
+2 1 0 2 0 0 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 3.00 90.00 150.00
+	 5895 7065 6165 7065
+2 1 0 2 0 0 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 3.00 90.00 150.00
+	 7020 6480 6885 6300
+2 1 0 2 0 0 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 3.00 90.00 150.00
+	 4770 6660 4680 6480
+2 1 0 2 0 0 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 3.00 90.00 150.00
+	 5850 6165 5625 6165
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 7110 6750 6660 6525 6660 6075
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 7290 6750 7290 6300 6840 6075
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 4860 7200 4410 6525 4410 5850
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 5040 7200 5040 6300 4590 5850
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 0 0 3
+	 6660 6075 5130 6435 4410 5895
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 0 0 4
+	 6840 6075 6480 5670 5175 6075 4590 5850
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 0 0 4
+	 5040 7200 5850 6840 6975 7200 7290 6750
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 0 50 -1 -1 4.000 0 0 0 4
+	 4860 7200 4950 6885 5400 6750 6120 6840
+	 0.000 -1.000 -1.000 0.000
+4 0 0 50 -1 0 12 0.0000 4 90 180 4500 7245 cs\001
+4 0 0 50 -1 0 12 0.0000 4 90 180 4050 5895 ce\001
+4 0 0 50 -1 0 12 0.0000 4 90 90 7110 6075 e\001
+4 0 0 50 -1 0 12 0.0000 4 90 90 7515 6795 s\001
+4 0 0 50 -1 0 12 0.0000 4 180 135 7470 6300 gi\001
diff --git a/doc/slicing/choose_call.fig b/doc/slicing/choose_call.fig
new file mode 100644
index 0000000000000000000000000000000000000000..de59292eb760bb2ea6504d35c5f0c95a2da5289a
--- /dev/null
+++ b/doc/slicing/choose_call.fig
@@ -0,0 +1,223 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+41.00
+Single
+-2
+1200 2
+6 6840 3510 8190 3960
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 6840 3510 8190 3510 8190 3960 6840 3960 6840 3510
+4 0 0 50 -1 0 10 0.0000 4 135 645 6930 3690 call(c) = g\001
+4 0 0 50 -1 0 10 0.0000 4 150 1110 6930 3885 /\\ add_outputs (g)\001
+-6
+6 5715 6750 6705 7065
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 6705 7065 6705 6750 5715 6750 5715 7065 6705 7065
+4 0 0 50 -1 0 10 0.0000 4 135 840 5805 6975 in(c) ~in(g) ?\001
+-6
+6 4050 7200 5490 7965
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4095 7245 5445 7245 5445 7920 4095 7920 4095 7245
+4 0 0 50 -1 0 10 0.0000 4 135 840 4230 7830 /\\ in(g)~in(c)\001
+4 0 0 50 -1 0 10 0.0000 4 135 645 4230 7425 call(c) = g\001
+4 0 0 50 -1 0 10 0.0000 4 135 1020 4230 7650 /\\ out(g)~out(c)\001
+-6
+6 5580 8010 6930 8415
+4 0 0 50 -1 0 10 0.0000 4 150 1320 5580 8145 apply missing_inputs\001
+4 0 0 50 -1 0 10 0.0000 4 150 1350 5580 8370 = modify_call_inputs\001
+-6
+6 7020 7245 8415 7920
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 7020 7245 8415 7245 8415 7920 7020 7920 7020 7245
+4 0 0 50 -1 0 10 0.0000 4 150 1245 7110 7830 /\\ missing_inputs(c)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1020 7110 7650 /\\ out(g)~out(c)\001
+4 0 0 50 -1 0 10 0.0000 4 135 645 7110 7425 call(c) = g\001
+-6
+6 7245 1620 8910 2115
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 7245 1620 8910 1620 8910 2115 7245 2115 7245 1620
+4 0 0 50 -1 0 10 0.0000 4 135 405 7380 1845 call=g\001
+4 0 0 50 -1 0 10 0.0000 4 150 1365 7380 2040 /\\ missing_outputs (c)\001
+-6
+6 7875 5625 9225 6300
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 7875 5625 9225 5625 9225 6300 7875 6300 7875 5625
+4 0 0 50 -1 0 10 0.0000 4 135 645 8010 5805 call(c) = g\001
+4 0 0 50 -1 0 10 0.0000 4 150 1110 8010 6000 /\\ change_call(g2)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1095 8010 6195 /\\ out(g2)~out(c)\001
+-6
+6 8685 6525 10080 7290
+4 0 0 50 -1 0 10 0.0000 4 150 885 8685 6855 missing_input\001
+4 0 0 50 -1 0 10 0.0000 4 150 1155 8685 7050 -> change_call(g2)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1395 8685 7245 (pre : out(g2)~out(c))\001
+4 0 0 50 -1 0 10 0.0000 4 105 465 8685 6660 USER :\001
+-6
+6 8640 2250 10035 3015
+4 0 0 50 -1 0 10 0.0000 4 150 1035 8640 2580 missing_outputs\001
+4 0 0 50 -1 0 10 0.0000 4 150 1155 8640 2775 -> change_call(g2)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1395 8640 2970 (pre : out(g2)~out(c))\001
+4 0 0 50 -1 0 10 0.0000 4 105 465 8640 2385 USER :\001
+-6
+6 7245 2520 8010 2745
+2 4 0 1 0 7 50 -1 18 0.000 0 0 7 0 0 5
+	 8010 2745 7245 2745 7245 2520 8010 2520 8010 2745
+4 0 0 50 -1 2 10 0.0000 4 105 600 7335 2700 MODE ?\001
+-6
+6 -360 1035 990 1575
+4 1 0 50 -1 0 10 0.0000 4 150 1140 315 1170 apr\350s modification\001
+4 1 0 50 -1 0 10 0.0000 4 135 1020 315 1350 du marquage de c\001
+4 1 0 50 -1 0 10 0.0000 4 135 1320 315 1530 avec sig(c) <> bottom\001
+-6
+6 -225 6300 1125 6840
+6 -225 6705 1125 6840
+4 1 0 50 -1 0 10 0.0000 4 135 1275 450 6810 pour chaque appelant\001
+-6
+4 1 0 50 -1 0 10 0.0000 4 150 1140 450 6435 apr\350s modification\001
+4 1 0 50 -1 0 10 0.0000 4 150 990 450 6615 d'une entr\351e de g\001
+-6
+6 5490 4995 6840 5715
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5490 4995 6840 4995 6840 5715 5490 5715 5490 4995
+4 0 0 50 -1 0 10 0.0000 4 135 900 5670 5220 call(c) = None\001
+4 0 0 50 -1 0 10 0.0000 4 150 1035 5670 5415 /\\ change_call(g)\001
+4 0 0 50 -1 0 10 0.0000 4 135 1020 5670 5610 /\\ out(g)~out(c)\001
+-6
+6 2025 5220 4365 5715
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2025 5220 4365 5220 4365 5715 2025 5715 2025 5220
+4 0 0 50 -1 0 10 0.0000 4 135 900 2115 5400 call(c) = None\001
+4 0 0 50 -1 0 10 0.0000 4 150 2115 2115 5595 /\\ add_outputs (g)+change_call(g)\001
+-6
+6 4500 5220 5490 5580
+4 0 0 50 -1 0 10 0.0000 4 150 960 4500 5535 add_outputs(g)\001
+4 0 0 50 -1 0 10 0.0000 4 135 345 4500 5355 apply\001
+-6
+6 2025 4590 3105 4860
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 3105 4860 3105 4590 2025 4590 2025 4860 3105 4860
+4 0 0 50 -1 0 10 0.0000 4 135 960 2070 4770 out(g)~out(c)?\001
+-6
+6 3600 3825 4770 4410
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3600 3825 4770 3825 4770 4410 3600 4410 3600 3825
+4 0 0 50 -1 0 10 0.0000 4 135 900 3735 4050 call(c) = None\001
+4 0 0 50 -1 0 10 0.0000 4 105 720 3735 4245 /\\ NewSlice\001
+-6
+6 2250 3870 3015 4095
+2 4 0 1 0 7 50 -1 18 0.000 0 0 7 0 0 5
+	 3015 4095 2250 4095 2250 3870 3015 3870 3015 4095
+4 0 0 50 -1 2 10 0.0000 4 105 600 2340 4050 MODE ?\001
+-6
+6 2070 2880 3240 3465
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2070 2880 3240 2880 3240 3465 2070 3465 2070 2880
+4 0 0 50 -1 0 10 0.0000 4 135 900 2205 3105 call(c) = None\001
+4 0 0 50 -1 0 10 0.0000 4 150 840 2205 3300 /\\ choose_call\001
+-6
+6 3420 3015 5805 3375
+4 0 0 50 -1 0 10 0.0000 4 135 1320 3870 3330 (pre : out(g)~out(c))\001
+4 0 0 50 -1 0 10 0.0000 4 150 2355 3420 3150 USER : choose_call -> change_call (g)\001
+-6
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 1485 6480 64 64 1485 6480 1549 6480
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 6210 6030 64 64 6210 6030 6274 6030
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 2475 4275 64 64 2475 4275 2539 4275
+2 1 1 1 0 7 50 -1 -1 6.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 3240 3195 6210 3195 6210 4995
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 3105 4725 5670 4725 5670 4995
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 2025 1215 2475 1215 2475 2880
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 7200 2610 2880 2610 2880 2880
+2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 8415 7470 8550 7470 8550 6300
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2475 4860 2475 5220
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2475 4095 2475 4590
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	2 1 1.00 60.00 120.00
+	 7470 3960 7470 6480 6390 6480 6390 6750
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 7470 2160 7470 2520
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 6210 5715 6210 6030
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 -450 1215 990 1215
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 6210 6030 6210 6750
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 5715 6930 4725 6930 4725 7200
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 -450 6480 1440 6480
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2025 1890 7245 1890
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 6705 6930 7695 6930 7695 7245
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 7470 2745 7470 3510
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	2 1 1.00 60.00 120.00
+	 7695 7920 7695 8235 4725 8235 4725 7920
+2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 3
+	2 1 1.00 60.00 120.00
+	 8550 2115 8550 5445 6840 5445
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2475 3465 2475 3870
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3015 4005 3600 4005
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 2025 1350 2025 1080 990 1080 990 1350 2025 1350
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 1485 1350 1485 1755
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 2025 2025 2025 1755 990 1755 990 2025 2025 2025
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	2 1 1.00 60.00 120.00
+	 1485 2025 1485 6480 6075 6480 6075 6750
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 7875 6030 6255 6030
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 4365 5400 5490 5400
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 3600 4275 2520 4275
+4 0 0 50 -1 0 10 0.0000 4 105 345 2565 4995 NON\001
+4 0 0 50 -1 0 10 0.0000 4 105 285 3195 4545 OUI\001
+4 0 0 50 -1 0 10 0.0000 4 105 285 5400 6885 OUI\001
+4 0 0 50 -1 0 10 0.0000 4 105 345 6840 6885 NON\001
+4 0 0 50 -1 0 10 0.0000 4 150 1410 6660 2340 apply missing_outputs\001
+4 0 0 50 -1 0 10 0.0000 4 105 345 2070 1170 NON\001
+4 0 0 50 -1 0 10 0.0000 4 105 345 2070 1845 NON\001
+4 0 0 50 -1 0 10 0.0000 4 105 765 6345 2880 call <- None\001
+4 0 0 50 -1 0 10 0.0000 4 105 285 1575 1530 OUI\001
+4 1 0 50 -1 0 10 0.0000 4 135 735 1485 1260 call(c) = g ?\001
+4 1 0 50 -1 0 10 0.0000 4 135 990 1485 1935 out(g)~out(c) ?\001
+4 0 0 50 -1 0 10 0.0000 4 105 285 1575 2205 OUI\001
+4 0 0 50 -1 0 10 0.0000 4 150 1095 5895 6255 apply change_call\001
+4 0 0 50 -1 0 10 0.0000 4 105 270 2565 4500 -> g \001
+4 0 0 50 -1 0 10 0.0000 4 150 1095 2160 3645 apply choose_call\001
diff --git a/doc/slicing/conclusion.tex b/doc/slicing/conclusion.tex
new file mode 100644
index 0000000000000000000000000000000000000000..cfa67fd91a7ea5fb75899f741a5f830fab6cf888
--- /dev/null
+++ b/doc/slicing/conclusion.tex
@@ -0,0 +1,20 @@
+\chapter{Conclusion}
+
+En conclusion, on peut dire que les fonctionnalités de base de l'outil
+n'ont pas beaucoup évoluées en 2008, mais il a gagné en robustesse,
+et en précision~: ce qui était le principal objectif de l'année.\\
+
+La principale évolution concerne la gestion des annotations
+que ce soit lors de la production du résultat (que garde-t-on~?)
+que comme critère de \slicing. Ce point est encore en développement
+car il nécessite l'utilisation de fonctions externes au module
+qui n'existent pas encore.\\
+
+La boîte à outils de \slicing peut être considéré comme stable,
+même si elle peut encore évoluer pour répondre à de nouveaux besoins,
+
+L'annexe \ref{sec-projets} présente en particulier
+certains projets qui ont été évoqués,
+et dont certain pourrait éventuellement venir compléter l'outil.
+
+
diff --git a/doc/slicing/exple2.fig b/doc/slicing/exple2.fig
new file mode 100644
index 0000000000000000000000000000000000000000..063357672eaa09c8a334ddef7d364827f57d3708
--- /dev/null
+++ b/doc/slicing/exple2.fig
@@ -0,0 +1,266 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 2700.000 4365.000 2700 4275 2610 4365 2700 4455
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 3960.000 3375 3870 3285 3960 3375 4050
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 3735.000 3375 3645 3285 3735 3375 3825
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 3375.000 3375 3285 3285 3375 3375 3465
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 3150.000 3375 3060 3285 3150 3375 3240
+5 1 0 1 0 5 20 -1 20 0.000 0 1 0 0 3375.000 2700.000 3375 2610 3285 2700 3375 2790
+5 1 0 1 0 2 21 -1 20 0.000 0 0 0 0 3375.000 3150.000 3375 3060 3465 3150 3375 3240
+5 1 0 1 0 2 21 -1 20 0.000 0 0 0 0 3375.000 2700.000 3375 2610 3465 2700 3375 2790
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 2925.000 3150.000 2925 3060 3015 3150 2925 3240
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 2925.000 2700.000 2925 2610 3015 2700 2925 2790
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 3825.000 3735.000 3825 3645 3915 3735 3825 3825
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 3825.000 2700.000 3825 2610 3915 2700 3825 2790
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 3375.000 3735.000 3375 3645 3465 3735 3375 3825
+5 1 0 1 0 2 22 -1 20 0.000 0 0 0 0 3375.000 3375.000 3375 3285 3465 3375 3375 3465
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 2925.000 3150.000 2925 3060 2835 3150 2925 3240
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 3600.000 3735.000 3600 3645 3510 3735 3600 3825
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 3600.000 2700.000 3600 2610 3510 2700 3600 2790
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 3150.000 3150.000 3150 3060 3060 3150 3150 3240
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 3150.000 2700.000 3150 2610 3060 2700 3150 2790
+5 1 0 1 0 5 14 -1 20 0.000 0 1 0 0 2925.000 2700.000 2925 2610 2835 2700 2925 2790
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 675.000 3150.000 675 3060 585 3150 675 3240
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 900.000 3150.000 900 3060 810 3150 900 3240
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 1350.000 3150.000 1350 3060 1260 3150 1350 3240
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 1350.000 2700.000 1350 2610 1260 2700 1350 2790
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 900.000 2700.000 900 2610 810 2700 900 2790
+5 1 0 1 0 5 13 -1 20 0.000 0 1 0 0 675.000 2700.000 675 2610 585 2700 675 2790
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 2925.000 3150.000 2925 3060 2835 3150 2925 3240
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 2925.000 2700.000 2925 2610 2835 2700 2925 2790
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 3375.000 3735.000 3375 3645 3285 3735 3375 3825
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 3375.000 3375.000 3375 3285 3285 3375 3375 3465
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 3375.000 3150.000 3375 3060 3285 3150 3375 3240
+5 1 0 1 0 5 41 -1 20 0.000 0 1 0 0 3375.000 2700.000 3375 2610 3285 2700 3375 2790
+5 1 0 1 0 2 42 -1 20 0.000 0 0 0 0 3825.000 3735.000 3825 3645 3915 3735 3825 3825
+5 1 0 1 0 2 42 -1 20 0.000 0 0 0 0 3375.000 3150.000 3375 3060 3465 3150 3375 3240
+5 1 0 1 0 2 42 -1 20 0.000 0 0 0 0 3825.000 2700.000 3825 2610 3915 2700 3825 2790
+5 1 0 1 0 2 42 -1 20 0.000 0 0 0 0 3375.000 2700.000 3375 2610 3465 2700 3375 2790
+5 1 0 1 0 5 43 -1 20 0.000 0 1 0 0 675.000 3150.000 675 3060 585 3150 675 3240
+5 1 0 1 0 5 43 -1 20 0.000 0 1 0 0 1125.000 3150.000 1125 3060 1035 3150 1125 3240
+5 1 0 1 0 2 43 -1 20 0.000 0 0 0 0 1125.000 3150.000 1125 3060 1215 3150 1125 3240
+5 1 0 1 0 2 43 -1 20 0.000 0 0 0 0 1575.000 3150.000 1575 3060 1665 3150 1575 3240
+5 1 0 1 0 2 43 -1 20 0.000 0 0 0 0 1575.000 2700.000 1575 2610 1665 2700 1575 2790
+5 1 0 1 0 2 43 -1 20 0.000 0 0 0 0 1125.000 2700.000 1125 2610 1215 2700 1125 2790
+5 1 0 1 0 5 43 -1 20 0.000 0 1 0 0 1125.000 2700.000 1125 2610 1035 2700 1125 2790
+5 1 0 1 0 5 43 -1 20 0.000 0 1 0 0 675.000 2700.000 675 2610 585 2700 675 2790
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 3600.000 3735.000 3600 3645 3510 3735 3600 3825
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 3600.000 2700.000 3600 2610 3510 2700 3600 2790
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 3150.000 3150.000 3150 3060 3060 3150 3150 3240
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 3150.000 2700.000 3150 2610 3060 2700 3150 2790
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 900.000 3150.000 900 3060 810 3150 900 3240
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 1350.000 3150.000 1350 3060 1260 3150 1350 3240
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 900.000 2700.000 900 2610 810 2700 900 2790
+5 1 0 1 0 5 31 -1 20 0.000 0 1 0 0 1350.000 2700.000 1350 2610 1260 2700 1350 2790
+5 1 0 1 0 5 51 -1 20 0.000 0 1 0 0 4725.000 3510.000 4725 3420 4635 3510 4725 3600
+5 1 0 1 0 1 51 -1 20 0.000 0 0 0 0 4725.000 3825.000 4725 3735 4815 3825 4725 3915
+5 1 0 1 0 2 51 -1 20 0.000 0 0 0 0 4725.000 4185.000 4725 4095 4815 4185 4725 4275
+5 1 0 1 0 5 23 -1 20 0.000 0 1 0 0 1125.000 3150.000 1125 3060 1035 3150 1125 3240
+5 1 0 1 0 5 23 -1 20 0.000 0 1 0 0 1125.000 2700.000 1125 2610 1035 2700 1125 2790
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 1125.000 2700.000 1125 2610 1215 2700 1125 2790
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 1575.000 2700.000 1575 2610 1665 2700 1575 2790
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 1575.000 3150.000 1575 3060 1665 3150 1575 3240
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 675.000 2700.000 675 2610 765 2700 675 2790
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 675.000 3150.000 675 3060 765 3150 675 3240
+5 1 0 1 0 2 23 -1 20 0.000 0 0 0 0 1125.000 3150.000 1125 3060 1215 3150 1125 3240
+6 4500 2565 6165 3285
+5 1 0 1 0 5 15 -1 20 0.000 0 1 0 0 5400.000 3150.000 5400 3060 5310 3150 5400 3240
+5 1 0 1 0 5 15 -1 20 0.000 0 1 0 0 5400.000 2700.000 5400 2610 5310 2700 5400 2790
+5 1 0 1 0 5 15 -1 20 0.000 0 1 0 0 4950.000 2700.000 4950 2610 4860 2700 4950 2790
+5 1 0 1 0 5 40 -1 20 0.000 0 1 0 0 4950.000 3150.000 4950 3060 4860 3150 4950 3240
+5 1 0 1 0 5 40 -1 20 0.000 0 1 0 0 4950.000 2700.000 4950 2610 4860 2700 4950 2790
+5 1 0 1 0 1 42 -1 20 0.000 0 0 0 0 5850.000 3150.000 5850 3060 5940 3150 5850 3240
+5 1 0 1 0 1 42 -1 20 0.000 0 0 0 0 5850.000 2700.000 5850 2610 5940 2700 5850 2790
+5 1 0 1 0 5 30 -1 20 0.000 0 1 0 0 5400.000 3150.000 5400 3060 5310 3150 5400 3240
+5 1 0 1 0 5 30 -1 20 0.000 0 1 0 0 5400.000 2700.000 5400 2610 5310 2700 5400 2790
+6 4500 2565 6165 3285
+5 1 0 1 0 1 21 -1 20 0.000 0 0 0 0 5850.000 3150.000 5850 3060 5940 3150 5850 3240
+5 1 0 1 0 1 21 -1 20 0.000 0 0 0 0 5850.000 2700.000 5850 2610 5940 2700 5850 2790
+5 1 0 1 0 1 22 -1 20 0.000 0 0 0 0 4950.000 3150.000 4950 3060 5040 3150 4950 3240
+5 1 0 1 0 1 22 -1 20 0.000 0 0 0 0 4950.000 2700.000 4950 2610 5040 2700 4950 2790
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5400 2700 90 90 5400 2700 5490 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5400 3150 90 90 5400 3150 5490 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4950 2700 90 90 4950 2700 5040 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4950 3150 90 90 4950 3150 5040 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5850 3150 90 90 5850 3150 5940 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 5850 2700 90 90 5850 2700 5940 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4770 2700 4500 3060
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4500 2700 6165 2700 6165 3150 4500 3150 4500 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 4950 2790 4950 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 5400 2790 5400 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 5850 2790 5850 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 5015 2768 5375 3083
+4 1 0 50 -1 0 10 0.0000 4 105 120 5130 3060 X\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 5580 3060 Y\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 6030 3060 g\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 4590 2835 g\001
+4 1 0 50 -1 0 10 0.0000 4 75 75 4815 2655 u\001
+4 1 0 50 -1 0 10 0.0000 4 75 75 5265 2655 v\001
+4 1 0 50 -1 0 10 0.0000 4 75 120 5715 2655 w\001
+-6
+-6
+6 540 2565 1710 2835
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 675 2700 90 90 675 2700 765 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 900 2700 90 90 900 2700 990 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1125 2700 90 90 1125 2700 1215 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1350 2700 90 90 1350 2700 1440 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1575 2700 90 90 1575 2700 1665 2700
+-6
+6 540 3015 1710 3285
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 675 3150 90 90 675 3150 765 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 900 3150 90 90 900 3150 990 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1125 3150 90 90 1125 3150 1215 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1350 3150 90 90 1350 3150 1440 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1575 3150 90 90 1575 3150 1665 3150
+-6
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3150 3150 90 90 3150 3150 3240 3150
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3150 3375 90 90 3150 3375 3240 3375
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 3735 90 90 3600 3735 3690 3735
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3825 3960 90 90 3825 3960 3915 3960
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 3960 90 90 3600 3960 3690 3960
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 2700 90 90 3600 2700 3690 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3825 2700 90 90 3825 2700 3915 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 2700 90 90 3375 2700 3465 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3150 2700 90 90 3150 2700 3240 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2925 2700 90 90 2925 2700 3015 2700
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3365 3730 90 90 3365 3730 3455 3730
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3815 3730 90 90 3815 3730 3905 3730
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2935 3370 90 90 2935 3370 3025 3370
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3385 3370 90 90 3385 3370 3475 3370
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3385 3145 90 90 3385 3145 3475 3145
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2935 3145 90 90 2935 3145 3025 3145
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3150 4365 90 90 3150 4365 3240 4365
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 4365 90 90 3600 4365 3690 4365
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 4050 4365 90 90 4050 4365 4140 4365
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2700 4365 90 90 2700 4365 2790 4365
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 3960 90 90 3375 3960 3465 3960
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1125 3465 90 90 1125 3465 1215 3465
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1350 3465 90 90 1350 3465 1440 3465
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 1575 3465 90 90 1575 3465 1665 3465
+1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 900 3465 90 90 900 3465 990 3465
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 2483 2700 2258 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 2925 2790 2925 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3150 2790 3150 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3375 2790 3375 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3375 3465 3375 3645
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 75.00
+	 3375 4050 3375 4095 3150 4095 3150 4275
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3600 4050 3600 4275
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 75.00
+	 3825 4050 3825 4095 4050 4095 4050 4275
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2475 3150 2700 3150 2700 3375 2475 3375 2475 3150
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2700 3150 3510 3150 3510 3375 2700 3375 2700 3150
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2925 3735 3150 3735 3150 3960 2925 3960 2925 3735
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3600 2790 3600 3645
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 3825 2790 3825 3645
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3150 3735 3960 3735 3960 3960 3150 3960 3150 3735
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 75.00
+	 3150 4095 2925 4095 2700 4095 2700 4275
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2250 2700 4275 2700 4275 4365 2250 4365 2250 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1575 3240 1575 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1350 3240 1350 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1125 3240 1125 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1125 3240 900 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 900 3240 900 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 675 3240 900 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 900 3240 1125 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 675 3240 1125 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 675 2790 675 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 900 2790 900 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 1125 2790 1125 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 1350 2790 1350 3060
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 75.00
+	 1575 2790 1575 3060
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 540 3150 1710 3150 1710 3465 540 3465 540 3150
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 540 3150 360 3150 360 3465 540 3465 540 3150
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 0 2700 2025 2700 2025 3825 0 3825 0 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 495 2700 0 3195
+4 0 0 50 -1 0 12 0.0000 4 135 60 2295 2835 f\001
+4 1 0 50 -1 0 10 0.0000 4 105 135 2610 3105 c1\001
+4 1 0 50 -1 0 10 0.0000 4 105 135 3060 3690 c2\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 3240 4275 X\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 3690 4275 Y\001
+4 1 0 50 -1 0 10 0.0000 4 105 60 2790 4275 f\001
+4 1 0 50 -1 0 10 0.0000 4 105 90 4140 4275 Z\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 2565 3285 g\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 3060 3870 g\001
+4 1 0 50 -1 0 10 0.0000 4 75 60 2925 2565 a\001
+4 1 0 50 -1 0 10 0.0000 4 105 75 3150 2565 b\001
+4 1 0 50 -1 0 10 0.0000 4 75 60 3375 2565 c\001
+4 1 0 50 -1 0 12 0.0000 4 135 90 3600 2565 d\001
+4 1 0 50 -1 0 12 0.0000 4 90 90 3825 2565 e\001
+4 0 0 51 -1 0 10 0.0000 4 135 990 4950 3555 marque m en m1\001
+4 0 0 51 -1 0 10 0.0000 4 135 990 4950 3870 marque m en m2\001
+4 0 0 51 -1 0 10 0.0000 4 135 1185 4950 4230 marque spare en m2\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 1125 3690 X\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 1350 3690 Y\001
+4 1 0 50 -1 0 10 0.0000 4 105 90 1575 3690 Z\001
+4 1 0 50 -1 0 10 0.0000 4 105 120 900 3690 N\001
+4 1 0 50 -1 0 12 0.0000 4 135 60 675 2565 I\001
+4 1 0 50 -1 0 12 0.0000 4 135 75 900 2565 J\001
+4 1 0 50 -1 0 12 0.0000 4 135 135 1125 2565 K\001
+4 1 0 50 -1 0 12 0.0000 4 135 105 1350 2565 L\001
+4 1 0 50 -1 0 12 0.0000 4 135 165 1575 2565 M\001
+4 1 0 50 -1 0 12 0.0000 4 135 60 450 3375 f\001
+4 1 0 50 -1 0 12 0.7854 4 135 360 225 2925 main\001
diff --git a/doc/slicing/exple2v0.pdf b/doc/slicing/exple2v0.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..644513d26120a090ea73a3b5b14d52af292d22e0
Binary files /dev/null and b/doc/slicing/exple2v0.pdf differ
diff --git a/doc/slicing/exple2v1-1.pdf b/doc/slicing/exple2v1-1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..7d821b6a59ed2869753f01ea0c03d2689162cc79
Binary files /dev/null and b/doc/slicing/exple2v1-1.pdf differ
diff --git a/doc/slicing/exple2v1-2.pdf b/doc/slicing/exple2v1-2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..84850912b8f1b5f18a604e8aa30b6f562d5691cc
Binary files /dev/null and b/doc/slicing/exple2v1-2.pdf differ
diff --git a/doc/slicing/exple2v1-3.pdf b/doc/slicing/exple2v1-3.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..aad6063f1b39f90136293ba1dfe76318f0255186
Binary files /dev/null and b/doc/slicing/exple2v1-3.pdf differ
diff --git a/doc/slicing/exple2v1-4.pdf b/doc/slicing/exple2v1-4.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..9d665443e13baeaaae0d12cfe356d749a6d5508c
Binary files /dev/null and b/doc/slicing/exple2v1-4.pdf differ
diff --git a/doc/slicing/exple2v2-1.pdf b/doc/slicing/exple2v2-1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..218a7e55a1e5d53d55a89eee9fd984ba16a9781f
Binary files /dev/null and b/doc/slicing/exple2v2-1.pdf differ
diff --git a/doc/slicing/exple2v2-2.pdf b/doc/slicing/exple2v2-2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4593112e2f5dc3c0af633c0a05c89400c5d4cfb1
Binary files /dev/null and b/doc/slicing/exple2v2-2.pdf differ
diff --git a/doc/slicing/exple2v2-3.pdf b/doc/slicing/exple2v2-3.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f0b2b16294ac04bd6c2cc15493bb05a2c54fd345
Binary files /dev/null and b/doc/slicing/exple2v2-3.pdf differ
diff --git a/doc/slicing/exple2v3-1.pdf b/doc/slicing/exple2v3-1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f0a389d3b848397281e7ee5088d01d2e8d234b87
Binary files /dev/null and b/doc/slicing/exple2v3-1.pdf differ
diff --git a/doc/slicing/exple2v3-2.pdf b/doc/slicing/exple2v3-2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..decf18a4c15a76cc5ffe6fc9df111e82a9a2ee69
Binary files /dev/null and b/doc/slicing/exple2v3-2.pdf differ
diff --git a/doc/slicing/exple2v3-3.pdf b/doc/slicing/exple2v3-3.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3fe63e2bd280ed94ac8a627997c631b300fd8811
Binary files /dev/null and b/doc/slicing/exple2v3-3.pdf differ
diff --git a/doc/slicing/exple2v3-4.pdf b/doc/slicing/exple2v3-4.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..afc8e61196c714677a7d02079d33a1aae3627730
Binary files /dev/null and b/doc/slicing/exple2v3-4.pdf differ
diff --git a/doc/slicing/exple2v4-1.pdf b/doc/slicing/exple2v4-1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..253178920e4656ccc7817d6f9cfb626885e38fbc
Binary files /dev/null and b/doc/slicing/exple2v4-1.pdf differ
diff --git a/doc/slicing/exple2v4-2.pdf b/doc/slicing/exple2v4-2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..92ffac9208c07267c158b6552b64f44b71a08ce0
Binary files /dev/null and b/doc/slicing/exple2v4-2.pdf differ
diff --git a/doc/slicing/fonction.tex b/doc/slicing/fonction.tex
new file mode 100644
index 0000000000000000000000000000000000000000..faa7a9ae02c1e8d06a5b5906b19ea195086e4601
--- /dev/null
+++ b/doc/slicing/fonction.tex
@@ -0,0 +1,223 @@
+\chapter{Réduction d'une fonction}\label{sec-filtrage-fct}
+
+\section{Fonction spécialisée}
+
+On appelle \indextxtdef{fonction spécialisée}{fonction!spécialisée}
+la réduction d'une fonction source obtenue suite à l'application d'une ou
+plusieurs actions. Ce chapitre expose comment est représentée
+cette réduction, et comment elle est calculée.\\
+
+La réduction d'une fonction doit distinguer les instructions visibles
+de celles qui ne le sont pas.
+Une information booléenne, attachée à chaque instruction,
+devrait donc suffire à
+indiquer si celle-ci appartient ou non à la fonction spécialisée, mais
+la mise en place d'un outil de navigation incite à enrichir les informations
+calculées. On décide donc d'avoir
+une annotation plus précise du flot de données, que l'on appelle
+{\bf marquage},
+pour préciser la raison de la présence ou de l'absence d'un certain élément.
+Cela peut permettre de visualiser l'impact des instructions d'une
+fonction sur un point de programme (contrôle, données utilisées, déclaration
+nécessaires, etc.)\\
+
+Le document qui présente le calcul de PDG expose les éléments qui composent le
+graphe de dépendance. La plupart correspondent à une instruction.
+Quelques exceptions néanmoins~:
+\begin{itemize}
+\item les éléments représentant les entrées/sorties d'une fonction
+  ne sont pas associés à une instruction,
+\item le label d'une instruction est représenté par un élément en plus de ceux
+qui représentent l'instruction,
+\item un appel de fonction est représenté par plusieurs éléments.\\
+\end{itemize}
+
+Nous ne nous considérons pas, dans un premier temps,
+la spécialisation des fonctions appelées qui sera étudiée
+dans le chapitre \ref{sec-interproc}. 
+L'appel de fonction est donc simplement vu pour l'instant comme
+une instruction représentée par plusieurs éléments.
+
+
+Par contre, nous distinguons la visibilité d'un label de celle de l'instruction
+associée. Dans la suite, le label sera souvent considéré comme une instruction à
+part entière.\\
+
+On peut donc dire que
+la fonction spécialisée contient un \indexdef{marquage}
+qui fait correspondre une \indexdef{marque} 
+aux instructions et labels d'une fonction.
+
+\section{Marquage}
+
+On calcule le marquage d'une fonction en réponse à une requête.
+Celle-ci se traduit en général en terme d'éléments du PDG.\\
+
+Initialement, le marquage
+peut contenir le résultat de précédents calculs ou être
+nouvellement créé, c'est-à-dire vide.\\
+
+Le calcul élémentaire est très simple~:
+il consiste à parcourir le PDG,
+à calculer la marque pour chaque élément,
+et à l'associer à l'instruction ou au label correspondant
+en la combinant avec l'éventuelle valeur précédente.\\
+
+Une idée de l'algorithme appliqué est présenté en \ref{sec-algo-mark-fct}.
+
+
+\subsection{Passage à un point de programme}
+
+Une première requête consiste à marquer les éléments du flot
+qui servent à déterminer ce qui permet de passer
+à un point de programme.\\
+
+La marque propagée s'appelle
+\indextxtdef{marque de contrôle}{marque!de contrôle},
+et se note {\it mC}.
+% , mais on utilise une
+% \indextxtdef{marque de contrôle initiale}{marque!de contrôle initiale}
+% ($mC_0$) pour annoter le point de
+% départ de la recherche.
+% Cela permet de retrouver ce point par la suite, et de ne
+% pas sélectionner l'instruction concernée.\\
+
+Pour faire ce calcul, on propage la marque dans les dépendances de contrôle du
+point choisi, puis récursivement dans toutes les dépendances des points ainsi
+sélectionnés. Cela correspond à marquer  {\it mC} tous les éléments
+de l'ensemble $R_{L0}$.
+
+\begin{exemple}
+\begin{tabular}{l|p{8cm}}
+\begin{tabular}{>{\itshape}c c l}
+mC  && \verb!x = y+1;!\\
+  && \verb!a = 0;!\\
+  && \verb!b = 10;!\\
+  && \verb!...!\\
+mC  && \verb!if (x > 0) {!\\
+  && \verb!...!\\
+  && \verb!L: a += b;!\\
+  && \verb!...!\\
+  && \verb!}!\\
+\end{tabular}
+&
+Il s'agit ici de sélectionner ce qui contrôle le passage au point \verbtt{L}.
+Le test \verb!x>0! est donc marqué {\it mC} ainsi que le calcul de \verbtt{x}
+dont dépend ce test.
+\end{tabular}
+\end{exemple}
+
+\subsection{Valeur d'une donnée}
+
+On peut également demander à sélectionner ce qui permet de calculer une donnée
+à un point de programme.
+On peut par exemple demander à ne garder que ce qui permet de calculer l'une des
+sorties d'une fonction.\\
+
+La première étape consiste à trouver l'élément, ou les éléments,
+correspondant dans le graphe.
+Des éléments particuliers représentent les sorties de la fonction.
+Pour des calculs internes,
+on peut utiliser l'identification d'une affectation pour parler de la donnée
+affectée, ou alors
+il faut disposer de l'état utilisé lors de la construction du graphe.
+On peut alors retrouver les éléments qui ont participé au calcul en un point
+de n'importe quelle
+donnée, du moins lorsque le point considéré se trouve dans sa portée.\\
+
+La marque associée au calcul d'une donnée s'appelle
+\indextxtdef{marque de valeur}{marque!de valeur}
+et se note {\it mV}. Elle sert, comme son nom l'indique,
+à annoter les éléments qui participent au calcul
+de la valeur de la donnée demandée. \\
+
+Les données qui permettent de calculer l'adresse de la case modifiée (partie
+gauche de l'affectation)
+sont annotés par une \indextxtdef{marque d'adresse}{marque!d'adresse} ($mA$).
+Il s'agit par exemple du calcul de l'indice d'un élément de tableau ou d'un
+pointeur.\\
+
+Les éléments
+qui permettent d'atteindre le point de programme sont marqués {\it mC}.
+
+\begin{exemple}
+\begin{tabular}{m{4cm} c | m{8cm}}
+\begin{tabular}{>{\itshape}c c l}
+mCA  && \verb!x = y+1;!\\
+mV  && \verb!b = 10;!\\
+  && \verb!...!\\
+mC  && \verb!if (x > 0) {!\\
+  && \verb!...!\\
+  && \verb!L: t[x] = b;!\\
+  && \verb!...!\\
+  && \verb!}!\\
+\end{tabular}
+&&
+Il s'agit ici de sélectionner ce qui participe au calcul de l'instruction
+située au point \verbtt{L}.
+Le test \verb!x>0! est donc marqué {\it mC} ainsi que le calcul de \verbtt{x}
+dont dépend ce test. La valeur de \verbtt{b} participe au calcul de la partie
+droite et est donc marqué {\it mV}. La partie gauche dépend de
+\verbtt{x} qui doit donc avoir la marque {\it mA}. On voit donc que \verbtt{x}
+cumule deux informations et est donc marqué {\it mCA}.
+\end{tabular}
+\end{exemple}
+
+
+\subsection{Éléments superflus}
+
+On a vu que le marquage est relatif aux instructions,
+et que certaines instructions (appels de fonctions) sont représentées
+par plusieurs éléments du PDG. Si on ne souhaite pas décomposer les
+instructions (ie. spécialiser les appels de fonctions),
+il peut arriver qu'une même instruction corresponde à des éléments
+visibles et d'autres invisibles. Ces derniers, et leurs dépendances,
+sont alors marqués
+\indextxtdef{superflus}{marque!superflu} (marque $mS$).
+Certaines instructions deviennent alors visibles alors qu'elles ne sont pas
+strictement nécessaires au calcul demandé.\\
+
+\begin{exemple}
+\begin{center}
+\begin{tabular}{m{4cm}p{1cm}m{6cm}}
+\begin{verbatim}
+int G;
+int f (int x, int y) {
+  G = x + 1;
+  return y + 2;
+}
+int g (void) {
+  int a = 1;
+  int b = a+1;
+  return f (b, a);
+}
+\end{verbatim}
+&&
+Si l'utilisateur demande à sélectionner ce qui permet de calculer la valeur
+de retour de \verbtt{g}, on n'aurait en fait besoin que de la valeur de \verbtt{a},
+mais comme on ne spécialise pas \verbtt{f}, il faut aussi marquer
+l'instruction qui calcule \verbtt{b}  comme superflue.
+\end{tabular}
+\end{center}
+\end{exemple}
+
+\subsection{Marques}
+
+En résumé, les marques possibles sont les suivantes~:
+\begin{center}
+\begin{tabular}{|>{\itshape}c!{:}l|}
+  \hline
+  mV & marque de valeur \\
+  mC & marque de contrôle \\
+  mA & marque d'adresse \\
+  mS & marque pour un élément superflu\\
+  \hline
+\end{tabular}
+\end{center}
+
+Les marques $mV,mC,mA$ peuvent se superposer lorsqu'un élément participe au
+calcul pour plusieurs raisons. On notera par exemple $mVA$ la marque associée à
+un élément qui participe à la valeur et au calcul d'adresse. Par la suite,
+on appelle marque $mCAV$ toute marque de cette famille.\\
+
+La marque $mS$ est l'élément neutre de la combinaison.
diff --git a/doc/slicing/intercmds.tex b/doc/slicing/intercmds.tex
new file mode 100644
index 0000000000000000000000000000000000000000..90f9b011872dda397cdcabcda0ae73c46db484e8
--- /dev/null
+++ b/doc/slicing/intercmds.tex
@@ -0,0 +1,256 @@
+
+\chapter{Détail des actions} \label{app-actions}
+
+Ce chapitre présente une fiche signalétique pour chaque action du calcul
+interprocédurale présentées au chapitre \ref{sec-interproc}.
+Elle correspondent aux commandes telles qu'elles ont été spécifiées,
+et il peut y avoir quelques différences par rapport à ce qui a été implémenté,
+mais il s'agit de différences mineures (principalement les noms).
+Pour plus de détails, le lecteur est invité à consulter la document du code
+qui sera toujours la plus à jour.\\
+
+\newcommand{\proto}[2]{
+  \section{#1}\labact{#1}{2}
+  \centerline{\textit{#1}(#2)}
+  \bb
+  }
+\newcommand{\precond}{{\bf Précondition}}
+\newcommand{\param}{{\bf Paramètres}}
+\newcommand{\creable}{{\bf Création par l'utilisateur}}
+\newcommand{\modifiable}{{\bf Modifiable par l'utilisateur}}
+\newcommand{\generable}{{\bf Génération automatique}}
+\newcommand{\application}{{\bf Application}}
+\newcommand{\genere}{{\bf Génération}}
+\newcommand{\modifie}{{\bf Modifications}}
+
+Les indications suivantes sont données pour chaque action~:
+\begin{itemize}
+  \item \param~: indique le sens des paramètres de l'action,
+  \item \precond~: indique les conditions éventuelles de création et/ou
+    d'application,
+  \item \creable~: indique si l'utilisateur peut la créer,
+  \item \modifiable~: indique si l'utilisateur peut la modifier lorsqu'elle est
+    dans la liste d'attente,
+  \item \generable~: indique si cette action peut être générée par l'outil,
+    et précise dans quels cas,
+  \item \application~: détaille ce qu'il se passe quand cette action est
+    appliquée,
+  \item \genere~: donne la liste des actions pouvant être générées,
+  \item \modifie~: indique si une spécialisation peut être crée ou modifiée.
+\end{itemize}
+
+\proto{NewSlice}{$f_0$}
+
+\begin{itemize}
+  \item \param~: $f_0$ est la fonction source pour laquelle on souhaite créer
+    une nouvelle spécialisation.
+  \item \precond~: néant.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression).
+  \item \generable~: oui, par \actChooseCall.
+  \item \application~: 
+    crée une nouvelle spécialisation $f_i$, initialement sans aucun marquage
+    (tout invisible).
+  \item \genere~: néant.
+  \item \modifie~: création d'une nouvelle $f_i$.
+\end{itemize}
+
+\proto{AddUserMark}{$f_i, (e,m)$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction dont on veut modifier le marquage,
+    $e$ un élément à marquer, $m$ la marque à lui ajouter.
+    Différentes version de cette action peut être proposée pour faciliter la
+    désignation de $e$ et le choix de la marque $m$.
+  \item \precond~: $f_i$ doit exister et $e$ désigner un élément valide de $f$.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression).
+  \item \generable~: non.
+  \item \application~: ajoute $m$ à la marque $m1$ de $e$ dans $f_i$
+    et propage dans les dépendances.
+  \item \genere~: $\actExamineCalls$.
+  \item \modifie~: modification de $f_i$.
+\end{itemize}
+
+\proto{ExamineCalls}{$f_i$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction dont le marquage a été modifié
+    et pour laquelle il faut vérifier les appels.
+  \item \precond~: $f_i$ doit exister.
+  \item \creable~: non.
+  \item \modifiable~: non.
+  \item \generable~: oui.
+  \item \application~: 
+    vérifie la cohérence du marquage de chaque appel de fonction $c$
+    de \call(f) et également des éventuelles appels à $f_i$.
+  \item \genere~: 
+    $\actChooseCall$ et/ou $\actMissingOutputs$ si le marquage de
+    certains appels de fonction a été modifié, et $\actMissingInputs$ si
+    $f_i$ est appelée et que les entrées de certains appels sont insuffisamment
+    marquées.
+  \item \modifie~: rien.
+\end{itemize}
+
+
+\proto{ChooseCall}{$c, f_i$}
+
+\begin{itemize}
+  \item \param~: appel $c$ dans la fonction spécialisée $f_i$.
+  \item \precond~: néant.
+  \item \creable~: non.
+  \item \modifiable~: oui, elle peut être remplacée par un $\actChangeCall(c,
+    f_i, g_j)$ (voir les conditions de création de cette action).
+  \item \generable~: oui, quand le marquage de $f_i$ est modifié et que 
+    l'appel $c$ devient visible, cette action est générée pour lui
+    attribuer une fonction à appeler.
+  \item \application~: détermine la fonction à appeler en tenant compte du mode
+    de fonctionnement.
+  \item \genere~: \actChangeCall{} et éventuellement \actNewSlice{} et
+    \actAddOutputMarks{}.
+  \item \modifie~: rien.
+\end{itemize}
+
+\proto{ChangeCall}{$c, f_i, g_j$}
+
+\begin{itemize}
+  \item \param~: on considère l'appel $c$ de $f_i$, $g_j$ est la fonction à
+    appeler.
+  \item \precond~: $\Call(f_0)(c)=g_0$ et la signature de sortie de $g_j$
+    doit être compatible avec $\sigc(c, f_i)$.
+  \item \creable~: oui.
+  \item \modifiable~: oui, mais seulement s'il l'a initialement créée.
+  \item \generable~: oui, par un \actChooseCall.
+  \item \application~: $\Call(f_i)(c)=g_j$ et les marques des entrées de $g_j$
+    sont propagées dans $f_i$ ($\actModifCallInputs(c, f_i)$).
+  \item \genere~: l'action \actModifCallInputs{} est directement
+    appliquée, mais elle peut générer d'autres actions (voir
+    \refact{ModifCallInputs}{2}).
+  \item \modifie~: $f_i$.
+\end{itemize}
+
+
+\proto{MissingInputs}{$c, f_i$}
+
+\begin{itemize}
+  \item \param~: 
+    appel $c$ dans la fonction spécialisée $f_i$,
+  \item \precond~: la fonction appelée nécessite plus d'entrées que n'en calcule
+    $f_i$.
+  \item \creable~: 
+    non,
+  \item \modifiable~: 
+    oui, elle peut être remplacée par un $\actChangeCall(c, f_i, g_j)$ (voir les
+    conditions de création de cette action).
+  \item \generable~: 
+    oui, lorsque la fonction $\Call(f_i)(c) = g_j$ a été modifiée, et qu'elle
+    nécessite le marquage d'entrées qui ne le sont pas $\sigc(c,f_i)$.
+  \item \application~: équivalente à \actModifCallInputs{} ou \actChooseCall{}
+    en fonction du mode de fonctionnement.
+  \item \genere~: dépend de l'application (voir ci-dessus).
+  \item \modifie~: dépend de l'application (voir ci-dessus).
+\end{itemize}
+
+
+\proto{ModifCallInputs}{$c, f_i$}
+
+\begin{itemize}
+  \item \param~: appel $c$ dans la fonction spécialisée $f_i$.
+  \item \precond~: $\Call(f_i)(c) = g_j$
+  \item \creable~: non.
+  \item \modifiable~: non.
+  \item \generable~: oui, par l'application de \actMissingInputs{} dans certains
+    modes.
+  \item \application~: propage les marques des entrées de $g_j$ au niveau de
+    l'appel $c$ de $f_i$ et et dans le dépendances.
+  \item \genere~: 
+    $\actChooseCall$ et/ou $\actMissingOutputs$ si le marquage de
+    certains appels de fonction a été modifié, et $\actMissingInputs$ si
+    $f_i$ est appelée et que les entrées de certains appels sont insuffisamment
+    marquées.
+  \item \modifie~: $f_i$.
+\end{itemize}
+
+\proto{MissingOutputs}{$c, f_i$}
+
+\begin{itemize}
+  \item \param~: appel $c$ dans la fonction spécialisée $f_i$
+  \item \precond~: $\Call(f_i)(c) = g_j$
+  \item \creable~: non.
+  \item \modifiable~: oui, elle peut être remplacée par un 
+    $\actChangeCall(c, f_i, g_k)$ 
+    (voir les conditions de création de cette action).
+  \item \generable~: oui, lorsque le marquage de  $c$ dans $f_i$ est modifié,
+    que l'appel est attribué à $g_j$, et que les sorties de $g_j$
+    sont insuffisantes.
+  \item \application~: dépend du mode~:
+    \begin{itemize}
+      \item \actAddOutputMarks{}
+      \item ou \actChooseCall{}
+    \end{itemize}
+  \item \genere~: dépend de l'application (voir ci-dessus).
+  \item \modifie~: dépend de l'application (voir ci-dessus).
+\end{itemize}
+
+\proto{AddOutputMarks}{$f_i, \outsigf$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction dont on veut modifier le marquage,
+     $\outsigf$ indique les marques qui doivent être ajouté aux sorties.
+  \item \precond~: $f_i$ doit exister et $\outsigf$ correspondre à une signature
+    des sorties de $f$.
+  \item \creable~: non.
+  \item \modifiable~: non.
+  \item \generable~: oui, par l'application de \actMissingOutputs.
+  \item \application~: 
+    les marques de $\outsigf$ sont ajoutées aux marques $m2$ des
+    sorties de $f_i$ et propagées.
+  \item \genere~: 
+    \actChooseCall{} et/ou \actMissingOutputs{} si le marquage de
+    certains appels de fonction a été modifié, et \actMissingInputs{} si
+    $f_i$ est appelée et que les entrées de certains appels sont insuffisamment
+    marquées.
+  \item \modifie~: modification de $f_i$.
+\end{itemize}
+
+\proto{CopySlice}{$f_i$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction spécialisée à copier.
+  \item \precond~: $f_i$ doit exister.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression),
+  \item \generable~: non.
+  \item \application~: 
+    crée une nouvelle spécialisation $f_j$ de $f$ dont le marquage et les appels
+    sont identiques à ceux de $f_i$.  Attention, à l'issue de cette action,
+    $f_j$ n'est pas appelée.
+  \item \genere~: non.
+  \item \modifie~: création d'une nouvelle $f_j$.
+\end{itemize}
+
+\proto{Combine}{$f_i, f_j$}
+
+\begin{itemize}
+  \item \param~: $f_i$ et $f_j$ sont les fonctions spécialisées à combiner.
+  \item \precond~: $f_i$ et $f_j$ doivent exister.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression),
+  \item \generable~: non.
+  \item \application~: calcule une nouvelle spécialisation $f_k$
+  \item \genere~: $\actChooseCall$
+  \item \modifie~: création et calcul de $f_k$.
+\end{itemize}
+
+\proto{DeleteSlice}{$f_i$}
+
+\begin{itemize}
+  \item \param~: $f_i$ est la fonction spécialisée à supprimer.
+  \item \precond~: $f_i$ ne doit pas être appelée.
+  \item \creable~: oui.
+  \item \modifiable~: oui (suppression).
+  \item \generable~: non.
+  \item \application~: $f_i$ est supprimée.
+  \item \genere~: néant.
+  \item \modifie~: $f_i$ est supprimée.
+\end{itemize}
diff --git a/doc/slicing/interexples.tex b/doc/slicing/interexples.tex
new file mode 100644
index 0000000000000000000000000000000000000000..20c59843be629e2d487c84fdfb95b6f1bfbc875d
--- /dev/null
+++ b/doc/slicing/interexples.tex
@@ -0,0 +1,206 @@
+
+\chapter{Exemple de marquage interprocédural}
+
+Cette partie présente comment les actions élémentaires précédemment présentées
+peuvent être utilisées pour répondre à des requêtes utilisateur de plus haut
+niveau. 
+
+
+\section{Présentation de l'exemple}
+
+Nous allons voir différents exemple de marquage de l'exemple ci-dessous.
+Dans tous les cas, on considère que l'utilisateur souhaite n'avoir qu'une
+spécialisation par fonction source dans le résultat, et qu'il demande
+systématiquement la propagation de son marquage aux appelants.
+\bb
+
+Pour simplifier la présentation,
+comme on ne s'intéresse ici qu'à la propagation interprocédurale,
+on n'utilise qu'une marque élémentaire $m$ quelconque qui rend un élément
+visible et la marque \spare{} déjà mentionnée.
+
+\noindent\begin{tabular}{p{4cm}p{4.5cm}p{5cm}}
+\begin{verbatim}
+int X, Y;
+int g (int u, int v, 
+       int w) {
+  lg1: X = u;
+  lg2: Y = u + v;
+  return w;
+  }
+\end{verbatim}
+&
+\begin{verbatim}
+int Z;
+int f (int a, int b, 
+       int c, int d, 
+       int e) {
+  int r;
+  lf1: r = g (a, b, c);
+  lf2: Z = g (r, d, e);
+  return X;
+  }
+\end{verbatim}
+&
+\begin{verbatim}
+int I, J, K, L, M, N;
+int main () {
+  lm1: /* ... */
+  lm2: N = f (I, J, K, L, M);
+  lm3: /* ... */
+  }
+\end{verbatim}
+\end{tabular}
+
+\bb\centerline{\uneimage{exple2v0}}\bb
+
+La légende indique comment sont représentées les marques sur les figures
+suivantes.
+
+\section{Cas 1}
+
+Supposons tout d'abord que l'utilisateur veuille sélectionner la sortie 0
+de $f$, et voyons comment se déroule le calcul.\bb
+
+On a vu en \S\ref{sec-propagate-to-calls} que cette requête de l'utilisateur se
+traduit par la séquence d'actions élémentaires suivantes~:
+\begin{itemize}
+  \item $f_1 = \actNewSlice (f_0)$,
+  \item $\actAddOutputMarks(f_1, (out_0, m))$
+  \item ${\mathit main}_1 = \actNewSlice ({\mathit main}_0)$,
+  \item $\actChangeCall(c, {\mathit main}_1, f_1)$.
+\end{itemize}
+
+On calcule tout d'abord le marquage de $f_1$ par simple propagation~:
+
+\bb{\centerline{\uneimage{exple2v1-1}}}\bb
+
+Puis, la seconde action
+génère $\actChooseCall(c_1, f_1)$ et $\actChooseCall(c_2, f_1)$.
+
+A l'application de la première de ces nouvelles actions,
+comme il n'y a pas encore de spécialisation pour $g$, 
+on génère~:
+
+\begin{itemize}
+  \item $g_1 = \actNewSlice (g_0)$,
+  \item $\actAddOutputMarks(g_1, (out_0, m))$
+  \item $\actChangeCall(c_1, f_1, g_1)$
+\end{itemize}
+
+A l'issue de la construction de $g_1$, l'entrée $w$ a une marque $m_2$.
+L'application du \actChangeCall{}
+va donc déclencher un $\actModifCallInputs(c_1, f_1)$ qui va conduire à marquer
+l'entrée $c$ de $f_1$ comme $\spare$ (en plus de $m$ en $m_1$).
+
+\bb{\centerline{\uneimage{exple2v1-2}}}\bb
+
+L'application de $\actChooseCall(c_2, f_1)$ produit~:
+\begin{itemize}
+  \item $\actAddOutputMarks(g_1, (out_X, m))$ puisqu'on a choisi de n'avoir
+    qu'une spécialisation par fonction source,
+  \item et $\actChangeCall(c_2, f_1, g_1)$.
+\end{itemize}
+
+Comme $g_1$ est appelée en $c_1$, 
+la modification de son marquage conduit à générer $\actMissingInputs(c_1, f_1)$,
+qui, vues les options, est directement traduit par 
+$\actModifCallInputs(c_1, f_1)$.
+
+Puis, le $\actChangeCall{}$ va déclencher $\actModifCallInputs(c_2, f_1)$
+qui va marquer $e$ comme $\spare$.
+
+\bb{\centerline{\uneimage{exple2v1-3}}}\bb
+
+Finalement, il ne reste plus qu'à appliquer $\actChangeCall(c, {\mathit main}_1,
+f_1)$ qui conduit à appliquer $\actModifCallInputs(c, {\mathit main}_1)$
+et donc à propager le marquage de $f_1$ dans ${\mathit main}_1$.
+
+\bb{\centerline{\uneimage{exple2v1-4}}}
+
+
+\section{Cas 2}
+
+A partir du résultat du cas 1, l'utilisateur souhaite sélectionner le calcul de
+$Y$ dans $g_1$. \bb
+
+$\actAddUserMark(g_1, (out_Y, m))$ propage le marquage en $m_1$ à l'entrée $v$
+de $g_1$ ($u$ est déjà marquée).
+
+\bb{\centerline{\uneimage{exple2v2-1}}}\bb
+
+Puis comme $g_1$ est appelée, et qu'il manque des marques, deux actions
+$\actMissingInputs{}$ sont générées. Les options indiquent qu'elles doivent être
+traduites en $\actModifCallInputs(c_1, f_1)$ et $\actModifCallInputs(c_2, f_1)$.
+Ce qui conduit à marquer en $m_1$ les entrées $a, b, d$ de $f_1$.
+
+\bb{\centerline{\uneimage{exple2v2-2}}}\bb
+
+De même, la propagation va être effectuée dans ${\mathit main}_1$
+par l'application de $\actModifCallInputs(c, {\mathit main}_1)$.
+
+\bb{\centerline{\uneimage{exple2v2-3}}}\bb
+
+
+\section{Cas 3}
+
+Dans une nouvelle étude, l'utilisateur souhaite sélectionner le calcul de $X$
+dans $g$.
+\bb
+
+Comme dans le cas 1, cette requête se traduit par la création d'une fonction
+spécialisée $g_1$ et la propagation de son marquage à tous ses appels~:
+\begin{itemize}
+  \item $g_1 = \actNewSlice (g_0)$,
+  \item $\actAddOutputMarks(g_1, (out_X, m))$
+  \item $f_1 = \actNewSlice (f_0)$,
+  \item $\actChangeCall(c_1, f_1, g_1)$.
+  \item $\actChangeCall(c_2, f_1, g_1)$.
+  \item ${\mathit main}_1 = \actNewSlice ({\mathit main}_0)$,
+  \item $\actChangeCall(c, {\mathit main}_1, f_1)$.
+\end{itemize}
+
+On calcule tout d'abord le marquage de $g_1$~:
+
+\bb{\centerline{\uneimage{exple2v3-1}}}\bb
+
+Puis, les deux \actChangeCall{} dans $f_1$ conduisent à propager $m_1$~:
+
+\bb{\centerline{\uneimage{exple2v3-2}}}\bb
+
+La seconde propagation (lors de la modification de $c_2$)
+déclenche $\actMissingOutputs(c_1, f_1)$
+qui, au vue des options, se transforme en $\actAddOutputMarks(g_1,
+\outsigc(c_1))$. Ceci conduit à marquer $m_2$ la sortie 0 de $g_1$.
+Les $\actMissingInputs$ générés se transforme en $\actModifCallInputs(c_1, f_1)$
+et $\actModifCallInputs(c_2, f_1)$, qui propage \spare{} aux entrées $c$ et $e$ de
+$f_1$.
+
+\bb{\centerline{\uneimage{exple2v3-3}}}\bb
+
+Enfin, le $\actChangeCall(c, {\mathit main}_1, f_1)$ propage le marquage de
+$f_1$ dans ${\mathit main}_1$. On remarque que même si ce changement avait été
+effectué plus tôt, la propagation du marquage aurait été effectué grâce à des
+$\actMissingInputs$.
+
+\bb{\centerline{\uneimage{exple2v3-4}}}\bb
+
+
+\section{Cas 4}
+
+A partir du cas 3, l'utilisateur souhaite ajouter la sélection du calcul de $Y$
+dans $g_1$.\bb
+
+$\actAddUserMark(g_1, (out_Y, m))$ conduit à marquer $Y$ en $m_1$,
+puis, par propagation, $v$ en $m_1$ également~:
+
+\bb{\centerline{\uneimage{exple2v4-1}}}\bb
+
+Des actions $\actMissingInputs$ transformée en $\actModifCallInputs$ propage
+$m_1$ aux entrées $b$ et $d$ de $f_1$, puis aux entrées $J$ et $L$ de ${\mathit
+main}_1$.
+
+\bb{\centerline{\uneimage{exple2v4-2}}}\bb
+
+
+
diff --git a/doc/slicing/interproc.tex b/doc/slicing/interproc.tex
new file mode 100644
index 0000000000000000000000000000000000000000..2d5cb46481f06d5782abc08a711d743910bce9da
--- /dev/null
+++ b/doc/slicing/interproc.tex
@@ -0,0 +1,198 @@
+\newcommand{\bb}{\bigskip}
+
+\newcommand{\spare}{\ensuremath{\mathit{Spare}}}
+\newcommand{\sigc}{\ensuremath{\mathit{sig_c}}}
+\newcommand{\insigc}{\ensuremath{\mathit{inSig_c}}}
+\newcommand{\outsigc}{\ensuremath{\mathit{outSig_c}}}
+\newcommand{\sigf}{\ensuremath{\mathit{sig_f}}}
+\newcommand{\insigf}{\ensuremath{\mathit{inSig_f}}}
+\newcommand{\outsigf}{\ensuremath{\mathit{outSig_f}}}
+\newcommand{\sig}{\ensuremath{\mathit{sig}}}
+\newcommand{\true}{\ensuremath{\mathit{true}}}
+\newcommand{\false}{\ensuremath{\mathit{false}}}
+ 
+\newcommand{\imply}{\Rightarrow}
+\newcommand{\lt}{<}
+ 
+\newcommand{\inout}{\ensuremath{\mathit{InOut}}}
+\newcommand{\call}{\ensuremath{\mathit{call}}}
+\newcommand{\length}{\ensuremath{\mathit{length}}}
+\newcommand{\none}{\ensuremath{\mathit{None}}}
+ 
+ 
+\newcommand{\topm}{{\top}_m}
+\newcommand{\tops}{{\top}_s}
+\newcommand{\topc}{{\top}_c}
+\newcommand{\botm}{{\bot}_m}
+\newcommand{\bots}{{\bot}_s}
+\newcommand{\botc}{{\bot}_c}
+ 
+\newcommand{\option}[1]{\motcle{#1}{Options}{opt}{\textbf{#1}}}
+
+\newcommand{\defaction}[1]{\motcle{#1}{Actions}{act}}
+\newcommand{\labact}[2]{\index{Actions!#1}\label{sec-#1-#2}}
+\newcommand{\refact}[2]{\S\ref{sec-#1-#2}}
+%===============================================================================
+
+\chapter{Réduction interprocédurale}\label{sec-interproc}
+
+\section{Objectif}
+
+Le filtrage élémentaire vu précédemment n'est qu'un préalable à la réduction
+d'une application car lorsqu'une fonction a été réduite, il faut également
+traiter ses appels pour rester cohérent, et on peut aussi vouloir réduire les
+fonctions appelées.
+
+\subsection{Spécification du problème}
+
+Pour étendre le marquage intraprocédural
+déjà effectué à un calcul interprocédural,
+une première approche serait
+de propager le marquage à travers les appels de fonctions, mais cela conduit
+soit à un trop grand nombre de fonctions spécialisées si l'on distingue tous les
+appels, soit à trop de perte de précision si l'on en fait l'union.
+Ce problème est exposé plus en détail en \S\ref{sec-compat-sig}.
+L'objectif est donc d'obtenir un compromis acceptable et paramétrable.\\
+
+Dès lors que l'on décide de pouvoir avoir plusieurs spécialisations d'une même
+fonction source dans l'application finale,
+le mécanisme permettant d'obtenir un résultat cohérent devient relativement
+complexe. Par exemple,
+lorsqu'on s'intéresse au calcul de certaines données $d$ dans une fonction $g$, 
+on a vu au chapitre précédent comment calculer le marquage des éléments du PDG
+pour pouvoir réduire $g$. 
+Si $g$ appelle $h$, et que toutes les sorties de $h$ ne sont pas nécessaires au
+calcul de $d$ dans $g$, on peut aussi vouloir demander la spécialisation de $h$.
+Par ailleurs, si $g$ est appelée, 
+il est possible de remplacer un ou plusieurs appels par un appel
+à $g_1$. Ce traitement doit être appliqué récursivement puisque dès que l'on
+modifie le marquage d'une fonction, on peut avoir besoin également de modifier
+les fonctions appelées et appelantes.\\
+
+On décide donc de décomposer un traitement complet en différentes
+actions élémentaires parfaitement définies. Elles pourront ensuite être
+combinées automatiquement en fonction d'options de plus haut niveau.
+
+\subsection{Organisation des résultats}
+
+Le processus complet consiste à appliquer successivement 
+un certain nombre de requêtes exprimées par l'utilisateur
+afin de construire une nouvelle application.
+Nous appellerons \indexdef{projet courant} 
+l'état de cette nouvelle application à un instant donné.
+Il est composé~:
+\begin{itemize}
+  \item d'un ensemble de résultats (initialement vide)
+    sur les fonctions tels qu'ils ont été
+    présentés en \ref{sec-filtrage-fct}, c'est-à-dire de fonctions
+    spécialisées~;
+  \item et d'une liste d'actions qui sont
+encore à appliquer pour obtenir une application cohérente.
+\end{itemize}
+\bb
+
+Lorsque l'utilisateur exprime des requêtes, elles sont traduites en
+{\bf actions} qui sont rangées dans la liste des tâches en attente. 
+Les actions s'appliquent en séquence, c'est-à-dire qu'on ne peut pas appliquer
+une action si la précédente n'est pas terminée.
+L'application d'une action peut éventuellement générer de nouvelles actions.
+\bb
+
+Une action peut dans certains cas être supprimée ou modifiée~: 
+ce point est abordé en \S\ref{sec-gestion-actions}.
+\bb
+
+A la fin de l'analyse, il n'y a plus d'action à appliquer,
+et l'application résultante peut être générée.
+
+\subsection{Appel de fonction}
+
+Lors du marquage intraprocédural, on obtient les marques strictement nécessaires
+au calcul demandé. On peut en particulier en extraire les signatures des appels
+de fonction. Pour chacun d'entre eux, dès lors qu'il y a au moins un élément
+visible, il va falloir décider quelle est la fonction appelée.
+On a vu par exemple qu'on peut choisir de ne pas spécialiser les appels de
+fonction~: les entrées invisibles des appels devront alors être marqué comme
+superflus.
+
+\subsection{Propagation aux fonctions appelées}\label{sec-callee}
+
+Pour se laisser la possibilité de faire évoluer l'outil,
+  on décide d'offrir plusieurs possibilités~:
+\begin{itemize}
+\item une spécialisation par appel~: 
+pour chaque appel, on détermine les sorties
+utiles, et on génère la fonction appelée correspondante (si elle n'existe pas
+déjà),
+\item pas de spécialisation de fonction~: dès qu'on a besoin d'une des sorties
+d'une fonction, on laisse l'appel, et on a donc besoin de sélectionner tous les
+arguments d'appel,
+\item une seule spécialisation par fonction~: regroupement de toutes les 
+spécialisations nécessaires à l'application en une seule fonction,
+\item regroupement de fonctions spécialisées {\it a posteriori}, 
+à la demande de l'utilisateur.
+\end{itemize}
+
+\subsection{Propagation aux fonctions appelantes}\label{sec-caller}
+
+  Lorsqu'une fonction spécialisée a été calculée, on peut vouloir l'appeler
+  à la place de la fonction initiale, et ainsi propager la réduction.
+  Il faut pour cela pouvoir créer une requête qui désigne le point d'appel,
+  et la fonction spécialisée à utiliser. Cette requête revient à s'intéresser au
+  calcul des entrées visibles de la spécialisation au dessus du point d'appel.
+  
+  L'application d'une telle requête peut à son tour générer une demande de
+  spécialisation, éventuellement de la même fonction comme dans l'exemple
+  ci-dessous.
+
+\begin{exemple}
+La figure suivante montre un exemple de différentes étapes de la
+transformation des appels à $g$ dans $f$ par des appels à la fonction filtrée
+$g_1$, et comment on peut envisager de propager l'information.
+
+\begin{center}
+\uneimage{propagation}
+\end{center}
+
+\begin{enumerate}
+  \item calcul de la fonction $g_1$ : seule la seconde entrée est visible, les
+    sorties ne sont pas visibles;
+  \item remplacement du second appel à $g$ dans $f$ par un appel à $g_1$,
+    et sélection des éléments qui permettent de calculer l'entrée visible.
+    On voit que ce calcul nécessite de calculer la seconde sortie du premier
+    appel à $g_1$. Il faut donc calculer une seconde fonction $g_2$.
+  \item calcul de la fonction $g_2$ : elle doit avoir les mêmes éléments que
+    $g_1$ et calculer en plus sa seconde sortie. On voit ce cela nécessite la
+    visibilité de la première entrée.
+  \item sélection de ce qui permet de calculer la première entrée de $g_2$ dans
+    $f$.
+\end{enumerate}
+\end{exemple}
+
+\subsection{Sélection des appels d'une fonction}
+
+  En plus des critères de \slicing déjà vus qui consiste à sélectionner une
+  donnée à un point de programme, l'aspect interprocédural conduit à
+  définir un nouveau critère qui permet 
+  de ne garder que ce qui permet d'appeler une fonction donnée, 
+  et de calculer les contextes d'appels. 
+  La fonction peut être~:
+  \begin{itemize}
+    \item une fonction externe dont on n'a pas le code,
+    \item une fonction présente dans le code source,
+    \item une fonction issue d'un précédent filtrage,
+  \end{itemize}
+  et on peut choisir de sélectionner~:
+  \begin{itemize}
+    \item uniquement ce qui permet d'atteindre les points de programme des
+      appels à cette fonction,
+    \item ou bien également ce qui permet de calculer les entrées.
+  \end{itemize}
+
+  Ce filtrage peut par exemple être utilisé pour réduire une application
+  afin de permettre une analyse des fuites mémoire.
+  Il suffit pour cela de sélectionner les fonctions d'allocation (\verbtt{alloc},
+  \verbtt{malloc}, etc.) et la fonction de libération (\verbtt{free}).\\
+
+\input{interproc2.tex}
+
diff --git a/doc/slicing/interproc2.tex b/doc/slicing/interproc2.tex
new file mode 100644
index 0000000000000000000000000000000000000000..c7528466dabfc224453400224c3591447e8bd28a
--- /dev/null
+++ b/doc/slicing/interproc2.tex
@@ -0,0 +1,995 @@
+\section{Principe et notations}
+
+On rappelle ici les aspects du calcul intraprocédural, et diverses notations,
+qui vont être utilisées par la suite.
+On s'appuie en grande partie sur la représentation des entrées/sortie
+et des appels de fonction dans le PDG présenté dans \cite{ppcPdg}.
+
+\subsection{Marques élémentaires}
+
+On considère qu'on a un ensemble de marques élémentaires,
+non détaillées ici, muni~:
+\begin{itemize}
+  \item d'un ordre partiel ($\leq$),
+  \item d'une opération d'union ($+$),
+  \item d'un plus petit élément ($\botm$) utilisé pour marquer les éléments
+    invisibles,
+  \item et d'un plus grand élément ($\topm$) correspondant au marquage des
+    élément de la fonction source.
+\end{itemize}
+
+On considère de plus un élément appelé \spare{} tel que~:
+\begin{itemize}
+  \item $\forall m. m \neq \botm \imply m = \spare \lor \spare \leq m$
+\end{itemize}
+On a donc~:
+\begin{equation*}
+\forall m. m \neq \botm \imply m + \spare = m  
+\end{equation*}
+Cette marque est donc la plus petite qui rende un élément visible.
+Elle est utilisée pour marquer les élément dit {\it superflus}, c'est-à-dire
+ceux qui ne seraient pas nécessaire si la réduction était plus précise.
+
+\subsection{Marquage}
+
+On a vu au chapitre \ref{sec-filtrage-fct} que l'on dispose d'une procédure
+permettant de marquer une instruction et de la propager
+selon les dépendances (PDG). 
+
+Au cours de ce calcul,
+les relations de dépendances entre les entrées et les sorties des fonctions
+appelées sont données par la spécification\footnote{c'est peut-être un problème
+si on fait de la coupure de branche, car les dépendances peuvent être réduites
+par une telle spécialisation.}.\bb
+
+Dans le résultat obtenu, lorsqu'un élément de fonction $e1$ est utilisé par un
+élément de fonction $e2$, la marque $m1$ associée à $e1$ 
+est supérieure ou
+égale à la marque $m2$ associée à $e2$ car  $m1$ est l'union des marques
+de tous les éléments qui dépendent de $e1$.
+
+\subsection{Fonctions}
+
+Chaque fonction source peut être spécialisée une ou plusieurs fois. 
+Au niveau {\it intraprocédural},
+cela signifie qu'on lui attribue un certain marquage.\bb
+
+Dans la suite, on note~:
+\begin{itemize}
+  \item $f, g, h, ...$ une fonction quelconque (source ou spécialisée),
+  \item une fonction source est munie d'un indice 0~: $f_0, g_0, h_0, ...$
+  \item les fonctions spécialisées ont un autre indice~: $f_i, g_j, h_k, ...$
+    (sauf mention contraire, quand on précise l'indice, 
+    on suppose donc qu'il est différent de 0).
+\end{itemize}
+
+\subsection{Entrées/sorties}
+
+Le graphe de dépendance contient des éléments particuliers qui représentent
+les entrées et les sorties de la fonction.
+On note $\inout(f)$ l'ensemble de ces éléments pour la fonction $f$.\bb
+
+On ne précise pas de quelle fonction $f$ il s'agit, car on considère le même
+ensemble d'entrées/sorties pour toutes les spécialisations~:
+\begin{equation*}
+    \forall i. \inout(f_0) = \inout(f_i)
+\end{equation*}
+
+\subsection{Signature}
+
+On appelle {\bf signature}, et on note $\sig$, une fonction 
+qui associe une marque aux éléments d'un ensemble d'entrées/sorties.
+
+On définit $\tops$ qui représente une signature dont tous les éléments
+ont une marque $\topm$~:
+\begin{equation*}
+\sig = \tops \equiv \forall e \in dom(\sig). \sig(e) = \topm
+\end{equation*}
+et de même, $\bots$ qui représente une signature dont tous les éléments 
+ont une marque $\botm$~:
+\begin{equation*}
+\sig = \bots \equiv \forall e \in dom(\sig). \sig(e) = \botm
+\end{equation*}
+
+% A TERMINER~: il faut sans doute déjà introduire la notion de précondition dans
+% la signature, car si deux spécialisations ont la même marque pour une même
+% sortie, mais qu'elles ne se placent pas dans les mêmes conditions, il faut tenir
+% compte de la relation d'ordre sur les préconditions (implication).
+% 
+% Exemple~: si on spécialise une fonction avec une entrée $x=2$,
+% elle est plus précise qu'une spécialisation avec $x>0$,
+% par contre, elle est incomparable avec la spécialisation dans le cas $x<0$.\bb
+
+
+On définit $\sigf(f)$ la {\bf signature d'une fonction} $f$ telle que~:
+\begin{itemize}
+  \item $dom(\sigf(f)) = \inout(f)$
+  \item $\sigf(f_0) = \tops$
+  \item $\sigf(f_i)(e)$ est la marque attribuée à $e$ dans $f_i$.
+\end{itemize}
+\bb
+
+On notera parfois $\insigf(f)$ et $\outsigf(f)$ les fonctions dont le domaine
+est réduit aux entrées ou aux sorties.
+
+% La relation d'ordre sur les signatures de fonction traduit la précision
+% des spécialisations.
+% Une spécialisation est plus petite qu'une autre si elle calcule moins
+% de chose, ou si elle calcule la même chose, mais qu'elle
+% nécessite moins d'entrée (c'est possible si le choix des fonctions appelées
+% n'est pas le même).
+
+\subsection{Appel de fonction}
+
+Comme nous parlons ici de la partie interprocédurale du traitement, on
+s'intéresse principalement aux appels de fonction.  On considère que l'on sait
+identifier de manière unique un appel de fonction $c$, (par exemple par
+l'identification de la fonction appelante et un élément du PDG, ou un numéro
+d'ordre). Dans la suite, pour préciser le nom de la fonction appelée,
+on notera $c_g$ un appel à une fonction $g$.\bb
+
+On note $\call(f)$ l'ensemble des appels de fonction de $f$.
+On remarque que l'on ne précise pas la spécialisation, car~:
+\begin{equation*}
+\forall i. \call(f_i) = \call(f_0)
+\end{equation*}
+\bb
+
+Pour chaque appel de fonction $c_g$ de $f_i$, 
+le graphe de dépendance contient des éléments qui
+représentent les entrées/sorties de la fonction appelée.
+
+On définit la {\bf signature d'un appel} de fonction $c$
+dans la fonction $f_i$, et on note $\sigc(c, f_i)$,
+la fonction qui donne les marques de ces éléments dans $f_i$.
+
+\section{Calcul interprocédural}
+
+\subsection{Gestion des fonctions}
+
+Au niveau {\it intraprocédural}, une fonction spécialisée est caractérisée par
+un certain marquage de ses éléments. 
+En interprocédural, on s'intéresse à la propagation des marques aux appels
+de fonction. On se propose donc d'ajouter aux fonctions spécialisées
+une fonction $\Call$, décrite en \S\ref{sec-Call}, qui associe, à chaque appel
+de fonction, l'identification de la fonction à appeler.  L'objectif est de
+remplacer certains appels par des appels à des fonctions spécialisées.\bb
+
+La réduction d'une application consiste à construire un {\bf projet} qui
+contient une liste de fonction, initialisée à la liste des fonctions source, et
+complétée au cours de l'étude par les fonctions spécialisées calculées.
+
+L'objectif est d'obtenir un projet cohérent, tel que défini en
+\S\ref{sec-coherence}.
+
+\subsection{Appels de fonction}\label{sec-Call}
+
+On appelle $\Call(f_i)$ la fonction qui fait correspondre
+chaque appel de $f_i$ à une fonction appelée.
+$\Call(f_i)(c)$ donne donc la fonction appelée par $f_i$ pour l'appel $c$.\bb
+
+On note $\Call(f_i)(c) = \botc$ quand l'appel est invisible.
+
+Par ailleurs, $\Call(f_i)(c) = \topc$ signifie que l'appel
+n'est pas encore attribué, c'est-à-dire que l'on n'a pas encore choisi la
+fonction à appeler.\bb
+
+Si la fonction appelée est déterminée par l'accès à un pointeur de fonction,
+il n'est pris en considération dans $\Call$ que si on connaît
+statiquement la fonction appelée à partir de l'analyse de valeur. 
+Dans les autres cas, on laissera
+l'appel tel qu'il est dans la fonction source.\bb
+
+
+Les fonctions source appellent forcement des fonctions source~:
+\begin{equation*}
+\forall c \in \call(f), \exists g. \Call(f_0)(c) = g_0
+\end{equation*}
+
+Quand l'appel est attribué, il correspond forcement à une spécialisation
+de la fonction initialement appelée~:
+\begin{equation*}
+\forall c \in \call(f), \Call(f_0)(c) = g_0 
+\imply \forall f_i. (\Call(f_i)(c)  = \botc \lor \Call(f_i)(c)  = \topc 
+\lor \exists j. \Call(f_i)(c)  = g_j)
+\end{equation*}
+
+Par ailleurs, si $\Call(f_i)(c)  = g_j$
+on veut que la signature de la fonction appelée 
+$\sigf(g_j)$ soit {\it compatible}
+à la signature de l'appel $\sigc(c, f_i)$.
+Voyons maintenant ce que cela veut dire...
+
+\subsection{Problème de compatibilité des signatures}\label{sec-compat-sig}
+
+La première idée qui vient lorsque l'on souhaite propager le marquage
+aux fonctions appelées est d'appliquer les mêmes règles de propagation dans les
+dépendances que pour le calcul
+intraprocédural. Mais lorsque l'on souhaite utiliser une même fonction
+spécialisée dans différents contextes, cela conduit à avoir une trop grande
+perte de précision. On veut par exemple pouvoir marquer
+comme \spare{} les entrées qui ne sont pas réellement utilisées pour un certain
+appel, même si elles portent d'autres marques par ailleurs.
+\bb
+
+Par exemple, dans le cas suivant~:
+
+\noindent\begin{tabular}{p{5cm}p{4cm}p{4cm}}
+\begin{verbatim}
+int X, Y;
+
+void g (int x, int y) {
+  X = x; Y = y;
+  }
+\end{verbatim}
+&
+\begin{verbatim}
+
+int f_a (int x_a, 
+        int y_a) {
+  g (x_a, y_a);
+  return X;
+  }
+\end{verbatim}
+&
+\begin{verbatim}
+
+int f_b (int x_b, 
+        int y_b) {
+  g (x_b, y_b);
+  return Y;
+  }
+\end{verbatim}
+\end{tabular}
+
+si l'utilisateur demande le marquage 
+des sorties 0 de \verb$f_a$ et \verb$f_b$, et la construction d'une seule
+spécialisation pour \verb$g$, on aimerait que \verb$x_a$ et \verb$y_b$ soient
+marquées \spare{}
+
+
+\bb
+Pour obtenir un tel comportement, on décide d'étendre le marquage
+comme suit.
+
+\subsection{Couple de marques}
+
+Pour garder un maximum de précision, il faut distinguer les sélections
+réellement effectuées par l'utilisateur des marques introduites par une
+approximation.
+Pour cela, on marque chaque élément d'une spécialisation non plus par une seule
+marque, mais par un couple $<m_1, m_2>$ où~:
+\begin{itemize}
+  \item la marque $m_1$ correspond à la propagation d'une sélection par
+    l'utilisateur dans la fonction d'origine et dans ses appelants,
+    {\sc MAIS}
+    on ne la propage pas directement dans les fonctions appelées
+    car cela conduit à avoir une trop grande perte de précision.
+    Il faut noter que $m_1$ ne peut en principe pas être \spare,
+    sauf si l'utilisateur le demande explicitement.
+  \item la marque $m_2$ correspond à la propagation d'une marque $m_1$
+    d'un appelant. Donc, lorsque la sortie d'un appel a une marque $m_1$, la
+    sortie correspondante de la fonction appelée est marquée $m_2$. 
+    Par ailleurs, si une fonction a une entrée marquée 
+    $m = <m_1, m_2>$ avec $m_2 \neq \botm$, ses appelants doivent propager 
+    $m' = <m_1, \spare>$ sur l'entrée correspondante.
+    Attention, comme on le verra plus loin,
+    cela ne veut pas dire que les entrées des appelants ont la
+    marque $m'$, car il faut combiner cette marque avec les marques de
+    l'appelante.
+\end{itemize}
+\bb
+
+Du point de vue de l'utilisateur, la marque associée à un élément est l'union de
+$m_1$ et de $m_2$.
+\bb
+
+Dans l'exemple précédent, les entrées $x$ et $y$ de $g$
+seront marquées en $m_2$, et cela conduira bien à marquer $\spare{}$ les entrées
+inutiles dans $f\_a$ et $f\_b$.
+
+\subsection{Cohérence du projet} \label{sec-coherence}
+
+Avant de voir comment calculer le résultat, voyons les propriétés que doit avoir
+un marquage final pour être cohérent.
+Les éléments qui nous intéressent sont les signatures des fonctions et des
+appels.
+
+Nous ne parlons ci-dessous que des marques propagées,
+sachant qu'en plus, chacune peut contenir aussi une marque mise manuellement par
+l'utilisateur.
+
+\begin{itemize}
+  \item les marques des sorties d'un appel $(c_g, f_i)$ ne dépendent que du
+    contexte d'appel, c'est-à-dire des marques de leurs dépendances dans $f_i$.
+    Néanmoins, il semble qu'une marque $m_2$ ne puisse venir que de marques
+    $m_2$ sur les sorties de $f_i$, sauf la marque \spare{} qui peut venir 
+    d'entrées d'appels de fonction.
+  \item les marques des sorties d'une fonction spécialisée sont déterminées
+    par les marques des sorties des appels à cette fonction.
+    On ne peut avoir $m_1 \neq \botm$ que si l'utilisateur a placé
+    explicitement une marques sur la sortie. La marque $m_2$ est l'union 
+    des marques $m_1$ et $m_2$ des sorties des appels.
+  \item les marques des entrées d'une fonction sont uniquement déterminées par
+    la propagation des marques des autres éléments de la fonction.
+    Une marque $m_1$ provient nécessairement d'une sélection utilisateur dans la
+    fonction considérée ou une de ses fonctions appelées.
+  \item les marques des entrées d'un appel $(c_g, f_i)$ sont une combinaison des
+    marques des entrées de $g$ et des sorties de $(c_g, f_i)$ 
+    Si l'on remplace la fonction appelée, il faut recalculer ces
+    marques d'entrées.
+\end{itemize}
+\bb
+
+En résumé,
+considérons une entrée $e$ et une sortie $s$ d'une fonction spécialisée $g_i$,
+on note $m(e) = \sigf(g_i)(e)$, $m(s) = \sigf(g_i)(s)$.
+
+\labcenterepsfig{call}{Propagation des marques dans les appels de
+fonction}{fig-mark-call}
+
+Soit $c$ un appel quelconque à cette fonction, 
+on note $m(ce) = \sigc(c)(e)$ et $m(cs) = \sigc(c)(s)$.
+Pour avoir un projet cohérent, on doit avoir les propriétés suivantes~:
+
+
+\begin{itemize}
+  \item $m_2(s) \geq m_1(cs) + m_2(cs)$
+  \item $m_1(e) \leq m_1(ce)$
+  \item $m_2(e) \neq \botm \imply m_1(ce) \geq \spare$
+\end{itemize}
+
+Par ailleurs, si la sortie $s$ dépend de l'entrée $e$~:
+\begin{itemize}
+  \item $m_1(cs) \leq m_2(s) \leq m_2(e) \leq m_2(ce)$
+  \item $m_1(cs) \leq m_1(ce)$
+  \item $m_1(s) \leq m_1(e) \leq m_1(ce)$
+\end{itemize}
+\bb
+
+On a vu que le calcul du résultat final se décompose en actions élémentaires.
+Entre deux actions, on impose que le projet soit {\bf partiellement cohérent},
+c'est-à-dire que pour tous $\Call(f_i)(c)$~:
+\begin{itemize}
+  \item $\Call(f_i)(c) = \botc \Longleftrightarrow \sigc(c, f_i) = \bots$
+  \item $\Call(f_i)(c) = \topc$ et il doit y avoir une action en attente pour
+    attribuer l'appel,
+  \item $\Call(f_i)(c) = g_j$ et~:
+    \begin{itemize}
+      \item $g_j$ doit exister et avoir une signature compatible à l'appel,
+      ou une action de modification en attente
+	(car dans ce cas, on ne sait pas forcement évaluer la compatibilité des
+	signatures).
+      \item ou $g_j$ n'existe pas encore, mais fait l'objet d'une action de
+	construction en attente.
+    \end{itemize}
+\end{itemize}
+\bb
+
+Lorsque la liste des actions est vide, le projet doit être {\bf cohérent}
+c'est-à-dire que tous les appels de fonction doivent être affectés
+à une fonction ayant une signature compatible avec celle de l'appel.
+
+
+\section{Actions pour le calcul interprocédural}\label{sec-def-actions}
+
+La difficulté du traitement est d'enchaîner correctement les actions pour
+obtenir une application cohérente.  De plus, pour avoir une boite à outils
+suffisamment flexible, les actions doivent correspondre à des traitements
+suffisamment élémentaires, et parfaitement spécifiés (surtout leur comportement
+vis à vis des différentes options). 
+
+On  décide donc que toute action doit être décomposée et traduite 
+en une séquence d'{\bf actions élémentaires} définies ci-dessous.
+Elles doivent être simples, et
+le moins paramétrables possible, la flexibilité venant plutôt de la
+traduction d'une action de haut niveau en actions élémentaires.
+Ces dernières ne sont donc pas toutes accessibles par l'utilisateur,
+mais peuvent être vues comme des étapes de calcul qui seront combinées 
+par la suite en fonction des besoins.
+\bb
+
+L'application d'une action élémentaire~:
+\begin{itemize}
+  \item peut éventuellement générer de nouvelles actions,
+  \item mais ne peut créer ou modifier qu'une seule fonction (ou aucune).
+\end{itemize}
+\bb
+
+Cette partie présente donc tout d'abord les actions élémentaires,
+et le détail de l'application de chacune d'entre elles.
+Puis, on verra que la génération de ces actions dépend du mode de fonctionnement
+choisi. Les modes proposés sont exposés en \S\ref{sec-modes}.
+
+Les actions sont résumées sous forme de fiches signalétiques, en annexe
+\ref{app-actions}.
+
+\defaction{NewSlice}
+\subsection{Création une spécialisation~: \actNewSlice}\labact{NewSlice}{1}
+
+On appelle $f_i = \actNewSlice(f_0)$ l'action qui permet de construire
+une spécialisation $f_i$ de $f_0$ . Initialement, toutes les marques sont
+mises à $\botm$ et la fonction $\Call(f_i)(c) = \topc$.
+Les modifications peuvent ensuite être faite à l'aide des actions présentées
+ci-dessous. Cela permet d'avoir un traitement cohérent.
+
+\subsection{Modification d'une spécialisation}
+
+Les actions suivantes permettent de modifier la marquage une spécialisation 
+Elles ne créent pas de nouvelles fonctions.
+\bb
+
+{\bf Attention}~: pour l'instant, les actions {\bf ajoutent} des marques.
+Veut-on pouvoir réduire une spécialisation~?
+
+\defaction{ExamineCalls}
+Dans tous les cas, lorsque le marquage d'une fonction est modifié,
+il faut ensuite gérer ses appels de fonction.
+Toutes les actions de modification ci-dessous génèrent donc une requête 
+\actExamineCalls{} qui permet d'effectuer cette tâche.
+Son application est présentée en \refact{ExamineCalls}{1}.
+
+\defaction{AddUserMark}
+\subsubsection{Ajout d'une marque utilisateur~: \actAddUserMark}\labact{AddUserMark}{1}
+
+L'action $\actAddUserMark(f_i, (e, m)$  permet d'ajouter et de propager
+une marque sur
+n'importe quel élément de $f_i$. Il s'agit d'une marque utilisateur,
+elle est donc ajoutée en $m_1$.
+
+\defaction{AddOutputMarks}
+\subsubsection{Propagation d'une marque de sortie ~: \actAddOutputMarks}\labact{AddOutputMarks}{1}
+
+L'action $\actAddOutputMarks(f_i, \outsigc)$
+est générée lorsque $f_i$ est appelée, mais qu'elle ne calcule pas assez de
+choses. Pour chaque sortie $s$, si $\outsigc(s) = <m_1, m_2>$,
+il faut ajouter $<\botm, m_1+m_2>$ à $\outsigf(f_i)(s)$ et propager
+la nouvelle marque dans $f_i$.
+
+\defaction{ModifCallInputs}
+\subsubsection{Marquage des entrées d'un appel~: \actModifCallInputs}\labact{ModifCallInputs}{1}
+
+L'action $\actModifCallInputs(c_g, f_i)$ est générée lorsque
+les marques d'entrée d'un appel $g_j = \Call(f_i)(c_g)$ dans $f_i$
+sont insuffisantes pour la fonction appelée. Pour chaque entrée $e$ de l'appel, 
+on commence par recalculer sa marque en fonction des marques de ses dépendances.
+Cela permet d'obtenir un résultat correct même si on avait besoin de plus
+d'entrée avant d'appeler $g_j$. Puis, si
+$\insigf(g_j)(e) = <m_1, m_2>$, il faut ajouter $<m_1, \spare>$ à
+$\insigc(c_g, f_i)$ si $m_2 \neq \botm$ et $<m_1, \botm>$ sinon,
+et propager la nouvelle marque ainsi obtenue dans $f_i$.
+
+
+\subsubsection{Gestion des appels~: $\actExamineCalls$}\labact{ExamineCalls}{1}
+
+L'action $\actExamineCalls(f_i)$ est automatiquement appliquée
+après toute modification du marquage de la fonction $f_i$
+car il faut examiner $\Call(f_i)$ afin d'en vérifier la cohérence,
+c'est-à-dire pour voir si les fonctions appelées conviennent toujours.
+\bb
+
+
+\defaction{ChooseCall}
+Pour chaque appel, on regarde donc~:
+\begin{itemize}
+  \item si $\outsigc(c, f_i) = \bots$ (on n'utilise pas les sorties de l'appel
+    de fonction), alors $\Call(f_i)(c) = \botc$,
+  \item sinon (certaines sorties sont marquées)~:
+    \begin{itemize}
+      \item si $\Call(f_i)(c) = \botc$~:
+	rien n'était appelé précédemment, il faire faire comme si 
+	$\Call(f_i)(c) = \topc$ (voir ci-dessous),
+      \item si $\Call(f_i)(c) = \topc$~:
+	aucune fonction n'a encore été attribuée à cet appel.
+	Une action \actChooseCall est chargée d'affecter une fonction à cet
+	appel (cf. \refact{ChooseCall}{1}).
+      \item si $\Call(f_i)(c) = g_j$~: il faut comparer $\outsigc(c, f_i)$ à
+	$outsigf(g_j)$ comme nous allons le voir.
+    \end{itemize}
+\end{itemize}
+
+Pour que la fonction appelée $g_j$ convienne, il faut qu'elle calcule au moins
+toutes les sorties nécessaires à cet appel. C'est-à-dire que si une sortie de
+l'appel est marquée $<m_1, m_2>$, et que la sortie correspondante de $g_j$ est
+marquée $<m_1', m_2'>$, on doit avoir~:
+\begin{equation*}
+m_2' \geq m_1 + m_2
+\end{equation*}
+
+\defaction{MissingOutputs}
+Si ce n'est pas le cas, une action \actMissingOutputs{} est générée
+(cf. \refact{MissingOutputs}{1}).
+On pourrait générer directement $\actAddOutputMarks(g_j, \outsigc(c, f_i)$ mais
+ça ne permettrait pas de choisir une autre fonction $g$ plutôt que d'étendre
+$g_j$.
+\bb
+
+\defaction{MissingInputs}
+Par ailleurs, $\actExamineCalls$ s'occupe également de la propagation des
+marques aux appelants, c'est-à-dire que si $f_i$ est appelée par $h_k$ et que
+les marques de ses entrées ont été modifiées, il faut les propager aux entrées
+des appels.  Pour cela, on génère une action \actMissingInputs
+(cf. \refact{MissingInputs}{1}).  On
+pourrait directement générer $\actModifCallInputs(c_f, h_k)$, mais cela ne
+permettrait pas de modifier l'appel de fonction pour choisir d'appeler une autre
+spécialisation de $f$ dans $h_k$.
+
+Les étapes de l'attribution, puis de la modification des appels de fonction
+peuvent sembler complexes au premier abord, 
+d'autant plus que leur enchaînement dépend d'un mode
+de fonctionnement qui sera explicité en \S\ref{sec-modes} et éventuellement des
+interventions ponctuelles de l'utilisateur.
+La figure \ref{fig-modifcall} tente de résumer ce processus.
+
+\clearpage
+\begin{center}
+  \rotatebox{90}{%
+     \resizebox{200mm}{!}{\includegraphics{choose_call}}}
+
+Fig.~\thefigure~:\label{fig-modifcall} 
+Gestion d'un appel $c$ à une fonction $g$
+
+suite à la modification des marques de la signature de $c$ dans la fonction appelante
+
+ou à celle des entrées de $g$.
+\stepcounter{figure}
+\end{center}
+\clearpage
+
+\subsection{Affecter ou modifier un appel de fonction}
+
+On a vu que lors de la création ou la modification du marquage d'une fonction
+$f_i$, des actions $\actChooseCall(c, f_i)$, 
+$\actMissingOutputs(c, f_i)$ ou
+$\actMissingInputs(c, f_i)$ pouvaient être générées lorsqu'un appel $c$
+doit être attribué ou modifié.
+Dans tous les cas, on se pose la question de la fonction à appeler car soit on
+ne l'a pas encore choisie, soit elle ne convient plus. 
+\bb
+
+\subsubsection{Attribution d'un appel : $\actChooseCall$}\labact{ChooseCall}{1}
+
+Une action $\actChooseCall(c, f_i)$ peut-être générée (selon le mode choisi)
+lorsque
+$\Call(f_i)(c)$ doit être modifié car le marquage de $f_i$ a changé~: 
+il s'agit de trouver une fonction $g_k$ pour remplacer l'ancienne valeur de
+$\Call(f_i)(c)$ qui pouvait être $\topc$, $\botc$ ou encore $g_j$,
+mais cette dernière ne convient plus.
+\bb
+
+Lors de l'application de cette action, outre le mode de fonctionnement,
+le critère principal de choix est le marquage des sorties dans l'appel 
+($\outsigc(c, f_i)$) qui est confronté  
+au marquage des spécialisations de $g$ déjà calculées,
+en appliquant éventuellement un traitement particulier à $g_j$,
+la fonction initialement appelée.
+
+En fonction du mode~:
+\begin{itemize}
+  \item soit on trouve une $g_k$ qui convient,
+  \item soit on trouve une $g_k$ que l'on souhaite utiliser,
+    mais qui ne calcule pas assez de choses~: 
+    il faut donc créer $\actAddOutputMarks (g_k, \sigc(c, f_i))$,
+  \item soit on ne trouve pas de spécialisation existante et on lance alors la
+    création d'une nouvelle spécialisation soit en partant de $g_0$, soit en
+    partant de $g_j$ (à voir...)
+\end{itemize}
+\bb
+
+\defaction{ChangeCall}
+Dans tous les cas, après avoir choisi $g_k$, 
+on applique une action \actChangeCall (cf. \refact{ChangeCall}{1}).
+
+\subsubsection{Action $\actMissingInputs$}\labact{MissingInputs}{1}
+
+On rappelle qu'une action $\actMissingInputs(c, f_i)$ est générée lorsque la
+fonction $g_j$ attribuée à $\Call(f_i)(c) = g_j$ a été modifiée, et qu'elle
+nécessite le marquage d'entrées qui ne le sont pas $\sigc(c,f_i)$.
+\bb
+
+En fonction du mode de fonctionnement, une telle action peut conduire à~:
+\begin{itemize}
+  \item la modification du marquage de $f_i$, 
+    c'est-à-dire l'application de $\actModifCallInputs(c, f_i)$,
+  \item le choix d'une autre fonction, c'est-à-dire l'application de
+    $\actChooseCall(c, f_i)$ (dont le résultat dépend du mode courant),
+  \item une transformation manuelle par l'utilisateur de cette action par 
+    un $\actChangeCall(c, f_i, g_k)$ où $g_k$ doit nécessairement calculer
+    suffisamment de sorties.
+\end{itemize}
+
+\subsubsection{Action $\actMissingOutputs$}\labact{MissingOutputs}{1}
+
+L'action $\actMissingOutputs(c, f_i)$ est générée lorsque le marquage de $f_i$
+a été modifié et que la
+fonction $g_j$ attribuée à $\Call(f_i)(c) = g_j$ ne calcule pas suffisamment 
+de sorties pour le nouveau marquage.
+\bb
+
+En fonction du mode de fonctionnement, une telle action peut conduire à~:
+\begin{itemize}
+  \item la modification du marquage de $g_j$,
+    c'est-à-dire l'application de $\actAddOutputMarks(g_j, \sigc(c, f_i))$,
+  \item le choix d'une autre fonction, c'est-à-dire l'application de
+    $\actChooseCall(c, f_i)$ (dont le résultat dépend du mode courant),
+  \item une transformation manuelle par l'utilisateur de cette action par
+    un $\actChangeCall(c, f_i, g_k)$ où $g_k$ doit nécessairement calculer
+    suffisamment de sorties.
+\end{itemize}
+
+\subsubsection{Changement d'un appel : $\actChangeCall$}\labact{ChangeCall}{1}
+
+L'action $\actChangeCall(c, f_i, g_j)$ permet de transformer $f_i$
+pour avoir $\Call(f_i)(c) = g_j$.  
+Elle ne peut être appliqué que si
+$g_j$ calcule bien toutes les sorties nécessaire à l'appel $c$ dans $f_i$.
+Il faut donc appliquer $\actAddOutputMarks$ à $g_j$ avant d'appliquer
+$\actChangeCall$ s'il en manque.
+\bb
+
+L'application de $\actChangeCall(c, f_i, g_j)$ consiste à modifier
+$\Call(f_i)(c)$, mais aussi à appliquer $\actModifCallInputs(c, f_i)$ dans le
+cas où la signature de $g_j$ nécessite des entrées qui ne sont pas visibles dans
+$\sigc(c, f_i)$.
+
+\subsection{Modes de fonctionnement}\label{sec-modes}
+
+La génération de ces actions, ainsi que l'effet de leur application sur le
+projet, dépend du choix d'un mode de fonctionnement
+qui décide de la précision des spécialisations. 
+Ce mode peut offrir de nombreuses possibilités, 
+mais on se limite dans un premier temps à quatre comportements~:
+\begin{enumerate}
+  \item pas de spécialisation des appels de fonction (\option{DontSliceCalls}) 
+    (cf. \S\ref{sec-DontSliceCalls})~;
+  \item pas de spécialisation, mais propagation du marquage aux fonctions
+    appelées (\option{PropagateMarksOnly})(cf. \S\ref{sec-PropagateMarksOnly})~;
+  \item le moins de spécialisations possibles 
+    (\option{MinimizeNbSlice}) (cf. \S\ref{sec-MinimizeNbSlice})~: 
+    l'outil ne crée pas plus d'une spécialisation par fonction~;
+  \item spécialisations les plus précises possible 
+    (\option{PreciseSlices}) (cf. \S\ref{sec-PreciseSlices})~:
+    on regroupe néanmoins les fonctions ayant la même visibilité,
+    même si le marquage n'est pas le même.
+\end{enumerate}
+
+Pour plus de flexibilité,
+du point de vue de la boîte à outil décrite ici, on suppose que le mode peut
+être changé à tout moment.
+
+\subsubsection{Réduction avec {\it DontSliceCalls}}\label{sec-DontSliceCalls}
+
+Il s'agit du choix qui permet d'utiliser le marquage intraprocédural sans
+propagation aux fonctions appelées.
+Il peut être utilisé si l'on s'intéresse aux liens de dépendance 
+dans une fonction, sans s'intéresser au reste de l'application.
+Tous les appels visibles sont donc attribués aux fonctions source~:
+$$\forall c. \exists o. \outsigc(c, f_i)(o) \neq \botm 
+\imply \Call(f_i)(c) = \Call(f_0)(c)$$
+
+Dans ce cas, il n'est pas utile de générer d'action $\actChooseCall$,
+et les $\actMissingInputs$ (marquage à \spare{} des entrées non utilisées)
+sont directement appliquées. 
+Par ailleurs, il n'y a pas non plus d'actions
+$\actMissingOutputs$ puisque les fonctions source calculent toutes les sorties.
+\bb
+
+Si un autre mode a été utilisé, il est possible néanmoins d'être amené à
+appliquer les actions suivantes~:
+
+\begin{itemize}
+  \item $\actChooseCall(c, f_i)$ est traduite en $\actChangeCall(c, f_i, g_0)$,
+  \item $\actMissingInputs(c, f_i)$ en $\actModifCallInputs(c, f_i)$
+  \item $\actMissingOutputs(c, f_i)$ en $\actAddOutputMarks$ ?
+    ou $\actChangeCall(c, f_i, g_0)$ ?
+\end{itemize}
+
+\subsubsection{Réduction avec {\it PropagateMarksOnly}}\label{sec-PropagateMarksOnly}
+
+Ce mode est à utiliser si l'on veut voir la propagation des dépendances
+dans l'ensemble de l'application sans calculer de spécialisations.
+Il est donc très semblable au mode précédent sauf que l'on calcule un marquage
+également pour les fonctions appelées. Néanmoins, il ne s'agit pas d'une
+réduction à proprement parlé puisque tout reste visible.
+
+\subsubsection{Réduction avec {\it MinimizeNbSlice}}\label{sec-MinimizeNbSlice}
+
+Lorsque l'on applique une action $\actChooseCall$ 
+sur un appel à une fonction $g$
+et qu'il n'y a pas encore de spécialisation, on en crée une nouvelle.
+
+S'il y a une spécialisation $g_j$ (et une seule), 
+elle est choisie  pour être appelée, indépendamment de son marquage. 
+\bb
+
+Si plusieurs $g_j$ existent, c'est 
+{\it la plus proche}\footnote{Les critères de choix restent à définir.}
+qui doit être choisie.
+\bb
+
+S'il manque des marques aux sorties de la fonction choisie,
+il faut les lui ajouter. Pour cela,
+il n'y a pas de génération de $\actMissingOutputs$ puisqu'on ne souhaite avoir
+qu'une seule spécialisation~: elle est directement remplacée 
+par $\actAddOutputMarks$.
+\bb
+
+Enfin, l'action $\actChangeCall$ permet d'appeler la fonction choisie.
+C'est cette dernière action qui s'occupe
+ensuite de propager le marquage des entrées dans $f_i$
+en appliquant automatiquement le $\actModifCallInputs(c, f_i)$.
+
+\subsubsection{Réduction avec {\it PreciseSlices}}\label{sec-PreciseSlices}
+
+Dans ce mode, lors de l'application de $\actChooseCall(c, f_i)$,
+le choix de la fonction à appeler s'effectue de la façon suivante~:
+\begin{itemize}
+  \item on sélectionne les spécialisations qui ont la même visibilité
+    que $\outsigc(c, f_i)$ (même si elles n'ont pas exactement le même
+    marquage)~;
+  \item s'il n'y en a pas, on en crée une nouvelle~;
+  \item s'il n'y en a qu'une, elle est choisie~;
+  \item s'il y en a plusieurs, il faut en choisir une.
+Dans le cas, on choisit pour l'instant la première 
+spécialisation trouvée. Il est clair que ce choix peut être amélioré
+si on définit des critères de choix.
+
+    Il faut remarquer que cette situation ne peut se produire que si
+    l'utilisateur est intervenu.
+\end{itemize}
+
+
+Remarque~: Si $\Call(f_i)(c)$ est déjà attribué avant l'application de 
+$\actChooseCall$, on ignore son ancienne valeur.\\
+
+Dans ce mode, l'application des actions $\actMissingOutputs(c, f_i)$ et 
+$\actMissingInputs(c, f_i)$ est équivalente à l'application
+de $\actChooseCall(c, f_i)$.
+\bb
+
+Il faut noter que ce mode peut être également être choisi si l'on veut piloter
+tous les choix manuellement car les actions sont toutes générées, et l'outil ne
+fait un choix que lorsqu'elles sont appliquées. Elles peuvent donc être
+préalablement transformées en $\actChangeCall$ par l'utilisateur.
+
+
+\subsection{Autres actions}
+
+\defaction{CopySlice}
+\subsubsection{Duplication d'une spécialisation~: \actCopySlice}\labact{CopySlice}{1}
+
+L'action $f_j = \actCopySlice(f_i)$ permet simplement de dupliquer $f_i$
+et donc de créer une nouvelle fonction spécialisée $f_j$.
+Le marquage, ainsi que la fonction $\Call(f_i)$ sont simplement copiés.
+
+Il faut noter que, initialement, $f_j$ n'est pas appelée.
+
+\defaction{Combine}
+\subsubsection{Combinaison de spécialisations~: \actCombine}\labact{Combine}{1}
+
+On peut combiner deux spécialisations (c'est-à-dire en faire l'union) 
+à l'aide de $f_3 = \actCombine(f_1, f_2)$.\bb
+
+La table de marquage se
+calcule simplement en combinant les marques, sans qu'il y ait besoin de
+propager.  Il faut ensuite résoudre les appels de fonction, c'est-à-dire
+calculer $\Call(f_3)$.  Ce qui est fait
+pour un appel donné $c$ dépend de sa signature dans le résultat $f_3$
+par rapport à ce qu'on a dans $f_1$ et $f_2$.
+On sait que, par construction 
+$\sigc(c, f_3) = \sigc(c, f_1) \cup \sigc(c, f_2)$
+et qu'elle est donc supérieure ou égale.
+
+\begin{itemize}
+  \item si $\sigc(c, f_1)=\sigc(c, f_2)$~:
+    \begin{itemize}
+      \item si $\Call(f_1)(c) = \Call(f_2)(c)$~: $\Call(f_3)(c) = \Call(f_1)(c)$
+      \item si $\Call(f_1)(c) = \topc$~: $\Call(f_3)(c) = \Call(f_2)(c)$
+      \item si $\Call(f_2)(c) = \topc$~: $\Call(f_3)(c) = \Call(f_1)(c)$
+      \item sinon, cela veut dire que les deux appels sont attribués à des
+	fonctions différentes~: on choisit celle qui a la plus petite signature
+	(ie. la plus précise).
+    \end{itemize}
+  \item sinon, si $\sigc(c, f_3)=\sigc(c, f_1)$~: $\Call(f_3)(c) = \Call(f_1)(c)$
+  \item sinon, si $\sigc(c, f_3)=\sigc(c, f_2)$~: $\Call(f_3)(c) = \Call(f_2)(c)$
+  \item sinon, $\Call(f_3)(c) = g_i$, et on crée une action 
+    $g_i = \actCombine(\Call(f_1)(c), \Call(f_2)(c))$.
+\end{itemize}
+\bb
+
+Il faut noter que la création de $f_3$ ne modifie ni $f_1$, ni $f_2$.
+Si l'objectif est de remplacer $f_1$ et $f_2$ par $f_3$,
+cela peut être fait par une combinaison d'actions élémentaires
+(cf. \S\ref{sec-fusion}).
+
+\defaction{DeleteSlice}
+\subsubsection{Suppression d'une spécialisation~: \actDeleteSlice}\labact{DeleteSlice}{1}
+
+Une fonction spécialisée peut être supprimée à l'aide de l'action
+\actDeleteSlice$(f_i)$, mais cette action ne peut être appliquée que 
+que si $f_i$ n'est pas appelée, sauf si elle n'est appelée que par elle même.
+Cela signifie que ses appels doivent être supprimés au préalable à l'aide
+d'actions \actChangeCall{} (ou de \actDeleteSlice{} sur les appelant...).
+
+
+\section{Sélection persistante}
+
+Après une première utilisation des fonctions présentées ci-dessus, il est apparu
+qu'un besoin utilisateur pouvait également être de marquer une instruction (ou
+une donnée à un point de programme) pour toutes les spécialisations d'une
+fonction. Ce type de sélection a été nommée
+\indextxtdef{persistante}{sélection!persistante}.
+Cela signifie que chaque fonction a, en parallèle de ses différents marquages,
+un marquage minimum qui est utilisé à la création de toute nouvelle
+spécialisation. Lorsque l'utilisateur ajoute une sélection persistante,
+elle est ajoutée à la fois dans ce marquage minimum, et dans toutes les
+spécialisations existantes. L'ajout d'une sélection persistante dans une
+fonction peut également rendre tous ses appels visibles (si l'option est
+positionnée) car l'utilisateur souhaite que le programme réduit passe aussi
+souvent au point marqué que le programme source~: cela suppose donc que tous les
+chemins qui mènent à la fonction soit visibles.
+
+\section{Gérer des actions élémentaires}\label{sec-multi-actions}
+
+Les actions élémentaires présentées ci-dessus doivent être combinées pour
+répondre à des requêtes de plus haut niveau.
+L'utilisateur exprime ses requêtes en ajoutant des actions dans la liste
+du projet, mais celles-ci doivent ensuite être décomposées pour être appliquées,
+et l'application d'actions élémentaires en génère d'autres.\\
+
+La granularité à laquelle l'utilisateur peut intervenir reste à
+définir en fonction de ce que l'on souhaite faire de l'outil.\\
+
+Nous allons tout d'abord examiner comment peut être gérée la liste d'action
+(\S\ref{sec-gestion-actions}), puis nous verrons un certain nombre d'exemple de
+combinaison d'actions élémentaires pour répondre à des requêtes de plus haut
+niveau.
+
+\subsection{Modification ou suppression d'actions}\label{sec-gestion-actions}
+
+Les actions de l'utilisateur peuvent être supprimées par ses soins avant d'être
+appliquée.  En revanche, les actions générées telles que \actChooseCall{},
+\actMissingInputs{} ou \actMissingOutputs{} consistent à rendre un appel de
+fonction cohérent, elles ne peuvent donc pas être supprimées. Par contre,
+l'utilisateur peut les transformer en \actChangeCall{} pour préciser la fonction
+qu'il souhaite voir appeler. Dans ce cas, cette nouvelle action ne pourra à son
+tour pas être supprimée.
+
+\subsection{Ordre des actions}\label{sec-ordre}
+
+A priori, le marquage étant parfaitement défini, il ne dépend pas de l'ordre des
+calculs. Néanmoins, le résultat obtenu peut dépendre de l'ordre d'application
+des actions, car si on applique une action qui construit une nouvelle
+fonction $g_j$, puis une autre pour construire $f_i$ qui appelle une fonction
+$g$, $g_j$ va pouvoir être choisie pour l'appel, alors que si la première action
+n'avait pas encore été appliquée, c'est peut-être une autre spécialisation qui
+aurait été appelée, ou une nouvelle action qui aurait été générée.
+De plus, certaines actions ont une précondition qui n'est éventuellement
+satisfaite que si les actions générées sont appliquées dans l'ordre.
+On ne prévoit donc pas dans un premier temps
+de pouvoir modifier l'ordre des actions.
+
+\subsection{Propagation aux appelants}\label{sec-propagate-to-calls}
+
+Les actions élémentaires ne propagent le marquage des entrées d'une certaine
+fonction $f_i$ qu'aux appels $(c, h_k)$ tels que $\Call(h_k)(c) = f_i$.
+Si on souhaite construire de nouvelles fonctions spécialisées pour toutes les
+fonctions $h$ qui appellent $f$ afin de propager le marquage, il faut enchaîner
+différentes actions élémentaires.
+
+Voyons par exemple comment piloter l'ajout d'une marque utilisateur $m$ sur un
+élément $e$ de $f$ avec propagation dans les appelants~:
+\begin{itemize}
+  \item $f_i = \actNewSlice (f_0)$
+  \item $\actAddUserMark (f_i, (e, m))$
+  \item $\forall h_0. \exists c_f \in \call(h_0) 
+    \imply h_k = \actNewSlice (h_0) \land \forall c_f. \actChangeCall(c_f, h_k,
+    f_i)$
+\end{itemize}
+
+\subsection{Fusion de deux spécialisation}\label{sec-fusion}
+
+Si deux spécialisations $f_1$ et $f_2$ ont été calculées, l'utilisateur peut
+vouloir les fusionner. Pour cela, il faut appliquer les actions suivantes~:
+\begin{itemize}
+  \item $f_3 = \actCombine (f_1, f_2)$
+  \item $\forall c, h_k. \Call(h_k)(c) = f_1 \imply \actChangeCall(c, h_k, f_3)$
+  \item $\forall c, h_k. \Call(h_k)(c) = f_2 \imply \actChangeCall(c, h_k, f_3)$
+  \item $\actDeleteSlice(f_1), \actDeleteSlice(f_2)$
+\end{itemize}
+
+% \subsection{autres exemples...}
+% \afaire{ compléter au fur et à mesure, en fonction des besoins.}
+
+%--------------------------------------
+\section{Production du résultat}
+
+On rappelle que l'objectif est de générer des fichiers source compilables.
+Or, après avoir effectué tout le travail de filtrage présenté précédemment,
+on obtient un projet contenant, pour chaque fonction, zéro, une, ou plusieurs
+fonctions filtrées, avec pour chaque fonction filtrée, une table de marquage
+permettant de déterminer les instruction visibles,
+et les appels de fonction.
+Voyons ce qu'il manque pour obtenir le résultat final.
+
+\subsection{Déclarations globales}
+
+Pour produire des fichiers de résultats, il faut avant tout être capable d'y
+mettre ce qui est en dehors des fonctions, à savoir les déclarations globales.
+
+Il aurait été possible de calculer des liens de dépendance vers les déclarations
+globales, mais on a considéré que la suppression de 
+déclarations inutiles était une fonctionnalité intéressante en soi,
+et cela est donc fait sous forme d'une passe supplémentaire sur le résultat.
+
+\subsection{Fonctions}
+
+Pour une fonction qui a été analysée, on a calculé la représentation de la
+fonction source, ainsi qu'une ou plusieurs spécialisations.
+Les fonctions non analysées ne figureront pas dans le résultat
+car elles ne participent pas au calcul demandé.
+
+\subsubsection{Fonction spécialisée}
+
+Pour générer le code correspondant à une fonction spécialisée,
+il faut lui donner un nom qui n'entre pas en conflit avec celui de des fonctions
+source ou des autres spécialisation.
+Il faut également avoir sa signature pour savoir si elle possède une valeur
+de retour, et connaître la liste de ses arguments visibles.
+
+\subsubsection{Garder ou non la fonction source}
+
+Une fonction source n'a besoin d'être présente dans l'application générée
+que si elle est appelée.
+Le traitement d'un appel de fonction qui ne conduit pas à appeler une
+spécialisation doit donc mémoriser un lien avec la fonction source.
+
+\subsubsection{Variables locales statiques}
+
+Lorsqu'une fonction est présente en plusieurs exemplaires dans le résultat,
+il faut penser à sortir les éventuelles variables statiques communes à plusieurs
+spécialisations afin qu'elles soient partagées par les différentes fonctions.
+
+\subsubsection{Modification des appels}\label{sec-filtre-call}
+
+Pour générer un appel à une fonction spécialisée,
+il faut avoir les mêmes informations que celles qui sont utilisées pour la
+définition de la fonction, à savoir~:
+\begin{itemize}
+\item son nom,
+\item la liste des paramètres formels nécessaires au calcul des sorties
+sélectionnées,
+\item le type de retour pour savoir si la fonction produit un résultat.
+\end{itemize}
+
+\subsubsection{Génération des nouveaux prototypes}
+
+Lorsque l'on produit des fonctions spécialisées, il faut aussi 
+générer les prototypes associés. Comme elles ont forcément la même portée que la
+fonction source, il suffit de générer ces nouveaux prototypes à l'endroit où
+l'on rencontre le prototype initial.
+
+\subsubsection{Gestion des blocs}
+
+Même si le graphe de dépendance contient des éléments représentant les blocs,
+et donc que le \slicing associe des marques à ces éléments,
+il est délicat de supprimer un bloc, même si est sensé être invisible.
+En effet, cela peut parfois changer la sémantique,
+et dans une construction \verb!if (c) { S1; } else { S2; }!,
+on peut même obtenir un résultat syntaxiquement incorrect
+si on n'y prend pas garde.\\
+
+Comme il peut être utile par ailleurs d'avoir un outil de nettoyage de code
+qui supprime proprement les blocs vide, on décide de ne pas les traiter 
+au niveau du \slicing. Tous les blocs sont donc considérés comme visibles
+indépendamment de leur marque, et le nettoyage est effectué lors d'une passe
+supplémentaire sur le code généré.
+
+\subsection{Annotations}
+
+Les annotations peuvent être utilisées pour construire des requêtes de \slicing,
+mais au delà de cette possibilité, il faut déterminer si les annotations
+présentes dans le code source doivent être mises dans le résultat.
+On regarde pour cela si les données qui permettent d'évaluer la propriété sont
+préservées dans le programme réduit : si c'est le cas, l'annotation va être
+gardée, dans le cas contraire, elle va être slicée.
diff --git a/doc/slicing/intro.tex b/doc/slicing/intro.tex
new file mode 100644
index 0000000000000000000000000000000000000000..7f312529bebf333dfa3e2427babd70bc15d6a658
--- /dev/null
+++ b/doc/slicing/intro.tex
@@ -0,0 +1,394 @@
+\chapter{Introduction}
+
+
+L'objectif de ces travaux est de concevoir et développer un outil de \slicing
+se basant sur le noyau \ppc d'analyse statique de programme C
+en s'inspirant du module équivalent déjà développé
+sur la base de l'outil \caveat qui est décrit dans \cite{slicingCaveat}.
+
+
+
+\section{État de l'art}\label{sec-lart}
+
+Voyons tout d'abord
+ce que dit la littérature sur ce sujet
+afin de se positionner par rapport aux différentes méthodes.\\
+
+On s'appuie ici sur la présentation des travaux sur le calcul de PDG
+effectué dans un autre document.
+
+\subsection{Origine}
+
+La technique consistant à réduire un logiciel -~appelée \slicing en anglais~-
+a été beaucoup
+étudiée depuis son introduction par la thèse de \cite{weiser79}.
+L'article \cite{weiser81} rappelle que sa définition du \slicing est
+la suivante~:
+
+\begin{definition}{slicing selon Weiser}
+Le programme d'origine et le programme transformé doivent être identique
+si on les regarde à travers la fenêtre défini par le critère de \slicing
+défini par un point de programme et une liste de variable.
+C'est à dire que la séquence de valeurs observées pour ces variables
+à ce point doivent être les mêmes.
+
+De plus, le programme transformé doit être obtenu par suppression de certaines
+instructions du programme d'origine.
+\end{definition}
+
+Cette définition a été remise en cause par la suite
+au motif que cette définition n'est pas suffisante pour traduire
+la compréhension intuitive que l'on a du \slicing.
+On trouve l'exemple suivant dans \cite{kumar02better},
+mais cette critique revient a plusieurs reprises.
+
+\begin{exemple}
+\begin{center}
+\begin{tabular}{|l|l|l|}
+\hline
+P & P1 & P2 \\
+\hline
+a = 1;   &          & a = 1; \\
+b = 3;   &          & b = 3; \\
+c = a*b; &          & \\
+a = 2;   & a = 2;   & \\
+b = 2;   & b = 2;   & \\
+d = a+b; & d = a+b; & d = a+b; \\
+\hline
+\end{tabular}
+\end{center}
+P1 est probablement ce qu'on attend du \slicing de P si l'on s'intéresse
+à la variable d après la dernière instruction, mais P2
+est aussi correct du point de vue de Weiser.
+\end{exemple}
+
+Il semble peu probable de construire un algorithme qui construit P2,
+mais on voit néanmoins que la définition est insuffisante
+pour spécifier complètement ce que doit être le résultat d'un \slicing.\\
+
+\cite{Choi94} formalise la définition de la façon suivante~:
+
+\begin{definition}{Correct-Executable-Slice}
+Let $P_{slice}$ be an executable slice of a program $P_{org}$,
+S be the set of statements in $P_{slice}$ and $Proj_S(P_{org}, \sigma_0)$
+be the projection of $Trace(P_{org}, \sigma_0)$ that contains
+only those statement traces produced by statements in S.
+$P_{slice}$ is a correct executable slice of $P_{org}$ if
+ $Proj_S(P_{org}, \sigma_0)$  is identical to $Trace(P_{org}, \sigma_0)$.
+\end{definition}
+
+Même si cette définition possède les mêmes inconvénients que celle d'origine,
+elle lui permet de faire des preuves de correction des ses algorithmes
+relativement à cette formalisation.
+
+\subsection{Graphes de dépendances}
+
+Comme on l'a vu dans \cite{ppcPdg} les graphes de dépendances sont à la base des
+calculs.
+\cite{Ottenstein84}, puis \\
+\cite{Ferrante87}
+introduisent la notion de PDG ({\it Program Dependence Graph}).
+Un tel graphe est utilisé pour représenter les différentes dépendances
+entre les instructions d'un programme.
+Ils l'exploitent pour calculer un {\it slicing non-executable}
+qui s'intéresse uniquement aux instructions
+qui influencent la valeur des variables,
+mais cette représentation sera également utilisée pour calculer un
+\slicing exécutable.\\
+
+Cette représentation, initialement intraprocédurale, a été étendue
+à l'interprocédurale dans \cite{horwitz88interprocedural} où elle
+porte le nom de SDG ({\it System Dependance Graph}).
+Dans ce papier, Susan Horwitz s'intéresse à un \slicing
+ayant la définition suivante~:
+
+\begin{definition}{slicing selon \cite{horwitz88interprocedural}}
+A slice of a program with respect to program point p and variable x
+consists of a set of statements of the program that might affect
+the value of x at p.
+\end{definition}
+
+Mais elle précise par ailleurs que x doit être défini ou utilisé en p.
+En effet, lorsque le graphe est construit, le \slicing se résume à un
+problème d'accessibilité à un noeud, or un noeud représente un
+point de programme et ne contient que les relations concernant les variables
+qui y apparaissent.\\
+
+Nous avons vu dans \cite{ppcPdg} que l'on peut lever cette limitation en gardant
+une correspondance entre les données à un point de programme et les noeud du
+graphe.
+
+\subsection{Slices vs. Chops}
+
+On a vu que le \slicing s'intéresse à ce qui se passe avant d'arriver
+à un certain point.\\
+
+La notion de {\it chopping} est similaire sauf qu'elle s'intéresse
+aux instructions qui vont être influencées par une certaine donnée
+à un certain point.
+
+\subsection{Critères de \slicing}
+
+Nous n'avons pour l'instant parlé que du \slicing dit {\bf statique}
+qui s'intéresse à toutes les exécutions d'un programme,
+par opposition au \slicingb {\bf dynamique}
+ qui considère la projection du programme
+sur l'exécution d'un jeu d'entrée particulier,
+ou {\bf quasi-statique} qui fixe uniquement une partie des entrées.\\
+
+Une version plus générale qui inclus à la fois l'un et l'autre
+est appelé \slicingb {\bf conditionnel} (\cite{fox-consit}).
+Il s'agit de spécifier le cas d'étude sous forme de
+des propriétés sur le jeu d'entrées (préconditions).\\
+
+Par la suite, la notion de {\bf  \slicing conditionnel arrière}
+a été introduit dans plusieurs buts différents :
+\begin{itemize}
+\item la première technique décrite dans \cite{Comuzzi} et
+ appelée p-slice, s'intéresse aux instructions qui participent
+à l'établissement de la postcondition,
+\item alors que la deuxième (\cite{fox01backward})
+a un objectif un peu différent car vue
+comme une aide à la preuve permettant d'éliminer du programme
+tous les cas dans lesquels la propriété est vérifiée (automatiquement),
+pour ne garder que ceux pour lesquels le résultat n'est pas certain
+afin que l'utilisateur puisse se concentrer sur la vérification
+de cette partie.
+
+Dans \cite{Harman2001}, ces auteurs continuent
+les travaux précédents en combinant
+une propagation avant et une propagation arrière.
+Quelques exemples et la présentation d'un outil mettant en {\oe}uvre
+le travail de cette équipe est présenté dans \cite{daoudi-consus}.
+Ils définissent leur objectif de la façon suivante :
+\end{itemize}
+
+\begin{definition}{pre-post conditioned slicing}
+Statements are removed if they cannot lead to
+satisfaction of the negation of the post condition,
+when executed in an initial state which satisfies
+the pre-condition.
+\end{definition}
+
+\begin{itemize}
+\item une troisième approche est présentée très brièvement
+dans (\cite{Chung-2001}~:
+il s'agit également de spécifier le critère de slicing par une pré-post
+et de combiner une propagation avant et arrière de propriétés
+pour ne garder que ce qui participe
+à l'établissement de la post dans le contexte de la précondition.
+\end{itemize}
+
+
+% {\bf contraint} (\cite{Field95}),
+
+
+Ces nouveaux types de \slicing
+ne se basent plus uniquement sur des relations de dépendance,
+mais nécessitent différentes techniques complémentaires comme
+l'exécution symbolique ou encore le calcul de WP.\\
+
+Dans le cadre de notre étude, il semble intéressant d'explorer
+cette voie étant donné que nous disposons (ou disposerons)
+de tels outils d'analyse dans \ppc.\\
+
+
+
+
+
+
+
+\subsection{Transformations}
+
+Dans nos précédents travaux, nous avons exploré certaines transformations
+de programme comme la spécialisation de fonction
+(et donc la transformation des appels),
+et également la propagation de constantes.\\
+
+Divers papiers, dont \cite{harman01gustt},
+présentent un \slicing qu'ils appellent {\bf amorphe}
+dans lequel il s'agit de
+combiner des techniques de \slicing et de transformation de programme.
+
+ \cite{ward2002} (pour une raison qui m'échappe)
+préfère parler de  \slicingb {\bf sémantique}\\
+
+% {\bf à développer !}
+
+
+\subsection{Outils}
+
+On peut citer deux outils qui mettent en {\oe}uvre cette technique sur les
+programmes C-ANSI~:
+\begin{itemize}
+\item {\it unravel}, présenté dans \cite{lyle97using},
+  est disponible sur le web  (cf. [\cite{unravel}])~;
+\item et le {\it Wisconsin Program-Slicing Tool} (\cite{reps93wisconsin}),
+est commercialisé par {\it GrammaTech} sous le nom {\it CodeSurfer}
+(cf. site web [\cite{CodeSurfeur}]).\\
+\end{itemize}
+
+Ces outils permettent tous les deux~:
+\begin{itemize}
+\item de sélectionner les parties de code utiles au calcul
+d'une variable à un point de contrôle,
+\item de visualiser les instructions sélectionnées sur le
+code source de l'utilisateur,
+\item et de faire des opérations d'union et l'intersection entre plusieurs
+réductions.
+\end{itemize}
+
+\subsection{Pour en savoir plus}
+
+Un état de l'art en 1995 est présenté dans \cite{tip95survey}.\\
+Plus récemment, \cite{survey2005} font un tour très complet des évolutions
+jusqu'en 2005.
+
+Par ailleurs, un site internet~- dont l'adresse est donnée
+dans la bibliographie sous la référence \cite{wwwSlicing}~-
+a tenu à jour une liste des projets
+et une bibliographie très impressionnante sur le \slicing
+jusqu'en 2003, mais ce site ne semble plus maintenu.\\
+
+
+\section{Ce que l'on veux faire}\label{sec-but}\label{sec-defR}
+
+\newcommand{\remitem}[1]{\begin{itemize}\item #1 \end{itemize}}
+%\newcommand{\warnitem}[1]{\begin{itemize}\item[$\blacktriangle$] #1
+                          %\end{itemize}}
+%\newcommand{\question}[1]{\begin{itemize}\item[{\bf ?}] #1 \end{itemize}}
+%\newcommand{\smilitem}[1]{\begin{itemize}\item[$\smiley$] #1 \end{itemize}}
+%\newcommand{\frownitem}[1]{\begin{itemize}\item[$\frownie$] #1 \end{itemize}}
+
+Le document \cite{baudinImpact} spécifie un outil d'aide à l'analyse d'impact
+après avoir analysé les besoins dans ce domaine.
+Le module de \slicing est présenté comme étant
+un composant important de cet outil.\\
+
+Résumons ici les caractéristiques principales de l'outil
+qui ont servies de spécification initiale~:
+
+\begin{itemize}
+\item l'outil sert à construire un programme compilable
+à partir d'un programme source, les deux programmes ayant le même
+comportement vis à vis des critères fournis par l'utilisateur~;
+\item la construction de ce programme résultat est un processus interactif.
+\item {\bf commandes} de l'outil
+\remitem{elles correspondent à des fonctions internes (en \caml)
+et doivent permettre d'accéder aux différentes fonctionnalités.\\
+Elles pourront être utilisées directement,
+combinées dans des {\it scripts} pour effectuer des opérations
+plus évoluées ou encore servir à construire un protocole de communication avec
+une interface graphique~;}
+\item commandes {\bf d'interrogation}
+\remitem{elles servent à questionner le système.
+Elles ne doivent pas modifier l'état interne de l'outil.
+Même si elles effectuent certains calculs pour répondre,
+et qu'elles stockent ces résultats pour éviter un recalcul ultérieur,
+ceci doit être transparent pour la suite des traitements~;}
+\item commandes dites {\bf d'action}
+\remitem{elles doivent permettent de construire
+le résultat du \slicing. Ces commandes doivent pouvoir s'enchaîner et se
+combiner~;}
+\item l'outil maintient une {\bf liste d'attente} des actions à effectuer.
+Ceci est utile car certains traitements peuvent être décomposés
+en plusieurs actions que l'utilisateur peut ensuite choisir d'appliquer ou non.
+Cela permet d'avoir un contrôle plus fin des calculs~;
+\item le programme résultant ne peut être généré
+que lorsque la liste d'attente est vide~;
+\item les traitements doivent être modulaires~;
+\item chaque fonction du programme source peut~:
+  \begin{itemize}
+  \item ne pas apparaître dans le résultat,
+  \item être simplement copiée dans le résultat,
+  \item correspondre à une ou plusieurs fonctions spécialisées du résultat.
+  \end{itemize}
+\item dans la représentation interne du résultat, les instructions
+sont associées à un marquage qui indique si elles doivent être cachées,
+ou sinon, la raison de leur présence, c'est-à-dire par exemple
+si elles participent au contrôle ou à la valeur d'une donnée sélectionnée, etc.
+
+\item identification d'instructions non significatives (ou superflues)
+\remitem{il s'agit d'être capable de distinguer ce que l'on doit ajouter
+lorsque l'on ne fait pas de spécialisation.
+Prenons par exemple le cas d'un appel $L : f(a,b);$
+où seul $a$ est nécessaire au calcul qui nous intéresse,
+mais que l'on ne souhaite pas spécialiser en $f(a);$.
+Il faudra alors ajouter ce qui permet de calculer $b$ en $L$
+aux instructions sélectionnées,
+mais en préservant l'information qu'elles sont {\it superflues}~;
+}
+
+\item spécialisation du code
+\remitem{il s'agit d'être capable d'effectuer des transformations syntaxiques
+pour réduire le code au maximum. Par exemple, si après une instruction
+\verbtt{y = x++;}, on n'a besoin que de \verbtt{x},
+il faut être capable de décomposer cette instruction
+afin de ne garder que \verbtt{x++;}
+
+Ce type de transformation étant déjà faite en amont du module de \slicing,
+le problème ne se pose plus pour ce type d'instruction,
+mais il existe encore pour la spécialisation des appels de fonction.
+En effet, si une fonction $f$ prend, par exemple,
+deux arguments dont un seul sert à calculer ce qui nous intéresse,
+on veut être capable de construire une fonction $f_1$
+qui ne prend qu'un seul argument,
+et transformer l'appel à $f$ en un appel à $f_1$.
+
+Par ailleurs, on peut également envisager de transformer des
+instructions lorsque l'on connaît la valeur constante d'une variable.
+}
+\end{itemize}
+
+
+\section{Plan des documents}
+
+Ce document présente uniquement les principes de ce qui a été développé.
+Pour plus de détail sur l'implémentation ou les commandes disponibles,
+le lecteur est invité à consulter la documentation du code
+car elle sera toujours plus détaillée et à jour que ce rapport.
+Comme la boîte à outil de \slicing est un greffon de \ppc,
+son interface est définie dans le module \verbtt{Db.Slicing}.
+Par ailleurs, l'introduction de la documentation interne du module
+donne une idée de l'architecture, et donne des points d'entrée.\\
+
+Les principes de calcul des graphes de dépendances
+sur lequel s'appuie le \slicing est présenté dans \cite{ppcPdg}.\\
+
+Le chapitre \ref{sec-filtrage-fct} présente
+la façon dont sont marquées les instructions d'une fonction pour
+effectuer une réduction intraprocédurale.\\
+
+Puis, le chapitre \ref{sec-interproc} expose comment sont organisés les calculs
+pour faire une propagation des réductions à l'ensemble de l'application,
+et comment on se propose de spécialiser les fonctions.\\
+
+Enfin, le chapitre \ref{sec-man} présente comment utiliser le module
+développé et propose donc une vision davantage dédiée à un utilisateur
+potentiel.\\
+
+
+Ce rapport étant un document de travail, il va évoluer au fur et à mesure des
+réalisations~:
+\begin{itemize}
+  \item la version 1.0 du 27 juin 2006 présentait
+les développements en cours concernant les graphe de dépendance
+et le marquage d'une fonction. La présentation des travaux à faire
+pour la gestion d'un \slicing interprocédural était moins détaillée car
+plus prospective. Suivait un chapitre contenant un manuel d'utilisation.
+Enfin, la conclusion présentait l'état courant de l'outil,
+et les perspectives d'évolution.
+\item dans la version 2.0 du 26 juin 2007, la partie sur le graphe de
+  dépendance a été extraite car elle fait l'objet d'un document séparé.
+  Le \slicing interprocédural est cette fois présenté en détail.
+  Les parties issues du document de spécification dont les idées
+  n'ont finalement pas été retenues ont été déplacées en annexe
+  \ref{sec-projets} pour mémoire. La partie sur l'utilisation de l'outil
+  a pour l'instant été conservée, même si elle n'est pas très spécifique à
+  l'utilisation du greffon de \slicing.
+\end{itemize}
+
+Fin 2008, ce document peut être considéré comme stable,
+car même si le développement évolue, il ne s'agit plus de modifier les
+fonctionnalité de bases, mais plutôt d'ajuster des points de détail pour
+améliorer la précision par exemple.
diff --git a/doc/slicing/macros_slicing.tex b/doc/slicing/macros_slicing.tex
new file mode 100644
index 0000000000000000000000000000000000000000..8e6b866c7cb643d377418cad661758f791675109
--- /dev/null
+++ b/doc/slicing/macros_slicing.tex
@@ -0,0 +1,187 @@
+%==============================================================================
+\usepackage{tabularx}
+\usepackage{alltt}
+\usepackage{ulem} %sout
+
+\usepackage{amsmath}
+\usepackage{wasysym}
+\usepackage{stmaryrd}
+\usepackage{listings}
+
+\usepackage[french]{varioref}
+
+%------------------------------------------------------------------------------
+\newcommand{\setenvclass}[2]{}
+
+\usepackage{listings}
+% TODO :
+\lstdefinestyle{clststyle}{}
+\lstnewenvironment{clisting}
+  {
+   \setenvclass{lstlisting}{clisting}
+   \lstset{language=C,
+           style=clststyle,
+           inputencoding=utf8,
+           extendedchars=true,
+           literate={ç}{{\c{c}}}1
+                    {â}{{\^{a}}}1
+                    {à}{{\`{a}}}1
+                    {ê}{{\^{e}}}1
+                    {ë}{{\"{e}}}1
+                    {é}{{\'{e}}}1
+                    {è}{{\`{e}}}1
+                    {ï}{{\"{\i}}}1
+                    {î}{{\^{\i}}}1
+                    {ô}{{\^{o}}}1
+                    {û}{{\^{u}}}1
+                    {ü}{{\"{u}}}1}
+                    }
+  {}
+
+\newcommand{\camlListingInput}[1]{
+  \begin{footnotesize}
+  \lstinputlisting[language=caml,
+                  style=clststyle,
+                  inputencoding=utf8,
+                  extendedchars=true,
+                  literate={ç}{{\c{c}}}1
+                           {â}{{\^{a}}}1
+                           {à}{{\`{a}}}1
+                           {ê}{{\^{e}}}1
+                           {ë}{{\"{e}}}1
+                           {é}{{\'{e}}}1
+                           {è}{{\`{e}}}1
+                           {ï}{{\"{\i}}}1
+                           {î}{{\^{\i}}}1
+                           {ô}{{\^{o}}}1
+                           {û}{{\^{u}}}1
+                           {ü}{{\"{u}}}1]{#1}
+  \end{footnotesize}
+}
+
+%-----------------------------------------------
+% Commandes pour mettre des ref dans l'index :
+\newcommand{\idb}[1]{\textbf{#1}}
+\newcommand{\indextxt}[1]{\index{#1}{\bf #1}}
+\newcommand{\indexdef}[1]{\index{#1|idb}{{\bf #1}}}
+\newcommand{\indextxtdef}[2]{\index{#2|idb}{{\bf #1}}}
+
+%-----------------------------------------------
+% quelques "mots" spéciaux
+\newcommand{\slicing}{{\it slicing}\xspace}
+\newcommand{\slicingb}{{\it slicing\ }}
+           % permet de corriger les cas où \slicing est suivi d'une {
+           % car il semble que xspace gère mal ce cas.
+\newcommand{\caml}{{\sc Ocaml}\xspace}
+\newcommand{\caveat}{{\sc Caveat}\xspace}
+\newcommand{\cil}{{\sc CIL}\xspace}
+\newcommand{\ppc}{{\sc Frama-C}\xspace}
+\newcommand{\from}{{\sc From}\xspace}
+
+\newcommand{\mylet}{\text{\it let }}
+\newcommand{\myin}{\text{\it in }}
+
+\DeclareMathOperator{\Call}{\mathcal{C\mathit{all}}}
+
+\makeatletter
+\newcommand*{\motcle}[3]{%
+  \index{#2!#1}%
+  \expandafter \@ifdefinable \csname #3#1\endcsname {%
+    \global \@namedef{#3#1}{\textit{#1}}%
+    }%
+}
+\makeatother
+
+%------------------------------------------------------------------------------
+\newcommand{\verbtt}[1]{{\small{\tt{#1}}}}
+%------------------------------------------------------------------------------
+% Légende des figures :
+\usepackage[hang,small]{caption}
+\renewcommand{\captionfont}{\it}
+\renewcommand{\captionlabelfont}{\it \bf \small}
+%\renewcommand{\captionlabeldelim}{ : }
+%-----------------------------------------------
+% prend le nom du fichier
+% et éventuellement un facteur d'échelle (1 par défaut)
+\newcommand{\uneimage}[1]{
+    \includegraphics[width=1\textwidth]{#1}
+}
+%--------------------------------
+\newcommand{\labcenterepsfig}[3]{
+  \begin{center}
+  \begin{figure}[hbt]
+    \centering{
+    \leavevmode
+    \uneimage{#1}
+    }
+    \caption{\label{#3} #2}
+  \end{figure}
+  \end{center}
+  }
+%------------------------------------------------------------------------------
+\newenvironment{debutenv}[1]
+  {
+    \vspace{5mm}
+    \begin{footnotesize}
+      \setenvclass{minipage}{myminipage}
+      \noindent\begin{minipage}[t]{\textwidth}
+      \fbox{\bf #1} \hrule
+    \vspace{3mm}
+  }
+  {
+    \end{minipage}
+    \end{footnotesize}
+  }
+\newenvironment{finenv}
+  {
+    \begin{footnotesize}
+      \setenvclass{minipage}{myminipage}
+    \noindent\begin{minipage}[t]{\textwidth}
+  }
+  {
+    \hrule
+    \
+    \end{minipage}
+    \end{footnotesize}
+    \vspace{5mm}
+  }
+\newenvironment{monenv}[1]
+  {\begin{debutenv}{#1}}
+  {\end{debutenv}
+   \par
+   \begin{finenv}
+   \end{finenv}}
+
+\newcounter{numexemple}
+\newcommand{\titreexemple}{%
+  \stepcounter{numexemple}{Exemple \arabic{numexemple}}}
+
+\newenvironment{exemple}
+  {\begin{monenv}{\titreexemple}}
+  {\end{monenv}}
+
+\newenvironment{exemple1}
+  {\begin{debutenv}{\titreexemple}}
+    {\end{debutenv}}
+
+\newenvironment{exemple2}
+  {\begin{finenv}}
+    {\end{finenv}}
+
+\newenvironment{astuce}
+  {\begin{monenv}{Astuce}}
+  {\end{monenv}}
+
+\newenvironment{definition}[1]
+  {\begin{monenv}{Definition (#1)}}
+  {\end{monenv}}
+
+\newenvironment{algo}[1]
+  {\begin{monenv}{Algorithme (#1)}}
+  {\end{monenv}}
+
+\newcounter{numrque}
+\newenvironment{remarque}[1]
+  {\refstepcounter{numrque}{\bf Remarque \arabic{numrque}} :\label{#1}}
+  {}
+%==============================================================================
diff --git a/doc/slicing/main.tex b/doc/slicing/main.tex
new file mode 100644
index 0000000000000000000000000000000000000000..a95e2a4163b83cb2eaa8a26b036775a612a1dc0c
--- /dev/null
+++ b/doc/slicing/main.tex
@@ -0,0 +1,31 @@
+\documentclass[a4paper,11pt,twoside,openright,web,lang=french]{frama-c-book}
+
+%\usepackage[french]{babel}
+
+\input{macros_slicing.tex}
+%==============================================================================
+\begin{document}
+
+\coverpage{Slicing --- Documentation technique}
+
+\begin{titlepage}
+\begin{flushleft}
+\includegraphics[height=14mm]{../images/cealistlogo.jpg}
+\end{flushleft}
+\vfill
+\title{Documentation du greffon Slicing}{Conception d'un outil de Slicing}
+\author{Anne Pacalet et Patrick Baudin}
+\begin{tabular}{l}
+CEA List, Laboratoire de Sûreté et Sécurité des Logiciels, Saclay, F-91191 \\
+\end{tabular}
+\vfill
+\begin{flushleft}
+  \textcopyright 2006-2020 CEA LIST
+
+\end{flushleft}
+\end{titlepage}
+
+\begin{sloppypar}
+\input{slicing.tex}
+\end{sloppypar}
+\end{document}
diff --git a/doc/slicing/man.tex b/doc/slicing/man.tex
new file mode 100644
index 0000000000000000000000000000000000000000..a07780b7a58de5afc87bec93c8a8baca66816430
--- /dev/null
+++ b/doc/slicing/man.tex
@@ -0,0 +1,120 @@
+\chapter{Utilisation}\label{sec-man}
+
+Dans ce chapitre essaye de présenter quelques bases qui permettent de tester
+la boîte à outil de \slicing à partir de l'interpréteur ou
+d'un fichier de commande.
+Pour l'utilisation de l'interface graphique,
+ se reporter à la documentation correspondante.
+Il est également possible d'exécuter certaines actions élémentaires
+en ligne de commande. Voir les options proposées à l'aide de~:
+\begin{center}
+\verb!bin/toplevel.top --help!
+\end{center}
+
+\section{Utilisation interactive}
+
+Lorsqu'on lance l'outil pour faire du slicing, il faut lui fournir le ou les
+fichiers à analyser, et au minimum l'option \verbtt{-deps}
+qui permet d'effectuer l'analyse de
+dépendances (utiliser \verbtt{--help} pour voir les autres options)~:
+\begin{center}
+\verb!bin/toplevel.top -deps fichier.c!
+\end{center}
+
+On se retrouve alors avec un prompt \verb!#!
+qui signale que l'on est sous un interpréteur \caml.\\
+
+Pour quitter l'interpréteur, il faut utiliser la commande~:
+\begin{center}
+\verb!#quit;;!
+\end{center}
+
+(le \verb!#! n'est pas le prompt, il fait parti de la commande).
+On peut aussi utiliser \verbtt{Ctrl-D}.
+
+\begin{astuce}\label{astuce-ledit}
+Comme tout interpréteur \caml, il n'a pas de capacité d'éditer la ligne de
+commande (pour corriger une faute de frappe par exemple), ni d'historique (pour
+rappeler une commande précédente). Il est donc fortement conseillé, même si ce
+n'est pas indispensable, d'installer
+\indextxt{\verbtt{ledit}}, que l'on peut obtenir à l'adresse~: \\
+\url{ftp://ftp.inria.fr/INRIA/Projects/cristal/Daniel.de\_Rauglaudre/Tools/}.
+Il suffit ensuite de faire précéder le nom de la commande par \verbtt{ledit}, tout
+simplement.
+Faire \verbtt{man ledit} pour avoir plus d'information sur les possibilités de cet
+outil.
+\end{astuce}
+
+Sous l'interpréteur, on peut utiliser n'importe quelle instruction \caml,
+et toutes les commandes spécifiques à l'outil.
+
+Pour ceux qui ne sont pas familier avec \caml,
+pour lancer une commande, il faut taper son nom suivie des arguments,
+ou de parenthèses vide s'il n'y a pas d'arguments, et terminer par deux
+points-virgules.
+
+L'interpréteur affiche le type de retour de la commande
+(\verbtt{unit} correspond au type vide),
+suivi éventuellement de la valeur retournée.
+Dans la plupart des cas, la première information n'intéresse pas l'utilisateur,
+mais cet affichage ne peut pas être désactivé.
+Il peut parfois être utile pour retrouver la signature des commandes<
+par exemple~:
+
+\centerline{\tt module S = Db.Slicing;;}
+
+affiche le type du nouveau module S, et permet donc de voir la liste des
+commandes du module \verbtt{Db.Slicing}.\\
+
+L'organisation de \ppc regroupe toutes les commandes dans le module \verbtt{Db}.
+Le sous-module \verbtt{Db.Slicing} contient les commandes de \slicing.
+Le nom d'une commande doit normalement être préfixé par le nom du
+module a qui elle appartient.
+Pour pouvoir utiliser les noms sans
+préfixe, il faut ouvrir le module à l'aide de~:
+
+\centerline{\tt open Db;;}
+
+On peut aussi choisir de renommer le module pour avoir un préfixe plus court~:
+
+\centerline{\tt module S = Db.Slicing;;}
+
+Des commandes provenant d'autres modules sont également utiles
+dans le cadre de l'utilisation du \slicing.
+\verbtt{Kui}, en particulier,
+fournit des fonctions qui permettent de naviguer dans les
+informations générées par les autres analyseurs.
+
+\section{Fichier de commandes}
+
+Les commandes peuvent être tapées directement, mais on peut également charger
+des fichiers contenant les commandes grâce à la commande \verb!#use "cmds.ml";;!.
+Le contenu du fichier \verbtt{cmds.ml} est alors interprété comme si on l'avait
+tapé, et on reprend la main sous l'interpréteur à l'issue de son exécution.\\
+
+Si l'on veut simplement lancer un fichier de commandes,
+on peut utiliser la redirection Unix.
+L'interpréteur se terminera alors à la rencontre du EOF (fin de fichier).
+
+\begin{astuce}\label{astuce-jnl-ledit}
+En utilisant \verbtt{ledit} (voir l'astuce \vpageref{astuce-ledit})
+on obtient également la possibilité de mémoriser
+l'historique, et d'avoir donc une journalisation des commandes lancées (très
+pratique comme base pour écrire un script, ou pour rejouer une séquence).
+Pour cela, il suffit de taper~:
+
+\centerline{{\tt ledit -h cmds.ml bin/toplevel.top} ... arguments...}
+\end{astuce}
+
+\section{Exemples}
+
+Quelques exemples d'utilisation peuvent être trouvées dans le répertoire de
+test. Les deux fichiers suivant fournissent quelques fonctions qui facilitent
+l'utilisation~:
+\begin{itemize}
+  \item \verbtt{libSelect.ml} propose une interface simplifiée pour des sélections
+    simples,
+  \item \verbtt{libAnim.ml} permet de générer des représentations graphiques du
+    projet à différentes étapes de sa construction afin de visualiser
+    les relations entre les spécialisations.
+\end{itemize}
diff --git a/doc/slicing/projets.tex b/doc/slicing/projets.tex
new file mode 100644
index 0000000000000000000000000000000000000000..dabfdf57a982b47e52d8855a9dca8b8647246019
--- /dev/null
+++ b/doc/slicing/projets.tex
@@ -0,0 +1,335 @@
+\chapter{Projets}\label{sec-projets}
+
+Ce chapitre regroupe diverses idées qui ont été évoquées à un moment ou un
+autre, et qui ont soit été abandonnées, soit remises à plus tard.
+
+\section{Autres critères}
+
+\subsection{Spécifier ce qu'on ne veut plus}
+
+Un autre critère intéressant de \slicing, qui n'apparaît dans aucun papier,
+serait, je pense, de pouvoir spécifier ce que l'on veut enlever.
+Par exemple, {\it "que devient le programme si on ne s'intéresse pas
+à telle sortie ou à tel traitement"}.\\
+
+Par ailleurs, l'analyse de dépendance utilisée pour le \slicing
+peut également être utilisée pour calculer des informations utiles à d'autres
+analyses. On peut par exemple s'intéresser aux variables dont la valeur
+détermine la sortie d'une boucle; ce qui peut être utiliser comme un indice
+sur les élargissements à effectuer dans une interprétation abstraite.
+
+\subsection{Calcul d'une variable globale}
+
+Le premier filtrage global vise à sélectionner les instructions qui
+participent au calcul d'une variable globale donnée.
+Comme on a accès par ailleurs à la liste des sorties de chaque fonction,
+il suffit de générer les filtres permettant de calculer
+cette variable sur chaque fonction l'ayant comme sortie.
+
+\section{Utilisation de la sémantique}
+
+Cette partie regroupe quelques idées d'évolutions pour améliorer le \slicing
+d'une fonction en utilisant la sémantique des instructions.
+Certaines d'entre elles ont été implémentées dans l'outil précédent;
+d'autres ne sont que des pistes qui restent à explorer.
+
+\subsection{Réduction relative à une contrainte}
+
+Dans l'outil précédent, une commande permettait de couper une branche
+en remplaçant le test de la condition de chemin par un {\tt assert}.\\
+
+Plus généralement,
+on s'intéresse ici à une contrainte représentant une assertion dans le code.
+On aimerait déplacer cette contrainte
+afin de déterminer un point où elle est impossible (réduite à {\it false}).
+On pourrait alors {\it couper} alors la branche correspondante.
+
+Le test conditionnel
+permettant d'accéder à cette branche peut être transformé en assertion,
+ou être supprimé (option ?).
+Dans le premier cas, les données utilisées dans le test
+sont visibles alors que dans le second,
+elles peuvent éventuellement être supprimées
+si elles ne servent pas par ailleurs.
+
+On peut aussi ôter les instructions qui ne sont plus utiles.
+La détection de code mort permet par exemple de supprimer les éléments qui
+n'étaient utilisés que dans la branche supprimée.
+
+\begin{exemple}
+Dans la séquence suivante~:
+\begin{center}
+\mbox{\texttt x = c+1; a = 2; if (c) x += a; y = x+1;}
+\end{center}
+
+si on demande à sélectionner les dépendances de \verbtt{y}, puis à supprimer la
+branche \verb!if (c)!, on obtient~:
+\begin{center}
+\mbox{\texttt x = c+1; \sout{a = 2;} {\bf assert (!c);} \sout{x += a;} y = x+1;}
+\end{center}
+
+où l'on voit que l'instruction \verb!a=2;! disparaît puis qu'elle ne sert plus.\\
+
+On verra ci-dessous comment on peut aussi déterminer que \verbtt{x} vaut alors $1$
+à l'aide du calcul de WP, et que donc, \verbtt{y} vaut 2 à l'aide de la
+propagation de constantes.
+\end{exemple}
+
+Le problème général lorsque l'on impose des contraintes,
+c'est qu'elles peuvent aussi influencer les résultats d'autres analyses
+comme l'analyse de valeur. On en verra un cas particulier
+ci-dessous avec la propagation de constante.
+
+%--------------------------------------
+\subsection{Passage à un point de programme}
+
+La contrainte dont nous venons de parler peut également être donnée
+implicitement en spécifiant un point de programme. Il s'agit alors d'être
+capable de supprimer ce qui ne sert pas lorsque l'exécution de la fonction passe
+par ce point. Une telle requête peut par exemple être utilisée dans le cadre
+d'une analyse d'impact.\\
+
+Une première étape peut consister à supprimer les branches incompatibles avec le
+point en ne regardant que la syntaxe.
+
+\begin{exemple}
+Dans la séquence suivante~:
+\begin{center}
+\mbox{\texttt if (c) P: x += a; else y = x+1;}
+\end{center}
+si l'utilisateur souhaite examiner le passage au
+point P, on peut éliminer la branche {\texttt else}~:
+\begin{center}
+\mbox{\texttt {\bf assert (c);} P: x += a; \sout{else y = x+1;}}
+\end{center}
+Attention, ceci n'est vrai que si la séquence n'est pas dans une boucle...
+\end{exemple}
+
+Mais il peut être plus intéressant de calculer une précondition qui assure que
+l'on passe par le point donné, et d'utiliser ce résultat comme une contrainte.\\
+
+\remarque{rem-wp} Attention,
+il faut noter que cette précondition ne peut généralement pas être
+calculée par un simple WP car celui-ci assure qu'une propriété est vraie
+si la fonction est exécutée avec des entrées satisfaisant la précondition,
+mais il n'assure pas qu'il n'y a pas d'autres cas possibles.
+Ceci est du à l'approximation introduite par le calcul de WP des boucles.
+
+%--------------------------------------
+\subsection{Propagation de constantes}
+
+D'autres réductions peuvent être effectuées en exploitant
+les constantes du programme.
+
+\begin{exemple}
+Dans la séquence suivante~:
+\begin{center}
+  \verb!x = c ? 1 : -1; if (x<0) f(x); else g(x); !
+\end{center}
+si l'on étudie cette séquence avec une valeur initiale 0 pour \verbtt{c}
+on aimerait savoir déterminer que :
+\begin{itemize}
+\item \verb!x=-1!,
+\item donc que le second test est vrai,
+\item que donc \verbtt{g} ne sera pas appelé,
+\item et que \verbtt{f} sera appelé dans ce contexte avec la valeur \verb!-1!.\\
+\end{itemize}
+
+On souhaite donc obtenir~:
+\begin{center}
+  \verb!assert (c == 0); x = -1; f(-1); !
+\end{center}
+\end{exemple}
+
+Ce calcul peut facilement être effectué par une analyse de valeur externe,
+mais il faut pouvoir lui transmettre la contrainte (ici~: $c=0;$).\\
+
+
+Dans l'outil précédent, le module de \slicing (FLD) avait été couplé à
+un module de propagation de constante (CST) de la façon suivante~:
+\begin{itemize}
+  \item pour chaque fonction filtrée, on calcule les états CST correspondants,
+  \item si une branche est supprimée à la demande de l'utilisateur,
+    CST en est informé pour réduire l'état,
+  \item si une constante est associée à une donnée,
+    (par exemple lors de la spécialisation d'une fonction avec un paramètre
+constant)
+    CST en est également informé,
+  \item lors du calcul d'une fonction filtrée, pour chaque saut conditionnel,
+    on interroge CST pour savoir si une branche est inaccessible ($\bot$),
+    et si c'est le cas, les éléments correspondant sont marqués $mM$ (code
+    mort),
+  \item pour chaque appel de fonction, si l'on sait déterminer qu'une ou
+    plusieurs entrées sont constantes, on demande la spécialisation de cette
+    fonction,
+  \item pour chaque appel de fonction, si l'on sait déterminer qu'une ou
+    plusieurs sorties sont constantes, on fournit l'information à CST pour qu'il
+    puisse la propager.
+\end{itemize}
+
+\begin{exemple}
+  Reprenons l'exemple précédent où l'on sait que $c=0$ en 1~:
+\begin{center}
+  \verb!/*1*/ x = c ? /*2*/1 : /*3*/-1; /*4*/if (x<0) /*5*/f(x); else /*6*/g(x); !
+\end{center}
+On a donc~:
+\begin{itemize}
+  \item en \verb!/*1*/! : $c=0$,
+  \item en \verb!/*2*/! : $\bot$ puisque le test est faux,
+  \item en \verb!/*4*/! : $x=-1$,
+  \item en \verb!/*5*/! : toujours $x=-1$,
+  \item en \verb!/*6*/! : $\bot$ puisque le test est toujours vrai,
+\end{itemize}
+Cette séquence est donc réduite à~:
+\begin{alltt}
+  x = \sout{ c ? 1 : } -1; \sout{ if (x>0)} f\_1(x); \sout{ else  g(x); }
+\end{alltt}
+où \verbtt{f\_1} est la fonction \verbtt{f} spécialisée avec son entrée à -1.\\
+\end{exemple}
+
+Quand l'analyse permet de déterminer la valeur précise d'une variable,
+il peut également être intéressant d'utiliser cette information pour effectuer
+une transformation de programme juste avant de produire le résultat.
+On ne peut pas vraiment le faire avant, car on peut être amené à regrouper
+plusieurs fonctions où la valeur peut être différente.\\
+
+
+L'implémentation des points suivants n'a pas été fait dans l'outil précédent,
+et il faudrait donc voir s'il est possible de les intégrer
+dans le nouveau~:
+  \begin{itemize}
+    \item supprimer l'argument correspondant à une entrée constante.
+En effet, lors du calcul de la fonction spécialisée, on ne savait
+pas supprimer l'argument correspondant,
+mais on propageait tout de même la valeur pour supprimer les éventuelles
+branchesmortes. 
+\begin{exemple}
+Dans l'exemple précédent,
+on peut spécialiser \verbtt{f} en \verbtt{f\_1} car on sait que $x=-1$.
+\begin{tabular}{ccl}
+Mais on aimerait aussi transformer &:& \verb! void f_1 (int x) { ... }!\\
+en &:& \verb! void f_1 (void) { int x = -1; ... }!
+\end{tabular}
+\end{exemple}
+\item supprimer le calcul d'une condition de \verbtt{if} toujours vraie quand il
+  n'y a pas de \verbtt{else}. Cela n'avait pas été fait car dans
+le module de propagation de constante,
+il n'y avait pas de point de programme correspondant à la branche
+\verbtt{else} manquante. L'état $\bot$ qui lui aurait été
+ associé n'était donc pas là pour permettre cette suppression.
+
+  \end{itemize}
+
+%--------------------------------------
+\subsection{Utilisation de WP}
+
+Comme on l'a vu, la propagation de constante peut permettre de
+spécialiser les fonctions et de couper des branches de programme.
+
+Ce type calcul s'effectue a priori par propagation avant. 
+Pour faire de la propagation arrière, 
+nous aimerions utiliser un calcul de WP.
+
+Le principe d'utilisation serait le suivant~:
+
+\begin{exemple1}
+  L'utilisateur s'intéresse uniquement à la branche {\it then} du {\it if}.
+  On introduit donc l'assertion $y<0$~:\\
+
+\begin{center}
+\begin{footnotesize}
+\begin{tabular}{|p{5cm}|p{5cm}|}
+  \hline
+Programme source & coupure de branche \\
+  \hline
+\begin{verbatim}
+int f (int c, int x) {
+
+  int y = c ?  1 : -1;
+  if (y < 0) {
+    int z = y - 1;
+    g (z);
+    return z + x;
+    }
+  else
+    return 0;
+}
+\end{verbatim}
+&
+\begin{alltt}
+int f (int c, int x) \{
+
+  int y = c ?  1 : -1;
+ {\bf assert (y < 0); }\{
+  int z = y - 1;
+  g (z);
+  return z + x;
+  \}
+
+
+\}
+\end{alltt}
+\\
+\hline
+\end{tabular}
+\end{footnotesize}
+\end{center}
+\end{exemple1}
+\begin{exemple2}
+\begin{center}
+\begin{footnotesize}
+\begin{tabular}{|p{5cm}|p{5cm}|}
+\hline
+WP & Propagation de constante \\
+\hline
+\begin{alltt}
+int f (int c, int x) \{
+ {\bf /* (c == 0); */ }
+  int y = c ?  1 : -1;
+  assert (y < 0); \{
+    int z = y - 1;
+    g (z);
+    return z + x;
+  \}
+
+\}
+\end{alltt}
+&
+\begin{alltt}
+int f (int c, int x) \{
+  /* (c == 0);  */
+  int y = {\bf /* 0 ?  1 : */} -1;
+  assert ({\bf -1} < 0); \{
+    int z = {\bf -1} - 1;
+    g ({\bf -2});
+    return {\bf -2} + x;
+  \}
+
+\}
+\end{alltt}
+\\
+\hline
+\end{tabular}
+\end{footnotesize}
+\end{center}
+
+Sur cet exemple, l'utilisation du WP permet de déterminer que $c$ vaut 0,
+et qu'il est alors possible de propager cette constante.\\
+
+\end{exemple2}
+
+
+La principale difficulté de l'utilisation d'un tel calcul est le pilotage des
+opérations.
+
+Le plus simple est de laisser l'utilisateur contrôler la propagation
+en utilisant des commandes interactives.
+
+L'idée est de lui permettre de donner une contrainte,
+de la remonter à l'aide de WP, et d'en déduire d'autres propriétés,
+utilisable par exemple par l'analyse de valeur.\\
+
+Attention, ici encore, comme dans la remarque \vref{rem-wp},
+il faudra préalablement
+s'assurer que l'approximation introduite par le WP des boucles est
+bien dans le bon sens relativement à ce que l'on souhaite obtenir...
diff --git a/doc/slicing/propagation.fig b/doc/slicing/propagation.fig
new file mode 100644
index 0000000000000000000000000000000000000000..512154ae8aa67a221b98d4d19c31b84c7ff9e7ae
--- /dev/null
+++ b/doc/slicing/propagation.fig
@@ -0,0 +1,100 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #ff9902
+0 33 #caa671
+0 34 #ff77ff
+0 35 #000000
+5 1 0 1 0 7 75 -1 -1 0.000 0 1 1 0 1366.500 -412.500 990 1080 1440 1125 1890 1035
+	2 1 1.00 60.00 120.00
+5 1 0 1 0 7 75 -1 -1 0.000 0 0 1 0 2002.500 1552.500 1935 2025 1530 1620 1935 1080
+	2 1 1.00 60.00 120.00
+5 1 0 1 0 7 75 -1 -1 0.000 0 1 1 0 1957.500 922.500 2025 1080 2115 990 2025 765
+	2 1 1.00 60.00 120.00
+5 1 0 1 0 7 75 -1 -1 0.000 0 1 1 0 3505.500 2272.500 3645 2610 3870 2250 3645 1935
+	2 1 1.00 60.00 120.00
+6 1305 1125 1575 1440
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1440 1282 90 112 1350 1282 1530 1282
+4 0 0 75 -1 18 14 0.0000 4 150 120 1395 1350 2\001
+-6
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1303 2362 90 112 1213 2362 1393 2362
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3103 2137 90 112 3013 2137 3193 2137
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3015 675 90 112 2925 675 3105 675
+2 4 0 1 0 7 100 -1 -1 0.000 0 0 7 0 0 5
+	 4770 2880 0 2880 0 0 4770 0 4770 2880
+2 1 0 1 0 7 80 -1 20 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 990 2250 1890 2250
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 1971 1872 1971 1962 2061 1917 1971 1872
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 2565 1935 2610 2025 2655 2025 2565
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 2475 1935 2520 2025 2565 2025 2475
+2 1 0 1 0 7 80 -1 20 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2610 2250 3510 2250
+2 1 0 1 0 7 75 -1 -1 0.000 0 0 -1 1 0 2
+	2 1 1.00 60.00 120.00
+	 2070 495 2070 225
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 1971 1962 1971 2052 2061 2007 1971 1962
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 3645 2475 3555 2520 3645 2565 3645 2475
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 630 1935 675 2025 720 2025 630
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 1125 1935 1170 2025 1215 2025 1125
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 1935 945 1935 1035 2025 990 1935 945
+2 3 0 1 0 7 75 -1 20 0.000 0 0 -1 0 0 4
+	 2025 1215 1935 1260 2025 1305 2025 1215
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 3555 1962 3555 2052 3645 2007 3555 1962
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 3555 1872 3555 1962 3645 1917 3555 1872
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 3645 2565 3555 2610 3645 2655 3645 2565
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 1935 450 1935 540 2025 495 1935 450
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 1935 540 1935 630 2025 585 1935 540
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 2025 720 1935 765 2025 810 2025 720
+2 3 0 1 0 7 50 -1 0 0.000 0 0 7 0 0 4
+	 1935 1035 1935 1125 2025 1080 1935 1035
+2 4 0 1 0 7 80 -1 18 0.000 0 0 7 0 0 5
+	 2610 2700 1890 2700 1890 1800 2610 1800 2610 2700
+2 4 0 1 0 7 90 -1 18 0.000 0 0 7 0 0 5
+	 2610 1350 1890 1350 1890 270 2610 270 2610 1350
+2 4 0 1 0 7 80 -1 15 0.000 0 0 7 0 0 5
+	 4230 2700 3510 2700 3510 1800 4230 1800 4230 2700
+2 4 0 1 0 7 50 -1 10 0.000 0 0 7 0 0 5
+	 990 2700 270 2700 270 1800 990 1800 990 2700
+2 4 0 1 0 7 50 -1 10 0.000 0 0 7 0 0 5
+	 990 1350 270 1350 270 270 990 270 990 1350
+3 2 0 1 0 7 75 -1 -1 0.000 0 0 0 3
+	 3555 1935 3015 810 2025 495
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 75 -1 -1 0.000 0 1 0 4
+	2 1 1.00 60.00 120.00
+	 2070 765 2700 1170 3060 2250 3555 2610
+	 0.000 -1.000 -1.000 0.000
+4 0 0 40 -1 18 12 0.0000 4 135 75 540 225 f\001
+4 0 0 40 -1 18 12 0.0000 4 180 345 450 1080 g();\001
+4 0 0 40 -1 18 12 0.0000 4 150 105 540 1710 g\001
+4 0 0 40 -1 18 12 0.0000 4 180 315 2070 1710 g_1\001
+4 0 0 40 -1 18 12 0.0000 4 180 285 2070 180 f_1\001
+4 0 0 89 -1 18 12 0.0000 4 180 555 2070 675 g_2();\001
+4 0 0 89 -1 18 12 0.0000 4 180 555 2070 1215 g_1();\001
+4 0 0 40 -1 18 12 0.0000 4 180 345 450 720 g();\001
+4 0 0 40 -1 18 12 0.0000 4 180 315 3690 1710 g_2\001
+4 0 0 75 -1 18 14 0.0000 4 150 120 1260 2430 1\001
+4 0 0 75 -1 18 14 0.0000 4 150 120 3060 2205 3\001
+4 0 0 75 -1 18 14 0.0000 4 150 120 2970 765 4\001
diff --git a/doc/slicing/slicing.tex b/doc/slicing/slicing.tex
new file mode 100644
index 0000000000000000000000000000000000000000..451b46fef43b3658a22e01569bc75cea49c135ca
--- /dev/null
+++ b/doc/slicing/slicing.tex
@@ -0,0 +1,79 @@
+%===============================================================================
+% Versions
+\section*{Versions}
+
+\begin{small}
+Seules les versions Vx.0 sont des documents achevés~;
+les autres sont à considérer comme des brouillons.
+
+\begin{enumerate}
+  \item[V4.0 -] 2 novembre 2020~:
+    \begin{itemize}
+    \item Document sous licence Creative Commons
+      ``Attribution-ShareAlike 4.0 International''
+      \url{https://creativecommons.org/licenses/by/4.0/}.
+    \end{itemize}
+  \item[V3.0 - ] 3 décembre 2008~:
+    \begin{itemize}
+      \item corrections mineures,
+      \item ajouts sur le \slicing des déclarations globales,
+      \item ajouts de la gestion des annotations.
+    \end{itemize}
+  \item[V2.0 - ] 26 juin 2007~:
+    \begin{itemize}
+      \item extraction de la documentation du PDG,
+      \item mise à jour vis à vis de l'état de l'outil,
+      \item fusion de la documentation sur l'interprocédural,
+      \item réorganisation de la partie sur l'interprocédural,
+      \item mise en annexe des projets non implémentés.
+    \end{itemize}
+  \item[V1.0 - ] 27 juin 2006~:
+    \begin{itemize}
+      \item ajout de la présentation du document,
+      \item ajout du chapitre "Utilisation" (manuel),
+      \item développement du calcul de certains ensembles sur les graphes de
+            dépendances,
+      \item mise à jour du chapitre sur l'interprocédural,
+      \item ajout d'une conclusion résumant l'état d'avancement des travaux.
+    \end{itemize}
+  \item[V0.2 - ] 27 avril 2006~:
+    \begin{itemize}
+      \item réorganisation de la définition des ensembles d'instructions,
+      \item corrections diverses.
+    \end{itemize}
+  \item[V0.1 - ] 22 février 2006~:
+    \begin{itemize}
+      \item bibliographie sur le \slicing,
+      \item analyse du document \cite{baudinImpact},
+      \item ce qu'on prévoit de faire,
+      \item premiers éléments sur la construction de graphe de dépendances,
+      \item intégration et tri des fichiers de l'ancien document (FLD),
+      \item algorithme de calcul des dépendances de contrôle.
+    \end{itemize}
+\end{enumerate}
+\end{small}
+%-------------------------------------------------------------------------------
+% Table des matières
+\cleardoublepage
+\tableofcontents
+%===============================================================================
+\cleardoublepage\input{intro.tex}
+\cleardoublepage\input{fonction.tex}
+\cleardoublepage\input{interproc.tex}
+\cleardoublepage\input{man.tex}
+\cleardoublepage\input{conclusion.tex}
+%===============================================================================
+\appendix
+%--------------------------------------
+\cleardoublepage \input{algo.tex}
+\cleardoublepage \input{interexples.tex}
+\cleardoublepage \input{intercmds.tex}
+\cleardoublepage \input{projets.tex}
+%-------------------------------------------------------------------------------
+\cleardoublepage
+\bibliographystyle{abbrvnat}
+\bibliography{bib-slicing}
+%--------------------------------------
+\cleardoublepage
+\printindex
+%===============================================================================