mapsec.c - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
mapsec.c (1206B)
---
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include <scc/mach.h>
6
7 #include "libmach.h"
8
9 static int
10 matchseg(Map *map, Mapsec *msec, FILE *fp)
11 {
12 unsigned long long o, e, mo, me;
13 Section *seg;
14 Mapsec *mseg, **v;
15
16 mo = msec->sec.load;
17 me = mo + msec->sec.size;
18
19 if ((msec->sec.flags & SLOAD) == 0)
20 return 0;
21
22 for (mseg = map->seg; mseg < &map->seg[map->nseg]; ++mseg) {
23 if (mseg->fp != fp)
24 continue;
25 o = mseg->sec.load;
26 e = o + mseg->sec.size;
27 if (mo >= o && me <= e) {
28 v = realloc(mseg->child, sizeof(Mapsec *) * (mseg->nchild+1));
29 if (!v)
30 return -1;
31 mseg->child = v;
32 v[mseg->nchild++] = msec;
33 }
34 }
35
36 return 0;
37 }
38
39 int
40 mapsec(Map *map, Section *sec, FILE *fp, long fsiz)
41 {
42 int n;
43 char *s;
44 Mapsec *msec, *mp;
45
46 mp = NULL;
47 n = map->nsec;
48 for (msec = map->sec; n--; msec++) {
49 s = msec->sec.name;
50 if (s && !strcmp(s, sec->name))
51 goto found;
52 if (!mp && !msec->used)
53 mp = msec;
54 }
55
56 if (mp) {
57 msec = mp;
58 goto found;
59 }
60
61 if ((map = remap(map, map->nsec+1, map->nseg)) == NULL)
62 return -1;
63 msec = &map->sec[map->nsec-1];
64
65 found:
66 msec->used = 1;
67 msec->sec = *sec;
68 msec->fp = fp,
69 msec->fsiz = fsiz;
70
71 return matchseg(map, msec, fp);
72 }