P4C
The P4 Compiler
Loading...
Searching...
No Matches
abstract_stepper.h
1/*
2 * SPDX-FileCopyrightText: 2022 The P4 Language Consortium
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_CORE_SMALL_STEP_ABSTRACT_STEPPER_H_
8#define BACKENDS_P4TOOLS_MODULES_TESTGEN_CORE_SMALL_STEP_ABSTRACT_STEPPER_H_
9
10#include <functional>
11#include <optional>
12#include <string>
13
14#include "ir/ir.h"
15#include "ir/node.h"
16#include "ir/solver.h"
17#include "ir/vector.h"
18#include "ir/visitor.h"
19
20#include "backends/p4tools/modules/testgen/core/program_info.h"
21#include "backends/p4tools/modules/testgen/core/small_step/small_step.h"
22#include "backends/p4tools/modules/testgen/lib/continuation.h"
23#include "backends/p4tools/modules/testgen/lib/execution_state.h"
24
25namespace P4::P4Tools::P4Testgen {
26
34class AbstractStepper : public Inspector {
35 public:
36 using Branch = SmallStepEvaluator::Branch;
37 using Result = SmallStepEvaluator::Result;
38
43 Result step(const IR::Node *);
44
46 bool preorder(const IR::Node *) override;
47
49
50 protected:
53
56
59
61 Result result;
62
64 virtual std::string getClassName() = 0;
65
66 virtual const ProgramInfo &getProgramInfo() const;
67
69 void logStep(const IR::Node *node);
70
75 static void checkMemberInvariant(const IR::Node *node);
76
77 /* *****************************************************************************************
78 * Transition helper functions
79 * ***************************************************************************************** */
80
86 bool stepSymbolicValue(const IR::Node *);
87
91
99 static bool stepToSubexpr(
100 const IR::Expression *subexpr, SmallStepEvaluator::Result &result,
101 const ExecutionState &state,
102 std::function<const Continuation::Command(const Continuation::Parameter *)> rebuildCmd);
103
114 static bool stepToListSubexpr(
115 const IR::BaseListExpression *subexpr, SmallStepEvaluator::Result &result,
116 const ExecutionState &state,
117 std::function<const Continuation::Command(const IR::BaseListExpression *)> rebuildCmd);
118
122 static bool stepToStructSubexpr(
123 const IR::StructExpression *subexpr, SmallStepEvaluator::Result &result,
124 const ExecutionState &state,
125 std::function<const Continuation::Command(const IR::StructExpression *)> rebuildCmd);
126
133 bool stepGetHeaderValidity(const IR::StateVariable &headerRef);
134
137 void setHeaderValidity(const IR::StateVariable &headerRef, bool validity,
139
147 bool stepSetHeaderValidity(const IR::StateVariable &headerRef, bool validity);
148
157 bool stepStackPushPopFront(const IR::Expression *stackRef, const IR::Vector<IR::Argument> *args,
158 bool isPush = true);
159
164 const IR::Literal *evaluateExpression(const IR::Expression *expr,
165 std::optional<const IR::Expression *> cond) const;
166
171 void setTargetUninitialized(ExecutionState &nextState, const IR::StateVariable &ref,
172 bool forceTaint) const;
173
177 void declareStructLike(ExecutionState &nextState, const IR::StateVariable &parentExpr,
178 bool forceTaint = false) const;
179
182 void declareBaseType(ExecutionState &nextState, const IR::StateVariable &paramPath,
183 const IR::Type_Base *baseType) const;
184};
185
186} // namespace P4::P4Tools::P4Testgen
187
188#endif /* BACKENDS_P4TOOLS_MODULES_TESTGEN_CORE_SMALL_STEP_ABSTRACT_STEPPER_H_ */
Provides a higher-level interface for an SMT solver.
Definition solver.h:30
Definition node.h:53
Definition ir/vector.h:59
const IR::Literal * evaluateExpression(const IR::Expression *expr, std::optional< const IR::Expression * > cond) const
Definition abstract_stepper.cpp:328
void declareStructLike(ExecutionState &nextState, const IR::StateVariable &parentExpr, bool forceTaint=false) const
Definition abstract_stepper.cpp:374
static bool stepToListSubexpr(const IR::BaseListExpression *subexpr, SmallStepEvaluator::Result &result, const ExecutionState &state, std::function< const Continuation::Command(const IR::BaseListExpression *)> rebuildCmd)
Definition abstract_stepper.cpp:109
static bool stepToStructSubexpr(const IR::StructExpression *subexpr, SmallStepEvaluator::Result &result, const ExecutionState &state, std::function< const Continuation::Command(const IR::StructExpression *)> rebuildCmd)
Definition abstract_stepper.cpp:153
bool stepToException(Continuation::Exception)
Definition abstract_stepper.cpp:81
ExecutionState & state
The state being evaluated.
Definition abstract_stepper.h:55
void declareBaseType(ExecutionState &nextState, const IR::StateVariable &paramPath, const IR::Type_Base *baseType) const
Definition abstract_stepper.cpp:391
static void checkMemberInvariant(const IR::Node *node)
Definition abstract_stepper.cpp:58
Result step(const IR::Node *)
Definition abstract_stepper.cpp:38
bool preorder(const IR::Node *) override
Provides generic handling of unsupported nodes.
Definition abstract_stepper.cpp:43
Result result
The output of the evaluation.
Definition abstract_stepper.h:61
bool stepSetHeaderValidity(const IR::StateVariable &headerRef, bool validity)
Definition abstract_stepper.cpp:252
void setTargetUninitialized(ExecutionState &nextState, const IR::StateVariable &ref, bool forceTaint) const
Definition abstract_stepper.cpp:350
bool stepSymbolicValue(const IR::Node *)
Definition abstract_stepper.cpp:70
bool stepGetHeaderValidity(const IR::StateVariable &headerRef)
Definition abstract_stepper.cpp:187
const ProgramInfo & programInfo
Target-specific information about the P4 program being evaluated.
Definition abstract_stepper.h:52
virtual std::string getClassName()=0
void logStep(const IR::Node *node)
Helper function for debugging execution of small stepper.
Definition abstract_stepper.cpp:51
static bool stepToSubexpr(const IR::Expression *subexpr, SmallStepEvaluator::Result &result, const ExecutionState &state, std::function< const Continuation::Command(const Continuation::Parameter *)> rebuildCmd)
Definition abstract_stepper.cpp:87
void setHeaderValidity(const IR::StateVariable &headerRef, bool validity, ExecutionState &state)
Definition abstract_stepper.cpp:217
bool stepStackPushPopFront(const IR::Expression *stackRef, const IR::Vector< IR::Argument > *args, bool isPush=true)
Definition abstract_stepper.cpp:298
Exception
Enumerates the exceptions that can be thrown during symbolic execution.
Definition continuation.h:41
Represents state of execution after having reached a program point.
Definition execution_state.h:40
Stores target-specific information about a P4 program.
Definition core/program_info.h:27
Definition phv/solver/action_constraint_solver.cpp:33