From b94c29a47b5020e4d052679fc5d22c19533fd73b Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 9 Jun 2010 17:28:54 -0700 Subject: [PATCH] ir_constant: Add get_record_field query --- ir.cpp | 26 ++++++++++++++++++++++++++ ir.h | 2 ++ 2 files changed, 28 insertions(+) diff --git a/ir.cpp b/ir.cpp index bb1c4589a57..38e2739449c 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 86beb2d7ce6..718c495fb30 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. * -- 2.30.2