summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ir.cpp26
-rw-r--r--ir.h2
2 files changed, 28 insertions, 0 deletions
diff --git a/ir.cpp b/ir.cpp
index bb1c4589a5..38e2739449 100644
--- a/ir.cpp
+++ b/ir.cpp
@@ -406,6 +406,32 @@ ir_constant::get_uint_component(unsigned i) const
}
+ir_constant *
+ir_constant::get_record_field(const char *name)
+{
+ int idx = this->type->field_index(name);
+
+ if (idx < 0)
+ return NULL;
+
+ if (this->components.is_empty())
+ return NULL;
+
+ exec_node *node = this->components.head;
+ for (int i = 0; i < idx; i++) {
+ node = node->next;
+
+ /* If the end of the list is encountered before the element matching the
+ * requested field is found, return NULL.
+ */
+ if (node->is_tail_sentinal())
+ return NULL;
+ }
+
+ return (ir_constant *) node;
+}
+
+
ir_dereference_variable::ir_dereference_variable(ir_variable *var)
{
this->var = var;
diff --git a/ir.h b/ir.h
index 86beb2d7ce..718c495fb3 100644
--- a/ir.h
+++ b/ir.h
@@ -1071,6 +1071,8 @@ public:
unsigned get_uint_component(unsigned i) const;
/*@}*/
+ ir_constant *get_record_field(const char *name);
+
/**
* Value of the constant.
*