Pristine Ack-5.5
[Ack-5.5.git] / mach / vax4 / ce / relocation.c
1 #include <system.h>
2 #include <out.h>
3 #include "back.h"
4
5 /* Written to run on VAX, and generate code for VAX */
6
7 extern long     B_base_address[];
8
9 do_local_relocation()
10 {
11         register struct outrelo *rp;
12         
13         /* print( "n relocation records %d\n", relo - reloc_info);  */
14
15         B_base_address[SEGTXT] = 0;
16         B_base_address[SEGCON] = text - text_area;
17         B_base_address[SEGBSS] = B_base_address[SEGCON] + data - data_area;
18         for ( rp = reloc_info; rp < relo; rp++) {
19                 register struct outname *np = &symbol_table[rp->or_nami];
20
21                 if ( np->on_valu  != -1 && ! (np->on_type & S_COM)) {
22                         register char *sect;
23
24                         switch( rp->or_sect - S_MIN) {
25                                 case SEGTXT:
26                                         sect = text_area;
27                                         break;
28                                 case SEGCON:
29                                         sect = data_area;
30                                         break;
31                                 default:
32                                         fprint( STDERR, 
33                                           "do_local_relo(): bad section %d\n",
34                                                 rp->or_sect - S_MIN);
35                                         break;
36                         }
37                         if  ( rp->or_type & RELO4) 
38                                 *((long *)(sect+rp->or_addr)) +=
39                                         np->on_valu +
40                                         B_base_address[(np->on_type&S_TYP)-S_MIN];
41                         else
42                                 fprint( STDERR,
43                                   "do_relo() : bad relocation size\n");
44                 }
45         }
46 }