Otawa  0.10
CFG (Control Flow Graph)

This module allows to represents program as a Control Flow Graph (CFG). More...

Classes

class  otawa::BasicBlock::Bundle
 A bundle, in a VLIW processors, is a group of instructions executed in parallel. More...
 
class  otawa::BasicBlock::BundleIter
 Iterator on bundles composing a basic block. More...
 
class  otawa::CFG
 Control Flow Graph representation. More...
 
class  otawa::CFGBuilder
 This processor is used for building the CFG from the binary program representation. More...
 
class  otawa::CFGChecker
 The analysis does not produce anything but simply check some properties on the involved CFG: More...
 
class  otawa::CFGCheckSummer
 Add to each involved CFG a checksum build on the instruction of the CFG. More...
 
class  otawa::CFGCollection
 Contains a collection of CFGs (used with INVOLVED_CFGS property). More...
 
class  otawa::CFGCollector
 This processor is used to collect all CFG implied in a computation. More...
 
class  otawa::DelayedBuilder
 This processor handle the delayed branch information provided by otawa::DELAYED_FEATURE to transform the CFG to let other processor ignore the delayed branch effects. More...
 
class  otawa::CFGSaver
 Save the CFGs of the current task to a file. More...
 
class  otawa::LoopReductor
 
class  otawa::LoopUnroller
 This processor unrolls the first iteration of each loop. More...
 
class  otawa::pfg::PFG
 A PFG (Program Flow Graph) is built from the binary form of the program to represent all possible pathes of the program from its entry point. More...
 
class  otawa::CFGInfo
 This allows storing all CFG available in a workspace. More...
 

Functions

Identifier< CFG * > otawa::ENTRY ("otawa::ENTRY", 0)
 Identifier used for storing and retrieving the CFG on its entry BB. More...
 
Identifier< int > otawa::INDEX ("otawa::INDEX",-1)
 Identifier used for storing in each basic block from the CFG its index. More...
 
p::feature otawa::CFG_INFO_FEATURE ("otawa::CFG_INFO_FEATURE", new Maker< CFGBuilder >())
 Feature asserting that the CFG has been scanned in the program. More...
 
SilentFeature otawa::CHECKED_CFG_FEATURE ("otawa::CHECKED_CFG_FEATURE", maker)
 This feature ensures that. More...
 
SilentFeature otawa::CFG_CHECKSUM_FEATURE ("otawa::CFG_CHECKSUM_FEATURE", maker)
 This feature ensures that each CFG has hooked a checksum allowing to check binary modifications between launch of an OTAWA application. More...
 
Identifier< unsigned long > otawa::CHECKSUM ("otawa::CHECKSUM", 0)
 This property hooked on a CFG provides a checksum build on the instruction of the CFG. More...
 
Identifier< const CFGCollection * > otawa::INVOLVED_CFGS ("otawa::INVOLVED_CFGS", 0)
 This property is used to link the current computation involved CFG on the framework. More...
 
Identifier< Edge * > otawa::CALLED_BY ("otawa::CALLED_BY", 0)
 This properties are put on a CFG to get the list of edges calling it. More...
 
SilentFeature otawa::COLLECTED_CFG_FEATURE ("otawa::COLLECTED_CFG_FEATURE", COLLECTED_CFG_MAKER)
 This feature asserts that all CFG involved in the current computation has been collected and accessible thanks to INVOLVED_CFGS property. More...
 
SilentFeature otawa::DELAYED_CFG_FEATURE ("otawa::DELAYED_CFG_FEATURE", maker)
 This feature informs that the current microprocessor supports delayed branches and that the CFG has been changed to reflect effect of delay branches. More...
 
Identifier< bool > otawa::DELAYED_INST ("otawa::DELAYED_INST", false)
 This property is set on instruction of a delayed branch. More...
 
