aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/util/rust-hir-map.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/util/rust-hir-map.h')
-rw-r--r--gcc/rust/util/rust-hir-map.h173
1 files changed, 173 insertions, 0 deletions
diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h
new file mode 100644
index 0000000..a400265
--- /dev/null
+++ b/gcc/rust/util/rust-hir-map.h
@@ -0,0 +1,173 @@
+// 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_MAP_H
+#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"
+
+namespace Rust {
+
+// refers to a Crate
+typedef uint32_t CrateNum;
+// refers to any node in the AST in current Crate
+typedef uint32_t NodeId;
+// refers to any node in the HIR for the current crate
+typedef uint32_t HirId;
+// refers to any top-level decl in HIR
+typedef uint32_t LocalDefId;
+// refers to <Crate><DefId>
+typedef uint64_t DefId;
+
+#define DEF_ID_CRATE_MASK 0xFFFFFFFF00000000
+#define DEF_ID_LOCAL_DEF_MASK 0x00000000FFFFFFFF
+
+#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 {
+
+class NodeMapping
+{
+public:
+ NodeMapping (CrateNum crateNum, NodeId nodeId, HirId hirId,
+ LocalDefId localDefId);
+ ~NodeMapping ();
+
+ static NodeMapping get_error ();
+
+ CrateNum get_crate_num () const;
+ NodeId get_nodeid () const;
+ HirId get_hirid () const;
+ LocalDefId get_local_defid () const;
+ DefId get_defid () const;
+
+ static DefId get_defid (CrateNum crate_num, LocalDefId local_defid);
+
+ std::string as_string () const;
+
+private:
+ CrateNum crateNum;
+ NodeId nodeId;
+ HirId hirId;
+ LocalDefId localDefId;
+};
+
+class Mappings
+{
+public:
+ static Mappings *get ();
+ ~Mappings ();
+
+ CrateNum get_next_crate_num ();
+ void set_current_crate (CrateNum crateNum);
+ CrateNum get_current_crate ();
+
+ 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);
+ void insert_ast_crate (AST::Crate *crate);
+
+ HIR::Crate *get_hir_crate (CrateNum crateNum);
+ void insert_hir_crate (HIR::Crate *crate);
+
+ void insert_defid_mapping (DefId id, HIR::Item *item);
+ HIR::Item *lookup_defid (DefId id);
+
+ void insert_local_defid_mapping (CrateNum crateNum, LocalDefId id,
+ HIR::Item *item);
+ HIR::Item *lookup_local_defid (CrateNum crateNum, LocalDefId id);
+
+ void insert_hir_item (CrateNum crateNum, HirId id, HIR::Item *item);
+ HIR::Item *lookup_hir_item (CrateNum crateNum, HirId id);
+
+ 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 insert_hir_stmt (CrateNum crateNum, HirId id, HIR::Stmt *type);
+ HIR::Stmt *lookup_hir_stmt (CrateNum crateNum, HirId id);
+
+ void insert_hir_param (CrateNum crateNum, HirId id, HIR::FunctionParam *type);
+ HIR::FunctionParam *lookup_hir_param (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);
+ }
+
+ bool resolve_nodeid_to_stmt (CrateNum crate, NodeId id, HIR::Stmt **stmt);
+ bool resolve_nodeid_to_stmt (NodeId id, HIR::Stmt **stmt)
+ {
+ return resolve_nodeid_to_stmt (get_current_crate (), id, stmt);
+ }
+
+private:
+ Mappings ();
+
+ CrateNum crateNumItr;
+ CrateNum currentCrateNum;
+
+ std::map<CrateNum, HirId> hirIdIter;
+ std::map<CrateNum, NodeId> nodeIdIter;
+ std::map<CrateNum, LocalDefId> localIdIter;
+
+ std::map<CrateNum, AST::Crate *> astCrateMappings;
+ std::map<CrateNum, HIR::Crate *> hirCrateMappings;
+
+ 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;
+ std::map<CrateNum, std::map<HirId, HIR::Stmt *> > hirStmtMappings;
+ std::map<CrateNum, std::map<HirId, HIR::FunctionParam *> > hirParamMappings;
+
+ // location info
+ std::map<CrateNum, std::map<NodeId, Location> > locations;
+
+ // reverse mappings
+ std::map<CrateNum, std::map<NodeId, HirId> > nodeIdToHirMappings;
+};
+
+} // namespace Analysis
+} // namespace Rust
+
+#endif // RUST_HIR_MAP_H