aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/util/rust-hir-map.cc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2020-12-15 17:48:11 +0000
committerPhilip Herron <herron.philip@googlemail.com>2020-12-17 17:23:46 +0000
commit6136f0aebbb84cbcf8f92bed206733391aaa3866 (patch)
tree49c24a3b9c9483bb2755642496bcd0aec3f8c598 /gcc/rust/util/rust-hir-map.cc
parenta621e19365473b477d121c28a057cc25d3951c76 (diff)
downloadgcc-6136f0aebbb84cbcf8f92bed206733391aaa3866.zip
gcc-6136f0aebbb84cbcf8f92bed206733391aaa3866.tar.gz
gcc-6136f0aebbb84cbcf8f92bed206733391aaa3866.tar.bz2
This is a new HIR -> GIMPLE pass it reuses the mappings from hir,
name resolution and type resolution to simplify the generation of gimple.
Diffstat (limited to 'gcc/rust/util/rust-hir-map.cc')
-rw-r--r--gcc/rust/util/rust-hir-map.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index 70c59f3..bdf487e 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -305,6 +305,55 @@ Mappings::lookup_hir_type (CrateNum crateNum, HirId id)
}
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)
{
@@ -377,5 +426,22 @@ Mappings::lookup_location (CrateNum crate, HirId id)
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