feat: added optimization level option to lld

This commit is contained in:
Sven Vogel 2024-09-19 19:48:45 +02:00
parent 0b1245b9cc
commit 2a688816fb
12 changed files with 38 additions and 19 deletions

View File

@ -6,7 +6,7 @@
#include <link/clang/driver.h> #include <link/clang/driver.h>
#include <mem/cache.h> #include <mem/cache.h>
bool clang_link(TargetLinkConfig* config) { bool clang_link(TargetConfig*, TargetLinkConfig* config) {
GString* commandString = g_string_new(""); GString* commandString = g_string_new("");

View File

@ -7,7 +7,7 @@
#include <link/driver.h> #include <link/driver.h>
bool clang_link(TargetLinkConfig* config); bool clang_link(TargetConfig*, TargetLinkConfig* config);
BinaryDriver* clang_get_driver(); BinaryDriver* clang_get_driver();

View File

@ -10,7 +10,7 @@
#define DEFAULT_DRIVER "ld.lld" #define DEFAULT_DRIVER "ld.lld"
//! @brief Function a binary driver used to link files //! @brief Function a binary driver used to link files
typedef bool (*driver_link)(TargetLinkConfig*); typedef bool (*driver_link)(TargetConfig*, TargetLinkConfig*);
typedef struct BinaryDriver_t { typedef struct BinaryDriver_t {
const char* name; const char* name;

View File

@ -6,7 +6,7 @@
#include <link/clang/driver.h> #include <link/clang/driver.h>
#include <mem/cache.h> #include <mem/cache.h>
bool gcc_link(TargetLinkConfig* config) { bool gcc_link(TargetConfig*, TargetLinkConfig* config) {
GString* commandString = g_string_new(""); GString* commandString = g_string_new("");

View File

@ -7,7 +7,7 @@
#include <link/driver.h> #include <link/driver.h>
bool gcc_link(TargetLinkConfig* config); bool gcc_link(TargetConfig*, TargetLinkConfig* config);
BinaryDriver* gcc_get_driver(); BinaryDriver* gcc_get_driver();

View File

@ -39,7 +39,7 @@ void link_init() {
} }
} }
bool link_run(TargetLinkConfig* config) { bool link_run(TargetConfig* target_config, TargetLinkConfig* config) {
if (g_hash_table_contains(binary_driver, config->driver)) { if (g_hash_table_contains(binary_driver, config->driver)) {
print_message(Info, "Invoking binary driver: %s", config->driver); print_message(Info, "Invoking binary driver: %s", config->driver);
@ -47,7 +47,7 @@ bool link_run(TargetLinkConfig* config) {
BinaryDriver* driver = BinaryDriver* driver =
g_hash_table_lookup(binary_driver, config->driver); g_hash_table_lookup(binary_driver, config->driver);
if (!driver->link_func(config)) { if (!driver->link_func(target_config, config)) {
print_message(Error, "Driver %s failed", config->driver); print_message(Error, "Driver %s failed", config->driver);
return false; return false;
} }

View File

@ -11,7 +11,7 @@ typedef BinaryDriver* (*driver_init)();
void link_init(); void link_init();
bool link_run(TargetLinkConfig*); bool link_run(TargetConfig*, TargetLinkConfig*);
void link_print_available_driver(); void link_print_available_driver();

View File

@ -16,32 +16,51 @@ const char* FLAGS[] = {
"--dynamic-linker=/usr/bin/ld.so" "--dynamic-linker=/usr/bin/ld.so"
}; };
bool lldc_link(TargetLinkConfig* config) { const char* get_optimization_level_string(TargetConfig* config)
{
char* buffer = mem_alloc(MemoryNamespaceLld, 6);
sprintf(buffer, "-O%d", config->optimization_level);
return buffer;
}
bool lldc_link(TargetConfig* target_config, TargetLinkConfig* link_config) {
GArray* arguments = mem_new_g_array(MemoryNamespaceLld, sizeof(char*)); GArray* arguments = mem_new_g_array(MemoryNamespaceLld, sizeof(char*));
char* linker = "ld.lld"; char* linker = "ld.lld";
g_array_append_val(arguments, linker); g_array_append_val(arguments, linker);
const char* optimization_level = get_optimization_level_string(target_config);
g_array_append_val(arguments, optimization_level);
for (int i = 0; i < sizeof(FLAGS)/sizeof(char*); i++) { for (int i = 0; i < sizeof(FLAGS)/sizeof(char*); i++) {
char* flag = (char*) FLAGS[i]; char* flag = (char*) FLAGS[i];
g_array_append_val(arguments, flag); g_array_append_val(arguments, flag);
} }
for (guint i = 0; i < config->object_file_names->len; i++) { for (guint i = 0; i < link_config->object_file_names->len; i++) {
char* obj = g_array_index(config->object_file_names, char*, i); char* obj = g_array_index(link_config->object_file_names, char*, i);
g_array_append_val(arguments, obj); g_array_append_val(arguments, obj);
} }
char* output_flag = "-o"; char* output_flag = "-o";
g_array_append_val(arguments, output_flag); g_array_append_val(arguments, output_flag);
g_array_append_val(arguments, config->output_file); g_array_append_val(arguments, link_config->output_file);
size_t chars = 0;
for (guint i = 0; i < arguments->len; i++) { for (guint i = 0; i < arguments->len; i++) {
printf("%s ", g_array_index(arguments, char*, i)); chars += strlen(g_array_index(arguments, char*, i));
} }
printf("\n");
char* buffer = mem_alloc(MemoryNamespaceLld, chars + 1);
size_t offset = 0;
for (guint i = 0; i < arguments->len; i++) {
offset += sprintf(buffer + offset, "%s ", g_array_index(arguments, char*, i));
}
print_message(Info, buffer);
const char* message = NULL; const char* message = NULL;
const bool code = lld_main(arguments->len, (const char**) arguments->data, &message); const bool code = lld_main(arguments->len, (const char**) arguments->data, &message);

View File

@ -7,7 +7,7 @@
#include <link/driver.h> #include <link/driver.h>
bool lldc_link(TargetLinkConfig* config); bool lldc_link(TargetConfig* target_config, TargetLinkConfig* link_config);
BinaryDriver* lldc_get_driver(); BinaryDriver* lldc_get_driver();

View File

@ -121,9 +121,9 @@ TargetLinkConfig* lld_create_link_config(__attribute__((unused))
return config; return config;
} }
BackendError lld_link_target(TargetLinkConfig* config) { BackendError lld_link_target(TargetConfig* target_config, TargetLinkConfig* config) {
if (link_run(config)) { if (link_run(target_config, config)) {
return SUCCESS; return SUCCESS;
} }

View File

@ -13,7 +13,7 @@ TargetLinkConfig* lld_create_link_config(__attribute__((unused))
const TargetConfig* target_config, const TargetConfig* target_config,
const Module* module); const Module* module);
BackendError lld_link_target(TargetLinkConfig* config); BackendError lld_link_target(TargetConfig* target_config, TargetLinkConfig* config);
void lld_delete_link_config(TargetLinkConfig* config); void lld_delete_link_config(TargetLinkConfig* config);

View File

@ -269,7 +269,7 @@ BackendError parse_module(const Module* module, const TargetConfig* config) {
lld_create_link_config(&target, config, module); lld_create_link_config(&target, config, module);
if (link_config != NULL) { if (link_config != NULL) {
err = lld_link_target(link_config); err = lld_link_target((TargetConfig*) config, link_config);
lld_delete_link_config(link_config); lld_delete_link_config(link_config);
} else { } else {