From af3ecb4a35ff9fd57662514fefcfced14893bbbe Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 29 Mar 2011 18:16:16 +0000 Subject: [PATCH] PR 12610 * config/tc-alpha.c (s_alpha_align): Don't auto-align a previous label; zap alpha_insn_label. --- gas/ChangeLog | 6 ++++++ gas/config/tc-alpha.c | 3 ++- gas/config/tc-avr.c | 17 +++++++++++++++++ gas/config/tc-avr.h | 13 +++++++++++++ gas/testsuite/gas/alpha/auto-align-1.d | 6 ++++++ gas/testsuite/gas/alpha/auto-align-1.s | 7 +++++++ 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 gas/testsuite/gas/alpha/auto-align-1.d create mode 100644 gas/testsuite/gas/alpha/auto-align-1.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 4275767758..d61c952621 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2011-03-29 Richard Henderson + + PR 12610 + * config/tc-alpha.c (s_alpha_align): Don't auto-align a previous + label; zap alpha_insn_label. + 2011-03-29 H.J. Lu * config/tc-i386.c (handle_quad): Properly handle multiple diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c index d1de6f92cf..5c1c73e991 100644 --- a/gas/config/tc-alpha.c +++ b/gas/config/tc-alpha.c @@ -5081,12 +5081,13 @@ s_alpha_align (int ignore ATTRIBUTE_UNUSED) if (align != 0) { alpha_auto_align_on = 1; - alpha_align (align, pfill, alpha_insn_label, 1); + alpha_align (align, pfill, NULL, 1); } else { alpha_auto_align_on = 0; } + alpha_insn_label = NULL; demand_empty_rest_of_line (); } diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index ef8cf93915..98fc0f5476 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -24,6 +24,8 @@ #include "as.h" #include "safe-ctype.h" #include "subsegs.h" +#include "dw2gencfi.h" + struct avr_opcodes_s { @@ -1543,3 +1545,18 @@ avr_cons_fix_new (fragS *frag, exp_mod_pm = 0; } } + +void +tc_cfi_frame_initial_instructions (void) +{ + /* AVR6 pushes 3 bytes for calls. */ + int return_size = (avr_mcu->mach == bfd_mach_avr6 ? 3 : 2); + + /* The CFA is the caller's stack location before the call insn. */ + /* Note that the stack pointer is dwarf register number 32. */ + cfi_add_CFA_def_cfa (32, return_size); + + /* Note that AVR consistently uses post-decrement, which means that things + do not line up the same way as for targers that use pre-decrement. */ + cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, 1-return_size); +} diff --git a/gas/config/tc-avr.h b/gas/config/tc-avr.h index b976d5a89b..777a9df37a 100644 --- a/gas/config/tc-avr.h +++ b/gas/config/tc-avr.h @@ -153,3 +153,16 @@ extern long md_pcrel_from_section (struct fix *, segT); /* 32 bits pseudo-addresses are used on AVR. */ #define DWARF2_ADDR_SIZE(bfd) 4 + +/* Enable cfi directives. */ +#define TARGET_USE_CFIPOP 1 + +/* The stack grows down, and is only byte aligned. */ +#define DWARF2_CIE_DATA_ALIGNMENT -1 + +/* Define the column that represents the PC. */ +#define DWARF2_DEFAULT_RETURN_COLUMN 36 + +/* Define a hook to setup initial CFI state. */ +extern void tc_cfi_frame_initial_instructions (void); +#define tc_cfi_frame_initial_instructions tc_cfi_frame_initial_instructions diff --git a/gas/testsuite/gas/alpha/auto-align-1.d b/gas/testsuite/gas/alpha/auto-align-1.d new file mode 100644 index 0000000000..971f1174e8 --- /dev/null +++ b/gas/testsuite/gas/alpha/auto-align-1.d @@ -0,0 +1,6 @@ +#objdump: -s -j .data +#name: alpha auto-align-1 + +.*: file format * +Contents of section .data: + 0000 04000000 .* diff --git a/gas/testsuite/gas/alpha/auto-align-1.s b/gas/testsuite/gas/alpha/auto-align-1.s new file mode 100644 index 0000000000..0b088c2496 --- /dev/null +++ b/gas/testsuite/gas/alpha/auto-align-1.s @@ -0,0 +1,7 @@ +.text + .align 4 +$B: unop +$E: .align 4 + fnop +.data + .long $E - $B