#ifndef __SCC_FORMAT_BUILDER_H__ #define __SCC_FORMAT_BUILDER_H__ #include "sccf_utils.h" #include typedef struct { sccf_t sccf; int aligned; sccf_strtab_t strtab; sccf_reloc_vec_t relocs; sccf_sym_vec_t symtab; scc_hashtable_t str2sym; scc_hashtable_t str2offset; } sccf_builder_t; void sccf_builder_init(sccf_builder_t *builder); usize sccf_builder_add_symbol(sccf_builder_t *builder, const char *name, sccf_sym_t *sym); usize sccf_builder_get_symbol_idx(sccf_builder_t *builder, const char *name); static inline sccf_sym_t * sccf_builder_get_symbol_unsafe(sccf_builder_t *builder, usize idx) { return &scc_vec_at(builder->symtab, idx); } void sccf_builder_add_reloc(sccf_builder_t *builder, sccf_reloc_t reloc); /** * @brief 必须确保参数合法 * * @param builder * @param sect_header * @param sect_data */ void sccf_builder_add_section(sccf_builder_t *builder, sccf_sect_header_t *sect_header, sccf_sect_data_t *sect_data); static inline void sccf_builder_add_text_section(sccf_builder_t *builder, sccf_sect_data_t *sect_data) { sccf_sect_header_t text_header = { .name = ".text", .addralign = 1, .data_size = scc_vec_size(*sect_data), .sccf_sect_type = SCCF_SECT_CODE, .size = scc_vec_size(*sect_data), .info = 0, .reserved = {0}, }; sccf_builder_add_section(builder, &text_header, sect_data); } static inline void sccf_builder_add_data_section(sccf_builder_t *builder, sccf_sect_data_t *sect_data) { sccf_sect_header_t text_header = { .name = ".data", .addralign = 1, .data_size = scc_vec_size(*sect_data), .sccf_sect_type = SCCF_SECT_DATA, .size = scc_vec_size(*sect_data), .info = 0, .reserved = {0}, }; sccf_builder_add_section(builder, &text_header, sect_data); } const sccf_t *sccf_builder_to_sccf(sccf_builder_t *builder); void sccf_builder_to_buffer(sccf_builder_t *builder, sccf_buffer_t *buffer); void sccf_builder_to_file(sccf_builder_t *builder, const char *file_path); #endif /* __SCC_FORMAT_BUILDER_H__ */