mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-25 21:19:54 +00:00
* ldlex.l: Recognize OVERLAY.
* ldgram.y: Add section_phdr field to %union. (section): Handle phdr_opt result. Add OVERLAY case. (opt_exp_without_type): New nonterminal. (phdr_opt): Return list of phdrs. (overlay_section): New nonterminal. * ldlang.c: Include <ctype.h>. (lang_leave_output_section_statement): Add phdrs parameter. Change all callers. (lang_section_in_phdr): Remove. (overlay_vma, overlay_lmn, overlay_max): New static variables. (struct overlay_list): Define. (overlay_list): New static variable. (lang_enter_overlay, lang_enter_overlay_section): New functions. (lang_leave_overlay_section, lang_leave_overlay): New functions. * ldlang.h (lang_leave_output_section_statement): Update declaration for new parameter. (lang_section_in_phdr): Don't declare. (lang_enter_overlay, lang_enter_overlay_section): Declare. (lang_leave_overlay_section, lang_leave_overlay): Declare. * ld.texinfo (Overlays): New node under SECTIONS, documenting overlays. * ldlex.l: Recognize MAX and MIN. * ldgram.y (MAX, MIN): New terminals. (exp): Recognize MAX and MIN. * ldexp.c (fold_binary): Handle MAX and MIN. * ld.texinfo (Arithmetic Functions): Document MAX and MIN. * ld.texinfo (PHDRS): Use @cindex, not @kindex, for program header index entries. * ldgram.y (SIZEOF, ADDR): Do not specify type.
This commit is contained in:
parent
6bb21dd356
commit
d22ec3b090
39
ld/ChangeLog
39
ld/ChangeLog
@ -1,3 +1,42 @@
|
||||
Mon Aug 5 16:26:14 1996 Ian Lance Taylor <ian@cygnus.com>
|
||||
|
||||
* ldlex.l: Recognize OVERLAY.
|
||||
* ldgram.y: Add section_phdr field to %union.
|
||||
(section): Handle phdr_opt result. Add OVERLAY case.
|
||||
(opt_exp_without_type): New nonterminal.
|
||||
(phdr_opt): Return list of phdrs.
|
||||
(overlay_section): New nonterminal.
|
||||
* ldlang.c: Include <ctype.h>.
|
||||
(lang_leave_output_section_statement): Add phdrs parameter.
|
||||
Change all callers.
|
||||
(lang_section_in_phdr): Remove.
|
||||
(overlay_vma, overlay_lmn, overlay_max): New static variables.
|
||||
(struct overlay_list): Define.
|
||||
(overlay_list): New static variable.
|
||||
(lang_enter_overlay, lang_enter_overlay_section): New functions.
|
||||
(lang_leave_overlay_section, lang_leave_overlay): New functions.
|
||||
* ldlang.h (lang_leave_output_section_statement): Update
|
||||
declaration for new parameter.
|
||||
(lang_section_in_phdr): Don't declare.
|
||||
(lang_enter_overlay, lang_enter_overlay_section): Declare.
|
||||
(lang_leave_overlay_section, lang_leave_overlay): Declare.
|
||||
* ld.texinfo (Overlays): New node under SECTIONS, documenting
|
||||
overlays.
|
||||
|
||||
* ldlex.l: Recognize MAX and MIN.
|
||||
* ldgram.y (MAX, MIN): New terminals.
|
||||
(exp): Recognize MAX and MIN.
|
||||
* ldexp.c (fold_binary): Handle MAX and MIN.
|
||||
* ld.texinfo (Arithmetic Functions): Document MAX and MIN.
|
||||
|
||||
* ld.texinfo (PHDRS): Use @cindex, not @kindex, for program header
|
||||
index entries.
|
||||
|
||||
* ldgram.y (SIZEOF, ADDR): Do not specify type.
|
||||
|
||||
* ldcref.c (check_nocrossref): Skip symbols with no output
|
||||
sections.
|
||||
|
||||
Fri Aug 2 14:57:49 1996 Ian Lance Taylor <ian@cygnus.com>
|
||||
|
||||
* ldgram.y (LOADADDR): New terminal.
|
||||
|
204
ld/ldlang.c
204
ld/ldlang.c
@ -14,8 +14,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GLD; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with GLD; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA. */
|
||||
|
||||
#include "bfd.h"
|
||||
#include "sysdep.h"
|
||||
@ -34,6 +35,8 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307
|
||||
#include "ldfile.h"
|
||||
#include "fnmatch.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
/* FORWARDS */
|
||||
static lang_statement_union_type *new_statement PARAMS ((enum statement_enum,
|
||||
size_t,
|
||||
@ -3338,12 +3341,14 @@ lang_float (maybe)
|
||||
}
|
||||
|
||||
void
|
||||
lang_leave_output_section_statement (fill, memspec)
|
||||
lang_leave_output_section_statement (fill, memspec, phdrs)
|
||||
bfd_vma fill;
|
||||
CONST char *memspec;
|
||||
const char *memspec;
|
||||
struct lang_output_section_phdr_list *phdrs;
|
||||
{
|
||||
current_section->fill = fill;
|
||||
current_section->region = lang_memory_region_lookup (memspec);
|
||||
current_section->phdrs = phdrs;
|
||||
stat_ptr = &statement_list;
|
||||
}
|
||||
|
||||
@ -3501,22 +3506,6 @@ lang_new_phdr (name, type, filehdr, phdrs, at, flags)
|
||||
*pp = n;
|
||||
}
|
||||
|
||||
/* Record that a section should be placed in a phdr. */
|
||||
|
||||
void
|
||||
lang_section_in_phdr (name)
|
||||
const char *name;
|
||||
{
|
||||
struct lang_output_section_phdr_list *n;
|
||||
|
||||
n = ((struct lang_output_section_phdr_list *)
|
||||
stat_alloc (sizeof (struct lang_output_section_phdr_list)));
|
||||
n->name = name;
|
||||
n->used = false;
|
||||
n->next = current_section->phdrs;
|
||||
current_section->phdrs = n;
|
||||
}
|
||||
|
||||
/* Record the program header information in the output BFD. FIXME: We
|
||||
should not be calling an ELF specific function here. */
|
||||
|
||||
@ -3636,3 +3625,178 @@ lang_add_nocrossref (l)
|
||||
/* Set notice_all so that we get informed about all symbols. */
|
||||
link_info.notice_all = true;
|
||||
}
|
||||
|
||||
/* Overlay handling. We handle overlays with some static variables. */
|
||||
|
||||
/* The overlay virtual address. */
|
||||
static etree_type *overlay_vma;
|
||||
|
||||
/* The overlay load address. */
|
||||
static etree_type *overlay_lma;
|
||||
|
||||
/* An expression for the maximum section size seen so far. */
|
||||
static etree_type *overlay_max;
|
||||
|
||||
/* A list of all the sections in this overlay. */
|
||||
|
||||
struct overlay_list
|
||||
{
|
||||
struct overlay_list *next;
|
||||
lang_output_section_statement_type *os;
|
||||
};
|
||||
|
||||
static struct overlay_list *overlay_list;
|
||||
|
||||
/* Start handling an overlay. */
|
||||
|
||||
void
|
||||
lang_enter_overlay (vma_expr, lma_expr)
|
||||
etree_type *vma_expr;
|
||||
etree_type *lma_expr;
|
||||
{
|
||||
/* The grammar should prevent nested overlays from occurring. */
|
||||
ASSERT (overlay_vma == NULL
|
||||
&& overlay_lma == NULL
|
||||
&& overlay_list == NULL
|
||||
&& overlay_max == NULL);
|
||||
|
||||
overlay_vma = vma_expr;
|
||||
overlay_lma = lma_expr;
|
||||
}
|
||||
|
||||
/* Start a section in an overlay. We handle this by calling
|
||||
lang_enter_output_section_statement with the correct VMA and LMA. */
|
||||
|
||||
void
|
||||
lang_enter_overlay_section (name)
|
||||
const char *name;
|
||||
{
|
||||
struct overlay_list *n;
|
||||
etree_type *size;
|
||||
|
||||
lang_enter_output_section_statement (name, overlay_vma, normal_section,
|
||||
0, 0, 0, overlay_lma);
|
||||
|
||||
/* If this is the first section, then base the VMA and LMA of future
|
||||
sections on this one. This will work correctly even if `.' is
|
||||
used in the addresses. */
|
||||
if (overlay_list == NULL)
|
||||
{
|
||||
overlay_vma = exp_nameop (ADDR, name);
|
||||
overlay_lma = exp_nameop (LOADADDR, name);
|
||||
}
|
||||
|
||||
/* Remember the section. */
|
||||
n = (struct overlay_list *) xmalloc (sizeof *n);
|
||||
n->os = current_section;
|
||||
n->next = overlay_list;
|
||||
overlay_list = n;
|
||||
|
||||
size = exp_nameop (SIZEOF, name);
|
||||
|
||||
/* Adjust the LMA for the next section. */
|
||||
overlay_lma = exp_binop ('+', overlay_lma, size);
|
||||
|
||||
/* Arrange to work out the maximum section end address. */
|
||||
if (overlay_max == NULL)
|
||||
overlay_max = size;
|
||||
else
|
||||
overlay_max = exp_binop (MAX, overlay_max, size);
|
||||
}
|
||||
|
||||
/* Finish a section in an overlay. There isn't any special to do
|
||||
here. */
|
||||
|
||||
void
|
||||
lang_leave_overlay_section (fill, phdrs)
|
||||
bfd_vma fill;
|
||||
struct lang_output_section_phdr_list *phdrs;
|
||||
{
|
||||
const char *name;
|
||||
char *clean, *s2;
|
||||
const char *s1;
|
||||
char *buf;
|
||||
|
||||
name = current_section->name;
|
||||
|
||||
lang_leave_output_section_statement (fill, "*default*", phdrs);
|
||||
|
||||
/* Define the magic symbols. */
|
||||
|
||||
clean = xmalloc (strlen (name) + 1);
|
||||
s2 = clean;
|
||||
for (s1 = name; *s1 != '\0'; s1++)
|
||||
if (isalnum (*s1) || *s1 == '_')
|
||||
*s2++ = *s1;
|
||||
*s2 = '\0';
|
||||
|
||||
buf = xmalloc (strlen (clean) + sizeof "__load_start_");
|
||||
sprintf (buf, "__load_start_%s", clean);
|
||||
lang_add_assignment (exp_assop ('=', buf,
|
||||
exp_nameop (LOADADDR, name)));
|
||||
|
||||
buf = xmalloc (strlen (clean) + sizeof "__load_stop_");
|
||||
sprintf (buf, "__load_stop_%s", clean);
|
||||
lang_add_assignment (exp_assop ('=', buf,
|
||||
exp_binop ('+',
|
||||
exp_nameop (LOADADDR, name),
|
||||
exp_nameop (SIZEOF, name))));
|
||||
|
||||
free (clean);
|
||||
}
|
||||
|
||||
/* Finish an overlay. If there are any overlay wide settings, this
|
||||
looks through all the sections in the overlay and sets them. */
|
||||
|
||||
void
|
||||
lang_leave_overlay (fill, memspec, phdrs)
|
||||
bfd_vma fill;
|
||||
const char *memspec;
|
||||
struct lang_output_section_phdr_list *phdrs;
|
||||
{
|
||||
lang_memory_region_type *region;
|
||||
struct overlay_list *l;
|
||||
struct lang_nocrossref *nocrossref;
|
||||
|
||||
if (memspec == NULL)
|
||||
region = NULL;
|
||||
else
|
||||
region = lang_memory_region_lookup (memspec);
|
||||
|
||||
nocrossref = NULL;
|
||||
|
||||
l = overlay_list;
|
||||
while (l != NULL)
|
||||
{
|
||||
struct lang_nocrossref *nc;
|
||||
struct overlay_list *next;
|
||||
|
||||
if (fill != 0 && l->os->fill == 0)
|
||||
l->os->fill = fill;
|
||||
if (region != NULL && l->os->region == NULL)
|
||||
l->os->region = region;
|
||||
if (phdrs != NULL && l->os->phdrs == NULL)
|
||||
l->os->phdrs = phdrs;
|
||||
|
||||
nc = (struct lang_nocrossref *) xmalloc (sizeof *nc);
|
||||
nc->name = l->os->name;
|
||||
nc->next = nocrossref;
|
||||
nocrossref = nc;
|
||||
|
||||
next = l->next;
|
||||
free (l);
|
||||
l = next;
|
||||
}
|
||||
|
||||
if (nocrossref != NULL)
|
||||
lang_add_nocrossref (nocrossref);
|
||||
|
||||
/* Update . for the end of the overlay. */
|
||||
lang_add_assignment (exp_assop ('=', ".",
|
||||
exp_binop ('+', overlay_vma, overlay_max)));
|
||||
|
||||
overlay_vma = NULL;
|
||||
overlay_lma = NULL;
|
||||
overlay_list = NULL;
|
||||
overlay_max = NULL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user