*** empty log message ***

This commit is contained in:
kaashoek 1987-11-25 13:54:01 +00:00
parent 7af2561a91
commit 152faf2b36
14 changed files with 84 additions and 33 deletions

View file

@ -7,11 +7,7 @@ IDIRS=-I.\
-I$(EM)/h\ -I$(EM)/h\
-I$(EM)/modules/h -I$(EM)/modules/h
LIBS=$(EM)/modules/lib/object.a\ LIBS=$(EM)/modules/lib/*.a
$(EM)/modules/lib/libstring.a\
$(EM)/modules/lib/libprint.a\
$(EM)/modules/lib/liballoc.a\
$(EM)/modules/lib/libsystem.a
all : data.o con2.o con4.o relocation.o end_back.o gen1.o gen2.o\ all : data.o con2.o con4.o relocation.o end_back.o gen1.o gen2.o\
gen4.o init_back.o mysprint.o output.o reloc1.o reloc2.o reloc4.o\ gen4.o init_back.o mysprint.o output.o reloc1.o reloc2.o reloc4.o\

View file

@ -2,6 +2,26 @@
#include <out.h> #include <out.h>
#include "mach.h" #include "mach.h"
/* Global datastructures :
* - 'text_area' points to the text segment, 'text' points to first free
* entry in the text segment.
* - 'data_area' points to the data segment, 'data' points to the first free
* entry in the data segmnet.
* - 'string_area' points to the string area, 'string' points to the first free
* entry in the string area.
* - 'reloc_info' points to the relocation table, 'relo' points to the first
* free entry in the relocation table.
* - 'symbol_table' points to the symbol table, 'nname' is the index of the
* first free entry in the symbol_table. If pointers were used it is a pain
* to do a realloc on the symbol table, because all pointers in the
* relocation table to the symbol table have to be updated.
* - The bss segment contains only one vaue, so its enough to count the
* the bytes wanted.
* - The 'size_*' variables count the number of entries in each segment.
* - 'cur_seg' contains the number of the segment to be filled.
* (see "back.h")
*/
char *text_area, char *text_area,
*data_area, *data_area,

View file

@ -6,18 +6,21 @@
end_back() end_back()
{ {
sync(); finish_tables();
define_segments();
do_local_relocation(); do_local_relocation();
} }
sync() finish_tables()
/* Prepare tables for do_local_relocation() and output().
*/
{ {
while ( ( text - text_area) % EM_WSIZE != 0 ) while ( ( text - text_area) % EM_WSIZE != 0 )
text1( '\0'); text1( '\0');
while ( ( data - data_area) % EM_WSIZE != 0 ) while ( ( data - data_area) % EM_WSIZE != 0 )
con1( '\0'); con1( '\0');
define_segments();
} }

View file

@ -4,10 +4,10 @@
#include "header.h" #include "header.h"
#include "mach.h" #include "mach.h"
/* The extnd_*() make a name unique. The resulting string is directly stored /* The extnd_*()s make a name unique. The resulting string is directly stored
in the symbol_table (by mysprint()). Later additional fields in the * in the symbol_table (by mysprint()). Later additional fields in the
symbol_table are filled. For these actions the values of the index in * symbol_table are filled. For these actions the values of the index in
the symbol_table and the length of the string are stored. * the symbol_table and the length of the string are stored.
*/ */
extern int string_lengte, index_symbol_table; extern int string_lengte, index_symbol_table;

View file

