diff --git a/src/coff/coff_lib_writer.c b/src/coff/coff_lib_writer.c index e29370d5..ad7fa781 100644 --- a/src/coff/coff_lib_writer.c +++ b/src/coff/coff_lib_writer.c @@ -87,7 +87,7 @@ coff_lib_writer_release(COFF_LibWriter **writer_ptr) *writer_ptr = 0; } -internal void +internal U64 coff_lib_writer_push_obj(COFF_LibWriter *writer, String8 obj_path, String8 obj_data) { U64 member_idx = writer->member_list.count; @@ -126,57 +126,45 @@ coff_lib_writer_push_obj(COFF_LibWriter *writer, String8 obj_path, String8 obj_d } } } + + return member_idx; } internal void -coff_lib_writer_push_export(COFF_LibWriter *writer, String8 raw_import_header) +coff_lib_writer_push_import(COFF_LibWriter *lib_writer, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportByType import_by, String8 name, U16 hint_or_ordinal, COFF_ImportType import_type) { - U64 member_idx = writer->member_list.count; - COFF_ParsedArchiveImportHeader import_header = coff_archive_import_from_data(raw_import_header); - // push import member + U64 member_idx = lib_writer->member_list.count; COFF_LibWriterMember member = {0}; - member.name = import_header.dll_name; - member.data = raw_import_header; - coff_lib_writer_member_list_push(writer->arena, &writer->member_list, member); + member.name = dll_name; + member.data = coff_make_import_header(lib_writer->arena, machine, time_stamp, dll_name, import_by, name, hint_or_ordinal, import_type); + coff_lib_writer_member_list_push(lib_writer->arena, &lib_writer->member_list, member); - switch (import_header.type) { - case COFF_ImportHeader_Code: { - COFF_LibWriterSymbol def_symbol = {0}; - def_symbol.name = push_str8_copy(writer->arena, import_header.func_name); - def_symbol.member_idx = member_idx; - coff_lib_writer_symbol_list_push(writer->arena, &writer->symbol_list, def_symbol); + if (name.size) { + switch (import_type) { + case COFF_ImportHeader_Code: { + COFF_LibWriterSymbol thunk_symbol = {0}; + thunk_symbol.name = push_str8_copy(lib_writer->arena, name); + thunk_symbol.member_idx = member_idx; + coff_lib_writer_symbol_list_push(lib_writer->arena, &lib_writer->symbol_list, thunk_symbol); - COFF_LibWriterSymbol imp_symbol = {0}; - imp_symbol.name = push_str8f(writer->arena, "__imp_%S", import_header.func_name); - imp_symbol.member_idx = member_idx; - coff_lib_writer_symbol_list_push(writer->arena, &writer->symbol_list, def_symbol); - } break; - case COFF_ImportHeader_Data: { - COFF_LibWriterSymbol imp_symbol = {0}; - imp_symbol.name = push_str8f(writer->arena, "__imp_%S", import_header.func_name); - imp_symbol.member_idx = member_idx; - coff_lib_writer_symbol_list_push(writer->arena, &writer->symbol_list, imp_symbol); - } break; - case COFF_ImportHeader_Const: { NotImplemented; } break; - default: { InvalidPath; } break; + COFF_LibWriterSymbol imp_symbol = {0}; + imp_symbol.name = push_str8f(lib_writer->arena, "__imp_%S", name); + imp_symbol.member_idx = member_idx; + coff_lib_writer_symbol_list_push(lib_writer->arena, &lib_writer->symbol_list, imp_symbol); + } break; + case COFF_ImportHeader_Data: { + COFF_LibWriterSymbol imp_symbol = {0}; + imp_symbol.name = push_str8f(lib_writer->arena, "__imp_%S", name); + imp_symbol.member_idx = member_idx; + coff_lib_writer_symbol_list_push(lib_writer->arena, &lib_writer->symbol_list, imp_symbol); + } break; + case COFF_ImportHeader_Const: { NotImplemented; } break; + default: { InvalidPath; } break; + } } } -internal void -coff_lib_writer_push_export_by_ordinal(COFF_LibWriter *lib_writer, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportType import_type, U16 ordinal) -{ - String8 import_header = coff_make_import_header_by_ordinal(lib_writer->arena, machine, time_stamp, dll_name, ordinal, import_type); - coff_lib_writer_push_export(lib_writer, import_header); -} - -internal void -coff_lib_writer_push_export_by_name(COFF_LibWriter *lib_writer, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportType import_type, String8 name, U16 hint) -{ - String8 import_header = coff_make_import_header_by_name(lib_writer->arena, machine, time_stamp, dll_name, name, hint, import_type); - coff_lib_writer_push_export(lib_writer, import_header); -} - internal String8List coff_lib_writer_serialize(Arena *arena, COFF_LibWriter *lib_writer, COFF_TimeStamp time_stamp, U16 mode, B32 emit_second_member) { diff --git a/src/coff/coff_lib_writer.h b/src/coff/coff_lib_writer.h index 76dee152..76b283c0 100644 --- a/src/coff/coff_lib_writer.h +++ b/src/coff/coff_lib_writer.h @@ -53,17 +53,17 @@ typedef struct COFF_LibWriter internal COFF_LibWriterSymbolNode * coff_lib_writer_symbol_list_push(Arena *arena, COFF_LibWriterSymbolList *list, COFF_LibWriterSymbol symbol); internal COFF_LibWriterMemberNode * coff_lib_writer_member_list_push(Arena *arena, COFF_LibWriterMemberList *list, COFF_LibWriterMember member); + internal COFF_LibWriterSymbol * coff_lib_writer_symbol_array_from_list(Arena *arena, COFF_LibWriterSymbolList list); internal COFF_LibWriterMember * coff_lib_writer_member_array_from_list(Arena *arena, COFF_LibWriterMemberList list); + internal void coff_lib_writer_symbol_array_sort(COFF_LibWriterSymbol *arr, U64 count); internal COFF_LibWriter * coff_lib_writer_alloc(void); -internal void coff_lib_writer_release(COFF_LibWriter **writer_ptr); -internal void coff_lib_writer_push_obj(COFF_LibWriter *writer, String8 obj_path, String8 obj_data); -internal void coff_lib_writer_push_export(COFF_LibWriter *writer, String8 raw_import_header); -internal void coff_lib_writer_push_export_by_ordinal(COFF_LibWriter *lib_writer, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportType import_type, U16 ordinal); -internal void coff_lib_writer_push_export_by_name(COFF_LibWriter *lib_writer, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportType import_type, String8 name, U16 hint); -internal String8List coff_lib_writer_serialize(Arena *arena, COFF_LibWriter *lib_writer, COFF_TimeStamp time_stamp, U16 mode, B32 emit_second_member); +internal void coff_lib_writer_release(COFF_LibWriter **writer_ptr); +internal U64 coff_lib_writer_push_obj(COFF_LibWriter *writer, String8 obj_path, String8 obj_data); +internal void coff_lib_writer_push_import(COFF_LibWriter *lib_writer, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportByType import_by, String8 name, U16 hint_or_ordinal, COFF_ImportType import_type); +internal String8List coff_lib_writer_serialize(Arena *arena, COFF_LibWriter *lib_writer, COFF_TimeStamp time_stamp, U16 mode, B32 emit_second_member); #endif // COFF_LIB_WRITER_H