ftp.nice.ch/pub/next/developer/languages/lisp/AKCL.1.599.s.tar.gz#/akcl-1-599/c/fasl_pass1.c

This is fasl_pass1.c in view mode; [Download] [Up]

/*
(C) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
*/

/*
	fasl_pass1.c
	DG-SPECIFIC

	fasl loader pass1 routines
*/

#include "include.h"
#include "../h/fasl.h"
#include "../h/fasl_global.h"

#ifdef AOSVS
#define ERSNF		077014	/* symbol not found error */
#endif
int	debug;

init_pass1()
{
	short	i = 0;

	fas_buffp = fas_io_buff;
	fas_temp_buff = fas_table_buff;
	fas_routine_addr = 0;	/* initialize routine addr */

	zero(fas_temp_buff, FAS_BUFF_LEN);
/*	zero((char *)fas_map, FAS_MAP_SIZE * 4);	*/
	fas_temp_curr = fas_temp_last = 0;
#ifdef AOSVS
	if (fas_stchan == -1) fasl_openst();
#endif
	fasl_open_temp();

	max_part_no = 0;
	for (i = 1; i <= MAX_SYS_PART; i++)
		fasl_new_table();

	fas_relocation_by_table = TRUE;
	vs_base_no = vs_top_no = fas_short_no = -1;
}

data_pass1()
{
	FAS_HDR_P	hdr_p;
	FAS_DATA_P	data_p;
	short	base, reloc, reloc_ex;
	short	*base_p, *dword_p;
	int	obnum, repeat_count, displacement;
	int	words, total_len, over_write;

	/* set up pointers */
	hdr_p = (FAS_HDR_P)fas_buffp;
	data_p = (FAS_DATA_P)(fas_buffp + FAS_HEADER_BLEN);

	obnum = hdr_p->hdr_num;	/* block number */
	base = data_p->data_base;
	if (datab_rev < 2)
		repeat_count = 1;
		else
		repeat_count = data_p->data_repeat;
	words = (int)(data_p->data_words) * repeat_count;

	if (base > max_part_no) fasl_invalid();

	/* relocation */
	base_p = &base;
	dword_p = &(data_p->data_disp);
	reloc = (data_p->data_reloc) & RELOC_OP;
	reloc_ex = ((data_p->data_reloc) & RELOC_OP_EX) >> RELOC_OP_S;
	if (reloc != EX_RELOC) unexpect_reloc(reloc);

	relocation(reloc_ex, base_p, dword_p);

	displacement = data_p->data_disp;
	part_table_p = fasl_get_table(base);
	total_len = part_table_p->part_len;
	if ((displacement + words) > total_len)
		total_len = displacement + words;
	part_table_p->part_len = total_len;
}

titl_pass1()
{
	FAS_HDR_P	hdr_p;
	FAS_TITL_P	titl_p;

	short		bnum;
	char		title_buff[MAX_TITLE+1];
	char		*work_ptr, *work_ptr1;
        short		title_len;
	
	bnum = ((FAS_HDR_P)fas_buffp)->hdr_num;
	if (bnum != 1) fasl_invalid();

/*
	titl_p = (FAS_HDR_P)(fas_buffp + FAS_HEADER_BLEN);

	title_len = titl_p->titl_len;
	work_ptr = fas_buffp + (titl_p->titl_ptr);
	work_ptr1 = title_buff;

	while ( title_len-- > 0)
		*(work_ptr1++) = *(work_ptr++);
	*work_ptr1 = '\0';

	if (debug) printf(";   Loading %s\n",title_buff);
*/
}

ext_pass1()
{
	FAS_HDR_P	hdr_p;
	FAS_ENT_P	ent_p;
	FAS_NAME_P	name_p;

	short	base, sym_count, symbol_len;
	char	*work_ptr, *work_ptr1;
	int	symval;
	int	ier;

	/* set up pointers */
	hdr_p = (FAS_HDR_P)fas_buffp;
	ent_p = (FAS_ENT_P)(fas_buffp + FAS_HEADER_BLEN);
	name_p = (FAS_NAME_P)(ent_p + 1);

	sym_count = ent_p->ent_count;

	while (sym_count-- > 0) {
	   part_table_p = fasl_new_table();
	   part_table_p->part_symbol = TRUE;
					/* set symbol flag */
	   symbol_len = (name_p->name_len) & L_MASK;

	   work_ptr = fas_buffp + (name_p->name_ptr);
	   work_ptr1 = part_table_p->part_name;
	   while(symbol_len-- > 0)		/* copy symbol */
		*work_ptr1++ = *work_ptr++;
	   ier = fasl_st(part_table_p->part_name, &symval);
#ifdef AOSVS
	   if (ier != 0)
		if (ier == ERSNF)
			/* ignore .REQUIRE_LANG_RT_REV_??.?? */
			if ((name_p->name_len) & L_MASK < 16 ||
			    strncmp(part_table_p->part_name,
				    ".REQUIRE_LANG_RT", 16) != 0) {
				fasl_undefined(part_table_p->part_name);
				} else {
				part_table_p->part_addr = -1;
				}
			else
			sys_emes(ier);
		else
		part_table_p->part_addr = symval;
#endif
#ifdef DGUX
	   if (ier != 0)
		/* ignore .REQUIRE_LANG_RT_REV_??.?? */
		if ((name_p->name_len) & L_MASK < 16 ||
		    strncmp(part_table_p->part_name,
			    ".REQUIRE_LANG_RT", 16) != 0) {
			fasl_undefined(part_table_p->part_name);
		} else 
			part_table_p->part_addr = -1;
	   else
		part_table_p->part_addr = symval;
#endif

	   name_p += 1;			/* advance for next symbol */
	}
}