Identifier< bool > otawa::DELAYED_NOP ("otawa::DELAYED_NOP", false)
 This property is true on NOP instructions insserted due to branch delay. More...
 
Identifier< sys::Path > otawa::CFG_IO_PATH ("otawa::CFG_IO_PATH")
 This property allows to configure the file used by CFGLoader and CFGSaver. More...
 
SilentFeature otawa::UNROLLED_LOOPS_FEATURE ("otawa::UNROLLED_LOOPS_FEATURE", UNROLLED_LOOPS_MAKER)
 This feature that the loops have been unrolled at least once. More...
 
Identifier< BasicBlock * > otawa::UNROLLED_FROM ("otawa::UNROLLED_FROM", 0)
 Put on the header ex-header of a loop, this property gives the BB of the unrolled loop. More...
 
SilentFeature otawa::PFG_FEATURE ("otawa::PFG_FEATURE", pfg::maker)
 Feature providing the PFG of the application. More...
 
Identifier< pfg::PFG * > otawa::PFG ("otawa::PFG", 0)
 PFG of the program. More...
 
Identifier< pfg::BB * > otawa::PFG_BB ("otawa::PFG_BB", 0)
 Link of pfg::BB on an in instruction. More...
 
Identifier< CFGInfo * > otawa::CFG_INFO ("otawa::CFG_INFO", 0)
 Get the collection of CFG found in the program. More...
 
 otawa::BasicBlock::Bundle::Bundle (void)
 Simple bundle constructor. More...
 

Variables

Identifier< CFG * > otawa::ENTRY
 Identifier used for storing and retrieving the CFG on its entry BB. More...
 
Identifier< int > otawa::INDEX
 Identifier used for storing in each basic block from the CFG its index. More...
 
p::feature otawa::CFG_INFO_FEATURE
 Feature asserting that the CFG has been scanned in the program. More...
 
SilentFeature otawa::CHECKED_CFG_FEATURE
 This feature ensures that. More...
 
SilentFeature otawa::CFG_CHECKSUM_FEATURE
 This feature ensures that each CFG has hooked a checksum allowing to check binary modifications between launch of an OTAWA application. More...
 
Identifier< unsigned long > otawa::CHECKSUM
 This property hooked on a CFG provides a checksum build on the instruction of the CFG. More...
 
Identifier< const CFGCollection * > otawa::INVOLVED_CFGS
 This property is used to link the current computation involved CFG on the framework. More...
 
Identifier< Edge * > otawa::CALLED_BY
 This properties are put on a CFG to get the list of edges calling it. More...
 
SilentFeature otawa::COLLECTED_CFG_FEATURE
 This feature asserts that all CFG involved in the current computation has been collected and accessible thanks to INVOLVED_CFGS property. More...
 
SilentFeature otawa::DELAYED_CFG_FEATURE
 This feature informs that the current microprocessor supports delayed branches and that the CFG has been changed to reflect effect of delay branches. More...
 
Identifier< bool > otawa::DELAYED_INST
 This property is set on instruction of a delayed branch. More...
 
Identifier< bool > otawa::DELAYED_NOP
 This property is true on NOP instructions insserted due to branch delay. More...
 
Identifier< sys::Path > otawa::CFG_IO_PATH
 This property allows to configure the file used by CFGLoader and CFGSaver. More...
 
SilentFeature otawa::UNROLLED_LOOPS_FEATURE
 This feature that the loops have been unrolled at least once. More...
 
Identifier< BasicBlock * > otawa::UNROLLED_FROM
 Put on the header ex-header of a loop, this property gives the BB of the unrolled loop. More...
 
SilentFeature otawa::PFG_FEATURE
 Feature providing the PFG of the application. More...
 
Identifier< pfg::PFG * > otawa::PFG
 PFG of the program. More...
 
Identifier< pfg::BB * > otawa::PFG_BB
 Link of pfg::BB on an in instruction. More...
 
