*** empty log message ***
This commit is contained in:
parent
7af2561a91
commit
152faf2b36
|
@ -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\
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue