fixed: linker crashing
This commit is contained in:
parent
d537dc94ae
commit
266477c956
|
@ -42,9 +42,9 @@ int lld_main(int Argc, const char **Argv, const char **outstr) {
|
||||||
|
|
||||||
lld::Result result = lld::lldMain(Args, stdout_stream, stderr_stream, LLD_COFF_ELF_MINGW_DRIVER);
|
lld::Result result = lld::lldMain(Args, stdout_stream, stderr_stream, LLD_COFF_ELF_MINGW_DRIVER);
|
||||||
|
|
||||||
*outstr = strdup(stdout.c_str());
|
*outstr = strdup(stderr.append(stdout).c_str());
|
||||||
|
|
||||||
return !result.retCode && result.canRunAgain;
|
return result.retCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|
|
@ -23,6 +23,7 @@ typedef struct TargetLinkConfig_t {
|
||||||
gboolean fatal_warnings;
|
gboolean fatal_warnings;
|
||||||
// colorize linker output
|
// colorize linker output
|
||||||
bool colorize;
|
bool colorize;
|
||||||
|
char* output_file;
|
||||||
} TargetLinkConfig;
|
} TargetLinkConfig;
|
||||||
|
|
||||||
typedef enum TargetCompilationMode_t {
|
typedef enum TargetCompilationMode_t {
|
||||||
|
|
|
@ -57,14 +57,14 @@ static int compile_file_to_ast(AST_NODE_PTR ast, ModuleFile *file) {
|
||||||
yyrestart(yyin);
|
yyrestart(yyin);
|
||||||
lex_reset();
|
lex_reset();
|
||||||
|
|
||||||
yyparse();
|
int status = yyparse();
|
||||||
|
|
||||||
// clean up global state
|
// clean up global state
|
||||||
// current_file = NULL;
|
// current_file = NULL;
|
||||||
root = NULL;
|
root = NULL;
|
||||||
yyin = NULL;
|
yyin = NULL;
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -59,6 +59,14 @@ TargetLinkConfig* lld_create_link_config(const Target* target, const TargetConfi
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// output file after linking
|
||||||
|
gchar* basename = g_strjoin(".", target_config->name, "out", NULL);
|
||||||
|
gchar* filename = g_build_filename(target_config->output_directory, basename, NULL);
|
||||||
|
|
||||||
|
config->output_file = filename;
|
||||||
|
}
|
||||||
|
|
||||||
g_array_append_val(config->object_file_names, target_object);
|
g_array_append_val(config->object_file_names, target_object);
|
||||||
INFO("resolved path of target object: %s", target_object);
|
INFO("resolved path of target object: %s", target_object);
|
||||||
|
|
||||||
|
@ -83,20 +91,30 @@ TargetLinkConfig* lld_create_link_config(const Target* target, const TargetConfi
|
||||||
}
|
}
|
||||||
|
|
||||||
GArray* lld_create_lld_arguments(TargetLinkConfig* config) {
|
GArray* lld_create_lld_arguments(TargetLinkConfig* config) {
|
||||||
GArray* argv = g_array_new(FALSE, FALSE, sizeof(char*));
|
GArray* argv = g_array_new(TRUE, FALSE, sizeof(char*));
|
||||||
|
|
||||||
|
gchar* arg = g_strdup("ld.lld");
|
||||||
|
g_array_append_val(argv, arg);
|
||||||
|
|
||||||
if (config->fatal_warnings) {
|
if (config->fatal_warnings) {
|
||||||
g_array_append_val(argv, "--fatal-warnings");
|
arg = g_strdup("--fatal-warnings");
|
||||||
|
g_array_append_val(argv, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config->colorize) {
|
if (config->colorize) {
|
||||||
g_array_append_val(argv, "--color-diagnostics=always");
|
arg = g_strdup("--color-diagnostics=always");
|
||||||
|
g_array_append_val(argv, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
arg = g_strjoin("", "-o", config->output_file, NULL);
|
||||||
|
g_array_append_val(argv, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (guint i = 0; i < config->object_file_names->len; i++) {
|
for (guint i = 0; i < config->object_file_names->len; i++) {
|
||||||
char* object_file_path = g_array_index(config->object_file_names, char*, i);
|
char* object_file_path = g_array_index(config->object_file_names, char*, i);
|
||||||
char* argument = g_strjoin("", "-l", object_file_path, NULL);
|
arg = g_strjoin("", object_file_path, NULL);
|
||||||
g_array_append_val(argv, argument);
|
g_array_append_val(argv, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
return argv;
|
return argv;
|
||||||
|
@ -110,6 +128,10 @@ BackendError lld_link_target(TargetLinkConfig* config) {
|
||||||
|
|
||||||
INFO("Linking target...");
|
INFO("Linking target...");
|
||||||
|
|
||||||
|
char* arguments = g_strjoinv(" ", (char**) argv->data);
|
||||||
|
print_message(Info, "%s", arguments);
|
||||||
|
g_free(arguments);
|
||||||
|
|
||||||
const char* message = NULL;
|
const char* message = NULL;
|
||||||
int status = lld_main((int) argv->len, (const char**) argv->data, &message);
|
int status = lld_main((int) argv->len, (const char**) argv->data, &message);
|
||||||
|
|
||||||
|
@ -118,12 +140,18 @@ BackendError lld_link_target(TargetLinkConfig* config) {
|
||||||
g_array_free(argv, TRUE);
|
g_array_free(argv, TRUE);
|
||||||
|
|
||||||
if (message != NULL) {
|
if (message != NULL) {
|
||||||
print_message(Warning, "Message from LLD: %s", message);
|
if (strcmp("", message) != 0) {
|
||||||
|
print_message(Error, "%s", message);
|
||||||
|
}
|
||||||
|
|
||||||
free((void*) message);
|
free((void*) message);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != 0) {
|
if (status) {
|
||||||
err = new_backend_impl_error(Implementation, NULL, "failed to link target");
|
err = new_backend_impl_error(Implementation, NULL, "failed to link target");
|
||||||
|
print_message(Error, "Linker exited with: %d", status);
|
||||||
|
} else {
|
||||||
|
print_message(Info, "Successfully linked target to: %s", config->output_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -83,8 +83,6 @@ BackendError emit_module_to_file(LLVMBackendCompileUnit* unit,
|
||||||
"invalid codegen file");
|
"invalid codegen file");
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: add custom link libraries
|
|
||||||
|
|
||||||
INFO("export to file: %s", filename);
|
INFO("export to file: %s", filename);
|
||||||
|
|
||||||
if (LLVMTargetMachineEmitToFile(target_machine, unit->module, filename,
|
if (LLVMTargetMachineEmitToFile(target_machine, unit->module, filename,
|
||||||
|
@ -208,7 +206,6 @@ static BackendError build_module(LLVMBackendCompileUnit* unit,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: implement functions
|
|
||||||
err = impl_functions(unit, global_scope, module->functions);
|
err = impl_functions(unit, global_scope, module->functions);
|
||||||
|
|
||||||
char* error = NULL;
|
char* error = NULL;
|
||||||
|
@ -245,13 +242,14 @@ BackendError parse_module(const Module* module, const TargetConfig* config) {
|
||||||
INFO("Module build successfully...");
|
INFO("Module build successfully...");
|
||||||
Target target = create_target_from_config(config);
|
Target target = create_target_from_config(config);
|
||||||
|
|
||||||
export_module(unit, &target, config);
|
err = export_module(unit, &target, config);
|
||||||
|
if (err.kind == Success) {
|
||||||
TargetLinkConfig* link_config = lld_create_link_config(&target, config, module);
|
TargetLinkConfig* link_config = lld_create_link_config(&target, config, module);
|
||||||
|
|
||||||
lld_link_target(link_config);
|
lld_link_target(link_config);
|
||||||
|
|
||||||
lld_delete_link_config(link_config);
|
lld_delete_link_config(link_config);
|
||||||
|
}
|
||||||
|
|
||||||
delete_target(target);
|
delete_target(target);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue