aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-i386.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-05-27 16:52:49 +0000
committerRichard Henderson <rth@redhat.com>2003-05-27 16:52:49 +0000
commita4447b93785ea7fd86d583bb892f3cb5f6db71d3 (patch)
treed33b904ec977b697a1bfcf3c0bc0897ed800edfa /gas/config/tc-i386.c
parentb7d6ed970a277da806f01110c032f0e19eab2368 (diff)
downloadgdb-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/tc-i386.c')
-rw-r--r--gas/config/tc-i386.c69
1 files changed, 28 insertions, 41 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);
}