Identifier< CFGInfo * > otawa::CFG_INFO
 Get the collection of CFG found in the program. More...
 
static Identifier< bool > otawa::CFGChecker::NO_EXCEPTION
 In configuration of otawa::CFGChecker . More...
 
static Identifier< CFG * > otawa::CFGCollector::ADDED_CFG
 This configuration property allows to add unlinked CFG to the used CFG collection. More...
 
static Identifier< CString > otawa::CFGCollector::ADDED_FUNCTION
 This configuration property allows to add unlinked functions to the used CFG collection. More...
 
static Identifier< CFGInfo * > & otawa::CFGInfo::ID = CFG_INFO
 This property allows to get the CFG information from the current CFG is member of. More...
 

Detailed Description

This module allows to represents program as a Control Flow Graph (CFG).

The CFG is graph representation of the execution path of the program where nodes, BasicBlock, represents blocks of sequential instructions and edges, Edge, the control flow transitions between blocks.

Using the CFG

Most analyses only read the CFG structure and either use the properties of the CFG, or creates new properties. They only need to understand the structure of the CFG.

Most classes, features and identifier are accessible in the header file:

A CFG is made mainly of 3 classes:

These classes are subclasses of PropList and therefore support properties.

To visit a CFG, one has to start from either the entry, or the exit BB (that are not virtual blocks and does not match any code in the program) and follows the edges (be aware that a CFG may contain loops !). To get the outputting edges of a BB, the following code based on the iterator BasicBlock::OutIterator may apply:

for(BasicBlock::OutIterator edge(bb); edge; edge++)
process(edge);

Another way to work CFG is to make the analysis class to inherit from one of the following standard processors:

They will avoid the hassle work of traversing the different CFGs of the task and BB and edges inside the CFGs.

As an example, the following analysis outputs the CFG and disassemble the instructions in the BB.

class Disassembler: public BBProcessor {
protected:
virtual void processCFG(WorkSpace *ws, CFG *cfg) {
cout << "CFG " << cfg->label() << io::endl;
}
virtual void processBB(WorkSpace *ws, CFG *cfg, BasicBlock *bb) {
if(bb->isEnd())
return;
cout << "\t" << bb << io::endl;
cout << "\t\t" << inst->address() << "\t" << *inst << io::endl;
}
};

The traversal of the graph following edges requires the understanding of the kind of the edges:

Notice that you shouldn't use the Edge::target() method for an edge of type Edge::CALL but instead the Edge::calledCFG() that gives the CFG of the called sub-program.

One may also observe that the CFG representation fully supports transformations like inlining of called sub-program or the representation of a possible exception raise. As shown in the section on the transformation of CFG, these transformations does not duplicate code or changes the original program. Only the representation is modified and aims at improving the precision in some particular cases. Whatevern the Edge::VIRTUAL_CALL, Edge::VIRTUAL_RETURN, Edge::EXN_CALL and Edge::EXN_RETURN provides more information on the transformed CFG:

Finally, a CFG may be called at different points in the other CFGs of the program, the properties CALLED_BY hooked to the CFG allows to get the matching calling edges:

for(Identifier<Edge *>::Getter edge(cfg, CALLED_BY); edge; edge++)
processCaller(cfg, edge);

Building the CFGs

Once a program is loaded, OTAWA has only two information item on the structure of the program: the block of bytes representing the program and the startup address of the program. In addition, according to the option of linkage, other symbols may be available like the entry points of the functions composing the program.

From this, OTAWA must decode the instructions from these entry points and follows all execution paths until fully decoding the program. This first phase is performed the CFGBuilder analysis that produces as an output, a CFGInfo, the collection of all CFGs (one by function) of the program. This phase is relatively complex and may fail because of:

For the latter case, you can help CFGBuilder by providing information on the possible branches using the properties below:

This properties are usually set by the FlowFactLoader from textual or XML files. Once may also observe that this properties allows also to change artificially the control flow according to the needs of a user. For example, one can avoid the "printf" function to be called by putting a property NO_CALL on its entry instruction.