pat_pass1()
{
	FAS_HDR_P	hdr_p;
	FAS_PAT_P	pat_p;
	FAS_PATD_P	patd_p;

	short	base, pat_count, flags;
	long	p_len;			/* partition length */
	short	p_name_len;		/* partion name length */
	char	*work_ptr, *work_ptr1;
	int	symval;
	int	ier;

	/* set up pointers */
	hdr_p = (FAS_HDR_P)fas_buffp;
	pat_p = (FAS_PAT_P)(fas_buffp + FAS_HEADER_BLEN);
	patd_p = (FAS_PATD_P)(pat_p + 1);

	pat_count = pat_p->pat_count;

	while (pat_count-- > 0) {	/* for each descripter */
	   part_table_p = fasl_new_table();

	   flags = patd_p->patd_flag;	/* various flags */
	   part_table_p->part_align = (flags & PAT_ALN) >> PAT_ALN_S;
	   if (part_table_p->part_align > 1) fasl_align_error();

	   part_table_p->part_global = (flags & PAT_BASE) >> PAT_BASE_S;
	   part_table_p->part_len = patd_p->patd_len;
	   p_name_len = (patd_p->patd_nlen) & L_MASK;

	   /* check short NREL */
	   if (((flags & PAT_NREL) != 0) &&
	       (part_table_p->part_global == FALSE)) {
/*		part_table_p->part_addr = fas_short_nrel;	*/
		fas_short_no = part_table_p->part_no;
		goto NEXT;
	   }
	   work_ptr = fas_buffp + (patd_p->patd_nptr);
	   work_ptr1 = part_table_p->part_name;
	   while (p_name_len-- > 0)		/* copy name */
		*work_ptr1++ = *work_ptr++;

	   if (vs_base_no < 0 &&
	       strcmp(part_table_p->part_name, "vs_base") == 0)
		vs_base_no = part_table_p->part_no;
	   else if (vs_top_no < 0 &&
		    strcmp(part_table_p->part_name, "vs_top") == 0)
		vs_top_no = part_table_p->part_no;

	   if (part_table_p->part_global == FALSE) goto NEXT;
	   ier = fasl_st(part_table_p->part_name, &symval);
#ifdef AOSVS
	   if (ier == ERSNF) {
		FEerror("Internal entry ~S not found.", 1,
		       make_simple_string(part_table_p->part_name));
	   } else
		if (ier != 0)
 			sys_emes(ier);
			else
			part_table_p->part_addr = symval;
#endif
#ifdef DGUX
	   if (ier != 0) {
		FEerror("Internal entry ~S not found.", 1,
		       make_simple_string(part_table_p->part_name));
	   } else
		part_table_p->part_addr = symval;

#endif
NEXT:
	   patd_p += 1;			/* advance for next */
	}
}

rev_pass1()
{
	FAS_HDR_P	hdr_p;
	FAS_REV_P	rev_p;
	FAS_REVD_P	revd_p;

	short	bnum, rev_count, block_type;

	bnum = ((FAS_HDR_P)fas_buffp)->hdr_num;
	if (bnum != 2) fasl_invalid();

	rev_p = (FAS_REV_P)(fas_buffp + FAS_HEADER_BLEN);
	revd_p = (FAS_REVD_P)(rev_p + 1);

	rev_count = rev_p->rev_count;

	while ( rev_count-- > 0) {
	   block_type = (revd_p->revd_btyp) & BLOCK_TYPE;
	   if (block_type != DATA_BLOCK) continue;
	   datab_rev = (revd_p->revd_brev);	/* data block rev */

	   if (datab_rev > 2) fasl_rev_error();

	   revd_p += 1;		/* advance for next */
	}
}

