aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/util
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/util')
-rw-r--r--gcc/rust/util/rust-hir-map.cc65
-rw-r--r--gcc/rust/util/rust-hir-map.h30
-rw-r--r--gcc/rust/util/rust-inference-var.h112
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