diff options
author | Richard Henderson <rth@redhat.com> | 2003-05-27 16:52:49 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 2003-05-27 16:52:49 +0000 |
commit | a4447b93785ea7fd86d583bb892f3cb5f6db71d3 (patch) | |
tree | d33b904ec977b697a1bfcf3c0bc0897ed800edfa /gas/config | |
parent | b7d6ed970a277da806f01110c032f0e19eab2368 (diff) | |
download | gdb-a4447b93785ea7fd86d583bb892f3cb5f6db71d3.zip gdb-a4447b93785ea7fd86d583bb892f3cb5f6db71d3.tar.gz gdb-a4447b93785ea7fd86d583bb892f3cb5f6db71d3.tar.bz2 |
* dw2gencfi.c, dw2gencfi.h: Rewrite from scratch.
* as.c (main): Always call cfi_finish.
* config/tc-i386.c (x86_dwarf2_return_column): New.
(x86_cie_data_alignment): New.
(md_begin): Set them.
(tc_x86_cfi_init): Remove.
(tc_x86_regname_to_dw2regnum): Fix 32-bit register numbers;
return int, not unsigned long; don't as_bad here.
(tc_x86_frame_initial_instructions): Streamline; use
updated api.
* config/tc-i386.h (tc_cfi_init): Remove.
(DWARF2_DEFAULT_RETURN_COLUMN): New.
(DWARF2_CIE_DATA_ALIGNMENT): New.
* gas/cfi/cfi-i386.d: Update for dw2gencfi rewrite.
* gas/cfi/cfi-x86_64.d: Likewise.
* gas/cfi/cfi-i386-2.d: New.
* gas/cfi/cfi-i386-2.s: New.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-i386.c | 69 | ||||
-rw-r--r-- | gas/config/tc-i386.h | 14 |
2 files changed, 35 insertions, 48 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 9a3bbbb..4823ee7 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -319,6 +319,12 @@ static unsigned int no_cond_jump_promotion = 0; /* Pre-defined "_GLOBAL_OFFSET_TABLE_". */ symbolS *GOT_symbol; +/* The dwarf2 return column, adjusted for 32 or 64 bit. */ +unsigned int x86_dwarf2_return_column; + +/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */ +int x86_cie_data_alignment; + /* Interface to relax_segment. There are 3 major relax states for 386 jump insns because the different types of jumps add different sizes to frags when we're @@ -987,6 +993,17 @@ md_begin () record_alignment (bss_section, 2); } #endif + + if (flag_code == CODE_64BIT) + { + x86_dwarf2_return_column = 16; + x86_cie_data_alignment = -8; + } + else + { + x86_dwarf2_return_column = 8; + x86_cie_data_alignment = -4; + } } void @@ -6301,42 +6318,15 @@ intel_putback_token () prev_token.str = NULL; } -void -tc_x86_cfi_init (void) -{ - struct cfi_config cfi_config; - - if (flag_code == CODE_64BIT) - { - cfi_config.addr_length = 8; - cfi_config.eh_align = 8; - cfi_config.code_align = 1; - cfi_config.data_align = -8; - cfi_config.ra_column = 0x10; - cfi_config.reloc_type = BFD_RELOC_64; - } - else - { - cfi_config.addr_length = 4; - cfi_config.eh_align = 4; - cfi_config.code_align = 1; - cfi_config.data_align = -4; - cfi_config.ra_column = 0x08; - cfi_config.reloc_type = BFD_RELOC_32; - } - - cfi_set_config (&cfi_config); -} - -unsigned long +int tc_x86_regname_to_dw2regnum (const char *regname) { unsigned int regnum; unsigned int regnames_count; char *regnames_32[] = { - "eax", "ebx", "ecx", "edx", - "edi", "esi", "ebp", "esp", + "eax", "ecx", "edx", "ebx", + "esp", "ebp", "esi", "edi", "eip" }; char *regnames_64[] = @@ -6364,21 +6354,18 @@ tc_x86_regname_to_dw2regnum (const char *regname) if (strcmp (regname, regnames[regnum]) == 0) return regnum; - as_bad (_("unknown register name '%s'"), regname); return -1; } void tc_x86_frame_initial_instructions (void) { - if (flag_code == CODE_64BIT) - { - cfi_add_insn (CFA_def_cfa, tc_x86_regname_to_dw2regnum ("rsp"), 8); - cfi_add_insn (CFA_offset, tc_x86_regname_to_dw2regnum ("rip"), -8); - } - else - { - cfi_add_insn (CFA_def_cfa, tc_x86_regname_to_dw2regnum ("esp"), 4); - cfi_add_insn (CFA_offset, tc_x86_regname_to_dw2regnum ("eip"), -4); - } + static unsigned int sp_regno; + + if (!sp_regno) + sp_regno = tc_x86_regname_to_dw2regnum (flag_code == CODE_64BIT + ? "rsp" : "esp"); + + cfi_add_CFA_def_cfa (sp_regno, -x86_cie_data_alignment); + cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment); } diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h index aa131ba..f45d713 100644 --- a/gas/config/tc-i386.h +++ b/gas/config/tc-i386.h @@ -546,18 +546,18 @@ extern void sco_id PARAMS ((void)); #endif /* We want .cfi_* pseudo-ops for generating unwind info. */ -#define TARGET_USE_CFIPOP -#ifdef TARGET_USE_CFIPOP +#define TARGET_USE_CFIPOP 1 -#define tc_cfi_init() tc_x86_cfi_init () -extern void tc_x86_cfi_init PARAMS ((void)); +extern unsigned int x86_dwarf2_return_column; +#define DWARF2_DEFAULT_RETURN_COLUMN x86_dwarf2_return_column + +extern int x86_cie_data_alignment; +#define DWARF2_CIE_DATA_ALIGNMENT x86_cie_data_alignment #define tc_regname_to_dw2regnum tc_x86_regname_to_dw2regnum -extern unsigned long tc_x86_regname_to_dw2regnum PARAMS ((const char *regname)); +extern int tc_x86_regname_to_dw2regnum PARAMS ((const char *regname)); #define tc_cfi_frame_initial_instructions tc_x86_frame_initial_instructions extern void tc_x86_frame_initial_instructions PARAMS ((void)); -#endif /* TARGET_USE_CFIPOP */ - #endif /* TC_I386 */ |