From 80c3d8cfbee4261191eb22419c2145ff70aa49b7 Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 30 Oct 2014 15:41:45 +0000 Subject: [PATCH] 2014-10-30 Richard Biener * genmatch.c: Remove , and includes. Include ggc.h and hash-map.h. (ggc_internal_cleared_alloc): Provide stub definition. (ggc_free): Likewise. (struct capture_id_map_hasher): New traits for hash_map. (cid_map_t): New typedef. (everywhere else): Replace std::map use with cid_map_t. * hash-map.h (hash_map::elements): New member function. * Makefile.in (build/genmatch.o): Add $(HASH_TABLE_H), hash-map.h and $(GGC_H) as dependency. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@216940 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 13 +++++++++++ gcc/Makefile.in | 2 +- gcc/genmatch.c | 67 +++++++++++++++++++++++++++++++++++++++++++-------------- gcc/hash-map.h | 2 ++ 4 files changed, 67 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d014c08f43..bb70ce47e9a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,18 @@ 2014-10-30 Richard Biener + * genmatch.c: Remove , and includes. + Include ggc.h and hash-map.h. + (ggc_internal_cleared_alloc): Provide stub definition. + (ggc_free): Likewise. + (struct capture_id_map_hasher): New traits for hash_map. + (cid_map_t): New typedef. + (everywhere else): Replace std::map use with cid_map_t. + * hash-map.h (hash_map::elements): New member function. + * Makefile.in (build/genmatch.o): Add $(HASH_TABLE_H), + hash-map.h and $(GGC_H) as dependency. + +2014-10-30 Richard Biener + * genmatch.c (capture_info::walk_c_expr): Ignore capture uses inside TREE_TYPE (). * gimple-ssa-strength-reduction.c (stmt_cost): Use CASE_CONVERT. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index a74df1fd1ae..9c67fe21b7f 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2495,7 +2495,7 @@ build/genhooks.o : genhooks.c $(TARGET_DEF) $(C_TARGET_DEF) \ build/genmddump.o : genmddump.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H) \ coretypes.h $(GTM_H) errors.h $(READ_MD_H) gensupport.h build/genmatch.o : genmatch.c $(BCONFIG_H) $(SYSTEM_H) \ - coretypes.h errors.h + coretypes.h errors.h $(HASH_TABLE_H) hash-map.h $(GGC_H) # Compile the programs that generate insn-* from the machine description. # They are compiled with $(COMPILER_FOR_BUILD), and associated libraries, diff --git a/gcc/genmatch.c b/gcc/genmatch.c index 35d852c9259..d238a50cbd8 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -23,19 +23,30 @@ along with GCC; see the file COPYING3. If not see #include "bconfig.h" #include -#include -#include -#include #include "system.h" #include "coretypes.h" +#include "ggc.h" #include #include "errors.h" #include "hashtab.h" #include "hash-table.h" +#include "hash-map.h" #include "vec.h" #include "is-a.h" +/* Stubs for GGC referenced through instantiations triggered by hash-map. */ +void *ggc_internal_cleared_alloc (size_t, void (*)(void *), + size_t, size_t + CXX_MEM_STAT_INFO) +{ + return NULL; +} +void ggc_free (void *) +{ +} + + /* libccp helpers. */ static struct line_maps *line_table; @@ -350,6 +361,28 @@ get_operator (const char *id) } +/* Helper for the capture-id map. */ + +struct capture_id_map_hasher : default_hashmap_traits +{ + static inline hashval_t hash (const char *); + static inline bool equal_keys (const char *, const char *); +}; + +inline hashval_t +capture_id_map_hasher::hash (const char *id) +{ + return htab_hash_string (id); +} + +inline bool +capture_id_map_hasher::equal_keys (const char *id1, const char *id2) +{ + return strcmp (id1, id2) == 0; +} + +typedef hash_map cid_map_t; + /* The AST produced by parsing of the pattern definitions. */ @@ -410,13 +443,13 @@ struct c_expr : public operand }; c_expr (cpp_reader *r_, vec code_, unsigned nr_stmts_, - vec ids_, std::map *capture_ids_) + vec ids_, cid_map_t *capture_ids_) : operand (OP_C_EXPR), r (r_), code (code_), capture_ids (capture_ids_), nr_stmts (nr_stmts_), ids (ids_) {} /* cpplib tokens and state to transform this back to source. */ cpp_reader *r; vec code; - std::map *capture_ids; + cid_map_t *capture_ids; /* The number of statements parsed (well, the number of ';'s). */ unsigned nr_stmts; /* The identifier replacement vector. */ @@ -492,11 +525,11 @@ struct simplify simplify (operand *match_, source_location match_location_, struct operand *result_, source_location result_location_, vec ifexpr_vec_, vec > for_vec_, - std::map *capture_ids_) + cid_map_t *capture_ids_) : match (match_), match_location (match_location_), result (result_), result_location (result_location_), ifexpr_vec (ifexpr_vec_), for_vec (for_vec_), - capture_ids (capture_ids_), capture_max (capture_ids_->size () - 1) {} + capture_ids (capture_ids_), capture_max (capture_ids_->elements () - 1) {} /* The expression that is matched against the GENERIC or GIMPLE IL. */ operand *match; @@ -513,7 +546,7 @@ struct simplify in the lowering phase. */ vec > for_vec; /* A map of capture identifiers to indexes. */ - std::map *capture_ids; + cid_map_t *capture_ids; int capture_max; }; @@ -1419,7 +1452,7 @@ c_expr::gen_transform (FILE *f, const char *dest, id = (const char *)n->val.str.text; else id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str; - fprintf (f, "captures[%u]", (*capture_ids)[id]); + fprintf (f, "captures[%u]", *capture_ids->get(id)); ++i; continue; } @@ -2029,7 +2062,7 @@ capture_info::walk_c_expr (c_expr *e) id = (const char *)n->val.str.text; else id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str; - info[(*e->capture_ids)[id]].force_no_side_effects_p = true; + info[*e->capture_ids->get(id)].force_no_side_effects_p = true; } } } @@ -2439,7 +2472,7 @@ private: vec active_ifs; vec > active_fors; - std::map *capture_ids; + cid_map_t *capture_ids; public: vec simplifiers; @@ -2615,10 +2648,12 @@ parser::parse_capture (operand *op) id = get_ident (); else fatal_at (token, "expected number or identifier"); - unsigned next_id = capture_ids->size (); - std::pair::iterator, bool> res - = capture_ids->insert (std::pair(id, next_id)); - return new capture ((*res.first).second, op); + unsigned next_id = capture_ids->elements (); + bool existed; + unsigned &num = capture_ids->get_or_insert (id, &existed); + if (!existed) + num = next_id; + return new capture (num, op); } /* Parse an expression @@ -2799,7 +2834,7 @@ parser::parse_simplify (source_location match_location, expr *result) { /* Reset the capture map. */ - capture_ids = new std::map; + capture_ids = new cid_map_t; const cpp_token *loc = peek (); struct operand *match = parse_op (); diff --git a/gcc/hash-map.h b/gcc/hash-map.h index 4988fe4d037..a5816dca3ce 100644 --- a/gcc/hash-map.h +++ b/gcc/hash-map.h @@ -264,6 +264,8 @@ public: break; } + size_t elements () const { return m_table.elements (); } + private: template friend void gt_ggc_mx (hash_map *); -- 2.11.4.GIT