openbsd-ports/devel/avr/binutils/patches/patch-binutils_rdcoff_c
ckuethe ebcb40e5e1 Update to the latest AVR gcc, binutils, libc and gdb. Based on the FreeBSD
port, which is also in sync with winavr/avrstudio. Among other things, this
adds support for atmega328... which means new arduino boards should work.
2010-06-27 20:58:10 +00:00

148 lines
4.4 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

$OpenBSD: patch-binutils_rdcoff_c,v 1.3 2010/06/27 20:58:10 ckuethe Exp $
--- binutils/rdcoff.c.orig Sat Jun 26 11:22:44 2010
+++ binutils/rdcoff.c Sat Jun 26 11:31:17 2010
@@ -82,6 +82,9 @@ struct coff_types
struct coff_slots *slots;
/* Basic types. */
debug_type basic[T_MAX + 1];
+ /* Some general information, kept here for convenience. */
+ size_t intsize; /* sizeof (int) */
+ size_t doublesize; /* sizeof (double) */
};
static debug_type *coff_get_slot (struct coff_types *, int);
@@ -101,6 +104,7 @@ static bfd_boolean parse_coff_symbol
(bfd *, struct coff_types *, asymbol *, long, struct internal_syment *,
void *, debug_type, bfd_boolean);
static bfd_boolean external_coff_symbol_p (int sym_class);
+static bfd_vma coff_convert_register (bfd *, bfd_vma);
/* Return the slot for a type. */
@@ -271,8 +275,7 @@ parse_coff_base_type (bfd *abfd, struct coff_symbols *
break;
case T_INT:
- /* FIXME: Perhaps the size should depend upon the architecture. */
- ret = debug_make_int_type (dhandle, 4, FALSE);
+ ret = debug_make_int_type (dhandle, types->intsize, FALSE);
name = "int";
break;
@@ -287,7 +290,7 @@ parse_coff_base_type (bfd *abfd, struct coff_symbols *
break;
case T_DOUBLE:
- ret = debug_make_float_type (dhandle, 8);
+ ret = debug_make_float_type (dhandle, types->doublesize);
name = "double";
break;
@@ -307,7 +310,7 @@ parse_coff_base_type (bfd *abfd, struct coff_symbols *
break;
case T_UINT:
- ret = debug_make_int_type (dhandle, 4, TRUE);
+ ret = debug_make_int_type (dhandle, types->intsize, TRUE);
name = "unsigned int";
break;
@@ -565,6 +568,8 @@ parse_coff_symbol (bfd *abfd ATTRIBUTE_UNUSED, struct
case C_WEAKEXT:
case C_EXT:
+ /* AVR COFF abuses C_EXTDEF */
+ case C_EXTDEF:
if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
DEBUG_GLOBAL, bfd_asymbol_value (sym)))
return FALSE;
@@ -580,9 +585,9 @@ parse_coff_symbol (bfd *abfd ATTRIBUTE_UNUSED, struct
break;
case C_REG:
- /* FIXME: We may need to convert the register number. */
if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
- DEBUG_REGISTER, bfd_asymbol_value (sym)))
+ DEBUG_REGISTER,
+ coff_convert_register (abfd, bfd_asymbol_value (sym))))
return FALSE;
break;
@@ -596,9 +601,9 @@ parse_coff_symbol (bfd *abfd ATTRIBUTE_UNUSED, struct
break;
case C_REGPARM:
- /* FIXME: We may need to convert the register number. */
if (! debug_record_parameter (dhandle, bfd_asymbol_name (sym), type,
- DEBUG_PARM_REG, bfd_asymbol_value (sym)))
+ DEBUG_PARM_REG,
+ coff_convert_register (abfd, bfd_asymbol_value (sym))))
return FALSE;
break;
@@ -648,6 +653,28 @@ external_coff_symbol_p (int sym_class)
return FALSE;
}
+static bfd_vma
+coff_convert_register (abfd, val)
+ bfd *abfd;
+ bfd_vma val;
+{
+
+ switch (bfd_get_arch (abfd))
+ {
+ case bfd_arch_avr:
+ /* AVR COFF wants to describe up to four registers by the four
+ bytes of the 32-bit value. Unused bytes are filled with
+ 0xff. In theory, this would allow for non-contiguous
+ register usage to hold a single value, but hopefully, no
+ compiler is going to use that feature. We could not handle
+ it anyway. */
+ return val & 0xff;
+
+ default:
+ return val;
+ }
+}
+
/* This is the main routine. It looks through all the symbols and
handles them. */
@@ -674,7 +701,18 @@ parse_coff (bfd *abfd, asymbol **syms, long symcount,
types.slots = NULL;
for (i = 0; i <= T_MAX; i++)
types.basic[i] = DEBUG_TYPE_NULL;
+ switch (bfd_get_arch (abfd))
+ {
+ case bfd_arch_avr:
+ types.intsize = 2;
+ types.doublesize = 4;
+ break;
+ default:
+ types.intsize = 4;
+ types.doublesize = 8;
+ }
+
next_c_file = -1;
fnname = NULL;
fnclass = 0;
@@ -734,7 +772,6 @@ parse_coff (bfd *abfd, asymbol **syms, long symcount,
switch (syment.n_sclass)
{
case C_EFCN:
- case C_EXTDEF:
case C_ULABEL:
case C_USTATIC:
case C_LINE:
@@ -757,6 +794,8 @@ parse_coff (bfd *abfd, asymbol **syms, long symcount,
/* Fall through. */
case C_WEAKEXT:
case C_EXT:
+ /* AVR COFF abuses C_EXTDEF for C_EXT */
+ case C_EXTDEF:
if (ISFCN (syment.n_type))
{
fnname = name;