This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch,AVR]: Make flash size a device property (was: core property)


Georg-Johann Lay schrieb:
This patch addresses several issues related to device flash size:

* cores avrxmega4/5 have ELPM* instruction

* flash sizes for xmega were wrong because atxmegaXX
  has some extra bootloader flash and thus a flash size
  of XX + epsilon.

* There are devices with different flash sizes, i.e. with
  different sets of reasonable address spaces within the same
  core architecture.  Thus, turn flash size from a core property
  to a device property

* No more try to fix silly (too big) address spaces by means
  of modulo computation. Just emit an error if a nonsensical
  address space is used

As this patch is mainly about the new xmega architecture support:


I updated the avrtest core simulator hosted in the WinAVR project at sourceforge. The avrtest simulator can now be used to reg-test avr-gcc testsuite against xmega core.

The regression tests on xmega revealed two typos in avr BE that are already fixed:

http://gcc.gnu.org/viewcvs?view=revision&revision=184522
http://gcc.gnu.org/viewcvs?view=revision&revision=184559

As target I used atxmega128a3 and the test results are exactly the same as for atmega128, except for some functions that use builtin return or instrument-functions that trigger builtin return.

This is because the testsuite was run with this patch applied and the flash size of atxmega128a3 is > 64Ki words then, thus a warning from avr.c

rtx
avr_return_addr_rtx (int count, rtx tem)
{
  ...

  if (AVR_3_BYTE_PC)
    {
      r = gen_rtx_SYMBOL_REF (Pmode, ".L__stack_usage+2");
      warning (0, "'builtin_return_address' contains only
               2 bytes of address");
    }

I did not try to use PSImode as potential fix; but even with PSImode there would be a warning from

static bool
avr_assemble_integer (rtx x, unsigned int size, int aligned_p)
{
  ...
  if (GET_MODE (x) == PSImode)
    {
      default_assemble_integer (avr_const_address_lo16 (x),
                                GET_MODE_SIZE (HImode), aligned_p);

      fputs ("\t.warning\t\"assembling 24-bit address needs binutils"
             " extension for hh8(", asm_out_file);
      output_addr_const (asm_out_file, x);
      fputs (")\"\n", asm_out_file);

      fputs ("\t.byte\t0\t" ASM_COMMENT_START " hh8(", asm_out_file);
      output_addr_const (asm_out_file, x);
      fputs (")\n", asm_out_file);

      return true;
    }

The simulator does not test I/O and the new operand modifier %i, of course, but I heard that guys using 4.7 snapshots could compile and run xmega programs without problems.

Johann


Passes without regression.

Ok for trunk?

Johann

	PR target/49868
	* doc/extend.texi (AVR Named Address Spaces): No more try to fix
	address spaces located outside of device flash.

	PR target/49868
	PR target/52261
	* config/avr/avr.h (base_arch_s): Remove field n_segments.
	(mcu_type_s): Add field n_flash.
	* config/avr/avr-devices.c (avr_arch_types): Remove .n_segments.
	Set .have_elpm and .have_elpmx to 1 for avrxmega4 and avrxmega5.
	(AVR_MCU): Add N_FLASH argument.
	* config/avr/avr-mcus.def (AVR_MCU): Add initializer for .n_flash.
	* config/avr/avr-c.c (avr_cpu_cpp_builtins): Only define built-in
	macro __FLASH<n> if that address space makes sense for the device.
	* config/avr/avr.c (avr_out_lpm): Don't try to fix address spaces
	outside of target flash.
	(avr_asm_named_section): Ditto.
	(avr_asm_select_section): Ditto.
	(avr_addr_space_convert): Ditto.
	(avr_emit_movmemhi): Ditto.
	(avr_nonconst_pointer_addrspace, avr_pgm_check_var_decl): Error if
	address space is outside of device flash.
	(avr_insert_attributes): Ditto.
	(avr_xload_libgcc_p): Use avr_current_device->n_flash instead of
	avr_current_arch->n_segments.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]