• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Create new subsection section in given section.
2    Copyright (C) 2002 Red Hat, Inc.
3    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4 
5    This program is Open Source software; you can redistribute it and/or
6    modify it under the terms of the Open Software License version 1.0 as
7    published by the Open Source Initiative.
8 
9    You should have received a copy of the Open Software License along
10    with this program; if not, you may obtain a copy of the Open Software
11    License version 1.0 from http://www.opensource.org/licenses/osl.php or
12    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13    3001 King Ranch Road, Ukiah, CA 95482.   */
14 
15 #ifdef HAVE_CONFIG_H
16 # include <config.h>
17 #endif
18 
19 #include <stdlib.h>
20 
21 #include <libasmP.h>
22 #include <system.h>
23 
24 
25 AsmScn_t *
asm_newsubscn(asmscn,nr)26 asm_newsubscn (asmscn, nr)
27      AsmScn_t *asmscn;
28      unsigned int nr;
29 {
30   AsmScn_t *runp;
31   AsmScn_t *newp;
32 
33   /* Just return if no section is given.  The error must have been
34      somewhere else.  */
35   if (asmscn == NULL)
36     return NULL;
37 
38   /* Determine whether there is already a subsection with this number.  */
39   runp = asmscn->subsection_id == 0 ? asmscn : asmscn->data.up;
40   while (1)
41     {
42       if (runp->subsection_id == nr)
43 	/* Found it.  */
44 	return runp;
45 
46       if (runp->subnext == NULL || runp->subnext->subsection_id > nr)
47 	break;
48 
49       runp = runp->subnext;
50     }
51 
52   newp = (AsmScn_t *) malloc (sizeof (AsmScn_t));
53   if (newp == NULL)
54     return NULL;
55 
56   /* Same assembler context than the original section.  */
57   newp->ctx = runp->ctx;
58 
59   /* User provided the subsectio nID.  */
60   newp->subsection_id = nr;
61 
62   /* Inherit the parent's type.  */
63   newp->type = runp->type;
64 
65   /* Pointer to the zeroth subsection.  */
66   newp->data.up = runp->subsection_id == 0 ? runp : runp->data.up;
67 
68   /* We start at offset zero.  */
69   newp->offset = 0;
70   /* And generic alignment.  */
71   newp->max_align = 1;
72 
73   /* No output yet.  */
74   newp->content = NULL;
75 
76   /* Inherit the fill pattern from the section this one is derived from.  */
77   newp->pattern = asmscn->pattern;
78 
79   /* Enqueue at the right position in the list.  */
80   newp->subnext = runp->subnext;
81   runp->subnext = newp;
82 
83   return newp;
84 }
85