* ldgram.y: Add support for REGION_ALIAS operator.
authorNick Clifton <nickc@redhat.com>
Mon, 2 Mar 2009 17:27:36 +0000 (17:27 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 2 Mar 2009 17:27:36 +0000 (17:27 +0000)
        * ldlang.c: Likewise.
        * ldlang.h: Likewise.
        * ldlex.l: Likewise.
        * NEWS: Mention the new feature.
        * ld.texinfo: Document the new feature.
        * ld-scripts/regions-alias-1.t: New file.
        * ld-scripts/regions-alias-2.t: New file.
        * ld-scripts/regions-alias-3.t: New file.
        * ld-scripts/regions-alias-4.t: New file.
        * ld-scripts/script.exp: Run region alias tests.

25 files changed:
ld/ChangeLog
ld/NEWS
ld/ld.texinfo
ld/ldgram.y
ld/ldlang.c
ld/ldlang.h
ld/ldlex.l
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/group8a.d
ld/testsuite/ld-elf/group8b.d
ld/testsuite/ld-elf/group9a.d
ld/testsuite/ld-elf/group9b.d
ld/testsuite/ld-scripts/memory.t
ld/testsuite/ld-scripts/region-alias-1.t [new file with mode: 0644]
ld/testsuite/ld-scripts/region-alias-2.t [new file with mode: 0644]
ld/testsuite/ld-scripts/region-alias-3.t [new file with mode: 0644]
ld/testsuite/ld-scripts/region-alias-4.t [new file with mode: 0644]
ld/testsuite/ld-scripts/rgn-over1.d
ld/testsuite/ld-scripts/rgn-over2.d
ld/testsuite/ld-scripts/rgn-over3.d
ld/testsuite/ld-scripts/rgn-over4.d
ld/testsuite/ld-scripts/rgn-over5.d
ld/testsuite/ld-scripts/rgn-over6.d
ld/testsuite/ld-scripts/rgn-over7.d
ld/testsuite/ld-scripts/script.exp

index de067e4ed1683f2e8b17d1c426f27097c608dc3b..1d0fea9015c671bd93364f0af1fde9cfa45c7b84 100644 (file)
@@ -1,3 +1,12 @@
+2009-03-02  Sebastian Huber  <sebastian.huber@embedded-brains.de>
+
+       * ldgram.y: Add support for REGION_ALIAS operator.
+       * ldlang.c: Likewise.
+       * ldlang.h: Likewise.
+       * ldlex.l: Likewise.
+       * NEWS: Mention the new feature.
+       * ld.texinfo: Document the new feature.
+
 2009-03-02  Qinwei  <qinwei@sunnorth.com.cn>
 
        * Makefile.am: Replace score elf emulation with score3 and score7
diff --git a/ld/NEWS b/ld/NEWS
index 1789c8b49d5ada4833b119b987c9f465b6c08ff2..e4951572d80768127d003d57d199734532471e12 100644 (file)
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,5 +1,7 @@
 -*- text -*-
 
+* New script function REGION_ALIAS to add alias names to memory regions.
+
 * PE targets no longer make use of the long section names PE extension to
   the COFF format when generating executable images, by default.  The old
   (slightly non-conformant) behaviour can still be invoked by using the
index fc5f1daaf937dd758ebd211135998ee8f9b13bc4..167df2838f91d919889c21452ba6526d7a995731 100644 (file)
@@ -2785,6 +2785,7 @@ In this section we describe the simple linker script commands.
 * Format Commands::            Commands dealing with object file formats
 @end ifclear
 
+* REGION_ALIAS::               Assign alias names to memory regions
 * Miscellaneous Commands::     Other linker script commands
 @end menu
 
@@ -2969,6 +2970,162 @@ command is also used to set the format for the output file.  @xref{BFD}.
 @end table
 @end ifclear
 
+@node REGION_ALIAS
+@subsection Assign alias names to memory regions
+@kindex REGION_ALIAS(@var{alias}, @var{region})
+@cindex region alias
+@cindex region names
+
+Alias names can be added to existing memory regions created with the
+@ref{MEMORY} command.  Each name corresponds to at most one memory region.
+
+@smallexample
+REGION_ALIAS(@var{alias}, @var{region})
+@end smallexample
+
+The @code{REGION_ALIAS} function creates an alias name @var{alias} for the
+memory region @var{region}.  This allows a flexible mapping of output sections
+to memory regions.  An example follows.
+
+Suppose we have an application for embedded systems which come with various
+memory storage devices.  All have a general purpose, volatile memory @code{RAM}
+that allows code execution or data storage.  Some may have a read-only,
+non-volatile memory @code{ROM} that allows code execution and read-only data
+access.  The last variant is a read-only, non-volatile memory @code{ROM2} with
+read-only data access and no code execution capability.  We have four output
+sections:
+
+@itemize @bullet
+@item
+@code{.text} program code;
+@item
+@code{.rodata} read-only data;
+@item
+@code{.data} read-write initialized data;
+@item
+@code{.bss} read-write zero initialized data.
+@end itemize
+
+The goal is to provide a linker command file that contains a system independent
+part defining the output sections and a system dependent part mapping the
+output sections to the memory regions available on the system.  Our embedded
+systems come with three different memory setups @code{A}, @code{B} and
+@code{C}:
+@multitable @columnfractions .25 .25 .25 .25
+@item Section @tab Variant A @tab Variant B @tab Variant C
+@item .text @tab RAM @tab ROM @tab ROM 
+@item .rodata @tab RAM @tab ROM @tab ROM2
+@item .data @tab RAM @tab RAM/ROM @tab RAM/ROM2
+@item .bss @tab RAM @tab RAM @tab RAM
+@end multitable
+The notation @code{RAM/ROM} or @code{RAM/ROM2} means that this section is
+loaded into region @code{ROM} or @code{ROM2} respectively.  Please note that
+the load address of the @code{.data} section starts in all three variants at
+the end of the @code{.rodata} section.
+
+The base linker script that deals with the output sections follows.  It
+includes the system dependent @code{linkcmds.memory} file that describes the
+memory layout:
+@smallexample
+INCLUDE linkcmds.memory
+
+SECTIONS
+  @{
+    .text :
+      @{
+        *(.text)
+      @} > REGION_TEXT
+    .rodata :
+      @{
+        *(.rodata)
+        rodata_end = .;
+      @} > REGION_RODATA
+    .data : AT (rodata_end)
+      @{
+        data_start = .;
+        *(.data)
+      @} > REGION_DATA
+    data_size = SIZEOF(.data);
+    data_load_start = LOADADDR(.data);
+    .bss :
+      @{
+        *(.bss)
+      @} > REGION_BSS
+  @}
+@end smallexample
+
+Now we need three different @code{linkcmds.memory} files to define memory
+regions and alias names.  The content of @code{linkcmds.memory} for the three
+variants @code{A}, @code{B} and @code{C}:
+@table @code
+@item A
+Here everything goes into the @code{RAM}.
+@smallexample
+MEMORY
+  @{
+    RAM : ORIGIN = 0, LENGTH = 4M
+  @}
+
+REGION_ALIAS("REGION_TEXT", RAM);
+REGION_ALIAS("REGION_RODATA", RAM);
+REGION_ALIAS("REGION_DATA", RAM);
+REGION_ALIAS("REGION_BSS", RAM);
+@end smallexample
+@item B
+Program code and read-only data go into the @code{ROM}.  Read-write data goes
+into the @code{RAM}.  An image of the initialized data is loaded into the
+@code{ROM} and will be copied during system start into the @code{RAM}.
+@smallexample
+MEMORY
+  @{
+    ROM : ORIGIN = 0, LENGTH = 3M
+    RAM : ORIGIN = 0x10000000, LENGTH = 1M
+  @}
+
+REGION_ALIAS("REGION_TEXT", ROM);
+REGION_ALIAS("REGION_RODATA", ROM);
+REGION_ALIAS("REGION_DATA", RAM);
+REGION_ALIAS("REGION_BSS", RAM);
+@end smallexample
+@item C
+Program code goes into the @code{ROM}.  Read-only data goes into the
+@code{ROM2}.  Read-write data goes into the @code{RAM}.  An image of the
+initialized data is loaded into the @code{ROM2} and will be copied during
+system start into the @code{RAM}.
+@smallexample
+MEMORY
+  @{
+    ROM : ORIGIN = 0, LENGTH = 2M
+    ROM2 : ORIGIN = 0x10000000, LENGTH = 1M
+    RAM : ORIGIN = 0x20000000, LENGTH = 1M
+  @}
+
+REGION_ALIAS("REGION_TEXT", ROM);
+REGION_ALIAS("REGION_RODATA", ROM2);
+REGION_ALIAS("REGION_DATA", RAM);
+REGION_ALIAS("REGION_BSS", RAM);
+@end smallexample
+@end table
+
+It is possible to write a common system initialization routine to copy the
+@code{.data} section from @code{ROM} or @code{ROM2} into the @code{RAM} if
+necessary:
+@smallexample
+#include <string.h>
+
+extern char data_start [];
+extern char data_size [];
+extern char data_load_start [];
+
+void copy_data(void)
+@{
+  if (data_start != data_load_start)
+    @{
+      memcpy(data_start, data_load_start, (size_t) data_size);
+    @}
+@}
+@end smallexample
+
 @node Miscellaneous Commands
 @subsection Other Linker Script Commands
 There are a few other linker scripts commands.
@@ -4310,7 +4467,9 @@ The @var{name} is a name used in the linker script to refer to the
 region.  The region name has no meaning outside of the linker script.
 Region names are stored in a separate name space, and will not conflict
 with symbol names, file names, or section names.  Each memory region
-must have a distinct name.
+must have a distinct name within the @code{MEMORY} command.  However you can
+add later alias names to existing memory regions with the @ref{REGION_ALIAS}
+command.  
 
 @cindex memory region attributes
 The @var{attr} string is an optional list of attributes that specify
index 1149e6b29c40cbe9db08c542a9fab873e016224f..4d06725e46786966f6c8b541c0d7a4b5780e9513 100644 (file)
@@ -1,6 +1,6 @@
 /* A YACC grammar to parse a superset of the AT&T linker scripting language.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
 
    This file is part of the GNU Binutils.
@@ -131,6 +131,7 @@ static int error_index;
 %token SEGMENT_START
 %token INCLUDE
 %token MEMORY
+%token REGION_ALIAS
 %token NOLOAD DSECT COPY INFO OVERLAY
 %token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
 %token <integer> NEXT
@@ -352,6 +353,8 @@ ifile_p1:
                { lang_add_insert ($3, 0); }
        |       INSERT_K BEFORE NAME
                { lang_add_insert ($3, 1); }
+       |       REGION_ALIAS '(' NAME ',' NAME ')'
+               { lang_memory_region_alias ($3, $5); }
        ;
 
 input_list:
index cc390b0b4119e12bdf6ed3464806d515f78380f4..9f62e9f02cc75d76fa51803a5f1e4c0455ae13b0 100644 (file)
@@ -1205,7 +1205,13 @@ lang_finish (void)
   In this case it is probably an error to create a region that has
   already been created.  If we are not inside a MEMORY block it is
   dubious to use an undeclared region name (except DEFAULT_MEMORY_REGION)
-  and so we issue a warning.  */
+  and so we issue a warning.
+  
+  Each region has at least one name.  The first name is either
+  DEFAULT_MEMORY_REGION or the name given in the MEMORY block.  You can add
+  alias names to an existing region within a script with
+  REGION_ALIAS (alias, region_name).  Each name corresponds to at most one
+  region.  */
 
 static lang_memory_region_type *lang_memory_region_list;
 static lang_memory_region_type **lang_memory_region_list_tail
@@ -1214,28 +1220,31 @@ static lang_memory_region_type **lang_memory_region_list_tail
 lang_memory_region_type *
 lang_memory_region_lookup (const char *const name, bfd_boolean create)
 {
-  lang_memory_region_type *p;
+  lang_memory_region_name *n;
+  lang_memory_region_type *r;
   lang_memory_region_type *new;
 
   /* NAME is NULL for LMA memspecs if no region was specified.  */
   if (name == NULL)
     return NULL;
 
-  for (p = lang_memory_region_list; p != NULL; p = p->next)
-    if (strcmp (p->name, name) == 0)
-      {
-       if (create)
-         einfo (_("%P:%S: warning: redeclaration of memory region '%s'\n"),
-                name);
-       return p;
-      }
+  for (r = lang_memory_region_list; r != NULL; r = r->next)
+    for (n = &r->name_list; n != NULL; n = n->next)
+      if (strcmp (n->name, name) == 0)
+        {
+          if (create)
+            einfo (_("%P:%S: warning: redeclaration of memory region `%s'\n"),
+                   name);
+          return r;
+        }
 
   if (!create && strcmp (name, DEFAULT_MEMORY_REGION))
-    einfo (_("%P:%S: warning: memory region %s not declared\n"), name);
+    einfo (_("%P:%S: warning: memory region `%s' not declared\n"), name);
 
   new = stat_alloc (sizeof (lang_memory_region_type));
 
-  new->name = xstrdup (name);
+  new->name_list.name = xstrdup (name);
+  new->name_list.next = NULL;
   new->next = NULL;
   new->origin = 0;
   new->length = ~(bfd_size_type) 0;
@@ -1251,8 +1260,50 @@ lang_memory_region_lookup (const char *const name, bfd_boolean create)
   return new;
 }
 
+void
+lang_memory_region_alias (const char * alias, const char * region_name)
+{
+  lang_memory_region_name * n;
+  lang_memory_region_type * r;
+  lang_memory_region_type * region;
+
+  /* The default region must be unique.  This ensures that it is not necessary
+     to iterate through the name list if someone wants the check if a region is
+     the default memory region.  */
+  if (strcmp (region_name, DEFAULT_MEMORY_REGION) == 0
+      || strcmp (alias, DEFAULT_MEMORY_REGION) == 0)
+    einfo (_("%F%P:%S: error: alias for default memory region\n"));
+
+  /* Look for the target region and check if the alias is not already
+     in use.  */
+  region = NULL;
+  for (r = lang_memory_region_list; r != NULL; r = r->next)
+    for (n = &r->name_list; n != NULL; n = n->next)
+      {
+        if (region == NULL && strcmp (n->name, region_name) == 0)
+          region = r;
+        if (strcmp (n->name, alias) == 0)
+          einfo (_("%F%P:%S: error: redefinition of memory region "
+                   "alias `%s'\n"),
+                 alias);
+      }
+
+  /* Check if the target region exists.  */
+  if (region == NULL)
+    einfo (_("%F%P:%S: error: memory region `%s' "
+             "for alias `%s' does not exist\n"),
+           region_name,
+           alias);
+
+  /* Add alias to region name list.  */
+  n = stat_alloc (sizeof (lang_memory_region_name));
+  n->name = xstrdup (alias);
+  n->next = region->name_list.next;
+  region->name_list.next = n;
+}
+
 static lang_memory_region_type *
-lang_memory_default (asection *section)
+lang_memory_default (asection * section)
 {
   lang_memory_region_type *p;
 
@@ -1847,7 +1898,7 @@ lang_map (void)
       char buf[100];
       int len;
 
-      fprintf (config.map_file, "%-16s ", m->name);
+      fprintf (config.map_file, "%-16s ", m->name_list.name);
 
       sprintf_vma (buf, m->origin);
       minfo ("0x%s ", buf);
@@ -4462,8 +4513,8 @@ lang_check_section_addresses (void)
      a bfd_vma quantity in decimal.  */
   for (m = lang_memory_region_list; m; m = m->next)
     if (m->had_full_message)
-      einfo (_("%X%P: region %s overflowed by %ld bytes\n"),
-            m->name, (long)(m->current - (m->origin + m->length)));
+      einfo (_("%X%P: region `%s' overflowed by %ld bytes\n"),
+            m->name_list.name, (long)(m->current - (m->origin + m->length)));
 
 }
 
@@ -4485,21 +4536,21 @@ os_region_check (lang_output_section_statement_type *os,
     {
       if (tree != NULL)
        {
-         einfo (_("%X%P: address 0x%v of %B section %s"
-                  " is not within region %s\n"),
+         einfo (_("%X%P: address 0x%v of %B section `%s'"
+                  " is not within region `%s'\n"),
                 region->current,
                 os->bfd_section->owner,
                 os->bfd_section->name,
-                region->name);
+                region->name_list.name);
        }
       else if (!region->had_full_message)
        {
          region->had_full_message = TRUE;
 
-         einfo (_("%X%P: %B section %s will not fit in region %s\n"),
+         einfo (_("%X%P: %B section `%s' will not fit in region `%s'\n"),
                 os->bfd_section->owner,
                 os->bfd_section->name,
-                region->name);
+                region->name_list.name);
        }
     }
 }
@@ -4588,8 +4639,8 @@ lang_size_sections_1
                       from the region specification.  */
                    if (os->region == NULL
                        || ((os->bfd_section->flags & (SEC_ALLOC | SEC_LOAD))
-                           && os->region->name[0] == '*'
-                           && strcmp (os->region->name,
+                           && os->region->name_list.name[0] == '*'
+                           && strcmp (os->region->name_list.name,
                                       DEFAULT_MEMORY_REGION) == 0))
                      {
                        os->region = lang_memory_default (os->bfd_section);
@@ -4602,10 +4653,10 @@ lang_size_sections_1
                        && !IGNORE_SECTION (os->bfd_section)
                        && ! link_info.relocatable
                        && check_regions
-                       && strcmp (os->region->name,
+                       && strcmp (os->region->name_list.name,
                                   DEFAULT_MEMORY_REGION) == 0
                        && lang_memory_region_list != NULL
-                       && (strcmp (lang_memory_region_list->name,
+                       && (strcmp (lang_memory_region_list->name_list.name,
                                    DEFAULT_MEMORY_REGION) != 0
                            || lang_memory_region_list->next != NULL)
                        && expld.phase != lang_mark_phase_enum)
index daf125583e6cc1beb3db9cbd67ec0c6f5896b696..0b57b857ba3c343d20893df001eadc9a0fc72301 100644 (file)
@@ -43,13 +43,19 @@ struct _fill_type
 
 typedef struct statement_list
 {
-  union lang_statement_union *head;
-  union lang_statement_union **tail;
+  union lang_statement_union *  head;
+  union lang_statement_union ** tail;
 } lang_statement_list_type;
 
+typedef struct memory_region_name_struct
+{
+  const char * name;
+  struct memory_region_name_struct * next;
+} lang_memory_region_name;
+
 typedef struct memory_region_struct
 {
-  char *name;
+  lang_memory_region_name name_list;
   struct memory_region_struct *next;
   bfd_vma origin;
   bfd_size_type length;
@@ -429,7 +435,8 @@ struct lang_definedness_hash_entry
 
 /* Used by place_orphan to keep track of orphan sections and statements.  */
 
-struct orphan_save {
+struct orphan_save
+{
   const char *name;
   flagword flags;
   lang_output_section_statement_type *os;
@@ -457,10 +464,10 @@ extern void lang_init
   (void);
 extern void lang_finish
   (void);
-extern lang_memory_region_type *lang_memory_region_lookup
-  (const char *const, bfd_boolean);
-extern lang_memory_region_type *lang_memory_region_default
-  (asection *);
+extern lang_memory_region_type * lang_memory_region_lookup
+  (const char * const, bfd_boolean);
+extern void lang_memory_region_alias
+  (const char *, const char *);
 extern void lang_map
   (void);
 extern void lang_set_flags
index aa06d5460d9835a5c2dcf5189539d20d60aa5793..48309027dbd975bc09487a14856e30034f60274b 100644 (file)
@@ -1,7 +1,7 @@
 %{
 
 /* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2007
+   2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009
    Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support.
 
@@ -239,6 +239,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
 <BOTH,SCRIPT,EXPRESSION,MRI>":"                { RTOKEN(':'); }
 <BOTH,SCRIPT,EXPRESSION,MRI>";"                { RTOKEN(';');}
 <BOTH,SCRIPT>"MEMORY"                  { RTOKEN(MEMORY);}
+<BOTH,SCRIPT>"REGION_ALIAS"            { RTOKEN(REGION_ALIAS);}
 <BOTH,SCRIPT,EXPRESSION>"ORIGIN"       { RTOKEN(ORIGIN);}
 <BOTH,SCRIPT>"VERSION"                 { RTOKEN(VERSIONK);}
 <EXPRESSION,BOTH,SCRIPT>"BLOCK"                { RTOKEN(BLOCK);}
index 88fb12bed7e33e43851cd8cb4c2e74ed2d86ffec..c338bb48d4617f2962caaec24975dd5fa90da98b 100644 (file)
@@ -1,3 +1,11 @@
+2009-03-02  Sebastian Huber  <sebastian.huber@embedded-brains.de>
+
+       * ld-scripts/regions-alias-1.t: New file.
+       * ld-scripts/regions-alias-2.t: New file.
+       * ld-scripts/regions-alias-3.t: New file.
+       * ld-scripts/regions-alias-4.t: New file.
+       * ld-scripts/script.exp: Run region alias tests.
+
 2009-02-27  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        * ld-pe/pe.exp:  Disable auto-import when linking on Cygwin.
index b55715148ec3bd1be31664e8b3420c2217df5f2c..455e02ff87ac3d6fa409b9a354e72a3053a8274b 100644 (file)
@@ -2,6 +2,7 @@
 #ld: -r --gc-sections --entry foo
 #readelf: -g --wide
 #notarget: ia64-*-* mep-*-*
+#xfail: dlx-*-* openrisc-*-* or32-*-* alpha-*-* arc-*-* hppa64-*-*
 
 COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains 1 sections:
    \[Index\]    Name
index 0a78173a21bd8a2d54632352598f818024e028e8..6e88454c088c4619b0dba6641ae0b59eaf2f12cd 100644 (file)
@@ -2,6 +2,7 @@
 #ld: -r --gc-sections --entry bar
 #readelf: -g --wide
 #notarget: ia64-*-* mep-*-*
+#xfail: dlx-*-* openrisc-*-* or32-*-* alpha-*-* arc-*-* hppa64-*-*
 
 COMDAT group section \[[ 0-9]+\] `.group' \[bar\] contains 1 sections:
    \[Index\]    Name
index a20e24f70a9ccbb95c7c91ec047339b6c4bc6ea6..1410ea5daef87232ee33637301bb31634382f896 100644 (file)
@@ -2,6 +2,7 @@
 #ld: -r --gc-sections --entry foo
 #readelf: -g --wide
 #notarget: ia64-*-* mep-*-*
+#xfail: dlx-*-* openrisc-*-* or32-*-* alpha-*-* arc-*-*
 
 COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains 2 sections:
    \[Index\]    Name
index a28d6703264090f1715733a9235b37ec87c074d3..89418dd71f3a64a0726741185e14e136c5c28ab5 100644 (file)
@@ -2,6 +2,7 @@
 #ld: -r --gc-sections --entry bar
 #readelf: -g --wide
 #notarget: ia64-*-* mep-*-*
+#xfail: dlx-*-* openrisc-*-* or32-*-* alpha-*-* hppa64-*-* arc-*-*
 
 COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains 2 sections:
    \[Index\]    Name
index 8a73c58801b870f91ae10322e1505fae75519c69..6623b28939254176f455c5343021c44973f95f2f 100644 (file)
@@ -1,9 +1,15 @@
 MEMORY
 {
-  TEXTMEM (ARX) : ORIGIN = 0x100, LENGTH = 32K
-  DATAMEM (AW)  : org = 0x1000, l = (64 * 1024)
+  R_TEXTMEM (ARX) : ORIGIN = 0x100, LENGTH = 32K
+  R_DATAMEM (AW)  : org = 0x1000, l = (64 * 1024)
 }
 
+REGION_ALIAS ("A_TEXTMEM", R_TEXTMEM);
+REGION_ALIAS ("A_DATAMEM", R_DATAMEM);
+
+REGION_ALIAS ("TEXTMEM", A_TEXTMEM);
+REGION_ALIAS ("DATAMEM", A_DATAMEM);
+
 SECTIONS
 {
   . = 0;
diff --git a/ld/testsuite/ld-scripts/region-alias-1.t b/ld/testsuite/ld-scripts/region-alias-1.t
new file mode 100644 (file)
index 0000000..91f8100
--- /dev/null
@@ -0,0 +1,7 @@
+MEMORY
+{
+  MY_REGION (ARX) : ORIGIN = 0, LENGTH = 32K
+}
+
+REGION_ALIAS ("MY_ALIAS", MY_REGION);
+REGION_ALIAS ("MY_ALIAS", MY_REGION);
diff --git a/ld/testsuite/ld-scripts/region-alias-2.t b/ld/testsuite/ld-scripts/region-alias-2.t
new file mode 100644 (file)
index 0000000..a6b1514
--- /dev/null
@@ -0,0 +1,6 @@
+MEMORY
+{
+  MY_REGION (ARX) : ORIGIN = 0, LENGTH = 32K
+}
+
+REGION_ALIAS ("MY_ALIAS", "NIL");
diff --git a/ld/testsuite/ld-scripts/region-alias-3.t b/ld/testsuite/ld-scripts/region-alias-3.t
new file mode 100644 (file)
index 0000000..667879b
--- /dev/null
@@ -0,0 +1,6 @@
+MEMORY
+{
+  MY_REGION (ARX) : ORIGIN = 0, LENGTH = 32K
+}
+
+REGION_ALIAS ("MY_ALIAS", "*default*");
diff --git a/ld/testsuite/ld-scripts/region-alias-4.t b/ld/testsuite/ld-scripts/region-alias-4.t
new file mode 100644 (file)
index 0000000..da9dff5
--- /dev/null
@@ -0,0 +1,6 @@
+MEMORY
+{
+  MY_REGION (ARX) : ORIGIN = 0, LENGTH = 32K
+}
+
+REGION_ALIAS ("*default*", MY_REGION);
index 2ce7ffc90c44f7345f753c487abe9a4bbddef8be..54892be41d8da28262449d29b02ef80207656b8e 100644 (file)
@@ -1,7 +1,7 @@
 # name: rgn-over1
 # source: rgn-over.s
 # ld: -T rgn-over1.t -Map tmpdir/rgn-over1.map
-# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region r1\n[^ \n]*?ld[^:\n]*?: region r1 overflowed by 16 bytes\Z
+# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section \`.text' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 16 bytes\Z
 
 Discarded input sections
 #...
index ace011789853cbe92d2092bd13b4ec68a523cdef..1a5afea8d5f81ce3867142f273dd62f9be124cd6 100644 (file)
@@ -1,7 +1,7 @@
 # name: rgn-over2
 # source: rgn-over.s
 # ld: -T rgn-over2.t -Map tmpdir/rgn-over2.map
-# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section \.data will not fit in region r1\n[^ \n]*?ld[^:\n]*?: region r1 overflowed by 4 bytes\Z
+# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.data' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 4 bytes\Z
 
 Discarded input sections
 #...
index 91504177692a0fa01724d428081915e9c3deef1e..76fa7c53b3be1ce5cd7944efbef675e221045b63 100644 (file)
@@ -1,7 +1,7 @@
 # name: rgn-over3
 # source: rgn-over.s
 # ld: -T rgn-over3.t -Map tmpdir/rgn-over3.map
-# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region r1\n[^ \n]*?ld[^:\n]*?: [^\n]*?section \.data will not fit in region r2\n[^ \n]*?ld[^:\n]*?: region r1 overflowed by 4 bytes\n[^ \n]*?ld[^:\n]*?: region r2 overflowed by 4 bytes\Z
+# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.text' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.data' will not fit in region `r2'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 4 bytes\n[^ \n]*?ld[^:\n]*?: region `r2' overflowed by 4 bytes\Z
 
 Discarded input sections
 #...
index e4e98c56c85e6925d87a6fa823010882deec209f..1087aec58c4a3774bb6e897a6a027f1738af9fa6 100644 (file)
@@ -1,7 +1,7 @@
 # name: rgn-over4
 # source: rgn-over.s
 # ld: -T rgn-over4.t -Map tmpdir/rgn-over4.map
-# error: \A[^ \n]*?ld[^:\n]*?: [^:\n]*?section \.text will not fit in region r1\n[^ \n]*?ld[^:\n]*?: region r1 overflowed by 16 bytes\Z
+# error: \A[^ \n]*?ld[^:\n]*?: [^:\n]*?section `\.text' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 16 bytes\Z
 
 Discarded input sections
 #...
index abce4e180a5a51abbbb056b7fbc825de13428c43..734d9feed677ebd2a5ac893df2212982074b2598 100644 (file)
@@ -1,7 +1,7 @@
 # name: rgn-over5
 # source: rgn-over.s
 # ld: -T rgn-over5.t -Map tmpdir/rgn-over5.map
-# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region v1\n[^ \n]*?ld[^:\n]*?: region v1 overflowed by 16 bytes\Z
+# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.text' will not fit in region `v1'\n[^ \n]*?ld[^:\n]*?: region `v1' overflowed by 16 bytes\Z
 
 Discarded input sections
 #...
index d7088a0166c43d9e8211988b9a079fdfaea876ba..00b41d05630b0fc74e6f33597c6d45ce2d3f1f59 100644 (file)
@@ -1,7 +1,7 @@
 # name: rgn-over6
 # source: rgn-over.s
 # ld: -T rgn-over6.t -Map tmpdir/rgn-over6.map
-# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region r1\n[^ \n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region v1\n[^ \n]*?ld[^:\n]*?: region r1 overflowed by 16 bytes\n[^ \n]*?ld[^:\n]*?: region v1 overflowed by 16 bytes\Z
+# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.text' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.text' will not fit in region `v1'\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 16 bytes\n[^ \n]*?ld[^:\n]*?: region `v1' overflowed by 16 bytes\Z
 
 Discarded input sections
 #...
index 52442ba87df2568137ba45f60e6057bbca229076..82cfea43ee7228b5ae5df64afe1720a125f31803 100644 (file)
@@ -1,7 +1,7 @@
 # name: rgn-over7
 # source: rgn-over.s
 # ld: -T rgn-over7.t -Map tmpdir/rgn-over7.map
-# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section \.text will not fit in region r1\n[^ \n]*?ld[^:\n]*?: section \.data \[0+1008 -> 0+1013\] overlaps section \.text \[0+1000 -> 0+100b\]\n[^ \n]*?ld[^:\n]*?: region r1 overflowed by 4 bytes\Z
+# error: \A[^ \n]*?ld[^:\n]*?: [^\n]*?section `\.text' will not fit in region `r1'\n[^ \n]*?ld[^:\n]*?: section \.data \[0+1008 -> 0+1013\] overlaps section \.text \[0+1000 -> 0+100b\]\n[^ \n]*?ld[^:\n]*?: region `r1' overflowed by 4 bytes\Z
 
 Discarded input sections
 #...
index 62c98bede4a692866120a275e33fdd958146938b..88d4b4fb298e7b1ddcdea200b405822f7fffc732 100644 (file)
@@ -126,3 +126,13 @@ if ![ld_simple_link $ld tmpdir/script "$flags -T $srcdir/$subdir/memory.t tmpdir
 } else {
     check_script
 }
+
+set test_script_list [glob $srcdir/$subdir/region-alias-*.t]
+
+foreach test_script $test_script_list {
+    if ![ld_simple_link $ld tmpdir/script "$flags -T $test_script tmpdir/script.o"] {
+        xfail "REGION_ALIAS: $test_script"
+    } else {
+        xpass "REGION_ALIAS: $test_script"
+    }
+}