From c04343dbab902e5b8a5f047266645a5e7d40a5ed Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Fri, 7 May 2021 13:19:29 +0100 Subject: Explicitly track crate names within the mappings We need to track crate names including the translation units one for symbol mangling purposes. This defaults to TestCrate for now and will need more work to actually make this a compiler option as part of imports and visbility. --- gcc/rust/rust-session-manager.cc | 8 ++++++++ gcc/rust/util/rust-hir-map.cc | 27 ++++++++++++++++----------- gcc/rust/util/rust-hir-map.h | 24 +++++++++++++++++++++++- 3 files changed, 47 insertions(+), 12 deletions(-) (limited to 'gcc/rust') diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc index da788b5..5e9746f 100644 --- a/gcc/rust/rust-session-manager.cc +++ b/gcc/rust/rust-session-manager.cc @@ -70,6 +70,10 @@ const char *kHIRDumpFile = "gccrs.hir.dump"; const char *kHIRTypeResolutionDumpFile = "gccrs.type-resolution.dump"; const char *kTargetOptionsDumpFile = "gccrs.target-options.dump"; +// FIME in the imports/visibility milestone - this needs to be command line +// option +const std::string kDefaultCrateName = "TestCrate"; + // Implicitly enable a target_feature (and recursively enable dependencies). void Session::implicitly_enable_feature (std::string feature_name) @@ -445,6 +449,10 @@ Session::enable_dump (std::string arg) void Session::parse_files (int num_files, const char **files) { + auto mappings = Analysis::Mappings::get (); + CrateNum crate_num = mappings->setup_crate_mappings (kDefaultCrateName); + mappings->set_current_crate (crate_num); + for (int i = 0; i < num_files; i++) { printf ("Attempting to parse file: %s\n", files[i]); diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 0dcbd4f..3a0cbb1 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -107,7 +107,7 @@ Mappings::get () { static std::unique_ptr instance; if (!instance) - instance = std::move (std::unique_ptr (new Mappings ())); + instance = std::unique_ptr (new Mappings ()); return instance.get (); } @@ -125,18 +125,23 @@ Mappings::set_current_crate (CrateNum crateNum) } CrateNum -Mappings::get_current_crate () +Mappings::setup_crate_mappings (std::string crate_name) { - // HACK - if (hirIdIter.find (currentCrateNum) == hirIdIter.end ()) - { - hirIdIter[currentCrateNum] = UNKNOWN_HIRID; - nodeIdIter[currentCrateNum] = UNKNOWN_NODEID; - localIdIter[currentCrateNum] = UNKNOWN_LOCAL_DEFID; - nodeIdToHirMappings[currentCrateNum] = {}; - locations[currentCrateNum] = {}; - } + CrateNum crate_num = get_next_crate_num (); + hirIdIter[crate_num] = UNKNOWN_HIRID; + nodeIdIter[crate_num] = UNKNOWN_NODEID; + localIdIter[crate_num] = UNKNOWN_LOCAL_DEFID; + nodeIdToHirMappings[crate_num] = {}; + locations[crate_num] = {}; + crate_names[crate_num] = crate_name; + + return crate_num; +} + +CrateNum +Mappings::get_current_crate () const +{ return currentCrateNum; } diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 9777ee3..a198be6 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -83,7 +83,26 @@ public: CrateNum get_next_crate_num (); void set_current_crate (CrateNum crateNum); - CrateNum get_current_crate (); + CrateNum get_current_crate () const; + CrateNum setup_crate_mappings (std::string crate_name); + + bool get_crate_name (CrateNum crate_num, std::string &name) const + { + auto it = crate_names.find (crate_num); + if (it == crate_names.end ()) + return false; + + name.assign (it->second); + return true; + } + + std::string get_current_crate_name () const + { + std::string name; + bool ok = get_crate_name (get_current_crate (), name); + rust_assert (ok); + return name; + } NodeId get_next_node_id () { return get_next_node_id (get_current_crate ()); } NodeId get_next_node_id (CrateNum crateNum); @@ -212,6 +231,9 @@ private: // all hirid nodes std::map > hirNodesWithinCrate; + + // crate names + std::map crate_names; }; } // namespace Analysis -- cgit v1.1