mirror of
https://github.com/netwide-assembler/nasm.git
synced 2024-11-21 03:14:19 +08:00
outmatch: fix file info and cleanup in dwarf generation
In debug info and line, only main source is showed up. Header files will be laid out via TAG_subprogram Included missing memory cleanups Removed unnecessary null assertions Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
64dd380f1e
commit
1d73d14eb0
@ -355,6 +355,7 @@ static struct file_list *dw_head_list = 0, *dw_cur_list = 0, *dw_last_list = 0;
|
||||
static struct dw_sect_list *dw_head_sect = 0, *dw_cur_sect = 0, *dw_last_sect = 0;
|
||||
static uint32_t cur_line = 0, dw_num_files = 0, dw_num_sects = 0;
|
||||
static bool dbg_immcall = false;
|
||||
static const char *module_name = NULL;
|
||||
|
||||
/*
|
||||
* Special section numbers which are used to define Mach-O special
|
||||
@ -1071,6 +1072,7 @@ static int32_t macho_segbase(int32_t section)
|
||||
static void macho_filename(char *inname, char *outname)
|
||||
{
|
||||
standard_extension(inname, outname, ".o");
|
||||
module_name = inname;
|
||||
}
|
||||
|
||||
extern macros_t macho_stdmac[];
|
||||
@ -1784,7 +1786,7 @@ static void macho_dbg_generate(void)
|
||||
size_t saa_len = 0, high_addr = 0, total_len = 0;
|
||||
struct section *p_section = NULL;
|
||||
/* calculated at debug_str and referenced at debug_info */
|
||||
uint32_t producer_str_offset = 0, module_str_offset = 0, path_str_offset = 0;
|
||||
uint32_t producer_str_offset = 0, module_str_offset = 0, dir_str_offset = 0;
|
||||
|
||||
/* debug section defines */
|
||||
{
|
||||
@ -1816,11 +1818,9 @@ static void macho_dbg_generate(void)
|
||||
|
||||
/* debug line */
|
||||
{
|
||||
struct file_list *p_file;
|
||||
struct dw_sect_list *p_sect;
|
||||
size_t linep_off, buf_size;
|
||||
struct SAA *p_lines = saa_init(1L);
|
||||
nasm_assert(p_lines != NULL);
|
||||
|
||||
p_section = get_section_by_name("__DWARF", "__debug_line");
|
||||
nasm_assert(p_section != NULL);
|
||||
@ -1844,12 +1844,10 @@ static void macho_dbg_generate(void)
|
||||
saa_write8(p_lines, 1); /* std opcode 12 length */
|
||||
saa_write8(p_lines, 0); /* end of table */
|
||||
|
||||
list_for_each(p_file, dw_head_list) {
|
||||
saa_wcstring(p_lines, p_file->file_name);
|
||||
saa_write8(p_lines, 0); /* directory */
|
||||
saa_write8(p_lines, 0); /* time */
|
||||
saa_write8(p_lines, 0); /* size */
|
||||
}
|
||||
saa_wcstring(p_lines, module_name);
|
||||
saa_write8(p_lines, 0); /* directory */
|
||||
saa_write8(p_lines, 0); /* time */
|
||||
saa_write8(p_lines, 0); /* size */
|
||||
saa_write8(p_lines, 0); /* end of table */
|
||||
|
||||
linep_off = p_lines->datalen;
|
||||
@ -1867,63 +1865,49 @@ static void macho_dbg_generate(void)
|
||||
|
||||
list_for_each(p_sect, dw_head_sect) {
|
||||
struct SAA *p_linep = p_sect->psaa;
|
||||
|
||||
saa_len = p_linep->datalen;
|
||||
saa_rnbytes(p_linep, p_buf, saa_len);
|
||||
p_buf += saa_len;
|
||||
|
||||
saa_free(p_linep);
|
||||
p_sect = p_sect->next;
|
||||
}
|
||||
|
||||
macho_output(p_section->index, p_buf_base, OUT_RAWDATA, buf_size, NO_SEG, 0);
|
||||
|
||||
nasm_free(p_buf_base);
|
||||
}
|
||||
|
||||
/* string section */
|
||||
{
|
||||
struct file_list *p_file = dw_head_list;
|
||||
struct SAA *p_str = saa_init(1L);
|
||||
struct SAA *p_path_str = saa_init(1L);
|
||||
nasm_assert((p_str != NULL) && (p_path_str != NULL));
|
||||
char *cur_path = nasm_realpath(module_name);
|
||||
char *cur_file = nasm_basename(cur_path);
|
||||
char *cur_dir = nasm_dirname(cur_path);
|
||||
|
||||
p_section = get_section_by_name("__DWARF", "__debug_str");
|
||||
nasm_assert(p_section != NULL);
|
||||
|
||||
producer_str_offset = 0;
|
||||
saa_wbytes(p_str, nasm_signature, strlen(nasm_signature) + 1);
|
||||
|
||||
module_str_offset = path_str_offset = producer_str_offset + strlen(nasm_signature) + 1;
|
||||
|
||||
list_for_each(p_file, dw_head_list) {
|
||||
char *cur_path = nasm_realpath(p_file->file_name);
|
||||
char *cur_file = nasm_basename(cur_path);
|
||||
char *cur_dir = nasm_dirname(cur_path);
|
||||
|
||||
saa_wcstring(p_str, cur_file);
|
||||
saa_wcstring(p_path_str, cur_dir);
|
||||
|
||||
nasm_free(cur_path);
|
||||
nasm_free(cur_file);
|
||||
nasm_free(cur_dir);
|
||||
}
|
||||
module_str_offset = dir_str_offset = saa_wcstring(p_str, nasm_signature);
|
||||
dir_str_offset += saa_wcstring(p_str, cur_file);
|
||||
saa_wcstring(p_str, cur_dir);
|
||||
|
||||
saa_len = p_str->datalen;
|
||||
path_str_offset += saa_len;
|
||||
p_buf = nasm_malloc(saa_len);
|
||||
saa_rnbytes(p_str, p_buf, saa_len);
|
||||
macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
|
||||
saa_free(p_str);
|
||||
|
||||
saa_len = p_path_str->datalen;
|
||||
p_buf = nasm_malloc(saa_len);
|
||||
saa_rnbytes(p_path_str, p_buf, saa_len);
|
||||
macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
|
||||
saa_free(p_path_str);
|
||||
nasm_free(cur_path);
|
||||
nasm_free(cur_file);
|
||||
nasm_free(cur_dir);
|
||||
saa_free(p_str);
|
||||
nasm_free(p_buf);
|
||||
}
|
||||
|
||||
/* debug info */
|
||||
{
|
||||
struct SAA *p_info = saa_init(1L);
|
||||
nasm_assert(p_info != NULL);
|
||||
|
||||
p_section = get_section_by_name("__DWARF", "__debug_info");
|
||||
nasm_assert(p_section != NULL);
|
||||
@ -1938,7 +1922,7 @@ static void macho_dbg_generate(void)
|
||||
saa_write32(p_info, producer_str_offset); /* offset from string table for DW_AT_producer */
|
||||
saa_write16(p_info, DW_LANG_Mips_Assembler); /* DW_AT_language */
|
||||
saa_write32(p_info, module_str_offset); /* offset from string table for DW_AT_name */
|
||||
saa_write32(p_info, path_str_offset); /* offset from string table for DW_AT_comp_dir */
|
||||
saa_write32(p_info, dir_str_offset); /* offset from string table for DW_AT_comp_dir */
|
||||
saa_write32(p_info, 0); /* DW_AT_stmt_list */
|
||||
|
||||
if (ofmt == &of_macho64) {
|
||||
@ -1968,12 +1952,12 @@ static void macho_dbg_generate(void)
|
||||
macho_output(p_section->index, p_buf_base, OUT_RAWDATA, saa_len + 4, NO_SEG, 0);
|
||||
|
||||
saa_free(p_info);
|
||||
nasm_free(p_buf_base);
|
||||
}
|
||||
|
||||
/* abbrev section */
|
||||
{
|
||||
struct SAA *p_abbrev = saa_init(1L);
|
||||
nasm_assert(p_abbrev != NULL);
|
||||
|
||||
p_section = get_section_by_name("__DWARF", "__debug_abbrev");
|
||||
nasm_assert(p_section != NULL);
|
||||
@ -2027,6 +2011,7 @@ static void macho_dbg_generate(void)
|
||||
macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
|
||||
|
||||
saa_free(p_abbrev);
|
||||
nasm_free(p_buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user