# Copyright (C) 2014-2016 Free Software Foundation, Inc.
# 
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.

cat << EOF
/* Copyright (C) 2014-2016 Free Software Foundation, Inc.

   Copying and distribution of this script, with or without modification,
   are permitted in any medium without royalty provided the copyright
   notice and this notice are preserved.  */

OUTPUT_FORMAT("elf32-ip2k", "elf32-ip2k", "elf32-ip2k")
OUTPUT_ARCH(ip2k)
${RELOCATING+ENTRY(_start)}
SEARCH_DIR(.);

/* IP2022 default linker script.  */

MEMORY
{
	D_GPR    : org = 0x01000080, len = 128
        D_RAM    : org = 0x01000100, len = 4K - 256
        P_RAM    : org = 0x02000000, len = 16K
        P_ROM    : org = 0x02010000, len = 64K - 32
        P_RESET  : org = 0x0201FFE0, len = 32
        P_CONFIG : org = 0x02020000, len = 128
}

SECTIONS
{
	/* Allocated memory end markers
	   (initialized to start of appropriate memory address).  */
	__data_end  = 0x01000100;
	__pram_end  = 0x02000000;
	__flash_end = 0x02010000;

	/* Global general purpose registers in direct addressing range.  */
	.gpr 0x01000080 :
	{
		*(.gpr)
	} >D_GPR

	/* Pre-allocated, pre-initialized data memory.  */
	__data_run_begin = __data_end;
	__data_load_begin = (__flash_end + 1) & 0xFFFFFFFE;
	.data __data_run_begin : AT (__data_load_begin)
	{
		* (.data);
		* (.rodata)
	} >D_RAM
	__data_run_end  = __data_run_begin  + SIZEOF(.data);
	__data_load_end = __data_load_begin + SIZEOF(.data);
	__data_end      = __data_run_end;
	__flash_end     = __data_load_end;

	/* Pre-allocated, uninitialized data memory.  */
	__bss_begin = __data_end;
	.bss __bss_begin :
	{
		* (.bss)
	} >D_RAM
	__bss_end  = __bss_begin + SIZEOF(.bss);
	__data_end = __bss_end;

	/* Pre-allocated PRAM data memory.  */
	__pram_data_begin = (__pram_end + 1) & 0xFFFFFFFE;
	.pram_data __pram_data_begin :
	{
		* (.pram_data)
	} >P_RAM
	__pram_data_end = __pram_data_begin + SIZEOF(.pram_data);
	__pram_end      = __pram_data_end;

	/* PRAM code.  */
	__pram_run_begin  = (__pram_end + 1) & 0xFFFFFFFE;
	__pram_load_begin = (__flash_end + 1) & 0xFFFFFFFE;
	.pram __pram_run_begin : AT (__pram_load_begin)
	{
		* (.pram)
	} >P_RAM
	__pram_run_end  = __pram_run_begin  + SIZEOF(.pram);
	__pram_load_end = __pram_load_begin + SIZEOF(.pram);

	__pram_load_shift = ((__pram_run_begin - __pram_load_begin) & 0x1FFFF) | 0x02000000;
	__pram_end  = __pram_run_end;
	__flash_end = __pram_load_end;

	/* PRAM overlay code.  */
	__pram_overlay_run_start  = (__pram_end  + 1) & 0xFFFFFFFE;
	__pram_overlay_load_start = (__flash_end + 1) & 0xFFFFFFFE;	
	OVERLAY __pram_overlay_run_start : AT (__pram_overlay_load_start)
	{
		.pram1 { */overlay1/* (.pram); * (.pram1) }
		.pram2 { */overlay2/* (.pram); * (.pram2) }
	} >P_RAM
	__pram_overlay_run_end = .;
	__pram_overlay_load_end = __pram_overlay_load_start + SIZEOF(.pram1) + SIZEOF(.pram2);
	__pram_end  = __pram_overlay_run_end;
	__flash_end = __pram_overlay_load_end;

	/* Flash code.  */
	__text_begin = (__flash_end + 1) & 0xFFFFFFFE;
	.text __text_begin :
	{
		* (.text);
		* (.text.libgcc)
	} >P_ROM = 0xffff
	__text_end  = __text_begin + SIZEOF(.text);
	__flash_end = __text_end;

	/* Strings.  */
	__strings_begin = (__flash_end + 1) & 0xFFFFFFFE;
	.strings __strings_begin :
	{
		* (strings);
		* (.progmem.data)
	} >P_ROM = 0xffff
	__strings_end = __strings_begin + SIZEOF (.strings);
	__flash_end   = __strings_end;

	.ctors : { * (.ctors) } > P_ROM
	.dtors : { * (.dtors) } > P_ROM

	/* Reset code.  */
	.reset  : { * (.reset)  } >P_RESET  = 0xffff

	/* Configuration block.  */
	.config : { * (.config) } >P_CONFIG = 0xffff

	/* Stack.  */
	PROVIDE (__stack = 0x01000FFF);

	/* Stabs debugging sections.  */
	.stab           0 : { *(.stab) }
	.stabstr        0 : { *(.stabstr) }
	.stab.excl      0 : { *(.stab.excl) }
	.stab.exclstr   0 : { *(.stab.exclstr) }
	.stab.index     0 : { *(.stab.index) }
	.stab.indexstr  0 : { *(.stab.indexstr) }
	.comment        0 : { *(.comment) }

EOF

. $srcdir/scripttempl/DWARF.sc

cat <<EOF
}
EOF
