Add warning messages for the use of an undeclared memory region and the

redefintion of an already declared region.
This commit is contained in:
Nick Clifton 2003-10-21 15:33:47 +00:00
parent 5a21e886d0
commit a747ee4d51
4 changed files with 56 additions and 25 deletions

View File

@ -1,3 +1,19 @@
2003-10-21 Nick Clifton <nickc@redhat.com>
* ldlang.c (lang_memory_region_lookup): Add second parameter -
create - which is true if the region is being created. Issue
appropriate warning messages for finding and not finding
already created regions.
(lang_memory_default): Use DEFAULT_MEMORY_REGION.
(lang_leave_overlay_section): Likewise.
(lang_size_sections_1): Likewise.
Pass second parameter to lang_memory_region_lookup.
(lang_get_regions): Likewise.
* ldlang.h (DEFAULT_MEMORY_REGION): Define.
Update prototype for lang_memory_region_lookup.
* ldgram.y: Pass second parameter to lang_memory_region_lookup.
Use DEFAULT_MEMORY_REGION instead of "*default".
2003-10-20 Andrew Cagney <cagney@redhat.com>
* pe-dll.c: Replace "struct sec" with "struct bfd_section".

View File

@ -627,7 +627,7 @@ memory_spec_list:
memory_spec: NAME
{ region = lang_memory_region_lookup($1); }
{ region = lang_memory_region_lookup ($1, TRUE); }
attributes_opt ':'
origin_spec opt_comma length_spec
{}
@ -924,7 +924,7 @@ opt_nocrossrefs:
memspec_opt:
'>' NAME
{ $$ = $2; }
| { $$ = "*default*"; }
| { $$ = DEFAULT_MEMORY_REGION; }
;
phdr_opt:

View File

