summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/expand/lang_item.cpp23
-rw-r--r--src/expand/mod.cpp18
-rw-r--r--src/main.cpp3
-rw-r--r--src/trans/codegen_c.cpp2
-rw-r--r--src/trans/enumerate.cpp2
5 files changed, 28 insertions, 20 deletions
diff --git a/src/expand/lang_item.cpp b/src/expand/lang_item.cpp
index 8454aceb..a995aec0 100644
--- a/src/expand/lang_item.cpp
+++ b/src/expand/lang_item.cpp
@@ -180,6 +180,29 @@ public:
}
};
+class Decorator_Main:
+ public ExpandDecorator
+{
+public:
+ AttrStage stage() const override { return AttrStage::Post; }
+ void handle(const Span& sp, const AST::MetaItem& attr, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item& i) const override
+ {
+ TU_IFLET(::AST::Item, i, Function, e,
+ auto rv = crate.m_lang_items.insert(::std::make_pair( ::std::string("mrustc-main"), ::AST::Path(path) ));
+ if( !rv.second )
+ {
+ const auto& other_path = rv.first->second;
+ ERROR(sp, E0000, "Duplicate definition of #[main] - " << other_path << " and " << path);
+ }
+ )
+ else {
+ ERROR(sp, E0000, "#[main] on non-function " << path);
+ }
+ }
+};
+
+
STATIC_DECORATOR("lang", Decorator_LangItem)
+STATIC_DECORATOR("main", Decorator_Main);
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp
index 3e67ed15..f152b1ab 100644
--- a/src/expand/mod.cpp
+++ b/src/expand/mod.cpp
@@ -1024,24 +1024,6 @@ void Expand(::AST::Crate& crate)
// Post-process
Expand_Mod_IndexAnon(crate, crate.m_root_module);
- #if 0
- for( auto& a : crate.m_attrs.m_items )
- {
- for( auto& d : g_decorators ) {
- if( d.first == a.name() && d.second->expand_before_macros() == false ) {
- //d.second->handle(a, crate, ::AST::Path(), crate.m_root_module, crate.m_root_module);
- }
- }
- }
- for( auto& a : crate.m_attrs.m_items )
- {
- for( auto& d : g_decorators ) {
- if( d.first == a.name() && d.second->expand_before_macros() == false ) {
- d.second->handle(a, crate);
- }
- }
- }
- #endif
}
diff --git a/src/main.cpp b/src/main.cpp
index 6319e174..b334114d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -283,6 +283,9 @@ int main(int argc, char *argv[])
// TODO: Detect if an allocator crate is already present.
crate.load_extern_crate(Span(), "alloc_system");
crate.load_extern_crate(Span(), "panic_abort");
+
+ // - `mrustc-main` lang item default
+ crate.m_lang_items.insert(::std::make_pair( ::std::string("mrustc-main"), ::AST::Path("", {AST::PathNode("main")}) ));
}
// Resolve names to be absolute names (include references to the relevant struct/global/function)
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 11a74b4f..7308a9f3 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -104,7 +104,7 @@ namespace {
m_of
<< "int main(int argc, const char* argv[]) {\n"
<< "\t" << Trans_Mangle( ::HIR::GenericPath(m_resolve.m_crate.get_lang_item_path(Span(), "start")) ) << "("
- << "(uint8_t*)" << Trans_Mangle( ::HIR::GenericPath(::HIR::SimplePath(m_crate.m_crate_name, {"main"})) ) << ", argc, (uint8_t**)argv"
+ << "(uint8_t*)" << Trans_Mangle( ::HIR::GenericPath(m_resolve.m_crate.get_lang_item_path(Span(), "mrustc-main")) ) << ", argc, (uint8_t**)argv"
<< ");\n"
<< "}\n";
}
diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp
index 593cd6e1..f3306c65 100644
--- a/src/trans/enumerate.cpp
+++ b/src/trans/enumerate.cpp
@@ -70,7 +70,7 @@ TransList Trans_Enumerate_Main(const ::HIR::Crate& crate)
// user entrypoint
{
- auto main_path = ::HIR::SimplePath(crate.m_crate_name, {"main"});
+ auto main_path = crate.get_lang_item_path(Span(), "mrustc-main");
const auto& fcn = crate.get_function_by_path(sp, main_path);
state.enum_fcn( main_path, fcn, {} );