Message ID | 4D5ACDF2.20904@redhat.com |
---|---|
State | New |
Headers | show |
On 15 February 2011 20:03, Richard Henderson <rth@redhat.com> wrote: > On 02/15/2011 09:41 AM, Richard Henderson wrote: >> On 02/13/2011 07:10 AM, Petr Hluzín wrote: >>> http://xfree86.cygwin.ru/ml/binutils/2010-08/msg00109.html >> >> I'll agree that a better error message would be helpful. >> >> To answer a question within that message: >> >>> By the way: Why AVR target does not understand CFI? What needs to be >>> done in binutils? And in GDB? >> >> TARGET_USE_CFIPOP >> DWARF2_DEFAULT_RETURN_COLUMN >> DWARF2_CIE_DATA_ALIGNMENT >> DWARF2_LINE_MIN_INSN_LENGTH >> >> are the macros that need to be defined, >> >> tc_cfi_frame_initial_instructions >> >> may be required depending on what the state of the unwind >> info incoming to a function. Have a look at tc-i386.c, >> tc_x86_frame_initial_instructions for a typical stack-based >> call mechanism. >> >> For the nearly related task of dwarf2 line numbers, you need >> a call to dwarf2_emit_insn emitted immediately before each >> insn is added to the frags. Again, see tc-i386.c for ideas. > > To follow up on myself, it appears as if avr already has dwarf2 > line number support, and only needs a few things in order to > enable cfi support. > > CC'd to gcc and gdb because the dwarf2 register numbers for SP > and the return address column need to be coordinated. This is > part of the target's ABI. In avr-tdep.c [1] near avr_dwarf_reg_to_regnum(): /* Unfortunately dwarf2 register for SP is 32. */ (I can't help you with the value for #define DWARF2_DEFAULT_RETURN_COLUMN 36) AFAIK there is no written ABI. Only the calling convention is documented (and only the easy cases), the rest is in gdb/gcc/binutils sources and people's heads. > I've left a ??? marker for when AVR_3_BYTE_PC would be true in > gcc; I haven't tracked down how that maps into the assembler, > or even if there is a simple mapping. In avr_gdbarch_init() in avr-tdep.c [1]: /* Avr-6 call instructions save 3 bytes. */ switch (info.bfd_arch_info->mach) ... case bfd_mach_avr6: call_length = 3; break; [1] http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/src/gdb/avr-tdep.c?rev=1.128&content-type=text/plain&cvsroot=src
Index: config/tc-avr.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-avr.c,v retrieving revision 1.74 diff -u -p -r1.74 tc-avr.c --- config/tc-avr.c 28 Jun 2010 14:06:57 -0000 1.74 +++ config/tc-avr.c 15 Feb 2011 18:52:05 -0000 @@ -24,6 +24,8 @@ #include "as.h" #include "safe-ctype.h" #include "subsegs.h" +#include "dw2gencfi.h" + struct avr_opcodes_s { @@ -1488,3 +1490,12 @@ avr_cons_fix_new (fragS *frag, exp_mod_pm = 0; } } + +void +tc_cfi_frame_initial_instructions (void) +{ + /* ??? How do we tell if we're in 3-byte pc mode? */ + /* The CFA is immediately above the return address, which is on the stack. */ + cfi_add_CFA_def_cfa (32, 2); + cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, -2); +} Index: config/tc-avr.h =================================================================== RCS file: /cvs/src/src/gas/config/tc-avr.h,v retrieving revision 1.17 diff -u -p -r1.17 tc-avr.h --- config/tc-avr.h 27 Oct 2009 15:39:27 -0000 1.17 +++ config/tc-avr.h 15 Feb 2011 18:52:05 -0000 @@ -153,3 +153,17 @@ extern long md_pcrel_from_section (struc /* 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. */ +/* ??? This is an abi thing; coordinate with other projects. */ +#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