This fixes ! to work as documented in a memory region attribute list.
authorIan Lance Taylor <ian@airs.com>
Sat, 12 Jun 1999 21:24:56 +0000 (21:24 +0000)
committerIan Lance Taylor <ian@airs.com>
Sat, 12 Jun 1999 21:24:56 +0000 (21:24 +0000)
From Thomas Zenker <thz@lennartz-electronic.de>:
* ldgram.y (attributes_opt): Use attributes_list instead of NAME.
(attributes_list, attributes_string): New nonterminals.
* ldlang.c (lang_set_flags): Add invert parameter.  Don't handle
'!'.
* ldlang.c (lang_set_flags): Update declaration.

ld/ChangeLog
ld/ldgram.y
ld/ldlang.c
ld/ldlang.h

index 060b9ab..cbc6f9b 100644 (file)
@@ -1,3 +1,12 @@
+1999-06-13  Ian Lance Taylor  <ian@zembu.com>
+
+       From Thomas Zenker <thz@lennartz-electronic.de>:
+       * ldgram.y (attributes_opt): Use attributes_list instead of NAME.
+       (attributes_list, attributes_string): New nonterminals.
+       * ldlang.c (lang_set_flags): Add invert parameter.  Don't handle
+       '!'.
+       * ldlang.c (lang_set_flags): Update declaration.
+
 1999-06-12  Ian Lance Taylor  <ian@zembu.com>
 
        * emultempl/pe.em (gld_${EMULATION_NAME}_after_parse): Don't add
index a1f3ed6..002b9fb 100644 (file)
@@ -1,5 +1,5 @@
 /* A YACC grammer to parse a superset of the AT&T linker scripting languaue.
-   Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 1998
+   Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 1999
    Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
 
@@ -132,7 +132,7 @@ static int error_index;
 %token ORIGIN FILL
 %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
 %token ALIGNMOD AT PROVIDE
-%type <token> assign_op atype
+%type <token> assign_op atype attributes_opt
 %type <name>  filename
 %token CHIP LIST SECT ABSOLUTE  LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
 %token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
@@ -610,15 +610,24 @@ length_spec:
                                               "length",
                                               lang_first_phase_enum);
                }
-       
+       ;
 
 attributes_opt:
-                 '(' NAME ')'
-                       {
-                       lang_set_flags(region, $2);
-                       }
-       |
-  
+               /* empty */
+                 { /* dummy action to avoid bison 1.25 error message */ }
+       |       '(' attributes_list ')'
+       ;
+
+attributes_list:
+               attributes_string
+       |       attributes_list attributes_string
+       ;
+
+attributes_string:
+               NAME
+                 { lang_set_flags (region, $1, 0); }
+       |       '!' NAME
+                 { lang_set_flags (region, $2, 1); }
        ;
 
 startup:
index a2c533d..862e4e2 100644 (file)
@@ -3255,21 +3255,18 @@ lang_place_orphans ()
 
 
 void
-lang_set_flags (ptr, flags)
+lang_set_flags (ptr, flags, invert)
      lang_memory_region_type *ptr;
      CONST char *flags;
+     int invert;
 {
-  flagword *ptr_flags = &ptr->flags;
+  flagword *ptr_flags;
 
-  ptr->flags = ptr->not_flags = 0;
+  ptr_flags = invert ? &ptr->not_flags : &ptr->flags;
   while (*flags)
     {
       switch (*flags)
        {
-       case '!':
-         ptr_flags = (ptr_flags == &ptr->flags) ? &ptr->not_flags : &ptr->flags;
-         break;
-
        case 'A': case 'a':
          *ptr_flags |= SEC_ALLOC;
          break;
index 7bd7972..8c63938 100644 (file)
@@ -1,5 +1,6 @@
 /* ldlang.h - linker command language support
-   Copyright 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
+   Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999
+   Free Software Foundation, Inc.
    
    This file is part of GLD, the Gnu Linker.
    
@@ -383,7 +384,8 @@ extern struct memory_region_struct *lang_memory_region_lookup
 extern struct memory_region_struct *lang_memory_region_default
   PARAMS ((asection *));
 extern void lang_map PARAMS ((void));
-extern void lang_set_flags PARAMS ((lang_memory_region_type *, const char *));
+extern void lang_set_flags PARAMS ((lang_memory_region_type *, const char *,
+                                   int));
 extern void lang_add_output PARAMS ((const char *, int from_script));
 extern void lang_enter_output_section_statement
   PARAMS ((const char *output_section_statement_name,