Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /* -*- c++ -*- */
  2. /*
  3.  * Copyright © 2010 Intel Corporation
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the "Software"),
  7.  * to deal in the Software without restriction, including without limitation
  8.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9.  * and/or sell copies of the Software, and to permit persons to whom the
  10.  * Software is furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the next
  13.  * paragraph) shall be included in all copies or substantial portions of the
  14.  * Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22.  * DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. #pragma once
  26. #ifndef IR_VISITOR_H
  27. #define IR_VISITOR_H
  28.  
  29. #ifdef __cplusplus
  30. /**
  31.  * Abstract base class of visitors of IR instruction trees
  32.  */
  33. class ir_visitor {
  34. public:
  35.    virtual ~ir_visitor()
  36.    {
  37.       /* empty */
  38.    }
  39.  
  40.    /**
  41.     * \name Visit methods
  42.     *
  43.     * As typical for the visitor pattern, there must be one \c visit method for
  44.     * each concrete subclass of \c ir_instruction.  Virtual base classes within
  45.     * the hierarchy should not have \c visit methods.
  46.     */
  47.    /*@{*/
  48.    virtual void visit(class ir_rvalue *) { assert(!"unhandled error_type"); }
  49.    virtual void visit(class ir_variable *) = 0;
  50.    virtual void visit(class ir_function_signature *) = 0;
  51.    virtual void visit(class ir_function *) = 0;
  52.    virtual void visit(class ir_expression *) = 0;
  53.    virtual void visit(class ir_texture *) = 0;
  54.    virtual void visit(class ir_swizzle *) = 0;
  55.    virtual void visit(class ir_dereference_variable *) = 0;
  56.    virtual void visit(class ir_dereference_array *) = 0;
  57.    virtual void visit(class ir_dereference_record *) = 0;
  58.    virtual void visit(class ir_assignment *) = 0;
  59.    virtual void visit(class ir_constant *) = 0;
  60.    virtual void visit(class ir_call *) = 0;
  61.    virtual void visit(class ir_return *) = 0;
  62.    virtual void visit(class ir_discard *) = 0;
  63.    virtual void visit(class ir_if *) = 0;
  64.    virtual void visit(class ir_loop *) = 0;
  65.    virtual void visit(class ir_loop_jump *) = 0;
  66.    /*@}*/
  67. };
  68.  
  69. /* NOTE: function calls may never return due to discards inside them
  70.  * This is usually not an issue, but if it is, keep it in mind
  71.  */
  72. class ir_control_flow_visitor : public ir_visitor {
  73. public:
  74.    virtual void visit(class ir_variable *) {}
  75.    virtual void visit(class ir_expression *) {}
  76.    virtual void visit(class ir_texture *) {}
  77.    virtual void visit(class ir_swizzle *) {}
  78.    virtual void visit(class ir_dereference_variable *) {}
  79.    virtual void visit(class ir_dereference_array *) {}
  80.    virtual void visit(class ir_dereference_record *) {}
  81.    virtual void visit(class ir_assignment *) {}
  82.    virtual void visit(class ir_constant *) {}
  83.    virtual void visit(class ir_call *) {}
  84. };
  85. #endif /* __cplusplus */
  86.  
  87. #endif /* IR_VISITOR_H */
  88.