From 53d846e0c6ce605c3bce5c902829e0c0ce70e444 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 19 Apr 2011 17:54:23 +0200 Subject: Store enumerator values in semantics graph --- odb/parser.cxx | 16 ++++++++++++++-- odb/semantics/enum.cxx | 16 ++++++++++++---- odb/semantics/enum.hxx | 25 +++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 8 deletions(-) (limited to 'odb') diff --git a/odb/parser.cxx b/odb/parser.cxx index 23e9faa..a40a298 100644 --- a/odb/parser.cxx +++ b/odb/parser.cxx @@ -1234,7 +1234,8 @@ emit_enum (tree e, } else { - e_node = &unit_->new_node (file, line, clmn, e); + e_node = &unit_->new_node ( + file, line, clmn, e, TYPE_UNSIGNED (e) != 0); unit_->insert (e, *e_node); } @@ -1246,11 +1247,22 @@ emit_enum (tree e, for (tree er (TYPE_VALUES (e)); er != NULL_TREE ; er = TREE_CHAIN (er)) { char const* name (IDENTIFIER_POINTER (TREE_PURPOSE (er))); + tree tval (DECL_INITIAL (TREE_VALUE (er))); + + HOST_WIDE_INT hwl (TREE_INT_CST_LOW (tval)); + HOST_WIDE_INT hwh (TREE_INT_CST_HIGH (tval)); + + unsigned long long l (hwl); + unsigned long long h (hwh); + unsigned short width (HOST_BITS_PER_WIDE_INT); + + unsigned long long val ((h << width) + l); // There doesn't seem to be a way to get the proper position for // each enumerator. // - enumerator& er_node = unit_->new_node (file, line, clmn, er); + enumerator& er_node = unit_->new_node ( + file, line, clmn, er, val); unit_->new_edge (*e_node, er_node); // Inject enumerators into the outer scope. diff --git a/odb/semantics/enum.cxx b/odb/semantics/enum.cxx index f324716..56be2fc 100644 --- a/odb/semantics/enum.cxx +++ b/odb/semantics/enum.cxx @@ -14,14 +14,22 @@ namespace semantics } enumerator:: - enumerator (path const& file, size_t line, size_t column, tree tn) - : node (file, line, column, tn) + enumerator (path const& file, + size_t line, + size_t column, + tree tn, + unsigned long long value) + : node (file, line, column, tn), value_ (value) { } enum_:: - enum_ (path const& file, size_t line, size_t column, tree tn) - : node (file, line, column, tn) + enum_ (path const& file, + size_t line, + size_t column, + tree tn, + bool unsigned_) + : node (file, line, column, tn), unsigned__ (unsigned_) { } diff --git a/odb/semantics/enum.hxx b/odb/semantics/enum.hxx index dbc5790..12e43eb 100644 --- a/odb/semantics/enum.hxx +++ b/odb/semantics/enum.hxx @@ -71,8 +71,21 @@ namespace semantics return *enumerated_; } + // If the enumeration is signed, then this value should be re- + // interpreted as signed. + // + unsigned long long + value () const + { + return value_; + } + public: - enumerator (path const&, size_t line, size_t column, tree); + enumerator (path const&, + size_t line, + size_t column, + tree, + unsigned long long value); void add_edge_right (enumerates& e) @@ -83,6 +96,7 @@ namespace semantics using nameable::add_edge_right; private: + unsigned long long value_; enumerates* enumerated_; }; @@ -110,8 +124,14 @@ namespace semantics return enumerates_.end (); } + bool + unsigned_ () const + { + return unsigned__; + } + public: - enum_ (path const&, size_t line, size_t column, tree); + enum_ (path const&, size_t line, size_t column, tree, bool unsigned_); void add_edge_left (enumerates& e) @@ -120,6 +140,7 @@ namespace semantics } private: + bool unsigned__; enumerates_list enumerates_; }; } -- cgit v1.1