Back to index

cell-binutils  2.17cvs20070401
Classes | Functions | Variables
mri.c File Reference
#include "bfd.h"
#include "sysdep.h"
#include "ld.h"
#include "ldexp.h"
#include "ldlang.h"
#include "ldmisc.h"
#include "mri.h"
#include <ldgram.h>
#include "libiberty.h"

Go to the source code of this file.

Classes

struct  section_name_struct

Functions

static struct
section_name_struct ** 
lookup (const char *name, struct section_name_struct **list)
static void mri_add_to_list (struct section_name_struct **list, const char *name, etree_type *vma, const char *zalias, etree_type *align, etree_type *subalign)
void mri_output_section (const char *name, etree_type *vma)
void mri_only_load (const char *name)
void mri_base (etree_type *exp)
void mri_draw_tree (void)
void mri_load (const char *name)
void mri_order (const char *name)
void mri_alias (const char *want, const char *is, int isn)
void mri_name (const char *name)
void mri_format (const char *name)
void mri_public (const char *name, etree_type *exp)
void mri_align (const char *name, etree_type *exp)
void mri_alignmod (const char *name, etree_type *exp)
void mri_truncate (unsigned int exp)

Variables

static unsigned int symbol_truncate = 10000
static struct section_name_structorder
static struct section_name_structonly_load
static struct section_name_structaddress
static struct section_name_structalias
static struct section_name_structalignment
static struct section_name_structsubalignment
static int done_tree = 0

Class Documentation

struct section_name_struct

Definition at line 37 of file mri.c.

Collaboration diagram for section_name_struct:
Class Members
const char * alias
etree_type * align
const char * name
struct section_name_struct * next
int ok_to_load
etree_type * subalign
etree_type * vma

Function Documentation

static struct section_name_struct** lookup ( const char *  name,
struct section_name_struct **  list 
) [static, read]

Definition at line 57 of file mri.c.

