mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-23 08:13:13 +01:00
236 lines
7.1 KiB
C
236 lines
7.1 KiB
C
// Copyright (C) 1985-1998 by Symantec
|
||
// Copyright (C) 2000-2010 by Digital Mars
|
||
// All Rights Reserved
|
||
// http://www.digitalmars.com
|
||
// Written by Walter Bright
|
||
/*
|
||
* This source file is made available for personal use
|
||
* only. The license is in /dmd/src/dmd/backendlicense.txt
|
||
* or /dm/src/dmd/backendlicense.txt
|
||
* For any other uses, please contact Digital Mars.
|
||
*/
|
||
|
||
/* Global variables for PARSER */
|
||
|
||
#include <stdio.h>
|
||
#include <time.h>
|
||
|
||
#include "cc.h"
|
||
#include "global.h"
|
||
#include "oper.h"
|
||
#include "type.h"
|
||
#include "go.h"
|
||
#include "ty.h"
|
||
|
||
#include "optab.c"
|
||
#include "tytab.c"
|
||
|
||
#if __SC__ && _MSDOS
|
||
#if __INTSIZE == 4
|
||
unsigned __cdecl _stack = 100000; // set default stack size
|
||
#else
|
||
unsigned __cdecl _stack = 60000; // set default stack size
|
||
#endif
|
||
#endif
|
||
|
||
/* Global flags:
|
||
*/
|
||
|
||
char PARSER; // indicate we're in the parser
|
||
char OPTIMIZER; // indicate we're in the optimizer
|
||
int structalign; /* alignment for members of structures */
|
||
char dbcs; // current double byte character set
|
||
|
||
int TYptrdiff = TYint;
|
||
int TYsize = TYuint;
|
||
int TYsize_t = TYuint;
|
||
|
||
#ifdef DEBUG
|
||
char debuga,debugb,debugc,debugd,debuge,debugf,debugr,debugs,debugt,debugu,debugw,debugx,debugy;
|
||
#endif
|
||
|
||
#if !MARS
|
||
linkage_t linkage;
|
||
int linkage_spec = 0; /* using the default */
|
||
|
||
/* Function types */
|
||
/* LINK_MAXDIM = C,C++,Pascal,FORTRAN,syscall,stdcall,Jupiter */
|
||
#if MEMMODELS == 1
|
||
tym_t functypetab[LINK_MAXDIM] =
|
||
{
|
||
#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
||
TYnfunc,
|
||
TYnpfunc,
|
||
TYnpfunc,
|
||
TYnfunc,
|
||
#endif
|
||
};
|
||
#else
|
||
tym_t functypetab[LINK_MAXDIM][MEMMODELS] =
|
||
{
|
||
TYnfunc, TYffunc, TYnfunc, TYffunc, TYffunc,
|
||
#if VBTABLES
|
||
TYnfunc, TYffunc, TYnfunc, TYffunc, TYffunc,
|
||
#else
|
||
TYnpfunc, TYfpfunc, TYnpfunc, TYfpfunc, TYfpfunc,
|
||
#endif
|
||
TYnpfunc, TYfpfunc, TYnpfunc, TYfpfunc, TYfpfunc,
|
||
TYnpfunc, TYfpfunc, TYnpfunc, TYfpfunc, TYfpfunc,
|
||
TYnfunc, TYffunc, TYnfunc, TYffunc, TYffunc,
|
||
TYnsfunc, TYfsfunc, TYnsfunc, TYfsfunc, TYfsfunc,
|
||
TYjfunc, TYfpfunc, TYnpfunc, TYfpfunc, TYfpfunc,
|
||
};
|
||
#endif
|
||
|
||
/* Function mangling */
|
||
/* LINK_MAXDIM = C,C++,Pascal,FORTRAN,syscall,stdcall */
|
||
mangle_t funcmangletab[LINK_MAXDIM] =
|
||
{
|
||
mTYman_c,
|
||
mTYman_cpp,
|
||
mTYman_pas,
|
||
mTYman_for,
|
||
mTYman_sys,
|
||
mTYman_std,
|
||
mTYman_d,
|
||
};
|
||
|
||
/* Name mangling for global variables */
|
||
mangle_t varmangletab[LINK_MAXDIM] =
|
||
{
|
||
mTYman_c,
|
||
#if NEWMANGLE
|
||
mTYman_cpp,
|
||
#else
|
||
mTYman_c,
|
||
#endif
|
||
mTYman_pas,mTYman_for,mTYman_sys,mTYman_std,mTYman_d
|
||
};
|
||
#endif
|
||
|
||
targ_size_t dsout = 0; /* # of bytes actually output to data */
|
||
/* segment, used to pad for alignment */
|
||
|
||
/* File variables: */
|
||
|
||
char *argv0; // argv[0] (program name)
|
||
FILE *fdep = NULL; // dependency file stream pointer
|
||
FILE *flst = NULL; // list file stream pointer
|
||
FILE *fin = NULL; // input file
|
||
#if SPP
|
||
FILE *fout;
|
||
#endif
|
||
#if HTOD
|
||
char *fdmodulename = NULL;
|
||
FILE *fdmodule = NULL;
|
||
#endif
|
||
char *foutdir = NULL, // directory to place output files in
|
||
*finname = NULL,
|
||
*foutname = NULL,
|
||
*fsymname = NULL,
|
||
*fphreadname = NULL,
|
||
*ftdbname = NULL,
|
||
*fdepname = NULL,
|
||
*flstname = NULL; /* the filename strings */
|
||
|
||
list_t pathlist; /* include paths */
|
||
list_t headers; /* pre-include files */
|
||
|
||
/* Data from lexical analyzer: */
|
||
|
||
unsigned idhash = 0; // hash value of identifier
|
||
int xc = ' '; // character last read
|
||
|
||
/* Data for pragma processor:
|
||
*/
|
||
|
||
int colnumber = 0; /* current column number */
|
||
|
||
/* Other variables: */
|
||
|
||
int level = 0; /* declaration level */
|
||
/* 0: top level */
|
||
/* 1: function parameter declarations */
|
||
/* 2: function local declarations */
|
||
/* 3+: compound statement decls */
|
||
|
||
param_t *paramlst = NULL; /* function parameter list */
|
||
tym_t pointertype = TYnptr; /* default data pointer type */
|
||
|
||
/************************
|
||
* Bit masks
|
||
*/
|
||
|
||
const unsigned mask[32] =
|
||
{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,0x8000,
|
||
0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000,0x800000,
|
||
0x1000000,0x2000000,0x4000000,0x8000000,
|
||
0x10000000,0x20000000,0x40000000,0x80000000};
|
||
|
||
#if 0
|
||
const unsigned long maskl[32] =
|
||
{1,2,4,8,0x10,0x20,0x40,0x80,
|
||
0x100,0x200,0x400,0x800,0x1000,0x2000,0x4000,0x8000,
|
||
0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000,0x800000,
|
||
0x1000000,0x2000000,0x4000000,0x8000000,
|
||
0x10000000,0x20000000,0x40000000,0x80000000};
|
||
#endif
|
||
|
||
/* From util.c */
|
||
|
||
/*****************************
|
||
* SCxxxx types.
|
||
*/
|
||
|
||
#if !SPP
|
||
|
||
char sytab[SCMAX] =
|
||
{
|
||
#define X(a,b) b,
|
||
ENUMSCMAC
|
||
#undef X
|
||
};
|
||
|
||
#endif /* !SPP */
|
||
volatile int controlc_saw; /* a control C was seen */
|
||
symtab_t globsym; /* global symbol table */
|
||
Pstate pstate; // parser state
|
||
Cstate cstate; // compiler state
|
||
|
||
/* From go.c */
|
||
mftype mfoptim = 0; // mask of optimizations to perform
|
||
|
||
unsigned changes; // # of optimizations performed
|
||
struct DN *defnod = NULL; // array of definition elems
|
||
|
||
elem **expnod = NULL; /* array of expression elems */
|
||
block **expblk = NULL; /* parallel array of block pointers */
|
||
|
||
unsigned
|
||
maxblks = 0, /* array max for all block stuff */
|
||
/* dfoblks <= numblks <= maxblks */
|
||
numcse, /* number of common subexpressions */
|
||
deftop = 0, /* # of entries in defnod[] */
|
||
exptop = 0; /* top of expnod[] */
|
||
|
||
vec_t defkill = NULL, /* vector of AEs killed by an ambiguous */
|
||
/* definition */
|
||
starkill = NULL, /* vector of AEs killed by a definition */
|
||
/* of something that somebody could be */
|
||
/* pointing to */
|
||
vptrkill = NULL; /* vector of AEs killed by an access */
|
||
/* to a vptr */
|
||
|
||
/* From debug.c */
|
||
#if DEBUG
|
||
const char *regstring[32] = {"AX","CX","DX","BX","SP","BP","SI","DI",
|
||
"R8","R9","R10","R11","R12","R13","R14","R15",
|
||
"XMM0","XMM1","XMM2","XMM3","XMM4","XMM5","XMM6","XMM7",
|
||
"ES","PSW","STACK","ST0","ST01","NOREG","RMload","RMstore"};
|
||
#endif
|
||
|
||
/* From nwc.c */
|
||
|
||
type *chartype; /* default 'char' type */
|
||
|