aln_pass1()
{
	FAS_HDR_P	hdr_p;
	FAS_ALN_P	aln_p;

	short	base, power;

	aln_p = (FAS_ALN_P)(fas_buffp + FAS_HEADER_BLEN);

	base = aln_p->aln_base;
	part_table_p = fasl_get_table(base);
	part_table_p->part_align = aln_p->aln_power;
}

unexpected()
{

	short	block_type, block_num;

	block_type = (((FAS_HDR_P)fas_buffp)->hdr_typ) & BLOCK_TYPE;
	block_num = ((FAS_HDR_P)fas_buffp)->hdr_num;

	if (debug) {
		printf("unexpected FASL block\n");
		printf("  block type   : %d\n", block_type);
		printf("  block number : %d\n", block_num);
	}
	fasl_invalid();
}

/* set symbol value in partition table */
/*
fasl_ssym()
{
	int		symval, i, ier;
	char		*symp;

	for (i = MAX_SYS_PART + 1; i <= max_part_no; i++) {
	   part_table_p = fasl_get_table(i);
	   if ((part_table_p->part_symbol == FALSE) &&
	       (part_table_p->part_global == FALSE)) continue;
	   symp = part_table_p->part_name;
	   ier = fasl_st(symp, &symval);
#ifdef AOSVS
	   if (ier == ERSNF)
		if (part_table_p->part_symbol == TRUE)
			fasl_undefined(symp);
			else
			continue;
		else
		if (ier != 0) sys_emes(ier);
#endif
#ifdef DGUX
	   if (ier != 0)
		if (part_table_p->part_symbol == TRUE) fasl_undefined(symp);
#endif
	   part_table_p->part_addr = symval;
	}
}
*/

fasl_len()
{

	int		caddr, p_len;
	short		p_align, i;

	caddr = 0;
	for (i = 0; i < max_part_no; i++) {
	   if (i == fas_short_no) continue;
	   part_table_p = fasl_get_table(i);
	   if ((part_table_p->part_global == TRUE) &&
	       (part_table_p->part_addr != 0)) continue;
	   p_len = part_table_p->part_len;
	   p_align = part_table_p->part_align;
	   caddr = fasl_align(caddr, p_align) + p_len;
	   }
	caddr += 2;
		/* 1 word for actual length
		   1 word for alignment gap */
		/* warning : for above alignment gap to be  proper
		   all alignment power must be less or equal to 1 */

	return(caddr);
}

fasl_align(caddr, power)
int	caddr;
short	power;
{
	int	mask;

	mask = (1 << power) - 1;
	if ((caddr & mask) == 0) return(caddr);
	return((caddr | mask) + 1);
}

fasl_saddr()
{
	short	*caddr;
	int	i, part_len;
	int	recno, ind;
	short	part_align;

	caddr = fas_rstart;	/* set current to starting addr */
	fas_addr_rec_first = fas_temp_last + 1;
	fas_addr_rec_curr = 0;

	zero(fas_addr_buff, FAS_BUFF_LEN);

	for (i = 0; i <= max_part_no; i++) {
	   part_table_p = fasl_get_table(i);
	   if ((part_len = part_table_p->part_len) == 0 ||
	       part_table_p->part_addr != 0) {
	   	recno = i / FAS_ADDRS_IN_REC;
	   	ind = i % FAS_ADDRS_IN_REC;
	   	if (recno > fas_addr_rec_curr) {
			fasl_write_addr_rec(fas_addr_rec_curr);
			fas_addr_rec_curr++;
			zero(fas_addr_buff, FAS_BUFF_LEN);
	   	}
	   	((int *)fas_addr_buff)[ind] = part_table_p->part_addr;
		continue;
	   }
	   part_align = part_table_p->part_align;
	   caddr = fasl_align((int)caddr, part_align);
	   part_table_p->part_addr = caddr;
	   recno = i / FAS_ADDRS_IN_REC;
	   ind = i % FAS_ADDRS_IN_REC;
	   if (recno > fas_addr_rec_curr) {
		fasl_write_addr_rec(fas_addr_rec_curr);
		fas_addr_rec_curr++;
		zero(fas_addr_buff, FAS_BUFF_LEN);
	   }
	   ((int *)fas_addr_buff)[ind] = caddr;
	   caddr = caddr + part_len;
	}
	fasl_write_addr_rec(fas_addr_rec_curr);
}

check_short_area()
{
	if (fas_short_no < 0) return;
	part_table_p = fasl_get_table(fas_short_no);
	if (part_table_p->part_len == 0) return;
	if (fas_short_nrel + part_table_p->part_len > fas_short_end)
		FEerror("Not enough FASL short nrel area.", 0);

	part_table_p->part_addr = fas_short_nrel;

	/* for next */
	fas_short_nrel += part_table_p->part_len;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.