Merge pull request #2867 from flysand7/linux-asm

Implement foreign asm (x86) imports for linux and osx
This commit is contained in:
Jeroen van Rijn
2023-10-15 12:53:32 +02:00
committed by GitHub
2 changed files with 90 additions and 44 deletions
+1 -2
View File
@@ -4733,8 +4733,7 @@ gb_internal void check_add_foreign_import_decl(CheckerContext *ctx, Ast *decl) {
} }
if (has_asm_extension(fullpath)) { if (has_asm_extension(fullpath)) {
if (build_context.metrics.arch != TargetArch_amd64 || if (build_context.metrics.arch != TargetArch_amd64) {
build_context.metrics.os != TargetOs_windows) {
error(decl, "Assembly files are not yet supported on this platform: %.*s_%.*s", error(decl, "Assembly files are not yet supported on this platform: %.*s_%.*s",
LIT(target_os_names[build_context.metrics.os]), LIT(target_arch_names[build_context.metrics.arch])); LIT(target_os_names[build_context.metrics.os]), LIT(target_arch_names[build_context.metrics.arch]));
} }
+49 -2
View File
@@ -149,14 +149,20 @@ gb_internal i32 linker_stage(LinkerData *gen) {
if (!string_set_update(&asm_files, lib)) { if (!string_set_update(&asm_files, lib)) {
String asm_file = asm_files.entries[i].value; String asm_file = asm_files.entries[i].value;
String obj_file = concatenate_strings(permanent_allocator(), asm_file, str_lit(".obj")); String obj_file = concatenate_strings(permanent_allocator(), asm_file, str_lit(".obj"));
String obj_format;
#if defined(GB_ARCH_64_BIT)
obj_format = str_lit("win64");
#elif defined(GB_ARCH_32_BIT)
obj_format = str_lit("win32");
#endif // GB_ARCH_*_BIT
result = system_exec_command_line_app("nasm", result = system_exec_command_line_app("nasm",
"\"%.*s\\bin\\nasm\\windows\\nasm.exe\" \"%.*s\" " "\"%.*s\\bin\\nasm\\windows\\nasm.exe\" \"%.*s\" "
"-f win64 " "-f \"%.*s\" "
"-o \"%.*s\" " "-o \"%.*s\" "
"%.*s " "%.*s "
"", "",
LIT(build_context.ODIN_ROOT), LIT(asm_file), LIT(build_context.ODIN_ROOT), LIT(asm_file),
LIT(obj_format),
LIT(obj_file), LIT(obj_file),
LIT(build_context.extra_assembler_flags) LIT(build_context.extra_assembler_flags)
); );
@@ -296,6 +302,10 @@ gb_internal i32 linker_stage(LinkerData *gen) {
gbString lib_str = gb_string_make(heap_allocator(), "-L/"); gbString lib_str = gb_string_make(heap_allocator(), "-L/");
defer (gb_string_free(lib_str)); defer (gb_string_free(lib_str));
StringSet asm_files = {};
string_set_init(&asm_files, 64);
defer (string_set_destroy(&asm_files));
StringSet libs = {}; StringSet libs = {};
string_set_init(&libs, 64); string_set_init(&libs, 64);
defer (string_set_destroy(&libs)); defer (string_set_destroy(&libs));
@@ -307,6 +317,42 @@ gb_internal i32 linker_stage(LinkerData *gen) {
if (lib.len == 0) { if (lib.len == 0) {
continue; continue;
} }
if (has_asm_extension(lib)) {
if (string_set_update(&asm_files, lib)) {
continue; // already handled
}
String asm_file = lib;
String obj_file = concatenate_strings(permanent_allocator(), asm_file, str_lit(".o"));
String obj_format;
#if defined(GB_ARCH_64_BIT)
if (is_osx) {
obj_format = str_lit("macho64");
} else {
obj_format = str_lit("elf64");
}
#elif defined(GB_ARCH_32_BIT)
if (is_osx) {
obj_format = str_lit("macho32");
} else {
obj_format = str_lit("elf32");
}
#endif // GB_ARCH_*_BIT
// Note(bumbread): I'm assuming nasm is installed on the host machine.
// Shipping binaries on unix-likes gets into the weird territorry of
// "which version of glibc" is it linked with.
result = system_exec_command_line_app("nasm",
"nasm \"%.*s\" "
"-f \"%.*s\" "
"-o \"%.*s\" "
"%.*s "
"",
LIT(asm_file),
LIT(obj_format),
LIT(obj_file),
LIT(build_context.extra_assembler_flags)
);
array_add(&gen->output_object_paths, obj_file);
} else {
if (string_set_update(&libs, lib)) { if (string_set_update(&libs, lib)) {
continue; continue;
} }
@@ -351,6 +397,7 @@ gb_internal i32 linker_stage(LinkerData *gen) {
} }
} }
} }
}
for (Entity *e : gen->foreign_libraries) { for (Entity *e : gen->foreign_libraries) {
GB_ASSERT(e->kind == Entity_LibraryName); GB_ASSERT(e->kind == Entity_LibraryName);