Once the global CFGs of the program are built, the user is usually interested only in a subset of CFGS corresponding to the task the WCET is computed for. This subset is gathered by the CFGCollector analysis from one of the following properties:

As a result, the INVOLVED_CFGS (type CFGCollection) hooked to the workspace provides this list of functions that is used by the following analyses to perform the WCET computation. Notices that the first CFG of the collection is the entry point of the task. Remark also that the obtained CFG are a copy of the original CFG of the global decoding of the program: this means that you add as many properties to the collected CFG without impacting the CFGs of the global analysis.

Loops in the CFGs

Loops are a common shared issue when handling CFG. OTAWA provides several way to cope with loops. First two features allows to identify loops: LOOP_HEADERS_FEATURE and LOOP_INFO_FEATURE.

The LOOP_HEADERS_FEATURE allows to identify the loops in the CFG. Basically, it finds the back-edges (edges causing the looping) and, from these, the header of the loops. Each loop is defined by its header basic block that is the first basic block traversed when entering a loop. An header basic block is the header of only one loop and is a good way to identify the loop. The following properties are set:

This feature is implemented by the Dominance analysis or SpanningTreeBuilder.

If LOOP_HEADERS_FEATURE provides minimal information on a loop, LOOP_INFO_FEATURE allows to get full details sometimes for some analyses. The following properties are set:

As shown above, the loop handled by OTAWA supports only one entry point and header. This is a classic definition of so-called "regular" loops. Even if this is the most common loop found, some programs exhibit "irregular" loops (at least, two possible entry point). A usual way to support such a loop is to choose one entry point and to duplicate the code of the other entry points: this may be done in OTAWA using the analysis LoopReductor.

Transforming the CFG

CFGs in OTAWA are designed to be light representation of the program, that is, they support duplication with a minimal cost in term of memory footprint. This means, for example, that the precision of the computed WCET may be improved by duplicating some parts of the CFG to cope more precisely with the context of the code. Several OTAWA code processors provide such transformations.

The Virtualizer allows to inline the called function at the location they are called. Therefore, if a function is called at several locations, this allows to duplicate the BB and the edges representing the function and, instead to melt the context information, to have a context as precise as possible. Yet, such a transformation may be costly in terms of number of BB and must be used carefully. To prevent such a size explosion, you can mark a CFG as DONT_INLINE to prevent the inlining.

Unrolling loops is another way to improve precision. As many loop body have a different behavior between the first iteration and the other one (cache load, etc), it may be interesting to unroll loops once. This may be performed using the code processor LoopUnroller.

Finally, some transformations are required by a particular architecture. This is the case of instruction sets with delayed branches. Delayed branches executes the instruction following the branch instruction before performing actually the control flow change. As an outcome, the instruction following a branch is really part of the basic block the branch is contained in. This policy is different from the usual way OTAWA builds CFGs and a transformation must be done to fix the basic blocks: this is performed by DelayedBuilder.

Input / Output in XML

This modules provides two code processors allowing to perform input / output on CFG. CFGSaver save the CFG of the current task to a file while CFGLoader allows to load it back.

Both processors uses the same XML format defined below:

<?xml version="1.0" ?>
<otawa-workspace>
<cfg id="ID" entry="ID" exit="ID">
<bb id="ID" address="ADDRESS"? size="INT"?/>*
<edge kind="KIND" source="ID" target="ID"? cfg="ID"?/>*
</cfg>*
</otawa-workspace>

The OTAWA workspace is viewed, in the CFG representation, as a set of CFG that, in turn, is made of several basic blocks linked by edges. Each CFG and BB is identified with the attribute "id", any textual unique value, allowing to reference them.

