This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch,avr] Add support for devices with flash accessible by LD.
2017-06-12 11:40 GMT+04:00 Georg-Johann Lay <avr@gjlay.de>:
> On 12.06.2017 08:30, Pitchumani Sivanupandi wrote:
>>
>> On Friday 09 June 2017 03:59 PM, Georg-Johann Lay wrote:
>>>
>>> Hi,
>>>
>>> This patch adds support for devices that can access flash memory
>>> by LD* instructions, hence there is no need to put .rodata in RAM.
>>>
>>> The default linker script for the new multilib versions already
>>> supports this feature, it's similar to avrtiny, cf.
>>>
>>> https://sourceware.org/PR21472
>>>
>>> This patch does the following:
>>>
>>> * Add multilib variants avrxmega3 and avrxmega3/short-calls.
>>>
>>> * Add new option -mshort-calls for multilib selection between
>>> devices with <= 8KiB flash and > 8KiB flash.
>>>
>>> * Add specs handling for -mshort-calls: The compiler knows
>>> if this option is needed or not appropriate (similar to -msp8).
>>>
>>> * Add new ISA feature AVR_ISA_RCALL for multilib selection
>>> via -mshort-calls.
>>>
>>> * Add a new row to architecture description that contains the
>>> start address of flash memory in the RAM address range.
>>> (The actual value is not needed).
>>>
>>> * For devices with flash in RAM space, don't let .rodata
>>> objects trigger need for __do_copy_data.
>>>
>>> * Add some devices.
>>>
>>> * Add configure test for Binutils PR21472.
>>>
>>> * Adjust documentation etc.
>>>
>>> Even the smaller devices with flash <= 8KiB support JMP+CALL,
>>> but we get better code by assuming RJMP+RCALL: Jump tables
>>> are more efficient and insn length computation is more exact
>>> (CALL -> RCALL relaxation would need -mrelax and insn size
>>> would still be 4 bytes).
>>>
>>> Moreover, avr-libc uses __AVR_HAVE_JMP_CALL__ to determine
>>> vector entry size, and libgcc uses that macro for flash size
>>> estimation.
>>
>> Hi Johann,
>>
>>> + AVR_ISA_RCALL = 0x10 /* Use RJMP / RCALL even though RJMP / RCALL
>>> + are available (-mshort-calls). */
>>
>>
>> I think you meant "even though JMP/ CALL are avariable".
>>
>>> +AVR_MCU ("attiny817", ARCH_AVRXMEGA3, AVR_ISA_RCALL,
>>> "__AVR_ATtiny817__", 0x3e00, 0x0, 0x2000)
>>> +AVR_MCU ("attiny1616", ARCH_AVRXMEGA3, AVR_ISA_NONE,
>>> "__AVR_ATtiny1616__", 0x3800, 0x0, 0x4000)
>>
>>
>> Add attiny1614 device.
>> AVR_MCU ("attiny1614", ARCH_AVRXMEGA3, AVR_ISA_NONE,
>> "__AVR_ATtiny1614__", 0x3800, 0x0, 0x4000)
>>
>> Regards,
>> Pitchumani
>
>
> Updated patch.
>
> * config/avr/avr-arch.h (avr_arch_id) <ARCH_AVRXMEGA3>: New enum.
> (avr_mcu_t) <flash_pm_offset>: New field.
> (avr_device_specific_features) <AVR_ISA_RCALL>: New enum.
> * config/avr/avr.h (AVR_SHORT_CALLS): New define.
> (AVR_HAVE_JMP_CALL): Don't set if AVR_SHORT_CALLS.
> (AVR_TINY_PM_OFFSET): Remove macro.
> * config/avr/avr.opt (-mshort-calls): New option.
> * config/avr/gen-avr-mmcu-specs.c (print_mcu)
> [*self_spec]: Add / remove -mshort-calls depending on AVR_ISA_RCALL.
> * config/avr/avr-c.c (avr_cpu_cpp_builtins)
> <__AVR_SHORT_CALLS__>: Built-in define if AVR_SHORT_CALLS.
> <__AVR_HAVE_JMP_CALL__>: Use AVR_HAVE_JMP_CALL as condition
> instead of avr_arch->have_jmp_call.
> <__AVR_PM_BASE_ADDRESS__>: Built-in define if
> avr_arch->flash_pm_offset.
> [AVR_TINY] <__AVR_TINY_PM_BASE_ADDRESS__>: Use
> avr_arch->flash_pm_offset to define.
> * config/avr/avr-devices.c (avr_arch_types): Add initializers for
> new field flash_pm_offset. Add entry for avrxmega3.
> (avr_texinfo): Add entry for avrxmega3.
> * avr-mcus.def: Add entries for: avrxmega3, attiny212, attiny214,
> attiny412, attiny414, attiny416, attiny417, attiny814,
> attiny816, attiny817, attiny1614, attiny1616, attiny1617,
>
> attiny3214, attiny3216, attiny3217.
> * config/avr/avr.c (avr_assemble_integer)[AVR_TINY]: Use
> avr_arch->flash_pm_offset instead of AVR_TINY_PM_OFFSET.
> (avr_print_operand_address) [AVR_TINY]: Same.
> (avr_asm_init_sections) <readonly_data_section>: Only patch
> callback if avr_arch->flash_pm_offset = 0.
> (avr_asm_named_section) <avr_need_copy_data_p>: Skip setting it
> for rodata if avr_arch->flash_pm_offset != 0.
> (avr_encode_section_info) [AVR_TINY]: Adjust comment.
> * config/avr/genmultilib.awk (dir_rcall, opt_rcall): New vars.
> (opts) [AVR_ISA_RCALL]: Append opt_rcall.
> (m_options): Append opt_rcall.
> (m_dirnames): Append dir_rcall.
> * config/avr/t-multilib: Regenerate.
>
> * configure.ac [target=avr]: Check whether avrxmega3 default
> linker description file works as needed.
> * configure: Regenerate.
> * doc/avr-mmcu.texi: Regenerate.
> * doc/invoke.texi (AVR Options) <-mshort-calls>: Document it.
> <__AVR_ARCH__>: Document avrxmega3 and 103.
> <__AVR_HAVE_JMP_CALL__>: Adjust documentation.
> <__AVR_SHORT_CALLS__>: Document it.
> <__AVR_PM_BASE_ADDRESS__>: Document it.
> * doc/extend.texi (AVR Options) <-mshort-calls>: Document it.
> (AVR Variable Attributes) <progmem>: Document this is
> not needed for avrxmega3.
> (AVR Named Address Spaces) <__flash>: Dito.
>
>
Approved.