Patchwork [avr] gas support for cfi info

login
register
mail settings
Submitter Richard Henderson
Date Feb. 15, 2011, 7:03 p.m.
Message ID <4D5ACDF2.20904@redhat.com>
Download mbox | patch
Permalink /patch/83282/
State New
Headers show

Comments

Richard Henderson - Feb. 15, 2011, 7:03 p.m.
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.

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.


r~
Petr Hluzín - Feb. 15, 2011, 10:44 p.m.
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

Patch

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