aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-06-16 18:17:39 +0200
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2023-07-21 09:06:09 +0000
commit01c316bc2b661ee7db45c8246727a96a454bfcc1 (patch)
tree1a39383234a09e791d9fdf31eada323d55c4ec68 /gcc
parent5539f28018b492b68db4c1b6af0c4fe3acbfb19f (diff)
downloadgcc-01c316bc2b661ee7db45c8246727a96a454bfcc1.zip
gcc-01c316bc2b661ee7db45c8246727a96a454bfcc1.tar.gz
gcc-01c316bc2b661ee7db45c8246727a96a454bfcc1.tar.bz2
resolve: Add extern crate proc macro collection
Create a mapping for procedural macros with their crate num. gcc/rust/ChangeLog: * metadata/rust-extern-crate.h: Add proc macro getter. * rust-session-manager.cc (Session::load_extern_crate): Collect mappings and create mappings. * util/rust-hir-map.cc: Add insertion and lookup functions for every mapping. * util/rust-hir-map.h: Add function prototypes. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/metadata/rust-extern-crate.h2
-rw-r--r--gcc/rust/rust-session-manager.cc26
-rw-r--r--gcc/rust/util/rust-hir-map.cc64
-rw-r--r--gcc/rust/util/rust-hir-map.h22
4 files changed, 114 insertions, 0 deletions
diff --git a/gcc/rust/metadata/rust-extern-crate.h b/gcc/rust/metadata/rust-extern-crate.h
index 17a3f70..1bfd31a 100644
--- a/gcc/rust/metadata/rust-extern-crate.h
+++ b/gcc/rust/metadata/rust-extern-crate.h
@@ -40,6 +40,8 @@ public:
const std::string &get_metadata () const;
+ std::vector<ProcMacro::Procmacro> &get_proc_macros () { return proc_macros; }
+
static bool string_to_int (location_t locus, const std::string &s,
bool is_neg_ok, int *ret);
diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc
index de28f72..b9d8cbc 100644
--- a/gcc/rust/rust-session-manager.cc
+++ b/gcc/rust/rust-session-manager.cc
@@ -1024,6 +1024,32 @@ Session::load_extern_crate (const std::string &crate_name, location_t locus)
Lexer lex (extern_crate.get_metadata ());
Parser<Lexer> parser (lex);
std::unique_ptr<AST::Crate> metadata_crate = parser.parse_crate ();
+
+ std::vector<ProcMacro::Attribute> attribute_macros;
+ std::vector<ProcMacro::CustomDerive> derive_macros;
+ std::vector<ProcMacro::Bang> bang_macros;
+ for (auto &macro : extern_crate.get_proc_macros ())
+ {
+ switch (macro.tag)
+ {
+ case ProcMacro::CUSTOM_DERIVE:
+ derive_macros.push_back (macro.payload.custom_derive);
+ break;
+ case ProcMacro::ATTR:
+ attribute_macros.push_back (macro.payload.attribute);
+ break;
+ case ProcMacro::BANG:
+ bang_macros.push_back (macro.payload.bang);
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ }
+
+ mappings->insert_attribute_proc_macros (crate_num, attribute_macros);
+ mappings->insert_derive_proc_macros (crate_num, derive_macros);
+ mappings->insert_bang_proc_macros (crate_num, bang_macros);
+
AST::Crate &parsed_crate
= mappings->insert_ast_crate (std::move (metadata_crate), crate_num);
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index c4c6b77..0faea56 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -943,6 +943,70 @@ Mappings::get_exported_macros ()
}
void
+Mappings::insert_derive_proc_macros (
+ CrateNum num, std::vector<ProcMacro::CustomDerive> macros)
+{
+ auto it = procmacrosDeriveMappings.find (num);
+ rust_assert (it == procmacrosDeriveMappings.end ());
+
+ procmacrosDeriveMappings[num] = macros;
+}
+
+void
+Mappings::insert_bang_proc_macros (CrateNum num,
+ std::vector<ProcMacro::Bang> macros)
+{
+ auto it = procmacrosBangMappings.find (num);
+ rust_assert (it == procmacrosBangMappings.end ());
+
+ procmacrosBangMappings[num] = macros;
+}
+
+void
+Mappings::insert_attribute_proc_macros (
+ CrateNum num, std::vector<ProcMacro::Attribute> macros)
+{
+ auto it = procmacrosAttributeMappings.find (num);
+ rust_assert (it == procmacrosAttributeMappings.end ());
+
+ procmacrosAttributeMappings[num] = macros;
+}
+
+bool
+Mappings::lookup_derive_proc_macros (
+ CrateNum num, std::vector<ProcMacro::CustomDerive> &macros)
+{
+ auto it = procmacrosDeriveMappings.find (num);
+ if (it == procmacrosDeriveMappings.end ())
+ return false;
+
+ macros = it->second;
+ return true;
+}
+bool
+Mappings::lookup_bang_proc_macros (CrateNum num,
+ std::vector<ProcMacro::Bang> &macros)
+{
+ auto it = procmacrosBangMappings.find (num);
+ if (it == procmacrosBangMappings.end ())
+ return false;
+
+ macros = it->second;
+ return true;
+}
+bool
+Mappings::lookup_attribute_proc_macros (
+ CrateNum num, std::vector<ProcMacro::Attribute> &macros)
+{
+ auto it = procmacrosAttributeMappings.find (num);
+ if (it == procmacrosAttributeMappings.end ())
+ return false;
+
+ macros = it->second;
+ return true;
+}
+
+void
Mappings::insert_derive_proc_macro (
std::pair<std::string, std::string> hierarchy, ProcMacro::CustomDerive macro)
{
diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h
index e4bb255..d1fbe59 100644
--- a/gcc/rust/util/rust-hir-map.h
+++ b/gcc/rust/util/rust-hir-map.h
@@ -283,6 +283,20 @@ public:
void insert_exported_macro (AST::MacroRulesDefinition &def);
std::vector<NodeId> &get_exported_macros ();
+ void insert_derive_proc_macros (CrateNum num,
+ std::vector<ProcMacro::CustomDerive> macros);
+ void insert_bang_proc_macros (CrateNum num,
+ std::vector<ProcMacro::Bang> macros);
+ void insert_attribute_proc_macros (CrateNum num,
+ std::vector<ProcMacro::Attribute> macros);
+
+ bool lookup_derive_proc_macros (CrateNum num,
+ std::vector<ProcMacro::CustomDerive> &macros);
+ bool lookup_bang_proc_macros (CrateNum num,
+ std::vector<ProcMacro::Bang> &macros);
+ bool lookup_attribute_proc_macros (CrateNum num,
+ std::vector<ProcMacro::Attribute> &macros);
+
void insert_derive_proc_macro (std::pair<std::string, std::string> hierachy,
ProcMacro::CustomDerive macro);
void insert_bang_proc_macro (std::pair<std::string, std::string> hierachy,
@@ -376,6 +390,14 @@ private:
std::vector<NodeId> exportedMacros;
// Procedural macros
+ std::map<CrateNum, std::vector<ProcMacro::CustomDerive>>
+ procmacrosDeriveMappings;
+
+ std::map<CrateNum, std::vector<ProcMacro::Bang>> procmacrosBangMappings;
+
+ std::map<CrateNum, std::vector<ProcMacro::Attribute>>
+ procmacrosAttributeMappings;
+
std::map<std::pair<std::string, std::string>, ProcMacro::CustomDerive>
procmacroDeriveMappings;