@ -504,13 +504,19 @@ lang_init (void)
We maintain a list of all the regions here.
If no regions are specified in the script, then the default is used
which is created when looked up to be the entire data space. */
which is created when looked up to be the entire data space.
If create is true we are creating a region inside a MEMORY block.
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. */
static lang_memory_region_type *lang_memory_region_list;
static lang_memory_region_type **lang_memory_region_list_tail = &lang_memory_region_list;
lang_memory_region_type *
lang_memory_region_lookup (const char *const name)
lang_memory_region_lookup (const char *const name, bfd_boolean create)
{
lang_memory_region_type *p;
lang_memory_region_type *new;
@ -520,10 +526,12 @@ lang_memory_region_lookup (const char *const name)
return NULL;
for (p = lang_memory_region_list; p != NULL; p = p->next)
{
if (strcmp (p->name, name) == 0)
if (strcmp (p->name, name) == 0)
{
if (create)
einfo (_("%P:%S: warning: redeclaration of memory region '%s'\n"), name);
return p;
}
}
#if 0
/* This code used to always use the first region in the list as the
@ -532,13 +540,16 @@ lang_memory_region_lookup (const char *const name)
NOLOAD sections to work reasonably without requiring a region.
People should specify what region they mean, if they really want
a region. */
if (strcmp (name, "*default*") == 0)
if (strcmp (name, DEFAULT_MEMORY_REGION) == 0)
{
if (lang_memory_region_list != NULL)
return lang_memory_region_list;
}
#endif
if (!create && strcmp (name, DEFAULT_MEMORY_REGION))
einfo (_("%P:%S: warning: memory region %s not declared\n"), name);
new = stat_alloc (sizeof (lang_memory_region_type));
new->name = xstrdup (name);
@ -575,7 +586,7 @@ lang_memory_default (asection *section)
return p;
}
}
return lang_memory_region_lookup ("*default*");
return lang_memory_region_lookup (DEFAULT_MEMORY_REGION, FALSE);
}
lang_output_section_statement_type *
@ -2889,7 +2900,7 @@ lang_size_sections_1
|| (((bfd_get_section_flags (output_bfd, os->bfd_section)
& (SEC_ALLOC | SEC_LOAD)) != 0)
&& os->region->name[0] == '*'
&& strcmp (os->region->name, "*default*") == 0))
&& strcmp (os->region->name, DEFAULT_MEMORY_REGION) == 0))
{
os->region = lang_memory_default (os->bfd_section);
}
@ -2902,10 +2913,10 @@ lang_size_sections_1
& SEC_NEVER_LOAD) == 0
&& ! link_info.relocatable
&& check_regions
&& strcmp (os->region->name, "*default*") == 0
&& strcmp (os->region->name, DEFAULT_MEMORY_REGION) == 0
&& lang_memory_region_list != NULL
&& (strcmp (lang_memory_region_list->name,
"*default*") != 0
DEFAULT_MEMORY_REGION) != 0
|| lang_memory_region_list->next != NULL))
{
/* By default this is an error rather than just a
@ -3160,7 +3171,7 @@ lang_size_sections_1
{
/* If we don't have an output section, then just adjust
the default memory address. */
lang_memory_region_lookup ("*default*")->current = newdot;
lang_memory_region_lookup (DEFAULT_MEMORY_REGION, FALSE)->current = newdot;
}
else
{
@ -4464,10 +4475,11 @@ lang_float (bfd_boolean maybe)
/* Work out the load- and run-time regions from a script statement, and
store them in *LMA_REGION and *REGION respectively.
MEMSPEC is the name of the run-time region, or "*default*" if the
statement didn't specify one. LMA_MEMSPEC is the name of the
load-time region, or null if the statement didn't specify one.
HAVE_LMA_P is TRUE if the statement had an explicit load address.
MEMSPEC is the name of the run-time region, or the value of
DEFAULT_MEMORY_REGION if the statement didn't specify one.
LMA_MEMSPEC is the name of the load-time region, or null if the
statement didn't specify one.HAVE_LMA_P is TRUE if the statement
had an explicit load address.
It is an error to specify both a load region and a load address. */
@ -4478,14 +4490,14 @@ lang_get_regions (struct memory_region_struct **region,
const char *lma_memspec,
int have_lma_p)
{
*lma_region = lang_memory_region_lookup (lma_memspec);
*lma_region = lang_memory_region_lookup (lma_memspec, FALSE);
/* If no runtime region has been given, but the load region has
been, use the load region. */
if (lma_memspec != 0 && strcmp (memspec, "*default*") == 0)
if (lma_memspec != 0 && strcmp (memspec, DEFAULT_MEMORY_REGION) == 0)
*region = *lma_region;
else
*region = lang_memory_region_lookup (memspec);
*region = lang_memory_region_lookup (memspec, FALSE);
if (have_lma_p && lma_memspec != 0)
einfo (_("%X%P:%S: section has both a load address and a load region\n"));
@ -4849,10 +4861,11 @@ lang_leave_overlay_section (fill_type *fill,
name = current_section->name;
/* For now, assume that "*default*" is the run-time memory region and
that no load-time region has been specified. It doesn't really
matter what we say here, since lang_leave_overlay will override it. */
lang_leave_output_section_statement (fill, "*default*", phdrs, 0);
/* For now, assume that DEFAULT_MEMORY_REGION is the run-time memory
region and that no load-time region has been specified. It doesn't
really matter what we say here, since lang_leave_overlay will
override it. */
lang_leave_output_section_statement (fill, DEFAULT_MEMORY_REGION, phdrs, 0);
/* Define the magic symbols. */

View File

@ -23,6 +23,8 @@
#ifndef LDLANG_H
#define LDLANG_H
#define DEFAULT_MEMORY_REGION "*default*"
typedef enum {
lang_input_file_is_l_enum,
lang_input_file_is_symbols_only_enum,
@ -388,7 +390,7 @@ extern int lang_statement_iteration;
extern void lang_init
(void);
extern struct memory_region_struct *lang_memory_region_lookup
(const char *const);
(const char *const, bfd_boolean);
extern struct memory_region_struct *lang_memory_region_default
(asection *);
extern void lang_map