diff options
Diffstat (limited to 'gcc/rust/util')
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 65 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.h | 30 | ||||
-rw-r--r-- | gcc/rust/util/rust-inference-var.h | 112 |
3 files changed, 89 insertions, 118 deletions
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 094d0e3..70c59f3 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -133,6 +133,8 @@ Mappings::get_current_crate () hirIdIter[currentCrateNum] = UNKNOWN_HIRID; nodeIdIter[currentCrateNum] = UNKNOWN_NODEID; localIdIter[currentCrateNum] = UNKNOWN_LOCAL_DEFID; + nodeIdToHirMappings[currentCrateNum] = {}; + locations[currentCrateNum] = {}; } return currentCrateNum; @@ -157,7 +159,7 @@ Mappings::get_next_hir_id (CrateNum crateNum) auto id = it->second + 1; hirIdIter[crateNum] = id; - return id++; + return id; } LocalDefId @@ -238,6 +240,7 @@ Mappings::insert_hir_item (CrateNum crateNum, HirId id, HIR::Item *item) rust_assert (lookup_hir_item (crateNum, id) == nullptr); hirItemMappings[crateNum][id] = item; + nodeIdToHirMappings[crateNum][item->get_mappings ().get_nodeid ()] = id; } HIR::Item * @@ -260,6 +263,8 @@ Mappings::insert_hir_expr (CrateNum crateNum, HirId id, HIR::Expr *expr) rust_assert (lookup_hir_expr (crateNum, id) == nullptr); hirExprMappings[crateNum][id] = expr; + nodeIdToHirMappings[crateNum][expr->get_mappings ().get_nodeid ()] = id; + insert_location (crateNum, id, expr->get_locus_slow ()); } HIR::Expr * @@ -277,6 +282,29 @@ Mappings::lookup_hir_expr (CrateNum crateNum, HirId id) } void +Mappings::insert_hir_type (CrateNum crateNum, HirId id, HIR::Type *type) +{ + rust_assert (lookup_hir_type (crateNum, id) == nullptr); + + hirTypeMappings[crateNum][id] = type; + nodeIdToHirMappings[crateNum][type->get_mappings ().get_nodeid ()] = id; +} + +HIR::Type * +Mappings::lookup_hir_type (CrateNum crateNum, HirId id) +{ + auto it = hirTypeMappings.find (crateNum); + if (it == hirTypeMappings.end ()) + return nullptr; + + auto iy = it->second.find (id); + if (iy == it->second.end ()) + return nullptr; + + return iy->second; +} + +void Mappings::insert_local_defid_mapping (CrateNum crateNum, LocalDefId id, HIR::Item *item) { @@ -314,5 +342,40 @@ Mappings::walk_local_defids_for_crate (CrateNum crateNum, } } +bool +Mappings::lookup_node_to_hir (CrateNum crate, NodeId id, HirId *ref) +{ + auto it = nodeIdToHirMappings.find (crate); + if (it == nodeIdToHirMappings.end ()) + return false; + + auto iy = it->second.find (id); + if (iy == it->second.end ()) + return false; + + *ref = iy->second; + return true; +} + +void +Mappings::insert_location (CrateNum crate, HirId id, Location locus) +{ + locations[crate][id] = locus; +} + +Location +Mappings::lookup_location (CrateNum crate, HirId id) +{ + auto it = locations.find (crate); + if (it == locations.end ()) + return Location (); + + auto iy = it->second.find (id); + if (iy == it->second.end ()) + return Location (); + + return iy->second; +} + } // namespace Analysis } // namespace Rust diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 8929ca4..7fc8777 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -20,6 +20,7 @@ #define RUST_HIR_MAP_H #include "rust-system.h" +#include "rust-location.h" #include "rust-ast-full-decls.h" #include "rust-hir-full-decls.h" @@ -40,11 +41,11 @@ typedef uint64_t DefId; #define DEF_ID_CRATE_MASK 0xFFFFFFFF00000000 #define DEF_ID_LOCAL_DEF_MASK 0x00000000FFFFFFFF -#define UNKNOWN_CREATENUM ((uint32_t) (-1)) -#define UNKNOWN_NODEID ((uint32_t) (-1)) -#define UNKNOWN_HIRID ((uint32_t) (-1)) -#define UNKNOWN_LOCAL_DEFID ((uint32_t) (-1)) -#define UNKNOWN_DEFID ((uint64_t) (-1)) +#define UNKNOWN_CREATENUM ((uint32_t) (0)) +#define UNKNOWN_NODEID ((uint32_t) (0)) +#define UNKNOWN_HIRID ((uint32_t) (0)) +#define UNKNOWN_LOCAL_DEFID ((uint32_t) (0)) +#define UNKNOWN_DEFID ((uint64_t) (0)) namespace Analysis { @@ -86,7 +87,10 @@ public: NodeId get_next_node_id () { return get_next_node_id (get_current_crate ()); } NodeId get_next_node_id (CrateNum crateNum); + + HirId get_next_hir_id () { return get_next_hir_id (get_current_crate ()); } HirId get_next_hir_id (CrateNum crateNum); + LocalDefId get_next_localdef_id (CrateNum crateNum); AST::Crate *get_ast_crate (CrateNum crateNum); @@ -108,9 +112,21 @@ public: void insert_hir_expr (CrateNum crateNum, HirId id, HIR::Expr *expr); HIR::Expr *lookup_hir_expr (CrateNum crateNum, HirId id); + void insert_hir_type (CrateNum crateNum, HirId id, HIR::Type *type); + HIR::Type *lookup_hir_type (CrateNum crateNum, HirId id); + void walk_local_defids_for_crate (CrateNum crateNum, std::function<bool (HIR::Item *)> cb); + bool lookup_node_to_hir (CrateNum crate, NodeId id, HirId *ref); + + void insert_location (CrateNum crate, HirId id, Location locus); + Location lookup_location (CrateNum crate, HirId id); + Location lookup_location (HirId id) + { + return lookup_location (get_current_crate (), id); + } + private: Mappings (); @@ -127,8 +143,12 @@ private: std::map<DefId, HIR::Item *> defIdMappings; std::map<CrateNum, std::map<LocalDefId, HIR::Item *> > localDefIdMappings; std::map<CrateNum, std::map<HirId, HIR::Item *> > hirItemMappings; + std::map<CrateNum, std::map<HirId, HIR::Type *> > hirTypeMappings; std::map<CrateNum, std::map<HirId, HIR::Expr *> > hirExprMappings; + // location info + std::map<CrateNum, std::map<NodeId, Location> > locations; + // reverse mappings std::map<CrateNum, std::map<NodeId, HirId> > nodeIdToHirMappings; }; diff --git a/gcc/rust/util/rust-inference-var.h b/gcc/rust/util/rust-inference-var.h deleted file mode 100644 index 87decd5..0000000 --- a/gcc/rust/util/rust-inference-var.h +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (C) 2020 Free Software Foundation, Inc. - -// This file is part of GCC. - -// GCC is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 3, or (at your option) any later -// version. - -// GCC is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. - -// You should have received a copy of the GNU General Public License -// along with GCC; see the file COPYING3. If not see -// <http://www.gnu.org/licenses/>. - -#ifndef RUST_HIR_INFERENCE_VAR -#define RUST_HIR_INFERENCE_VAR - -#include "rust-system.h" -#include "rust-hir-full-decls.h" - -namespace Rust { -namespace HIR { - -class GeneralInferenceVariable; -class IntegralInferenceVariable; -class FloatInferenceVariable; -class InferenceVarVisitor -{ -public: - virtual void visit (GeneralInferenceVariable &v) {} - virtual void visit (IntegralInferenceVariable &v) {} - virtual void visit (FloatInferenceVariable &v) {} -}; - -// Base -class InferenceVariable -{ -public: - virtual ~InferenceVariable () {} - - virtual std::string as_string () const = 0; - - HIR::Type *get_type () { return resolved; } - - void set_type (HIR::Type *type) { resolved = type; } - - bool was_resolved () { return resolved != nullptr; } - - virtual void accept_vis (InferenceVarVisitor &vis) = 0; - -protected: - InferenceVariable () : resolved (nullptr) {} - - HIR::Type *resolved; -}; - -class GeneralInferenceVariable : public InferenceVariable -{ -public: - GeneralInferenceVariable () : InferenceVariable () {} - - void accept_vis (InferenceVarVisitor &vis) { vis.visit (*this); }; - - std::string as_string () const override - { - if (resolved) - return resolved->as_string (); - - return "[G::?T]"; - } -}; - -class IntegralInferenceVariable : public InferenceVariable -{ -public: - IntegralInferenceVariable () : InferenceVariable () {} - - void accept_vis (InferenceVarVisitor &vis) { vis.visit (*this); }; - - std::string as_string () const override - { - if (resolved) - return resolved->as_string (); - - return "[I::?T]"; - } -}; - -class FloatInferenceVariable : public InferenceVariable -{ -public: - FloatInferenceVariable () : InferenceVariable () {} - - void accept_vis (InferenceVarVisitor &vis) { vis.visit (*this); }; - - std::string as_string () const override - { - if (resolved) - return resolved->as_string (); - - return "[F::?T]"; - } -}; - -} // namespace HIR -} // namespace Rust - -#endif // RUST_HIR_INFERENCE_VAR |