@ -5,6 +5,9 @@
char *calloc(); char *calloc();
init_back() init_back()
/* Allocate space for the tables and set the default values.
*/
{ {
text_area = calloc( MAXTEXT, sizeof( char)); text_area = calloc( MAXTEXT, sizeof( char));
data_area = calloc( MAXDATA, sizeof( char)); data_area = calloc( MAXDATA, sizeof( char));

View file

@ -6,6 +6,12 @@ int Label, label_waiting;
save_label( lab) save_label( lab)
char *lab; char *lab;
/* It is now not possible to tell where the label belongs to, so store
* the string and remember the returned index to store the missing
* information later on (see dump_label()). Two labels at one address
* is not allowed.
*/
{ {
Label = find_sym( lab, SYMBOL_DEFINITION); Label = find_sym( lab, SYMBOL_DEFINITION);
label_waiting = 1; label_waiting = 1;

View file

@ -5,6 +5,10 @@
char *realloc(); char *realloc();
/* The routines allocate more space for the segments and update the
* global variables. Each time the space asked for is multiplied with 2.
*/
mem_text() mem_text()
{ {
/* print( "text_area too small %d %d \n", text_area, text); */ /* print( "text_area too small %d %d \n", text_area, text); */
@ -53,11 +57,10 @@ mem_relo()
mem_string() mem_string()
{ {
int i; int i = string - string_area;
/* print( "string_area out of memory %d %d \n", string_area, string);*/ /* print( "string_area out of memory %d %d \n", string_area, string);*/
i = string - string_area;
size_string = 2 * size_string; size_string = 2 * size_string;
string_area = realloc( string_area, sizeof( char) * size_string); string_area = realloc( string_area, sizeof( char) * size_string);
string = string_area + i; string = string_area + i;

View file

@ -3,10 +3,13 @@
#include "back.h" #include "back.h"
/* The following functions are called from reloc1(), reloc2(), reloc4(), /* The following functions are called from reloc1(), reloc2(), reloc4(),
dump_label(). * dump_label().
*/ */
align_word() align_word()
/* Do word allignment.
*/
{ {
switch ( cur_seg) { switch ( cur_seg) {
case SEGTXT : return; case SEGTXT : return;
@ -26,6 +29,9 @@ align_word()
long cur_value() long cur_value()
/* Return the index of the first free entry.
*/
{ {
switch( cur_seg) { switch( cur_seg) {
case SEGTXT: return text - text_area; case SEGTXT: return text - text_area;

View file

@ -1,6 +1,10 @@
#include <system.h> #include <system.h>
#include "data.h" #include "data.h"
/* Mysprint() stores the string directly in the string_arae. This saves
* a copy action.
*/
int mysprint( fmt, args) int mysprint( fmt, args)
char *fmt; char *fmt;
int args; int args;

View file

@ -3,7 +3,8 @@
#include "data.h" #include "data.h"
output() output()
/* Notice : entries in the symbol_table are converted. /* Dump the tables.
* Notice : entries in the symbol_table are converted.
*/ */
{ {

View file

@ -4,6 +4,10 @@
#include "back.h" #include "back.h"
#include "header.h" #include "header.h"
/* There are two forms of relocation program counter relative or
* absolute.
*/
reloc1( sym, off, pcrel) reloc1( sym, off, pcrel)
char *sym; char *sym;
arith off; arith off;
@ -13,7 +17,7 @@ int pcrel;
mem_relo(); mem_relo();
relo->or_type = RELO1; relo->or_type = RELO1;
#ifdef BYTES_REVERSED /* Nog optimaliseren?? */ #ifdef BYTES_REVERSED
relo->or_type |= RELBR; relo->or_type |= RELBR;
#endif #endif
#ifdef WORDS_REVERSED #ifdef WORDS_REVERSED

View file

@ -4,6 +4,10 @@
#include "back.h" #include "back.h"
#include "header.h" #include "header.h"
/* There are two forms of relocation program counter relative or
* absolute.
*/
reloc2( sym, off, pcrel) reloc2( sym, off, pcrel)
char *sym; char *sym;
arith off; arith off;
@ -13,7 +17,7 @@ int pcrel;
mem_relo(); mem_relo();
relo->or_type = RELO2; relo->or_type = RELO2;
#ifdef BYTES_REVERSED /* Nog optimaliseren?? */ #ifdef BYTES_REVERSED
relo->or_type |= RELBR; relo->or_type |= RELBR;
#endif #endif
#ifdef WORDS_REVERSED #ifdef WORDS_REVERSED

View file

@ -5,6 +5,10 @@
#include "back.h" #include "back.h"
#include "header.h" #include "header.h"
/* There are two forms of relocation program counter relative or
* absolute.
*/
reloc4( sym, off, pcrel) reloc4( sym, off, pcrel)
char *sym; char *sym;
arith off; arith off;
@ -14,7 +18,7 @@ int pcrel;
mem_relo(); mem_relo();
relo->or_type = RELO4; relo->or_type = RELO4;
#ifdef BYTES_REVERSED /* Nog optimaliseren?? */ #ifdef BYTES_REVERSED
relo->or_type |= RELBR; relo->or_type |= RELBR;
#endif #endif
#ifdef WORDS_REVERSED #ifdef WORDS_REVERSED

View file

@ -2,15 +2,21 @@
#include <out.h> #include <out.h>
#include "back.h" #include "back.h"
/* Solve the local references.
*/
#define seg_index( s) ( nname - SEGBSS - 1 + s) #define seg_index( s) ( nname - SEGBSS - 1 + s)
long get4(); long get4();
long base_adres();
extern short get2(); extern short get2();
extern char get1(); extern char get1();
do_local_relocation() do_local_relocation()
/* Check if this reference is solvable. External references contain
* -1 in 'on_valu'.
*/
{ {
register struct outrelo *ptr; register struct outrelo *ptr;
register int s; register int s;
@ -26,6 +32,10 @@ do_local_relocation()
do_relo(np,rp) do_relo(np,rp)
struct outname *np; struct outname *np;
struct outrelo *rp; struct outrelo *rp;
/* Solve the reference relative to the start of the segment where the symbol
* is defined.
*/
{ {
long oldval,newval; long oldval,newval;
char *sect; char *sect;
@ -44,7 +54,6 @@ struct outrelo *rp;
break; break;
} }
/* nu reloceren tov het segment waar het symbool in voorkomt! */
if ( rp->or_type & RELO4) { if ( rp->or_type & RELO4) {
oldval = get4( sect, rp->or_addr); oldval = get4( sect, rp->or_addr);
newval = oldval + np->on_valu; newval = oldval + np->on_valu;
@ -77,15 +86,3 @@ struct outrelo *rp;
*/ */
} }
long base_adres( seg)
int seg;
{
switch ( seg) {
case SEGTXT : return( 0);
case SEGCON : return( text-text_area);
case SEGBSS : return( text-text_area + data-data_area);
default : fprint( STDERR, "base_adres() wrong seg %d\n", seg);
}
}