many changes, in search for more speed

This commit is contained in:
ceriel 1988-10-31 15:02:39 +00:00
parent 3bb19b6e7d
commit 0011c49d1e
5 changed files with 73 additions and 90 deletions

View file

@ -1,7 +1,7 @@
EMHOME=../../../..
CEG=$(EMHOME)/lib/ceg
SOURCE=$(CEG)/ce_back/obj_back
CFLAGS=-O
CFLAGS=-O #-pg
CC=cc
IDIRS=-I.\

View file

@ -1,8 +1,11 @@
EMHOME=../../..
BACK=$(EMHOME)/lib/ceg/ce_back
install : back.a
install_ceg
all : back.a
make -f ce_makefile
install: all
make -f ce_makefile install
clean:
rm -rf back.a back

View file

@ -1,14 +1,14 @@
#include "mach.h"
#include <back.h>
#include <stdio.h>
#include <out.h>
#include <system.h>
arg_error( s, arg)
char *s;
int arg;
{
fprintf( stderr, "arg_error %s %d\n", s, arg);
fprint( STDERR, "arg_error %s %d\n", s, arg);
}

View file

@ -18,7 +18,10 @@ extern File *out_file;
struct exec u_header;
long ntext, ndata, nrelo, nchar, base_address();
long ntext, ndata, nrelo, nchar;
long base_address[SEGBSS+1];
int trsize=0, drsize=0;
struct relocation_info *u_reloc;
@ -29,6 +32,7 @@ output()
{
register int i;
register struct nlist *u_name;
register struct outrelo *rp;
/*
* Convert relocation data structures. This also requires
@ -41,16 +45,18 @@ output()
u_reloc = (struct relocation_info *)
Malloc((unsigned)nrelo*sizeof(struct relocation_info));
for (i = 0; i < nrelo; i++) {
if ( ( reloc_info[i].or_sect-S_MIN) == SEGTXT &&
convert_reloc( &reloc_info[i], u_reloc)) {
rp = reloc_info;
for (i = nrelo; i > 0; i--, rp++) {
if ( ( rp->or_sect-S_MIN) == SEGTXT &&
convert_reloc( rp, u_reloc)) {
trsize++;
u_reloc++;
}
}
for (i = 0; i < nrelo; i++) {
if ( ( reloc_info[i].or_sect-S_MIN) != SEGTXT &&
convert_reloc( &reloc_info[i], u_reloc)) {
rp = reloc_info;
for (i = nrelo; i > 0; i--, rp++) {
if ( ( rp->or_sect-S_MIN) != SEGTXT &&
convert_reloc( rp, u_reloc)) {
u_reloc++;
drsize++;
}
@ -98,39 +104,42 @@ reduce_name_table()
*/
#define S_NEEDED 0x8000
#define removable(nm) (!(nm.on_type & S_NEEDED) && *(nm.on_foff+string_area) == GENLAB)
#define removable(nm) (!(nm->on_type & S_NEEDED) && *(nm->on_foff+string_area) == GENLAB)
register int *diff_index =
(int *) Malloc((unsigned)(nname + 1) * sizeof(int));
register int i;
register struct outname *np;
char *new_str;
register char *p, *q;
register struct relocation_info *rp;
*diff_index++ = 0;
for (i = 0; i < nrelo; i++) {
if (u_reloc[i].r_extern) {
symbol_table[u_reloc[i].r_symbolnum].on_type |= S_NEEDED;
rp = u_reloc;
for (i = nrelo; i > 0; i--, rp++) {
if (rp->r_extern) {
symbol_table[rp->r_symbolnum].on_type |= S_NEEDED;
}
}
for (i = 0; i < nname; i++) {
np = symbol_table;
for (i = 0; i < nname; i++, np++) {
int old_diff_index = diff_index[i-1];
if (removable(symbol_table[i])) {
if (removable(np)) {
diff_index[i] = old_diff_index + 1;
}
else {
diff_index[i] = old_diff_index;
if (old_diff_index) {
symbol_table[i - old_diff_index] = symbol_table[i];
symbol_table[i - old_diff_index] = *np;
}
}
}
nname -= diff_index[nname - 1];
for (i = 0; i < nrelo; i++) {
register struct relocation_info *rp = &u_reloc[i];
rp = u_reloc;
for (i = nrelo; i > 0; i--, rp++) {
if (rp->r_extern) {
rp->r_symbolnum -= diff_index[rp->r_symbolnum];
}
@ -139,9 +148,10 @@ reduce_name_table()
free((char *)(diff_index-1));
new_str = q = Malloc((unsigned)(string - string_area));
for (i = 0; i < nname; i++) {
p = symbol_table[i].on_foff + string_area;
symbol_table[i].on_foff = q - new_str;
np = symbol_table;
for (i = nname; i > 0; i--, np++) {
p = np->on_foff + string_area;
np->on_foff = q - new_str;
while (*q++ = *p) p++;
}
free(string_area);
@ -172,8 +182,8 @@ init_unixheader()
}
convert_reloc( a_relo, u_relo)
struct outrelo *a_relo;
struct relocation_info *u_relo;
register struct outrelo *a_relo;
register struct relocation_info *u_relo;
{
int retval = 1;
@ -227,65 +237,43 @@ int length;
convert_name( a_name, u_name)
struct outname *a_name;
struct nlist *u_name;
register struct outname *a_name;
register struct nlist *u_name;
{
/* print( "naam is %s\n", a_name->on_foff + string_area); */
u_name->n_str = a_name->on_foff + 4;
fill_type( &(u_name->n_type), &(a_name->on_type), a_name->on_valu);
if ((a_name->on_type & S_TYP) == S_UND ||
(a_name->on_type & S_EXT)) u_name->n_type = N_EXT;
else u_name->n_type = 0;
if (a_name->on_valu != -1 && (! (a_name->on_type & S_COM))) {
switch((a_name->on_type & S_TYP) - S_MIN) {
case SEGTXT:
u_name->n_type |= N_TEXT;
break;
case SEGCON:
u_name->n_type |= N_DATA;
break;
case SEGBSS:
u_name->n_type |= N_BSS;
break;
default:
fprint(STDERR, "convert_name(): bad section %d\n",
(a_name->on_type & S_TYP) - S_MIN);
break;
}
}
u_name->n_other = '\0';
u_name->n_desc = 0;
if (a_name->on_type & S_COM)
u_name->n_value = a_name->on_valu;
else if ( a_name->on_valu != -1)
u_name->n_value = a_name->on_valu +
base_address( ( a_name->on_type & S_TYP) - S_MIN);
base_address[( a_name->on_type & S_TYP) - S_MIN];
else
u_name->n_value = 0;
}
fill_type( u_type, a_type, valu)
unsigned char *u_type;
ushort *a_type;
long valu;
{
int sect;
*u_type = ((*a_type&S_TYP) == S_UND || (*a_type & S_EXT)) ? N_EXT : 0;
if ( valu != -1 && (! (*a_type & S_COM))) {
sect = ( *a_type & S_TYP ) - S_MIN;
switch ( sect) {
case SEGTXT: *u_type |= N_TEXT;
break;
case SEGCON : *u_type |= N_DATA;
break;
case SEGBSS : *u_type |= N_BSS;
break;
default: fprint(STDERR,
"fill_type() : bad section %d\n", sect);
}
}
}
long base_address( seg)
int seg;
{
switch ( seg) {
case SEGTXT : return( 0);
break;
case SEGCON : return( text - text_area);
break;
case SEGBSS : return( text - text_area + data - data_area);
break;
default : fprint( STDERR,
"base_adres() : bad section %d\n", seg);
}
}
put_stringtablesize( n)
long n;
{

View file

@ -3,12 +3,9 @@
#include "data.h"
#include "back.h"
long get4();
extern long base_address();
/*
extern short get2();
extern char get1();
*/
/* Written to run on SUN, and generate code for SUN */
extern long base_address[];
do_local_relocation()
{
@ -16,11 +13,13 @@ do_local_relocation()
/* print( "n relocation records %d\n", relo - reloc_info); */
base_address[SEGTXT] = 0;
base_address[SEGCON] = text - text_area;
base_address[SEGBSS] = 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 long oldval,newval;
register char *sect;
switch( rp->or_sect - S_MIN) {
@ -36,19 +35,12 @@ do_local_relocation()
rp->or_sect - S_MIN);
break;
}
oldval = get4( sect, rp->or_addr);
newval = oldval + np->on_valu +
base_address( (np->on_type & S_TYP) -S_MIN);
if ( rp->or_type & RELO4)
put4( sect, rp->or_addr, newval);
/*
else if ( rp->or_type & RELO2)
put2( sect, rp->or_addr, (int) newval);
else if ( rp->or_type & RELO1)
put1( sect, rp->or_addr, (char) newval);
*/
*((long *)(sect+rp->or_addr)) +=
np->on_valu +
base_address[(np->on_type&S_TYP)-S_MIN];
else
print( STDERR,
fprint( STDERR,
"do_relo() : bad relocation size\n");
}
}