summaryrefslogtreecommitdiffstats
path: root/libasm/asm_newsubscn.c
blob: e767720e58611dde82d523050d9034630fe940b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/* Create new subsection section in given section.
   Copyright (C) 2002 Red Hat, Inc.
   Written by Ulrich Drepper <drepper@redhat.com>, 2002.

   This program is Open Source software; you can redistribute it and/or
   modify it under the terms of the Open Software License version 1.0 as
   published by the Open Source Initiative.

   You should have received a copy of the Open Software License along
   with this program; if not, you may obtain a copy of the Open Software
   License version 1.0 from http://www.opensource.org/licenses/osl.php or
   by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
   3001 King Ranch Road, Ukiah, CA 95482.   */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <stdlib.h>

#include <libasmP.h>
#include <system.h>


AsmScn_t *
asm_newsubscn (asmscn, nr)
     AsmScn_t *asmscn;
     unsigned int nr;
{
  AsmScn_t *runp;
  AsmScn_t *newp;

  /* Just return if no section is given.  The error must have been
     somewhere else.  */
  if (asmscn == NULL)
    return NULL;

  /* Determine whether there is already a subsection with this number.  */
  runp = asmscn->subsection_id == 0 ? asmscn : asmscn->data.up;
  while (1)
    {
      if (runp->subsection_id == nr)
	/* Found it.  */
	return runp;

      if (runp->subnext == NULL || runp->subnext->subsection_id > nr)
	break;

      runp = runp->subnext;
    }

  newp = (AsmScn_t *) malloc (sizeof (AsmScn_t));
  if (newp == NULL)
    return NULL;

  /* Same assembler context than the original section.  */
  newp->ctx = runp->ctx;

  /* User provided the subsectio nID.  */
  newp->subsection_id = nr;

  /* Inherit the parent's type.  */
  newp->type = runp->type;

  /* Pointer to the zeroth subsection.  */
  newp->data.up = runp->subsection_id == 0 ? runp : runp->data.up;

  /* We start at offset zero.  */
  newp->offset = 0;
  /* And generic alignment.  */
  newp->max_align = 1;

  /* No output yet.  */
  newp->content = NULL;

  /* Inherit the fill pattern from the section this one is derived from.  */
  newp->pattern = asmscn->pattern;

  /* Enqueue at the right position in the list.  */
  newp->subnext = runp->subnext;
  runp->subnext = newp;

  return newp;
}