aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/rust-session-manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/rust-session-manager.cc')
-rw-r--r--gcc/rust/rust-session-manager.cc113
1 files changed, 46 insertions, 67 deletions
diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc
index 1107608..febd009 100644
--- a/gcc/rust/rust-session-manager.cc
+++ b/gcc/rust/rust-session-manager.cc
@@ -62,6 +62,13 @@ const char *kTargetOptionsDumpFile = "gccrs.target-options.dump";
const std::string kDefaultCrateName = "rust_out";
const size_t kMaxNameLength = 64;
+Session &
+Session::get_instance ()
+{
+ static Session instance;
+ return instance;
+}
+
static std::string
infer_crate_name (const std::string &filename)
{
@@ -374,6 +381,9 @@ Session::init ()
// setup backend to GCC GIMPLE
backend = rust_get_backend ();
+
+ // setup mappings class
+ mappings = Analysis::Mappings::get ();
}
/* Initialise default options. Actually called before handle_option, unlike init
@@ -574,10 +584,8 @@ Session::parse_files (int num_files, const char **files)
options.set_crate_name (crate_name);
}
- auto mappings = Analysis::Mappings::get ();
- CrateNum crate_num = mappings->setup_crate_mappings (options.crate_name);
+ CrateNum crate_num = mappings->get_next_crate_num (options.get_crate_name ());
mappings->set_current_crate (crate_num);
-
for (int i = 0; i < num_files; i++)
{
rust_debug ("Attempting to parse file: %s", files[i]);
@@ -588,7 +596,7 @@ Session::parse_files (int num_files, const char **files)
}
void
-Session::handle_crate_name (AST::Crate parsed_crate)
+Session::handle_crate_name (const AST::Crate &parsed_crate)
{
auto mappings = Analysis::Mappings::get ();
auto crate_name_changed = false;
@@ -656,26 +664,23 @@ Session::parse_file (const char *filename)
Parser<Lexer> parser (lex);
// generate crate from parser
- auto parsed_crate = parser.parse_crate ();
-
- // setup the mappings for this AST
- auto mappings = Analysis::Mappings::get ();
- mappings->insert_ast_crate (&parsed_crate);
+ std::unique_ptr<AST::Crate> ast_crate = parser.parse_crate ();
// handle crate name
- handle_crate_name (parsed_crate);
+ handle_crate_name (*ast_crate.get ());
+ // dump options
if (options.dump_option_enabled (CompileOptions::LEXER_DUMP))
{
dump_lex (parser);
}
if (options.dump_option_enabled (CompileOptions::PARSER_AST_DUMP))
{
- dump_ast (parser, parsed_crate);
+ dump_ast (parser, *ast_crate.get ());
}
if (options.dump_option_enabled (CompileOptions::AST_DUMP_PRETTY))
{
- dump_ast_pretty (parsed_crate);
+ dump_ast_pretty (*ast_crate.get ());
}
if (options.dump_option_enabled (CompileOptions::TARGET_OPTION_DUMP))
{
@@ -685,6 +690,11 @@ Session::parse_file (const char *filename)
if (saw_errors ())
return;
+ // setup the mappings for this AST
+ CrateNum current_crate = mappings->get_current_crate ();
+ AST::Crate &parsed_crate
+ = mappings->insert_ast_crate (std::move (ast_crate), current_crate);
+
/* basic pipeline:
* - lex
* - parse
@@ -744,23 +754,22 @@ Session::parse_file (const char *filename)
return;
// lower AST to HIR
- HIR::Crate hir = HIR::ASTLowering::Resolve (parsed_crate);
+ std::unique_ptr<HIR::Crate> lowered
+ = HIR::ASTLowering::Resolve (parsed_crate);
+ if (saw_errors ())
+ return;
+
+ // add the mappings to it
+ HIR::Crate &hir = mappings->insert_hir_crate (std::move (lowered));
if (options.dump_option_enabled (CompileOptions::HIR_DUMP))
{
dump_hir (hir);
}
-
if (options.dump_option_enabled (CompileOptions::HIR_DUMP_PRETTY))
{
dump_hir_pretty (hir);
}
- if (saw_errors ())
- return;
-
- // add the mappings to it
- mappings->insert_hir_crate (&hir);
-
// type resolve
Resolver::TypeResolution::Resolve (hir);
if (options.dump_option_enabled (CompileOptions::TYPE_RESOLUTION_DUMP))
@@ -781,6 +790,7 @@ Session::parse_file (const char *filename)
// we can't do static analysis if there are errors to worry about
if (!saw_errors ())
{
+ // lints
Analysis::ScanDeadcode::Scan (hir);
Analysis::UnusedVariables::Lint (ctx);
}
@@ -789,52 +799,6 @@ Session::parse_file (const char *filename)
ctx.write_to_backend ();
}
-// TODO: actually implement method
-void
-load_extern_crate (std::string crate_name ATTRIBUTE_UNUSED)
-{}
-// TODO: deprecated - don't use
-
-// Parses up to the "load (external) crates" part of the frontend.
-// TODO: lots of this code is probably actually useful outside of dumping, so
-// maybe split off function
-void
-Session::debug_dump_load_crates (Parser<Lexer> &parser)
-{
- // parse crate as AST
- AST::Crate crate = parser.parse_crate ();
-
- /* TODO: search through inner attrs and see whether any of those attr paths
- * contain "no_core", "no_std", "compiler_builtins". If so/not, save certain
- * crate names. In these names, insert items at beginning of crate items.
- * This is crate injection. Also, inject prelude use decl at beginning
- * (first name is assumed to be prelude - prelude is a use decl
- * automatically generated to enable using Option and Copy without
- * qualifying it or importing it via 'use' manually) */
-
- std::vector<std::string> crate_names;
- for (const auto &item : crate.items)
- {
- // if item is extern crate, add name? to list of stuff ONLY IF config is
- // checked if item is module, iterate this loop inside it as well
- // (recursive?) ONLY IF config is checked
-
- // TODO: actually do the checks somewhere - probably in the items
-
- item->add_crate_name (crate_names);
- }
-
- /* loop through list of crate names/paths/whatever, attempting to load each
- * one. save loaded crates to a Session variable? Or save to current
- * AST::Crate? */
- for (const auto &name : crate_names)
- {
- load_extern_crate (name /*, basename = ""?*/);
- }
- // for each loaded crate, load dependencies of it as well
-}
-// TODO: deprecated - don't use
-
void
Session::register_plugins (AST::Crate &crate ATTRIBUTE_UNUSED)
{
@@ -951,7 +915,7 @@ Session::injection (AST::Crate &crate)
Linemap::unknown_location ()));
// insert at beginning
- crate.items.insert (crate.items.begin (), std::move (extern_crate));
+ // crate.items.insert (crate.items.begin (), std::move (extern_crate));
}
// create use tree path
@@ -1130,6 +1094,21 @@ Session::dump_type_resolution (HIR::Crate &hir) const
out.close ();
}
+// imports
+
+NodeId
+Session::load_extern_crate (const std::string &crate_name)
+{
+ // check if it was already loaded
+ // ....
+
+ rust_debug ("load_extern_crate: %s", crate_name.c_str ());
+ gcc_unreachable ();
+
+ return UNKNOWN_NODEID;
+}
+//
+
void
TargetOptions::dump_target_options () const
{