The cfg element must reference two specific BB (using the unique "id"), an entry BB and an exit BB. The BB is defined by its address and its size (in bytes). The edges are defined by their kind, the source BB and, depending on the type, the target BB or the called CFG (Edge::CALL). The latter attribute "cfg" must give the identifier of an existing CFG.

Function Documentation

otawa::BasicBlock::Bundle::Bundle ( void  )
inlineprivate

Simple bundle constructor.

Identifier<Edge *> otawa::CALLED_BY ( "otawa::CALLED_BY"  ,
 
)

This properties are put on a CFG to get the list of edges calling it.

Hooks
SilentFeature otawa::CFG_CHECKSUM_FEATURE ( "otawa::CFG_CHECKSUM_FEATURE"  ,
maker   
)

This feature ensures that each CFG has hooked a checksum allowing to check binary modifications between launch of an OTAWA application.

Properties
Identifier<CFGInfo *> otawa::CFG_INFO ( "otawa::CFG_INFO"  ,
 
)

Get the collection of CFG found in the program.

Feature
Hooks
WorkSpace
p::feature otawa::CFG_INFO_FEATURE ( "otawa::CFG_INFO_FEATURE"  ,
new Maker< CFGBuilder >  () 
)

Feature asserting that the CFG has been scanned in the program.

The result is put the CFGInfo::ID.

Identifier<sys::Path> otawa::CFG_IO_PATH ( "otawa::CFG_IO_PATH"  )

This property allows to configure the file used by CFGLoader and CFGSaver.

SilentFeature otawa::CHECKED_CFG_FEATURE ( "otawa::CHECKED_CFG_FEATURE"  ,
maker   
)

This feature ensures that.

  • there exists at least one path from the entry to the exit,
  • no branch is unresolved.

Default Processor

Identifier<unsigned long > otawa::CHECKSUM ( "otawa::CHECKSUM"  ,
 
)

This property hooked on a CFG provides a checksum build on the instruction of the CFG.

SilentFeature otawa::COLLECTED_CFG_FEATURE ( "otawa::COLLECTED_CFG_FEATURE"  ,
COLLECTED_CFG_MAKER   
)

This feature asserts that all CFG involved in the current computation has been collected and accessible thanks to INVOLVED_CFGS property.

Properties
ENTRY_CFG (WorkSpace). INVOLVED_CFGS (WorkSpace). INDEX (CFG) CALLED_BY (CFG)
SilentFeature otawa::DELAYED_CFG_FEATURE ( "otawa::DELAYED_CFG_FEATURE"  ,
maker   
)

This feature informs that the current microprocessor supports delayed branches and that the CFG has been changed to reflect effect of delay branches.

Default Processor
Properties
Identifier<bool> otawa::DELAYED_INST ( "otawa::DELAYED_INST"  ,
false   
)

This property is set on instruction of a delayed branch.

Features
Hooks
Identifier<bool> otawa::DELAYED_NOP ( "otawa::DELAYED_NOP"  ,
false   
)

This property is true on NOP instructions insserted due to branch delay.

Features
Hooks
Identifier<CFG *> otawa::ENTRY ( "otawa::ENTRY"  ,
 
)

Identifier used for storing and retrieving the CFG on its entry BB.

Identifier<int> otawa::INDEX ( "otawa::INDEX"  ,
1 
)

Identifier used for storing in each basic block from the CFG its index.

Also used for storing each CFG's index.

Hooks
Identifier<const CFGCollection *> otawa::INVOLVED_CFGS ( "otawa::INVOLVED_CFGS"  ,
 
)

This property is used to link the current computation involved CFG on the framework.

Hooks
Identifier<pfg::PFG *> otawa::PFG ( "otawa::PFG"  ,
 
)

PFG of the program.

Default value: null

Hooks
Provider
Identifier<pfg::BB *> otawa::PFG_BB ( "otawa::PFG_BB"  ,
 
)

Link of pfg::BB on an in instruction.

