This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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: [RFC] arc/ld: Linker script extensions to support nps targets


Hi Andrew,

My personal feeling is that you should not change arclinux.sc.
In reality, arclinux.sc is just there for a small change from elf.sc,
otherwise we would have used the default elf.sc.

Being so, I would personally prefer that we would not diverge much
further arclinux.sc, by adding special target requirements into it.
My suggestion would be for you to create an NPS specific emulation, and
either select it as default at binutils compilation time, or force it
through GCC drivers as you suggest.

Do you use a special tripplet to compile for nps ?
You can set the default emulation in ld/configure.tgt.
For example:

configure.tgt:arc*-*-linux*)        targ_emul=arclinux
configure.tgt:            targ_extra_emuls="arclinux_prof arcelf
arcelf_prof arcv2elf arcv2elfx"

Best regards,
Cupertino


On 11/30/2016 03:03 PM, Andrew Burgess wrote:
> The patch below adds some new symbols and sections to the arclinux
> linker script that are required to support nps targets.  The sections
> are placed at fixed locations that map to particular types of memory
> on the actual devices, and are accessed primarily with the nps
> specific cmem ld/st instructions, which assume a know base address.
>
> The new symbols are all provided with PROVIDE, and the new section
> only includes content from input files, this means (I believe) that if
> non of the input files produce cmem content, or reference the symbols
> relating to cmem content, then these linker script changes should make
> no impact on the final produced binary.
>
> It's because the change is harmless unless wanted that in this initial
> version of the patch I am proposing that the change be made for all
> ARC targets.
>
> However, I'm open to suggestions for alternative strategies.  The only
> idea I have right now is creating an nps specific clone of the
> arclinux linker emulation, and having GCC select this when compiling
> for nps.  I considered this, but initially rejected it as
> over-engineering, but again, I'd like to hear what people think.
>
> All feedback or suggestions welcome.
>
> Thanks,
> Andrew
>
> ---
>
> The arc700 nps variant uses some specific named sections to facilitate
> its CMEM based instructions, which operate on memory regions fixed at
> specific addresses.
>
> This commit extends the arclinux linker script to include symbols and
> sections required to support the nps targets.  As the new symbols are
> wrapped in PROVIDE, and the new sections don't contain any content
> unless there is input content, then these linker script changes should
> result in no visible changes for non-nps targets.
>
> ld/ChangeLog:
>
> 	* scripttempl/arcnps.sc: New file.
> 	* scripttempl/arclinux.sc: Include the new file.
> ---
>  ld/ChangeLog               |  5 +++
>  ld/scripttempl/arclinux.sc |  2 ++
>  ld/scripttempl/arcnps.sc   | 85 ++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 92 insertions(+)
>  create mode 100644 ld/scripttempl/arcnps.sc
>
> diff --git a/ld/scripttempl/arclinux.sc b/ld/scripttempl/arclinux.sc
> index 8b11386..cdbcf6a 100644
> --- a/ld/scripttempl/arclinux.sc
> +++ b/ld/scripttempl/arclinux.sc
> @@ -668,6 +668,8 @@ EOF
>  
>  . $srcdir/scripttempl/DWARF.sc
>  
> +. $srcdir/scripttempl/arcnps.sc
> +
>  cat <<EOF
>  
>    ${TINY_DATA_SECTION}
> diff --git a/ld/scripttempl/arcnps.sc b/ld/scripttempl/arcnps.sc
> new file mode 100644
> index 0000000..2ddab10
> --- /dev/null
> +++ b/ld/scripttempl/arcnps.sc
> @@ -0,0 +1,85 @@
> +# Copyright (C) 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
> +
> +  /* Start of symbols and sections required to support CMEM instructions
> +     on NPS targets.  These should result in no additional output for
> +     non-nps targets.  */
> +
> +  PROVIDE (_cmem_start               = ADDR (.cmem)                                            );
> +  PROVIDE (_cmem_alter_start         = ADDR (.cmem_alter)                                      );
> +  PROVIDE (_cmem_shared_start        = ADDR (.cmem_shared)                                     );
> +  PROVIDE (_cmem_shared_alter_start  = ADDR (.cmem_shared_alter)                               );
> +  PROVIDE (_fmt_slot0_start          = ADDR (.fmt_slot0)                                       );
> +  PROVIDE (_fmt_slot1_start          = ADDR (.fmt_slot1)                                       );
> +  PROVIDE (_fmt_slot2_start          = ADDR (.fmt_slot2)                                       );
> +  PROVIDE (_fmt_slot3_start          = ADDR (.fmt_slot3)                                       );
> +  PROVIDE (_fmt_slot4_start          = ADDR (.fmt_slot4)                                       );
> +  PROVIDE (_fmt_slot5_start          = ADDR (.fmt_slot5)                                       );
> +  PROVIDE (_fmt_slot6_start          = ADDR (.fmt_slot6)                                       );
> +  PROVIDE (_fmt_slot7_start          = ADDR (.fmt_slot7)                                       );
> +  PROVIDE (_fmt_slot8_start          = ADDR (.fmt_slot8)                                       );
> +  PROVIDE (_fmt_slot9_start          = ADDR (.fmt_slot9)                                       );
> +  PROVIDE (_fmt_slot10_start         = ADDR (.fmt_slot10)                                      );
> +  PROVIDE (_fmt_slot11_start         = ADDR (.fmt_slot11)                                      );
> +  PROVIDE (_fmt_slot12_start         = ADDR (.fmt_slot12)                                      );
> +  PROVIDE (_fmt_slot13_start         = ADDR (.fmt_slot13)                                      );
> +  PROVIDE (_fmt_slot14_start         = ADDR (.fmt_slot14)                                      );
> +  PROVIDE (_fmt_slot15_start         = ADDR (.fmt_slot15)                                      );
> +
> +  PROVIDE (_cmem_end                 = ADDR (.cmem)              + SIZEOF (.cmem)              );
> +  PROVIDE (_cmem_alter_end           = ADDR (.cmem_alter)        + SIZEOF (.cmem_alter)        );
> +  PROVIDE (_cmem_shared_end          = ADDR (.cmem_shared)       + SIZEOF (.cmem_shared)       );
> +  PROVIDE (_cmem_shared_alter_end    = ADDR (.cmem_shared_alter) + SIZEOF (.cmem_shared_alter) );
> +  PROVIDE (_fmt_slot0_end            = ADDR (.fmt_slot0)         + SIZEOF (.fmt_slot0)         );
> +  PROVIDE (_fmt_slot1_end            = ADDR (.fmt_slot1)         + SIZEOF (.fmt_slot1)         );
> +  PROVIDE (_fmt_slot2_end            = ADDR (.fmt_slot2)         + SIZEOF (.fmt_slot2)         );
> +  PROVIDE (_fmt_slot3_end            = ADDR (.fmt_slot3)         + SIZEOF (.fmt_slot3)         );
> +  PROVIDE (_fmt_slot4_end            = ADDR (.fmt_slot4)         + SIZEOF (.fmt_slot4)         );
> +  PROVIDE (_fmt_slot5_end            = ADDR (.fmt_slot5)         + SIZEOF (.fmt_slot5)         );
> +  PROVIDE (_fmt_slot6_end            = ADDR (.fmt_slot6)         + SIZEOF (.fmt_slot6)         );
> +  PROVIDE (_fmt_slot7_end            = ADDR (.fmt_slot7)         + SIZEOF (.fmt_slot7)         );
> +  PROVIDE (_fmt_slot8_end            = ADDR (.fmt_slot8)         + SIZEOF (.fmt_slot8)         );
> +  PROVIDE (_fmt_slot9_end            = ADDR (.fmt_slot9)         + SIZEOF (.fmt_slot9)         );
> +  PROVIDE (_fmt_slot10_end           = ADDR (.fmt_slot10)        + SIZEOF (.fmt_slot10)        );
> +  PROVIDE (_fmt_slot11_end           = ADDR (.fmt_slot11)        + SIZEOF (.fmt_slot11)        );
> +  PROVIDE (_fmt_slot12_end           = ADDR (.fmt_slot12)        + SIZEOF (.fmt_slot12)        );
> +  PROVIDE (_fmt_slot13_end           = ADDR (.fmt_slot13)        + SIZEOF (.fmt_slot13)        );
> +  PROVIDE (_fmt_slot14_end           = ADDR (.fmt_slot14)        + SIZEOF (.fmt_slot14)        );
> +  PROVIDE (_fmt_slot15_end           = ADDR (.fmt_slot15)        + SIZEOF (.fmt_slot15)        );
> +
> +  OVERLAY 0x57f00000 :
> +    {
> +      .cmem       { *(.cmem)       }
> +      .cmem_alter { *(.cmem_alter) }
> +    }
> +
> +  OVERLAY 0x57f08000 :
> +    {
> +      .cmem_shared       { *(.cmem_shared)       }
> +      .cmem_shared_alter { *(.cmem_shared_alter) }
> +    }
> +
> +  .fmt_slot0  0x58000000 : { *(.fmt_slot0)  }
> +  .fmt_slot1  0x58800000 : { *(.fmt_slot1)  }
> +  .fmt_slot2  0x59000000 : { *(.fmt_slot2)  }
> +  .fmt_slot3  0x59800000 : { *(.fmt_slot3)  }
> +  .fmt_slot4  0x5a000000 : { *(.fmt_slot4)  }
> +  .fmt_slot5  0x5a800000 : { *(.fmt_slot5)  }
> +  .fmt_slot6  0x5b000000 : { *(.fmt_slot6)  }
> +  .fmt_slot7  0x5b800000 : { *(.fmt_slot7)  }
> +  .fmt_slot8  0x5c000000 : { *(.fmt_slot8)  }
> +  .fmt_slot9  0x5c800000 : { *(.fmt_slot9)  }
> +  .fmt_slot10 0x5d000000 : { *(.fmt_slot10) }
> +  .fmt_slot11 0x5d800000 : { *(.fmt_slot11) }
> +  .fmt_slot12 0x5e000000 : { *(.fmt_slot12) }
> +  .fmt_slot13 0x5e800000 : { *(.fmt_slot13) }
> +  .fmt_slot14 0x5f000000 : { *(.fmt_slot14) }
> +  .fmt_slot15 0x5f800000 : { *(.fmt_slot15) }
> +
> + /* End of nps specific sections and symbols.  */
> +EOF



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