Control Flow Graph Representation requirements » History » Version 1
Sergey Smolov, 01/12/2016 05:52 PM
1 | 1 | Sergey Smolov | h1. Control Flow Graph Representation requirements |
---|---|---|---|
2 | |||
3 | Набросок каталога требований к подсистеме библиотеки Castle, отвечающей за представление графов потока управления. |
||
4 | Каталог составлялся по мотивам CFG-представления, которое использовалось в инструменте Retrascope 0.1.3, и на данный момент является устаревшим. Тем не менее, некоторые требования каталога сохраняют свою актуальность. |
||
5 | |||
6 | # Граф потока управления — это ориентированный граф, состоящий из вершин Vertex, соответствующих операторам программы, и ребер, соответствующих зависимостям по управлению между ними. Библиотека для работы с графами потока управления состоит из двух частей — представления графов потока и методов работы с графами потока. |
||
7 | # Зависимости по управлению хранятся в виде перекрестных ссылок между родительскими и дочерними вершинами Vertex. Например, родительская вершина Vertex1 содержит ссылку на дочернюю вершину Vertex2 во множестве её дочерних вершин; дочерняя вершина Vertex2 содержит ссылку на родительскую вершину Vertex1 во множестве её родительских вершин. |
||
8 | # Вершины Vertex могут быть как содержащими внутренние вершины Node (композитными), так и атомарными. Композитные вершины имеют метод addVertex(Vertex v) добавления внутренней вершины. |
||
9 | # Вершина Vertex имеет следующие методы: |
||
10 | getType() - возвращает тип вершины; |
||
11 | getId() - возвращает уникальный строковый (String) идентификатор вершины; |
||
12 | getDescription(ExprTreePrinter printer) — возвращает строковое представление вершины в формате указанного принтера; |
||
13 | deepcopy() - возвращает копию вершины без копирования зависимостей по управлению; |
||
14 | hasParents() - возвращает false, если множество родительских вершин пусто, иначе true; |
||
15 | hasChildren() - возвращает false, если множество дочерних вершин пусто, иначе true; |
||
16 | getParents() - возвращает коллекцию родительских Vertex; |
||
17 | getChildren() - возвращает коллекцию дочерних Vertex; |
||
18 | getOnlyParent() - если вершина имеет единственную родительскую вершину, то возвращает её, иначе возвращает первый элемент коллекции родительских вершин; |
||
19 | getOnlyChild() - если вершина имеет единственную дочернюю вершину, то возвращает её, иначе возвращает первый элемент коллекции дочерних вершин; |
||
20 | addParent(Vertex v) — добавляет указанную вершину в коллекцию родительских, если указанная вершина не является родительской и добавление новой родительской вершины допустимо, иначе бросает исключение; |
||
21 | addChild(Vertex v) — добавляет указанную вершину в коллекцию дочерних, если указанная вершина не является дочерней и добавление новой дочерней вершины допустимо, иначе бросает исключение; |
||
22 | removeParent(Vertex v) — удаляет указанную вершину из коллекции родительских, если она там присутствует, иначе бросает исключение; |
||
23 | removeChild(Vertex v) — удаляет указанную вершину из коллекции дочерних, если она там присутствует, иначе бросает исключение. |
||
24 | #1 Вершина Vertex имеет ряд методов хранения и предоставления мета-информации. Мета-информация хранится в виде пар «<ключ, значение>». Ключ и значение мета-информации имеют строковый (String) тип. На ключи мета-информации накладывается требование уникальности. |
||
25 | hasMetaInfo(String key) — если хранилище мета-информации (далее - хранилище) содержит пару с указанным ключом, то возвращает true, иначе возвращает false; |
||
26 | getMetaInfo(String key) — если хранилище содержит пару с указанным ключом, то возвращает соответствующее значение, иначе возвращает null; |
||
27 | getMetaInfo() - возвращает всю доступную мета-информацию для данной вершины в виде Map<String,String>; |
||
28 | addMetaInfo(String key, String value) — если хранилище содержит пару с указанным ключом, то заменяет значение на указанное, иначе помещает в хранилище пару «<key, value>»; |
||
29 | removeMetaInfo(String key) — если хранилище содержит пару с указанным ключом, удаляет её, иначе не делает ничего. |
||
30 | # Некоторые вершины имеют методы получения используемых и определяемых в данной вершине переменных (зависимости по данным). |
||
31 | getUses() - возвращает множество Set<NodeVariable> переменных, используемых в данной вершине; |
||
32 | getDefines() - возвращает множество Set<NodeVariable> переменных, определяемых в данной вершине. |
||
33 | # Все вершины Vertex классифицируются по типам. Тип вершины определяет, сколько родительских и сколько дочерних вершин может иметь вершина, имеет ли она методы получения зависимостей по данным. |
||
34 | Тип вершины может принимать следующие значения: BasicBlock, Case, Merge, Sink, Source, Switch. В следующей таблице приведены сравнительные характеристики вершин указанных типов. |
||
35 | Вершина типа BasicBlock соответствует оператору базового блока. Базовый блок содержит упорядоченную последовательность присваиваний Assignment. Присваивание — это пара «<ranged_variable,expression>», состоящая из определяемой переменной (или части переменной) ranged_variable и используемого выражения expression. Выражение имеет тип Node. Определяемая переменная состоит из переменной NodeVariable и диапазона Ranged (возможно, пустого). Диапазон — это пара «<Node, Node>» индексов, определяющих некоторую часть определяемой переменной (элемент массива, часть битового вектора и т. п.). |
||
36 | Вершина типа Case соответствует значению условного оператора. Вершина содержит набор допустимых значений NodeValue оператора. Тип значений оператора должен совпадать с типом условного выражения в родительской вершине типа Switch. |
||
37 | Вершина типа Merge соответствует точке объединения потоков управления. |
||
38 | Вершина типа Sink соответствует точке завершения потоков управления. |
||
39 | Вершина типа Source соответствует точке начала потоков управления. |
||
40 | Вершина типа Switch соответствует условному оператору (оператору ветвления). Вершина содержит условное выражение типа Node. Тип выражения должен совпадать с типом допустимых значених всех дочерних вершин типа Case. |
||
41 | # Библиотека должна предоставлять реализации следующих методов работы с графами потока управления: |
||
42 | Метод приведения графа к форме однократных присваиваний (Single Static Assignment). Это означает, что каждый пусть в графе от точки начала до точки завершения для каждой определяемой в нем переменной должен содержать не более одного определяющего её присваивания. |
||
43 | Метод обратных постановок для указанной вершины типа Switch и указанной упорядоченной последовательности вершин типа BasicBlock. Это означает, что в обратном относительно указанного в последовательности порядке для каждой вершины типа BasicBlock выбираются определяемые переменные и в выражении вершины типа Switch заменяются все их вхождения на используемые в присваиваниях выражения. |