Hooks
SilentFeature otawa::PFG_FEATURE ( "otawa::PFG_FEATURE"  ,
pfg::maker   
)

Feature providing the PFG of the application.

default processor: PFGBuilder

Provided properties
  • PFG – PFG of the application.
  • PFG_BB – link of a pfg::BB on the first instruction.
Identifier<BasicBlock*> otawa::UNROLLED_FROM ( "otawa::UNROLLED_FROM"  ,
 
)

Put on the header ex-header of a loop, this property gives the BB of the unrolled loop.

Hooks
SilentFeature otawa::UNROLLED_LOOPS_FEATURE ( "otawa::UNROLLED_LOOPS_FEATURE"  ,
UNROLLED_LOOPS_MAKER   
)

This feature that the loops have been unrolled at least once.

Variable Documentation

Identifier< CFG * > otawa::CFGCollector::ADDED_CFG
static

This configuration property allows to add unlinked CFG to the used CFG collection.

Referenced by otawa::CFGCollector::configure().

Identifier< CString > otawa::CFGCollector::ADDED_FUNCTION
static

This configuration property allows to add unlinked functions to the used CFG collection.

Referenced by otawa::CFGCollector::configure().

Identifier<Edge *> otawa::CALLED_BY("otawa::CALLED_BY", 0)
SilentFeature otawa::CFG_CHECKSUM_FEATURE("otawa::CFG_CHECKSUM_FEATURE", maker)

This feature ensures that each CFG has hooked a checksum allowing to check binary modifications between launch of an OTAWA application.

Properties

Referenced by otawa::CFGCheckSummer::CFGCheckSummer().

Identifier<CFGInfo *> otawa::CFG_INFO("otawa::CFG_INFO", 0)

Get the collection of CFG found in the program.

Feature
Hooks
WorkSpace
p::feature otawa::CFG_INFO_FEATURE("otawa::CFG_INFO_FEATURE", new Maker< CFGBuilder >())
Identifier<sys::Path> otawa::CFG_IO_PATH("otawa::CFG_IO_PATH")

This property allows to configure the file used by CFGLoader and CFGSaver.

Referenced by otawa::CFGSaver::configure().

SilentFeature otawa::CHECKED_CFG_FEATURE("otawa::CHECKED_CFG_FEATURE", maker)

This feature ensures that.

  • there exists at least one path from the entry to the exit,
  • no branch is unresolved.

Default Processor

Referenced by otawa::ContextualProcessor::ContextualProcessor().

Identifier<unsigned long > otawa::CHECKSUM("otawa::CHECKSUM", 0)

This property hooked on a CFG provides a checksum build on the instruction of the CFG.

Referenced by otawa::CFGCheckSummer::processCFG(), and while().

SilentFeature otawa::DELAYED_CFG_FEATURE("otawa::DELAYED_CFG_FEATURE", maker)

This feature informs that the current microprocessor supports delayed branches and that the CFG has been changed to reflect effect of delay branches.

Default Processor
Properties
Identifier<bool> otawa::DELAYED_INST("otawa::DELAYED_INST", false)

This property is set on instruction of a delayed branch.

Features
Hooks
Identifier<bool> otawa::DELAYED_NOP("otawa::DELAYED_NOP", false)

This property is true on NOP instructions insserted due to branch delay.

Features
Hooks
Identifier< CFGInfo * > & otawa::CFGInfo::ID = CFG_INFO
static

This property allows to get the CFG information from the current CFG is member of.

Hooks
See also
CFG_INFO

Referenced by otawa::AbsoluteAddress::cfg(), otawa::LabelAddress::cfg(), otawa::WorkSpace::getCFGInfo(), otawa::CFGBuilder::processWorkSpace(), and otawa::CFGCollector::processWorkSpace().

Identifier<const CFGCollection *> otawa::INVOLVED_CFGS("otawa::INVOLVED_CFGS", 0)

This property is used to link the current computation involved CFG on the framework.

