#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
-struct ir_program {
- void *bong_hits;
-};
-
/**
* Base class of all IR instructions
*/
virtual class ir_dereference * as_dereference() { return NULL; }
virtual class ir_dereference_array * as_dereference_array() { return NULL; }
virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
+ virtual class ir_expression * as_expression() { return NULL; }
virtual class ir_rvalue * as_rvalue() { return NULL; }
virtual class ir_loop * as_loop() { return NULL; }
virtual class ir_assignment * as_assignment() { return NULL; }
class ir_rvalue : public ir_instruction {
public:
+ virtual ir_rvalue *clone(struct hash_table *) const = 0;
+
virtual ir_rvalue * as_rvalue()
{
return this;
public:
ir_variable(const struct glsl_type *, const char *);
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_variable *clone(struct hash_table *ht) const;
virtual ir_variable *as_variable()
{
public:
ir_function_signature(const glsl_type *return_type);
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_function_signature *clone(struct hash_table *ht) const;
virtual void accept(ir_visitor *v)
{
*/
const char *function_name() const;
+ /**
+ * Get a handle to the function for which this is a signature
+ *
+ * There is no setter function, this function returns a \c const pointer,
+ * and \c ir_function_signature::_function is private for a reason. The
+ * only way to make a connection between a function and function signature
+ * is via \c ir_function::add_signature. This helps ensure that certain
+ * invariants (i.e., a function signature is in the list of signatures for
+ * its \c _function) are met.
+ *
+ * \sa ir_function::add_signature
+ */
+ inline const class ir_function *function() const
+ {
+ return this->_function;
+ }
+
/**
* Check whether the qualifiers match between this signature's parameters
* and the supplied parameter list. If not, returns the name of the first
/** Whether or not this function has a body (which may be empty). */
unsigned is_defined:1;
+ /** Whether or not this function signature is a built-in. */
+ unsigned is_built_in:1;
+
/** Body of instructions in the function. */
struct exec_list body;
private:
/** Function of which this signature is one overload. */
- class ir_function *function;
+ class ir_function *_function;
friend class ir_function;
};
public:
ir_function(const char *name);
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_function *clone(struct hash_table *ht) const;
virtual ir_function *as_function()
{
void add_signature(ir_function_signature *sig)
{
- sig->function = this;
- signatures.push_tail(sig);
+ sig->_function = this;
+ this->signatures.push_tail(sig);
}
/**
* Find a signature that matches a set of actual parameters, taking implicit
* conversions into account.
*/
- const ir_function_signature *matching_signature(exec_list *actual_param);
+ ir_function_signature *matching_signature(exec_list *actual_param);
/**
* Find a signature that exactly matches a set of actual parameters without
inline const char *ir_function_signature::function_name() const
{
- return function->name;
+ return this->_function->name;
}
/*@}*/
/* empty */
}
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_if *clone(struct hash_table *ht) const;
virtual ir_if *as_if()
{
/* empty */
}
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_loop *clone(struct hash_table *ht) const;
virtual void accept(ir_visitor *v)
{
public:
ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_assignment *clone(struct hash_table *ht) const;
virtual void accept(ir_visitor *v)
{
ir_expression(int op, const struct glsl_type *type,
ir_rvalue *, ir_rvalue *);
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_expression *as_expression()
+ {
+ return this;
+ }
+
+ virtual ir_expression *clone(struct hash_table *ht) const;
static unsigned int get_num_operands(ir_expression_operation);
unsigned int get_num_operands() const
actual_parameters->move_nodes_to(& this->actual_parameters);
}
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_call *clone(struct hash_table *ht) const;
virtual ir_call *as_call()
{
return callee;
}
+ /**
+ * Set the function call target
+ */
+ void set_callee(const ir_function_signature *sig);
+
/**
* Generates an inline version of the function before @ir,
* returning the return value of the function.
/* empty */
}
- virtual ir_instruction *clone(struct hash_table *) const;
+ virtual ir_return *clone(struct hash_table *) const;
virtual ir_return *as_return()
{
this->loop = loop;
}
- virtual ir_instruction *clone(struct hash_table *) const;
+ virtual ir_loop_jump *clone(struct hash_table *) const;
virtual void accept(ir_visitor *v)
{
this->condition = cond;
}
- virtual ir_instruction *clone(struct hash_table *ht) const;
+ virtual ir_discard *clone(struct hash_table *ht) const;
virtual void accept(ir_visitor *v)
{
/* empty */
}
- virtual ir_instruction *clone(struct hash_table *) const;
+ virtual ir_texture *clone(struct hash_table *) const;
virtual void accept(ir_visitor *v)
{
ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
- virtual ir_instruction *clone(struct hash_table *) const;
+ virtual ir_swizzle *clone(struct hash_table *) const;
virtual ir_swizzle *as_swizzle()
{
class ir_dereference : public ir_rvalue {
public:
+ virtual ir_dereference *clone(struct hash_table *) const = 0;
+
virtual ir_dereference *as_dereference()
{
return this;
public:
ir_dereference_variable(ir_variable *var);
- virtual ir_instruction *clone(struct hash_table *) const;
+ virtual ir_dereference_variable *clone(struct hash_table *) const;
virtual ir_dereference_variable *as_dereference_variable()
{
ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
- virtual ir_instruction *clone(struct hash_table *) const;
+ virtual ir_dereference_array *clone(struct hash_table *) const;
virtual ir_dereference_array *as_dereference_array()
{
ir_dereference_record(ir_variable *var, const char *field);
- virtual ir_instruction *clone(struct hash_table *) const;
+ virtual ir_dereference_record *clone(struct hash_table *) const;
/**
* Get the variable that is ultimately referenced by an r-value
*/
ir_constant(const ir_constant *c, unsigned i);
- virtual ir_instruction *clone(struct hash_table *) const;
+ virtual ir_constant *clone(struct hash_table *) const;
virtual ir_constant *as_constant()
{
void validate_ir_tree(exec_list *instructions);
+/**
+ * Make a clone of each IR instruction in a list
+ *
+ * \param in List of IR instructions that are to be cloned
+ * \param out List to hold the cloned instructions
+ */
+void
+clone_ir_list(exec_list *out, const exec_list *in);
+
extern void
_mesa_glsl_initialize_variables(exec_list *instructions,
struct _mesa_glsl_parse_state *state);