diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-07-26 22:15:53 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-07-27 12:32:25 +0100 |
commit | defe97ea4dfd5d0e77ec2a8401c987772d96884f (patch) | |
tree | b64c8b267deecaf1169138d332f03136aa9044b9 | |
parent | f3bf1f293d9c6cab7ccebdaa96433208f2c79057 (diff) | |
download | gcc-defe97ea4dfd5d0e77ec2a8401c987772d96884f.zip gcc-defe97ea4dfd5d0e77ec2a8401c987772d96884f.tar.gz gcc-defe97ea4dfd5d0e77ec2a8401c987772d96884f.tar.bz2 |
Add mappings for external items
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-extern.h | 14 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.h | 10 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.h | 32 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 24 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.h | 6 |
5 files changed, 75 insertions, 11 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-extern.h b/gcc/rust/hir/rust-ast-lower-extern.h index 1cc0c8e..4ea0019 100644 --- a/gcc/rust/hir/rust-ast-lower-extern.h +++ b/gcc/rust/hir/rust-ast-lower-extern.h @@ -47,8 +47,6 @@ public: Analysis::NodeMapping mapping (crate_num, item.get_node_id (), mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - mappings->insert_location (crate_num, mapping.get_hirid (), - item.get_locus ()); HIR::ExternalStaticItem *static_item = new HIR::ExternalStaticItem (mapping, item.get_identifier (), @@ -58,6 +56,11 @@ public: item.get_locus ()); translated = static_item; + + mappings->insert_hir_extern_item (crate_num, mapping.get_hirid (), + translated); + mappings->insert_location (crate_num, mapping.get_hirid (), + item.get_locus ()); } void visit (AST::ExternalFunctionItem &function) override @@ -97,8 +100,6 @@ public: Analysis::NodeMapping mapping (crate_num, function.get_node_id (), mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - mappings->insert_location (crate_num, mapping.get_hirid (), - function.get_locus ()); HIR::ExternalFunctionItem *function_item = new HIR::ExternalFunctionItem ( mapping, function.get_identifier (), std::move (generic_params), @@ -107,6 +108,11 @@ public: function.get_outer_attrs (), function.get_locus ()); translated = function_item; + + mappings->insert_hir_extern_item (crate_num, mapping.get_hirid (), + translated); + mappings->insert_location (crate_num, mapping.get_hirid (), + function.get_locus ()); } private: diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h index e53b739..80ca298 100644 --- a/gcc/rust/hir/rust-ast-lower-item.h +++ b/gcc/rust/hir/rust-ast-lower-item.h @@ -571,10 +571,6 @@ public: mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - mappings->insert_defid_mapping (mapping.get_defid (), translated); - mappings->insert_location (crate_num, mapping.get_hirid (), - extern_block.get_locus ()); - HIR::ExternBlock *hir_extern_block = new HIR::ExternBlock (mapping, extern_block.get_abi (), std::move (extern_items), std::move (vis), @@ -583,6 +579,12 @@ public: extern_block.get_locus ()); translated = hir_extern_block; + + mappings->insert_defid_mapping (mapping.get_defid (), translated); + mappings->insert_hir_item (mapping.get_crate_num (), mapping.get_hirid (), + translated); + mappings->insert_location (crate_num, mapping.get_hirid (), + extern_block.get_locus ()); } private: diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index 6d53711..7d976c5 100644 --- a/gcc/rust/hir/tree/rust-hir-item.h +++ b/gcc/rust/hir/tree/rust-hir-item.h @@ -2713,6 +2713,8 @@ public: Analysis::NodeMapping get_mappings () const { return mappings; } + Identifier get_item_name () const { return item_name; } + protected: ExternalItem (Analysis::NodeMapping mappings, Identifier item_name, Visibility vis, AST::AttrVec outer_attrs, Location locus) @@ -2746,9 +2748,6 @@ protected: // Clone function implementation as pure virtual method virtual ExternalItem *clone_external_item_impl () const = 0; - - // possibly make this public if required - std::string get_item_name () const { return item_name; } }; // A static item used in an extern block @@ -2790,6 +2789,8 @@ public: void accept_vis (HIRVisitor &vis) override; + std::unique_ptr<Type> &get_item_type () { return item_type; } + protected: /* Use covariance to implement clone function as returning this object * rather than base */ @@ -2840,6 +2841,12 @@ public: NamedFunctionParam &operator= (NamedFunctionParam &&other) = default; std::string as_string () const; + + Identifier get_param_name () const { return name; } + + std::unique_ptr<Type> &get_type () { return param_type; } + + Analysis::NodeMapping get_mappings () const { return mappings; } }; // A function item used in an extern block @@ -2920,6 +2927,20 @@ public: void accept_vis (HIRVisitor &vis) override; + std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + { + return generic_params; + } + + std::unique_ptr<Type> &get_return_type () { return return_type; } + + std::vector<NamedFunctionParam> &get_function_params () + { + return function_params; + } + + bool is_variadic () const { return has_variadics; } + protected: /* Use covariance to implement clone function as returning this object * rather than base */ @@ -2999,6 +3020,11 @@ public: void accept_vis (HIRVisitor &vis) override; + std::vector<std::unique_ptr<ExternalItem> > &get_extern_items () + { + return extern_items; + } + protected: /* Use covariance to implement clone function as returning this object * rather than base */ diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index 9af77a9..0dcb2e9 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -284,6 +284,30 @@ Mappings::lookup_hir_trait_item (CrateNum crateNum, HirId id) } void +Mappings::insert_hir_extern_item (CrateNum crateNum, HirId id, + HIR::ExternalItem *item) +{ + rust_assert (lookup_hir_extern_item (crateNum, id) == nullptr); + + hirExternItemMappings[crateNum][id] = item; + nodeIdToHirMappings[crateNum][item->get_mappings ().get_nodeid ()] = id; +} + +HIR::ExternalItem * +Mappings::lookup_hir_extern_item (CrateNum crateNum, HirId id) +{ + auto it = hirExternItemMappings.find (crateNum); + if (it == hirExternItemMappings.end ()) + return nullptr; + + auto iy = it->second.find (id); + if (iy == it->second.end ()) + return nullptr; + + return iy->second; +} + +void Mappings::insert_hir_impl_block (CrateNum crateNum, HirId id, HIR::ImplBlock *item) { diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 3789b57..7e5449c 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -132,6 +132,10 @@ public: HIR::TraitItem *item); HIR::TraitItem *lookup_hir_trait_item (CrateNum crateNum, HirId id); + void insert_hir_extern_item (CrateNum crateNum, HirId id, + HIR::ExternalItem *item); + HIR::ExternalItem *lookup_hir_extern_item (CrateNum crateNum, HirId id); + void insert_hir_impl_block (CrateNum crateNum, HirId id, HIR::ImplBlock *item); HIR::ImplBlock *lookup_hir_impl_block (CrateNum crateNum, HirId id); @@ -239,6 +243,8 @@ private: std::map<HirId, HIR::ImplBlock *> hirImplItemsToImplMappings; std::map<CrateNum, std::map<HirId, HIR::ImplBlock *> > hirImplBlockMappings; std::map<CrateNum, std::map<HirId, HIR::TraitItem *> > hirTraitItemMappings; + std::map<CrateNum, std::map<HirId, HIR::ExternalItem *> > + hirExternItemMappings; // location info std::map<CrateNum, std::map<NodeId, Location> > locations; |