Hooks

Referenced by otawa::BBCleaner::clean(), otawa::CFGCollector::cleanup(), otawa::dcache::CATBuilder::cleanup(), otawa::LoopUnroller::cleanup(), otawa::DelayedBuilder::cleanup(), otawa::Virtualizer::cleanup(), otawa::BBStatCollector::collect(), otawa::dfa::hai::DefaultListener< P >::DefaultListener(), otawa::CFGProcessor::doCleanUp(), otawa::ipet::ConstraintLoader::getBB(), otawa::BBStatCollector::process(), otawa::dcache::CATBuilder::processLBlockSet(), otawa::ACSMayBuilder::processLBlockSet(), otawa::ACSBuilder::processLBlockSet(), otawa::cat::CATBuilder::processLBlockSet(), otawa::ccg::Builder::processLBlockSet(), otawa::dcache::ACSMayBuilder::processLBlockSet(), otawa::dcache::ACSBuilder::processLBlockSet(), otawa::DeadCodeAnalysis::processWorkSpace(), otawa::dcache::CatConstraintBuilder::processWorkSpace(), otawa::ACSMayBuilder::processWorkSpace(), otawa::ACSBuilder::processWorkSpace(), otawa::LoopReductor::processWorkSpace(), otawa::LoopUnroller::processWorkSpace(), otawa::StackAnalysis::processWorkSpace(), otawa::CFGCollector::processWorkSpace(), otawa::DelayedBuilder::processWorkSpace(), otawa::branch::BranchBuilder::processWorkSpace(), otawa::CFGProcessor::processWorkSpace(), otawa::Virtualizer::processWorkSpace(), otawa::clp::Analysis::processWorkSpace(), otawa::dcache::ACSMayBuilder::processWorkSpace(), otawa::dcache::ACSBuilder::processWorkSpace(), otawa::BBStatCollector::total(), otawa::dfa::hai::UnrollingListener< P >::UnrollingListener(), otawa::dfa::hai::WideningListener< P >::WideningListener(), otawa::dfa::hai::DefaultListener< P >::~DefaultListener(), otawa::dfa::hai::UnrollingListener< P >::~UnrollingListener(), and otawa::dfa::hai::WideningListener< P >::~WideningListener().

Identifier< bool > otawa::CFGChecker::NO_EXCEPTION
static

In configuration of otawa::CFGChecker .

Inform the CFG checker that it must not issue an exception when an error is found: only a warning.

Referenced by otawa::CFGChecker::configure().

Identifier<pfg::PFG *> otawa::PFG("otawa::PFG", 0)

PFG of the program.

Default value: null

Hooks
Provider

Referenced by otawa::PFGBuilder::processWorkSpace().

Identifier<pfg::BB *> otawa::PFG_BB("otawa::PFG_BB", 0)

Link of pfg::BB on an in instruction.

Hooks

Referenced by otawa::PFGBuilder::addFunction(), and otawa::PFGBuilder::finalizeBB().

SilentFeature otawa::PFG_FEATURE("otawa::PFG_FEATURE", pfg::maker)

Feature providing the PFG of the application.

default processor: PFGBuilder

Provided properties
  • PFG – PFG of the application.
  • PFG_BB – link of a pfg::BB on the first instruction.

Referenced by otawa::PFGBuilder::PFGBuilder().

Identifier<BasicBlock*> otawa::UNROLLED_FROM("otawa::UNROLLED_FROM", 0)

Put on the header ex-header of a loop, this property gives the BB of the unrolled loop.

Hooks

Referenced by otawa::ipet::FlowFactConstraintBuilder::processBB(), and otawa::LoopUnroller::unroll().

SilentFeature otawa::UNROLLED_LOOPS_FEATURE("otawa::UNROLLED_LOOPS_FEATURE", UNROLLED_LOOPS_MAKER)

This feature that the loops have been unrolled at least once.