{
  struct section_name_struct **ptr = list;

  while (*ptr)
    {
      if (strcmp (name, (*ptr)->name) == 0)
       /* If this is a match, delete it, we only keep the last instance
          of any name.  */
       *ptr = (*ptr)->next;
      else
       ptr = &((*ptr)->next);
    }

  *ptr = xmalloc (sizeof (struct section_name_struct));
  return ptr;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void mri_add_to_list ( struct section_name_struct **  list,
const char *  name,
etree_type vma,
const char *  zalias,
etree_type align,
etree_type subalign 
) [static]

Definition at line 76 of file mri.c.

{
  struct section_name_struct **ptr = lookup (name, list);

  (*ptr)->name = name;
  (*ptr)->vma = vma;
  (*ptr)->next = NULL;
  (*ptr)->ok_to_load = 0;
  (*ptr)->alias = zalias;
  (*ptr)->align = align;
  (*ptr)->subalign = subalign;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void mri_alias ( const char *  want,
const char *  is,
int  isn 
)

Definition at line 254 of file mri.c.

{
  if (!is)
    {
      char buf[20];

      /* Some sections are digits.  */
      sprintf (buf, "%d", isn);

      is = xstrdup (buf);

      if (is == NULL)
       abort ();
    }

  mri_add_to_list (&alias, is, 0, want, 0, 0);
}

Here is the call graph for this function:

void mri_align ( const char *  name,
etree_type exp 
)

Definition at line 301 of file mri.c.

{
  mri_add_to_list (&alignment, name, 0, 0, exp, 0);
}

Here is the call graph for this function:

void mri_alignmod ( const char *  name,
etree_type exp 
)

Definition at line 307 of file mri.c.

{
  mri_add_to_list (&subalignment, name, 0, 0, 0, exp);
}

Here is the call graph for this function:

void mri_base ( etree_type exp)

Definition at line 110 of file mri.c.

{
  base = exp;
}
void mri_draw_tree ( void  )

Definition at line 118 of file mri.c.

{
  if (done_tree)
    return;

  /* Now build the statements for the ldlang machine.  */

  /* Attach the addresses of any which have addresses,
     and add the ones not mentioned.  */
  if (address != NULL)
    {
      struct section_name_struct *alist;
      struct section_name_struct *olist;

      if (order == NULL)
       order = address;

      for (alist = address;
          alist != NULL;
          alist = alist->next)
       {
         int done = 0;

         for (olist = order; done == 0 && olist != NULL; olist = olist->next)
           {
             if (strcmp (alist->name, olist->name) == 0)
              {
                olist->vma = alist->vma;
                done = 1;
              }
           }

         if (!done)
           {
             /* Add this onto end of order list.  */
             mri_add_to_list (&order, alist->name, alist->vma, 0, 0, 0);
           }
       }
    }

  /* If we're only supposed to load a subset of them in, then prune
     the list.  */
  if (only_load != NULL)
    {
      struct section_name_struct *ptr1;
      struct section_name_struct *ptr2;

      if (order == NULL)
       order = only_load;

      /* See if this name is in the list, if it is then we can load it.  */
      for (ptr1 = only_load; ptr1; ptr1 = ptr1->next)
       for (ptr2 = order; ptr2; ptr2 = ptr2->next)
         if (strcmp (ptr2->name, ptr1->name) == 0)
           ptr2->ok_to_load = 1;
    }
  else
    {
      /* No only load list, so everything is ok to load.  */
      struct section_name_struct *ptr;

      for (ptr = order; ptr; ptr = ptr->next)
       ptr->ok_to_load = 1;
    }

  /* Create the order of sections to load.  */
  if (order != NULL)
    {
      /* Been told to output the sections in a certain order.  */
      struct section_name_struct *p = order;

      while (p)
       {
         struct section_name_struct *aptr;
         etree_type *align = 0;
         etree_type *subalign = 0;
         struct wildcard_list *tmp;

         /* See if an alignment has been specified.  */
         for (aptr = alignment; aptr; aptr = aptr->next)
           if (strcmp (aptr->name, p->name) == 0)
             align = aptr->align;

         for (aptr = subalignment; aptr; aptr = aptr->next)
           if (strcmp (aptr->name, p->name) == 0)
             subalign = aptr->subalign;

         if (base == 0)
           base = p->vma ? p->vma : exp_nameop (NAME, ".");

         lang_enter_output_section_statement (p->name, base,
                                          p->ok_to_load ? 0 : noload_section,
                                          align, subalign, NULL, 0);
         base = 0;
         tmp = xmalloc (sizeof *tmp);
         tmp->next = NULL;
         tmp->spec.name = p->name;
         tmp->spec.exclude_name_list = NULL;
         tmp->spec.sorted = none;
         lang_add_wild (NULL, tmp, FALSE);

         /* If there is an alias for this section, add it too.  */
         for (aptr = alias; aptr; aptr = aptr->next)
           if (strcmp (aptr->alias, p->name) == 0)
             {
              tmp = xmalloc (sizeof *tmp);
              tmp->next = NULL;
              tmp->spec.name = aptr->name;
              tmp->spec.exclude_name_list = NULL;
              tmp->spec.sorted = none;
              lang_add_wild (NULL, tmp, FALSE);
             }

         lang_leave_output_section_statement (0, "*default*", NULL, NULL);

         p = p->next;
       }
    }

  done_tree = 1;
}

Here is the call graph for this function:

void mri_format ( const char *  name)

Definition at line 279 of file mri.c.

{
  if (strcmp (name, "S") == 0)
    lang_add_output_format ("srec", NULL, NULL, 1);

  else if (strcmp (name, "IEEE") == 0)
    lang_add_output_format ("ieee", NULL, NULL, 1);

  else if (strcmp (name, "COFF") == 0)
    lang_add_output_format ("coff-m68k", NULL, NULL, 1);

  else
    einfo (_("%P%F: unknown format type %s\n"), name);
}

Here is the call graph for this function:

void mri_load ( const char *  name)

Definition at line 241 of file mri.c.

Here is the call graph for this function:

void mri_name ( const char *  name)

Definition at line 273 of file mri.c.

Here is the call graph for this function:

void mri_only_load ( const char *  name)

Definition at line 104 of file mri.c.

{
  mri_add_to_list (&only_load, name, 0, 0, 0, 0);
}

Here is the call graph for this function:

void mri_order ( const char *  name)

Definition at line 248 of file mri.c.

{
  mri_add_to_list (&order, name, 0, 0, 0, 0);
}

Here is the call graph for this function:

void mri_output_section ( const char *  name,
etree_type vma 
)

Definition at line 95 of file mri.c.

{
  mri_add_to_list (&address, name, vma, 0, 0, 0);
}

Here is the call graph for this function:

void mri_public ( const char *  name,
etree_type exp 
)

Definition at line 295 of file mri.c.

{
  lang_add_assignment (exp_assop ('=', name, exp));
}

Here is the call graph for this function:

void mri_truncate ( unsigned int  exp)

Definition at line 313 of file mri.c.


Variable Documentation

Definition at line 50 of file mri.c.

Definition at line 51 of file mri.c.

Definition at line 53 of file mri.c.

int done_tree = 0 [static]

Definition at line 115 of file mri.c.

Definition at line 49 of file mri.c.

Definition at line 48 of file mri.c.

Definition at line 54 of file mri.c.

unsigned int symbol_truncate = 10000 [static]

Definition at line 47 of file mri.c.