73 lines
1.9 KiB
C
73 lines
1.9 KiB
C
//
|
|
// Created by servostar on 18.07.24.
|
|
//
|
|
|
|
#include <io/files.h>
|
|
#include <link/clang/driver.h>
|
|
#include <link/gcc/driver.h>
|
|
#include <link/lib.h>
|
|
#include <mem/cache.h>
|
|
#include <sys/log.h>
|
|
|
|
static driver_init AVAILABLE_DRIVER[] = {clang_get_driver, gcc_get_driver};
|
|
|
|
static GHashTable* binary_driver = NULL;
|
|
|
|
void link_init() {
|
|
INFO("initializing binary driver...");
|
|
|
|
if (binary_driver == NULL) {
|
|
binary_driver =
|
|
mem_new_g_hash_table(MemoryNamespaceLld, g_str_hash, g_str_equal);
|
|
|
|
for (unsigned long int i = 0;
|
|
i < sizeof(AVAILABLE_DRIVER) / sizeof(driver_init); i++) {
|
|
BinaryDriver* driver = AVAILABLE_DRIVER[i]();
|
|
|
|
if (driver == NULL) {
|
|
ERROR("failed to init driver by index: %d", i);
|
|
continue;
|
|
}
|
|
|
|
g_hash_table_insert(binary_driver, (gpointer) driver->name, driver);
|
|
INFO("initialized `%s` driver", driver->name);
|
|
}
|
|
} else {
|
|
PANIC("binary driver already initialized");
|
|
}
|
|
}
|
|
|
|
bool link_run(TargetLinkConfig* config) {
|
|
|
|
if (g_hash_table_contains(binary_driver, config->driver)) {
|
|
print_message(Info, "Invoking binary driver: %s", config->driver);
|
|
|
|
BinaryDriver* driver =
|
|
g_hash_table_lookup(binary_driver, config->driver);
|
|
|
|
if (!driver->link_func(config)) {
|
|
print_message(Error, "Driver %s failed", config->driver);
|
|
return false;
|
|
}
|
|
return true;
|
|
|
|
} else {
|
|
print_message(Error, "Binary driver not available: `%s`",
|
|
config->driver);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void link_print_available_driver() {
|
|
printf("Available binary driver:\n");
|
|
|
|
GHashTableIter iter;
|
|
gpointer key, value;
|
|
g_hash_table_iter_init(&iter, binary_driver);
|
|
|
|
while (g_hash_table_iter_next(&iter, &key, &value)) {
|
|
|
|
printf(" - %s\n", (char*) key);
|
|
}
|
|
}
|