+2012-05-14 Georg-Johann Lay <avr@gjlay.de>
+
+ PR target/53344
+ * config/avr/avr.c (avr_const_address_lo16): Remove.
+ (avr_assemble_integer): Print ".byte lo8(x)",
+ ".byte hi8(x)", ".byte hh8(x)" instead of emit an assembler
+ .warning if 3-byte address is assembled.
+ * doc/extend.texi (AVR Named Address Spaces): Document that
+ binutils 2.23 is needed to assemble 3-byte addresses.
+
2012-05-14 Richard Guenther <rguenther@suse.de>
* tree-vect-data-refs.c (vect_setup_realignment): Remove
}
-/* Return RTX that represents the lower 16 bits of a constant address.
- Unfortunately, simplify_gen_subreg does not handle this case. */
-
-static rtx
-avr_const_address_lo16 (rtx x)
-{
- rtx lo16;
-
- switch (GET_CODE (x))
- {
- default:
- break;
-
- case CONST:
- if (PLUS == GET_CODE (XEXP (x, 0))
- && SYMBOL_REF == GET_CODE (XEXP (XEXP (x, 0), 0))
- && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
- {
- HOST_WIDE_INT offset = INTVAL (XEXP (XEXP (x, 0), 1));
- const char *name = XSTR (XEXP (XEXP (x, 0), 0), 0);
-
- lo16 = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
- lo16 = gen_rtx_CONST (Pmode, plus_constant (Pmode, lo16, offset));
-
- return lo16;
- }
-
- break;
-
- case SYMBOL_REF:
- {
- const char *name = XSTR (x, 0);
-
- return gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
- }
- }
-
- avr_edump ("\n%?: %r\n", x);
- gcc_unreachable();
-}
-
-
/* Target hook for assembling integer objects. The AVR version needs
special handling for references to certain labels. */
avr_assemble_integer (rtx x, unsigned int size, int aligned_p)
{
if (size == POINTER_SIZE / BITS_PER_UNIT && aligned_p
- && text_segment_operand (x, VOIDmode) )
+ && text_segment_operand (x, VOIDmode))
{
fputs ("\t.word\tgs(", asm_out_file);
output_addr_const (asm_out_file, x);
}
else if (GET_MODE (x) == PSImode)
{
- default_assemble_integer (avr_const_address_lo16 (x),
- GET_MODE_SIZE (HImode), aligned_p);
+ /* This needs binutils 2.23+, see PR binutils/13503 */
+
+ fputs ("\t.byte\tlo8(", asm_out_file);
+ output_addr_const (asm_out_file, x);
+ fputs (")" ASM_COMMENT_START "need binutils PR13503\n", asm_out_file);
- fputs ("\t.warning\t\"assembling 24-bit address needs binutils"
- " extension for hh8(", asm_out_file);
+ fputs ("\t.byte\thi8(", asm_out_file);
output_addr_const (asm_out_file, x);
- fputs (")\"\n", asm_out_file);
+ fputs (")" ASM_COMMENT_START "need binutils PR13503\n", asm_out_file);
- fputs ("\t.byte\t0\t" ASM_COMMENT_START " hh8(", asm_out_file);
+ fputs ("\t.byte\thh8(", asm_out_file);
output_addr_const (asm_out_file, x);
- fputs (")\n", asm_out_file);
+ fputs (")" ASM_COMMENT_START "need binutils PR13503\n", asm_out_file);
return true;
}
RAM using the lower two bytes as RAM address.
If the high bit of the address is clear, data is read from flash
with @code{RAMPZ} set according to the high byte of the address.
+@xref{AVR Built-in Functions,,@code{__builtin_avr_flash_segment}}.
Objects in this address space will be located in @code{.progmem.data}.
@end table
@}
@end example
+@noindent
For each named address space supported by avr-gcc there is an equally
named but uppercase built-in macro defined.
The purpose is to facilitate testing if respective address space
#endif /* __FLASH */
@end example
-Notice that attribute @ref{AVR Variable Attributes,@code{progmem}}
+@noindent
+Notice that attribute @ref{AVR Variable Attributes,,@code{progmem}}
locates data in flash but
accesses to these data will read from generic address space, i.e.@:
from RAM,
from @w{@uref{http://nongnu.org/avr-libc/user-manual,AVR-LibC}}
together with attribute @code{progmem}.
+@noindent
@b{Limitations and caveats}
@itemize
as immediates into operands of instructions.
@item
-Code like the following is not yet supported because of missing
-support in avr-binutils,
-see @w{@uref{http://sourceware.org/PR13503,PR13503}}.
+The following code initializes a variable @code{pfoo}
+located in static storage with a 24-bit address:
@example
extern const __memx char foo;
const __memx void *pfoo = &foo;
@end example
-The code will throw an assembler warning and the high byte of
-@code{pfoo} will be initialized with@tie{}@code{0}, i.e.@: the
-initialization will be as if @code{foo} was located in the first
-64@tie{}KiB chunk of flash.
+Such code requires at least binutils 2.23, see
+@w{@uref{http://sourceware.org/PR13503,PR13503}}.
@end itemize