aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-07-26 22:15:53 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-07-27 12:32:25 +0100
commitdefe97ea4dfd5d0e77ec2a8401c987772d96884f (patch)
treeb64c8b267deecaf1169138d332f03136aa9044b9 /gcc
parentf3bf1f293d9c6cab7ccebdaa96433208f2c79057 (diff)
downloadgcc-defe97ea4dfd5d0e77ec2a8401c987772d96884f.zip
gcc-defe97ea4dfd5d0e77ec2a8401c987772d96884f.tar.gz
gcc-defe97ea4dfd5d0e77ec2a8401c987772d96884f.tar.bz2
Add mappings for external items
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/rust-ast-lower-extern.h14
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.h10
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.h32
-rw-r--r--gcc/rust/util/rust-hir-map.cc24
-rw-r--r--gcc/rust/util/rust-hir-map.h6
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;