This fixes ! to work as documented in a memory region attribute list.

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.
This commit is contained in:
Ian Lance Taylor 1999-06-12 21:24:56 +00:00
parent 57e21befb9
commit aa8804e46e
4 changed files with 35 additions and 18 deletions

View 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

View 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:

View 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;

View 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,