#include <system.h>
#include <out.h>
#include "back.h"

/* Written to run on VAX, and generate code for VAX */

extern long 	B_base_address[];

do_local_relocation()
{
	register struct outrelo *rp;
	
	/* print( "n relocation records %d\n", relo - reloc_info);  */

	B_base_address[SEGTXT] = 0;
	B_base_address[SEGCON] = text - text_area;
	B_base_address[SEGBSS] = B_base_address[SEGCON] + data - data_area;
	for ( rp = reloc_info; rp < relo; rp++) {
		register struct outname *np = &symbol_table[rp->or_nami];

		if ( np->on_valu  != -1 && ! (np->on_type & S_COM)) {
			register char *sect;

			switch( rp->or_sect - S_MIN) {
				case SEGTXT:
					sect = text_area;
					break;
				case SEGCON:
					sect = data_area;
					break;
				default:
					fprint( STDERR, 
					  "do_local_relo(): bad section %d\n",
				 		rp->or_sect - S_MIN);
					break;
			}
			if  ( rp->or_type & RELO4) 
				*((long *)(sect+rp->or_addr)) +=
					np->on_valu +
					B_base_address[(np->on_type&S_TYP)-S_MIN];
			else
				fprint( STDERR,
				  "do_relo() : bad relocation size\n");
		}
	}
}