|
|
| DoRemoveExits (ReferenceMap *refMap, TypeMap *typeMap) |
| |
|
const IR::Node * | preorder (IR::AssignmentStatement *statement) override |
| |
|
const IR::Node * | preorder (IR::BlockStatement *statement) override |
| |
|
const IR::Node * | preorder (IR::ExitStatement *action) override |
| |
|
const IR::Node * | preorder (IR::IfStatement *statement) override |
| |
|
const IR::Node * | preorder (IR::MethodCallStatement *statement) override |
| |
|
const IR::Node * | preorder (IR::P4Action *action) override |
| |
|
const IR::Node * | preorder (IR::P4Control *control) override |
| |
|
const IR::Node * | preorder (IR::P4Table *table) override |
| |
|
const IR::Node * | preorder (IR::SwitchStatement *statement) override |
| |
|
| DoRemoveReturns (P4::ReferenceMap *refMap, cstring varName="hasReturned", cstring retValName="retval") |
| |
|
const IR::Node * | preorder (IR::BlockStatement *statement) override |
| |
|
const IR::Node * | preorder (IR::ExitStatement *statement) override |
| |
|
const IR::Node * | preorder (IR::Function *function) override |
| |
|
const IR::Node * | preorder (IR::IfStatement *statement) override |
| |
|
const IR::Node * | preorder (IR::P4Action *action) override |
| |
|
const IR::Node * | preorder (IR::P4Control *control) override |
| |
|
const IR::Node * | preorder (IR::P4Parser *parser) override |
| |
|
const IR::Node * | preorder (IR::ReturnStatement *statement) override |
| |
|
const IR::Node * | preorder (IR::SwitchStatement *statement) override |
| |
This visitor removes "exit" calls. It is significantly more involved than return removal, since an exit in an action causes the calling control to terminate. This pass assumes that each statement in a control block can exit only once – so it should be run after a pass that enforces this, e.g., SideEffectOrdering. (E.g., it does not handle: if (t1.apply().hit && t2.apply().hit) { ... } It also assumes that there are no global actions and that action calls have been inlined.