aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-01-12 20:07:17 +0000
committergingerBill <bill@gingerbill.org>2022-01-12 20:07:17 +0000
commitfb0a3ab7c14d4bc3b821cef723ec6ea3e956c956 (patch)
tree265afc90c7e7ae4e9b77d65ea1680e55f6bb9e6b /src
parent5ec93677a04f17f38117f0cf301d9a72036a04e7 (diff)
Correct linkage for entry point procedures on Windows
Diffstat (limited to 'src')
-rw-r--r--src/checker.cpp8
-rw-r--r--src/llvm_backend.cpp23
-rw-r--r--src/llvm_backend_proc.cpp2
3 files changed, 19 insertions, 14 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index 42575f88d..f261c8f4a 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -2113,11 +2113,15 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) {
case Entity_Variable:
if (e->Variable.is_export) {
add_dependency_to_set(c, e);
+ } else if (e->flags & EntityFlag_Require) {
+ add_dependency_to_set(c, e);
}
break;
case Entity_Procedure:
if (e->Procedure.is_export) {
add_dependency_to_set(c, e);
+ } else if (e->flags & EntityFlag_Require) {
+ add_dependency_to_set(c, e);
}
if (e->flags & EntityFlag_Init) {
Type *t = base_type(e->type);
@@ -5440,7 +5444,9 @@ void check_parsed_files(Checker *c) {
Ast *node = nullptr;
while (mpmc_dequeue(&c->info.intrinsics_entry_point_usage, &node)) {
if (c->info.entry_point == nullptr && node != nullptr) {
- warning(node, "usage of intrinsics.__entry_point will be a no-op");
+ if (node->file()->pkg->kind != Package_Runtime) {
+ warning(node, "usage of intrinsics.__entry_point will be a no-op");
+ }
}
}
}
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 0b4c674ac..1c3cf86ac 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -1405,7 +1405,6 @@ void lb_generate_code(lbGenerator *gen) {
isize global_variable_max_count = 0;
- Entity *entry_point = info->entry_point;
bool already_has_entry_point = false;
for_array(i, info->entities) {
@@ -1416,14 +1415,17 @@ void lb_generate_code(lbGenerator *gen) {
global_variable_max_count++;
} else if (e->kind == Entity_Procedure) {
if ((e->scope->flags&ScopeFlag_Init) && name == "main") {
- GB_ASSERT(e == entry_point);
- // entry_point = e;
+ GB_ASSERT(e == info->entry_point);
}
if (e->Procedure.is_export ||
(e->Procedure.link_name.len > 0) ||
((e->scope->flags&ScopeFlag_File) && e->Procedure.link_name.len > 0)) {
String link_name = e->Procedure.link_name;
- if (link_name == "main" || link_name == "DllMain" || link_name == "WinMain" || link_name == "mainCRTStartup") {
+ if (link_name == "main" ||
+ link_name == "DllMain" ||
+ link_name == "WinMain" ||
+ link_name == "wWinMain" ||
+ link_name == "mainCRTStartup") {
already_has_entry_point = true;
}
}
@@ -1562,6 +1564,11 @@ void lb_generate_code(lbGenerator *gen) {
}
}
+ TIME_SECTION("LLVM Runtime Type Information Creation");
+ lbProcedure *startup_type_info = lb_create_startup_type_info(default_module);
+
+ TIME_SECTION("LLVM Runtime Startup Creation (Global Variables)");
+ lbProcedure *startup_runtime = lb_create_startup_runtime(default_module, startup_type_info, global_variables);
TIME_SECTION("LLVM Global Procedures and Types");
for_array(i, info->entities) {
@@ -1621,14 +1628,6 @@ void lb_generate_code(lbGenerator *gen) {
}
}
-
- TIME_SECTION("LLVM Runtime Type Information Creation");
- lbProcedure *startup_type_info = lb_create_startup_type_info(default_module);
-
- TIME_SECTION("LLVM Runtime Startup Creation (Global Variables)");
- lbProcedure *startup_runtime = lb_create_startup_runtime(default_module, startup_type_info, global_variables);
-
-
TIME_SECTION("LLVM Procedure Generation");
for_array(j, gen->modules.entries) {
lbModule *m = gen->modules.entries[j].value;
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 10b8a093f..c52572588 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -304,7 +304,7 @@ lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool ignore_body)
lbProcedure *lb_create_dummy_procedure(lbModule *m, String link_name, Type *type) {
{
lbValue *found = string_map_get(&m->members, link_name);
- GB_ASSERT(found == nullptr);
+ GB_ASSERT_MSG(found == nullptr, "failed to create dummy procedure for: %.*s", LIT(link_name));
}
lbProcedure *p = gb_alloc_item(permanent_allocator(), lbProcedure);