aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/util/rust-hir-map.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/util/rust-hir-map.cc')
-rw-r--r--gcc/rust/util/rust-hir-map.cc447
1 files changed, 447 insertions, 0 deletions
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
new file mode 100644
index 0000000..bdf487e
--- /dev/null
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -0,0 +1,447 @@
+// 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/>.
+
+#include "rust-hir-map.h"
+#include "rust-ast-full.h"
+#include "rust-hir-full.h"
+
+namespace Rust {
+namespace Analysis {
+
+NodeMapping::NodeMapping (CrateNum crateNum, NodeId nodeId, HirId hirId,
+ LocalDefId localDefId)
+ : crateNum (crateNum), nodeId (nodeId), hirId (hirId), localDefId (localDefId)
+{}
+
+NodeMapping::~NodeMapping () {}
+
+NodeMapping
+NodeMapping::get_error ()
+{
+ return NodeMapping (UNKNOWN_CREATENUM, UNKNOWN_NODEID, UNKNOWN_HIRID,
+ UNKNOWN_LOCAL_DEFID);
+}
+
+CrateNum
+NodeMapping::get_crate_num () const
+{
+ return crateNum;
+}
+
+NodeId
+NodeMapping::get_nodeid () const
+{
+ return nodeId;
+}
+
+HirId
+NodeMapping::get_hirid () const
+{
+ return hirId;
+}
+
+LocalDefId
+NodeMapping::get_local_defid () const
+{
+ return localDefId;
+}
+
+DefId
+NodeMapping::get_defid () const
+{
+ return get_defid (get_crate_num (), get_local_defid ());
+}
+
+DefId
+NodeMapping::get_defid (CrateNum crate_num, LocalDefId local_defid)
+{
+ DefId val = 0;
+ val |= crate_num;
+ val = val << sizeof (uint32_t);
+ val |= local_defid;
+ return val;
+}
+
+std::string
+NodeMapping::as_string () const
+{
+ std::ostringstream ss;
+ ss << "["
+ << "C: " << get_crate_num ();
+ if (get_nodeid () != UNKNOWN_NODEID)
+ ss << " Nid: " << get_nodeid ();
+
+ if (get_hirid () != UNKNOWN_HIRID)
+ ss << " Hid: " << get_hirid ();
+
+ if (get_local_defid () != UNKNOWN_LOCAL_DEFID)
+ ss << " Lid: " << get_local_defid ();
+
+ ss << "]";
+ return ss.str ();
+}
+
+// Mappings Class now
+
+Mappings::Mappings () {}
+
+Mappings::~Mappings () {}
+
+Mappings *
+Mappings::get ()
+{
+ static std::unique_ptr<Mappings> instance;
+ if (!instance)
+ instance = std::move (std::unique_ptr<Mappings> (new Mappings ()));
+
+ return instance.get ();
+}
+
+CrateNum
+Mappings::get_next_crate_num ()
+{
+ return crateNumItr++;
+}
+
+void
+Mappings::set_current_crate (CrateNum crateNum)
+{
+ currentCrateNum = crateNum;
+}
+
+CrateNum
+Mappings::get_current_crate ()
+{
+ // HACK
+ if (hirIdIter.find (currentCrateNum) == hirIdIter.end ())
+ {
+ hirIdIter[currentCrateNum] = UNKNOWN_HIRID;
+ nodeIdIter[currentCrateNum] = UNKNOWN_NODEID;
+ localIdIter[currentCrateNum] = UNKNOWN_LOCAL_DEFID;
+ nodeIdToHirMappings[currentCrateNum] = {};
+ locations[currentCrateNum] = {};
+ }
+
+ return currentCrateNum;
+}
+
+NodeId
+Mappings::get_next_node_id (CrateNum crateNum)
+{
+ auto it = nodeIdIter.find (crateNum);
+ rust_assert (it != nodeIdIter.end ());
+
+ auto id = it->second + 1;
+ nodeIdIter[crateNum] = id;
+ return id;
+}
+
+HirId
+Mappings::get_next_hir_id (CrateNum crateNum)
+{
+ auto it = hirIdIter.find (crateNum);
+ rust_assert (it != hirIdIter.end ());
+
+ auto id = it->second + 1;
+ hirIdIter[crateNum] = id;
+ return id;
+}
+
+LocalDefId
+Mappings::get_next_localdef_id (CrateNum crateNum)
+{
+ auto it = localIdIter.find (crateNum);
+ rust_assert (it != localIdIter.end ());
+
+ auto id = it->second + 1;
+ localIdIter[crateNum] = id;
+ return id;
+}
+
+AST::Crate *
+Mappings::get_ast_crate (CrateNum crateNum)
+{
+ auto it = astCrateMappings.find (crateNum);
+ if (it == astCrateMappings.end ())
+ return nullptr;
+
+ return it->second;
+}
+
+void
+Mappings::insert_ast_crate (AST::Crate *crate)
+{
+ CrateNum crateNum = get_current_crate ();
+ rust_assert (get_ast_crate (crateNum) == nullptr);
+
+ astCrateMappings[crateNum] = crate;
+}
+
+HIR::Crate *
+Mappings::get_hir_crate (CrateNum crateNum)
+{
+ auto it = hirCrateMappings.find (crateNum);
+ if (it == hirCrateMappings.end ())
+ return nullptr;
+
+ return it->second;
+}
+
+void
+Mappings::insert_hir_crate (HIR::Crate *crate)
+{
+ CrateNum crateNum = crate->get_mappings ().get_crate_num ();
+ rust_assert (get_hir_crate (crateNum) == nullptr);
+
+ hirCrateMappings[crateNum] = crate;
+}
+
+void
+Mappings::insert_defid_mapping (DefId id, HIR::Item *item)
+{
+ CrateNum crateNum = (id & DEF_ID_CRATE_MASK) >> sizeof (uint32_t);
+ LocalDefId localDefId = id & DEF_ID_LOCAL_DEF_MASK;
+
+ rust_assert (lookup_defid (id) == nullptr);
+ rust_assert (lookup_local_defid (crateNum, localDefId) == nullptr);
+
+ defIdMappings[id] = item;
+ insert_local_defid_mapping (crateNum, localDefId, item);
+}
+
+HIR::Item *
+Mappings::lookup_defid (DefId id)
+{
+ auto it = defIdMappings.find (id);
+ if (it == defIdMappings.end ())
+ return nullptr;
+
+ return it->second;
+}
+
+void
+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 *
+Mappings::lookup_hir_item (CrateNum crateNum, HirId id)
+{
+ auto it = hirItemMappings.find (crateNum);
+ if (it == hirItemMappings.end ())
+ return nullptr;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return nullptr;
+
+ return iy->second;
+}
+
+void
+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 *
+Mappings::lookup_hir_expr (CrateNum crateNum, HirId id)
+{
+ auto it = hirExprMappings.find (crateNum);
+ if (it == hirExprMappings.end ())
+ return nullptr;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return nullptr;
+
+ return iy->second;
+}
+
+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_hir_stmt (CrateNum crateNum, HirId id, HIR::Stmt *type)
+{
+ rust_assert (lookup_hir_stmt (crateNum, id) == nullptr);
+
+ hirStmtMappings[crateNum][id] = type;
+ nodeIdToHirMappings[crateNum][type->get_mappings ().get_nodeid ()] = id;
+}
+
+HIR::Stmt *
+Mappings::lookup_hir_stmt (CrateNum crateNum, HirId id)
+{
+ auto it = hirStmtMappings.find (crateNum);
+ if (it == hirStmtMappings.end ())
+ return nullptr;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return nullptr;
+
+ return iy->second;
+}
+
+void
+Mappings::insert_hir_param (CrateNum crateNum, HirId id,
+ HIR::FunctionParam *param)
+{
+ rust_assert (lookup_hir_stmt (crateNum, id) == nullptr);
+
+ printf ("inserting param with node id %u hir id: %u\n",
+ param->get_mappings ()->get_nodeid (), id);
+ hirParamMappings[crateNum][id] = param;
+ nodeIdToHirMappings[crateNum][param->get_mappings ()->get_nodeid ()] = id;
+}
+
+HIR::FunctionParam *
+Mappings::lookup_hir_param (CrateNum crateNum, HirId id)
+{
+ auto it = hirParamMappings.find (crateNum);
+ if (it == hirParamMappings.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)
+{
+ rust_assert (lookup_local_defid (crateNum, id) == nullptr);
+
+ localDefIdMappings[crateNum][id] = item;
+}
+
+HIR::Item *
+Mappings::lookup_local_defid (CrateNum crateNum, LocalDefId id)
+{
+ auto it = localDefIdMappings.find (crateNum);
+ if (it == localDefIdMappings.end ())
+ return nullptr;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return nullptr;
+
+ return iy->second;
+}
+
+void
+Mappings::walk_local_defids_for_crate (CrateNum crateNum,
+ std::function<bool (HIR::Item *)> cb)
+{
+ auto it = localDefIdMappings.find (crateNum);
+ if (it == localDefIdMappings.end ())
+ return;
+
+ for (auto iy = it->second.begin (); iy != it->second.end (); iy++)
+ {
+ if (!cb (iy->second))
+ return;
+ }
+}
+
+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;
+}
+
+bool
+Mappings::resolve_nodeid_to_stmt (CrateNum crate, NodeId id, HIR::Stmt **stmt)
+{
+ auto it = nodeIdToHirMappings.find (crate);
+ if (it == nodeIdToHirMappings.end ())
+ return false;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return false;
+
+ HirId resolved = iy->second;
+ auto resolved_stmt = lookup_hir_stmt (crate, resolved);
+ *stmt = resolved_stmt;
+ return resolved_stmt != nullptr;
+}
+
+} // namespace Analysis
+} // namespace Rust