51        LOG8(
"ComputeDefUse::clone " << rv->uid);
 
   54    void flow_merge(
Visitor &) 
override;
 
   58    enum { SKIPPING, NORMAL, READ_ONLY, WRITE_ONLY } state = SKIPPING;
 
   67        bool operator<(
const loc_t &a)
 const {
 
   68            if (node != a.node) 
return node->id < a.node->id;
 
   69            if (!parent || !a.parent) 
return parent != 
nullptr;
 
   70            return *parent < *a.parent;
 
   73        const T *find()
 const {
 
   74            for (
auto *p = 
this; p; p = p->parent) {
 
   75                if (
auto *t = p->node->to<T>()) 
return t;
 
 
   83    std::set<loc_t> &cached_locs;
 
   85    const loc_t *getLoc() { 
return getLoc(getChildContext()); }
 
   87    const loc_t *getLoc(
const IR::Node *n) { 
return getLoc(n, getChildContext()); }
 
   98        def_info_t *parent = 
nullptr;
 
  100        locset_t valid_bit_defs;
 
  102        std::map<cstring, def_info_t> fields;
 
  103        std::map<le_bitrange, def_info_t> slices;  
 
  105        void slices_sanity();
 
  106        std::map<le_bitrange, def_info_t>::iterator slices_overlap_begin(
le_bitrange);
 
  109        void flow_merge(def_info_t &);
 
  110        bool operator==(
const def_info_t &) 
const;
 
  111        bool operator!=(
const def_info_t &a)
 const { 
return !(*
this == a); }
 
  112        def_info_t() = 
default;
 
  113        def_info_t(
const def_info_t &);
 
  114        def_info_t(def_info_t &&);
 
  117    void add_uses(
const loc_t *, def_info_t &);
 
  118    void set_live_from_type(def_info_t &di, 
const IR::Type *type);
 
  128    static const locset_t empty;
 
  130    profile_t init_apply(
const IR::Node *root)
 override {
 
  131        auto rv = Inspector::init_apply(root);
 
  132        LOG3(
"## Midend ComputeDefUse");
 
  138    bool preorder(
const IR::P4Control *) 
override;
 
  139    bool preorder(
const IR::P4Table *) 
override;
 
  140    bool preorder(
const IR::P4Action *) 
override;
 
  141    bool preorder(
const IR::P4Parser *) 
override;
 
  142    bool preorder(
const IR::ParserState *) 
override;
 
  143    void revisit(
const IR::ParserState *) 
override;
 
  144    void loop_revisit(
const IR::ParserState *) 
override;
 
  145    void postorder(
const IR::ParserState *) 
override;
 
  146    bool preorder(
const IR::Type *)
 override { 
return false; }
 
  147    bool preorder(
const IR::Annotations *)
 override { 
return false; }
 
  148    bool preorder(
const IR::KeyElement *) 
override;
 
  149    bool preorder(
const IR::AssignmentStatement *) 
override;
 
  150    const IR::Expression *do_read(def_info_t &, 
const IR::Expression *, 
const Context *);
 
  151    const IR::Expression *do_write(def_info_t &, 
const IR::Expression *, 
const Context *);
 
  152    bool preorder(
const IR::PathExpression *) 
override;
 
  153    void loop_revisit(
const IR::PathExpression *) 
override;
 
  154    bool preorder(
const IR::MethodCallExpression *) 
override;
 
  155    void end_apply() 
override;
 
  157    class SetupJoinPoints;
 
  158    void applySetupJoinPoints(
const IR::Node *root) 
override;
 
  159    bool filter_join_point(
const IR::Node *) 
override;
 
  163        : ResolutionContext(true), cached_locs(*new 
std::set<loc_t>), defuse(*new defuse_t) {
 
  165        visitDagOnce = 
false;
 
  174    const locset_t &getDefs(
const IR::Node *n)
 const {
 
  175        auto it = defuse.defs.find(n);
 
  176        return it == defuse.defs.end() ? empty : it->second;
 
  178    const locset_t &getUses(
const IR::Node *n)
 const {
 
  179        auto it = defuse.uses.find(n);
 
  180        return it == defuse.uses.end() ? empty : it->second;
 
  184    friend std::ostream &operator<<(std::ostream &, 
const loc_t &);
 
  185    friend std::ostream &operator<<(std::ostream &, 
const defuse_t &);
 
  186    friend std::ostream &operator<<(std::ostream &out, 
const ComputeDefUse &cdu) {
 
  187        return out << cdu.defuse;
 
 
Visitor mixin for looking up names in enclosing scopes from the Visitor::Context.
Definition resolveReferences.h:32