93 lines
2.9 KiB
C
93 lines
2.9 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2011 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include "gtm_string.h"
|
|
|
|
#include "stp_parms.h"
|
|
#include "stringpool.h"
|
|
#include "cmd_qlf.h"
|
|
#include "cgp.h"
|
|
#include "compiler.h"
|
|
#include "mmemory.h"
|
|
|
|
GBLREF boolean_t run_time;
|
|
GBLREF spdesc stringpool, rts_stringpool, indr_stringpool;
|
|
GBLREF char source_file_name[];
|
|
GBLREF unsigned short source_name_len;
|
|
GBLREF command_qualifier cmd_qlf, glb_cmd_qlf;
|
|
GBLREF char cg_phase;
|
|
GBLREF mcalloc_hdr *mcavailptr, *mcavailbase;
|
|
|
|
error_def(ERR_ZLINKFILE);
|
|
error_def(ERR_ZLNOOBJECT);
|
|
|
|
int zlcompile (unsigned char len, unsigned char *addr)
|
|
{
|
|
boolean_t obj_exp, status;
|
|
size_t mcallocated, alloc;
|
|
mcalloc_hdr *lastmca, *nextmca;
|
|
DCL_THREADGBL_ACCESS;
|
|
|
|
SETUP_THREADGBL_ACCESS;
|
|
memcpy (source_file_name, addr, len);
|
|
source_file_name[len] = 0;
|
|
source_name_len = len;
|
|
assert(run_time);
|
|
obj_exp = (cmd_qlf.qlf & CQ_OBJECT) != 0;
|
|
assert(rts_stringpool.base == stringpool.base);
|
|
rts_stringpool = stringpool;
|
|
if (!indr_stringpool.base)
|
|
{
|
|
stp_init (STP_INITSIZE);
|
|
indr_stringpool = stringpool;
|
|
} else
|
|
stringpool = indr_stringpool;
|
|
run_time = FALSE;
|
|
mcfree(); /* If last compile errored out, may have left things uninitialized for us */
|
|
TREF(compile_time) = TRUE;
|
|
TREF(transform) = FALSE;
|
|
/* Find out how much space we have in mcalloc blocks */
|
|
for (mcallocated = 0, nextmca = mcavailptr; nextmca; nextmca = nextmca->link)
|
|
mcallocated += nextmca->size;
|
|
if (0 == mcallocated)
|
|
mcallocated = MC_DSBLKSIZE - MCALLOC_HDR_SZ; /* Min size is one default block size */
|
|
status = compiler_startup();
|
|
/* Determine if need to remove any added added mc blocks. Min value of mcallocated will ensure
|
|
we leave at least one block alone.
|
|
*/
|
|
for (alloc = 0, nextmca = mcavailptr;
|
|
nextmca && (alloc < mcallocated);
|
|
alloc += nextmca->size, lastmca = nextmca, nextmca = nextmca->link);
|
|
if (nextmca)
|
|
{ /* Start freeing at the nextmca node since these are added blocks */
|
|
lastmca->link = NULL; /* Sever link to further blocks here */
|
|
/* Release any remaining blocks if any */
|
|
for (lastmca = nextmca; lastmca; lastmca = nextmca)
|
|
{
|
|
nextmca = lastmca->link;
|
|
free(lastmca);
|
|
}
|
|
}
|
|
assert ((FALSE == run_time) && (TRUE == TREF(compile_time)));
|
|
run_time = TRUE;
|
|
TREF(compile_time) = FALSE;
|
|
TREF(transform) = TRUE;
|
|
indr_stringpool = stringpool;
|
|
stringpool = rts_stringpool;
|
|
indr_stringpool.free = indr_stringpool.base;
|
|
cmd_qlf.qlf = glb_cmd_qlf.qlf;
|
|
if (obj_exp && cg_phase != CGP_FINI)
|
|
rts_error(VARLSTCNT(5) ERR_ZLINKFILE, 2, len, addr, ERR_ZLNOOBJECT);
|
|
return status;
|
|
}
|