Mercurial > projects > ldc
view dmd2/mars.h @ 793:f6dd817060fc
Attempt at fixing #126.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Thu, 27 Nov 2008 18:31:09 +0100 |
parents | f04dde6e882c |
children | 340acf1535d0 |
line wrap: on
line source
// Compiler implementation of the D programming language // Copyright (c) 1999-2007 by Digital Mars // All Rights Reserved // written by Walter Bright // http://www.digitalmars.com // License for redistribution is by either the Artistic License // in artistic.txt, or the GNU General Public License in gnu.txt. // See the included readme.txt for details. #ifndef DMD_MARS_H #define DMD_MARS_H #ifdef __DMC__ #pragma once #endif /* __DMC__ */ #include <stdint.h> #include <stdarg.h> #define __STDC_FORMAT_MACROS 1 #include <inttypes.h> #include <stdarg.h> #ifdef __DMC__ #ifdef DEBUG #undef assert #define assert(e) (static_cast<void>((e) || (printf("assert %s(%d) %s\n", __FILE__, __LINE__, #e), halt()))) #endif #endif #ifdef IN_GCC /* Changes for the GDC compiler by David Friedman */ #endif #define BREAKABI 1 // 0 if not ready to break the ABI just yet struct Array; // LDC enum ARCH { ARCHinvalid, ARCHx86, ARCHx86_64, ARCHppc, ARCHppc_64, ARCHarm, ARCHthumb }; enum OUTPUTFLAG { OUTPUTFLAGno, OUTPUTFLAGdefault, // for the .o default OUTPUTFLAGset // for -output }; enum OS { OSinvalid, OSLinux, OSWindows, OSMacOSX, OSFreeBSD }; // Put command line switches in here struct Param { char obj; // write object file char link; // perform link char lib; // write library file instead of object file(s) char multiobj; // break one object file into multiple ones char oneobj; // write one object file instead of multiple ones char trace; // insert profiling hooks char quiet; // suppress non-error messages char verbose; // verbose compile char symdebug; // insert debug symbolic information char optimize; // run optimizer char optimizeLevel; // optimization level ARCH cpu; // target CPU OS os; // target OS char is64bit; // generate 64 bit code char isLE; // generate little endian code char scheduler; // which scheduler to use char useDeprecated; // allow use of deprecated features char useAssert; // generate runtime code for assert()'s char useInvariants; // generate class invariant checks char useIn; // generate precondition checks char useOut; // generate postcondition checks char useArrayBounds; // generate array bounds checks char useSwitchError; // check for switches without a default char useUnitTests; // generate unittest code char useInline; // inline expand functions char release; // build release version char preservePaths; // !=0 means don't strip path from source file char warnings; // enable warnings char pic; // generate position-independent-code for shared libs char noruntime; // code is not allowed to make implicit calls to the runtime char novalidate;// no bitcode validation char Dversion; // D version number char ignoreUnsupportedPragmas; // rather than error on them char *argv0; // program name Array *imppath; // array of char*'s of where to look for import modules Array *fileImppath; // array of char*'s of where to look for file import modules char *runtimeImppath; // char* of where to look for the core runtime char *objdir; // .obj file output directory char *objname; // .obj file output name char doDocComments; // process embedded documentation comments char *docdir; // write documentation file to docdir directory char *docname; // write documentation file to docname Array *ddocfiles; // macro include files for Ddoc char doHdrGeneration; // process embedded documentation comments char *hdrdir; // write 'header' file to docdir directory char *hdrname; // write 'header' file to docname unsigned debuglevel; // debug level Array *debugids; // debug identifiers unsigned versionlevel; // version level Array *versionids; // version identifiers bool dump_source; Array *defaultlibnames; // default libraries for non-debug builds Array *debuglibnames; // default libraries for debug builds const char *xmlname; // filename for XML output // Hidden debug switches char debuga; char debugb; char debugc; char debugf; char debugr; char debugw; char debugx; char debugy; char run; // run resulting executable size_t runargs_length; char** runargs; // arguments for executable // Linker stuff Array *objfiles; Array *linkswitches; Array *libfiles; char *deffile; char *resfile; char *exefile; // LDC stuff const char *llvmArch; char forceBE; char output_ll; char output_bc; char output_s; char output_o; char llvmInline; char llvmAnnotate; char useInlineAsm; char fqnNames; // use fully qualified object names char noDefaultLib; // target stuff const char *targetTriple; const char *dataLayout; }; struct Global { const char *mars_ext; const char *sym_ext; const char *obj_ext; #if _WIN32 const char *obj_ext_alt; #endif const char *ll_ext; const char *bc_ext; const char *s_ext; const char *lib_ext; const char *doc_ext; // for Ddoc generated files const char *ddoc_ext; // for Ddoc macro include files const char *hdr_ext; // for D 'header' import files const char *copyright; const char *written; Array *path; // Array of char*'s which form the import lookup path Array *filePath; // Array of char*'s which form the file import lookup path int structalign; const char *version; const char *ldc_version; Param params; unsigned errors; // number of errors reported so far unsigned gag; // !=0 means gag reporting of errors Global(); }; extern Global global; #if __GNUC__ //#define memicmp strncasecmp //#define stricmp strcasecmp #endif #ifdef __DMC__ typedef _Complex long double complex_t; #else #ifndef IN_GCC #include "complex_t.h" #endif #ifdef __APPLE__ //#include "complex.h"//This causes problems with include the c++ <complex> and not the C "complex.h" #define integer_t dmd_integer_t #endif #endif // Be careful not to care about sign when using integer_t typedef uint64_t integer_t; // Signed and unsigned variants typedef int64_t sinteger_t; typedef uint64_t uinteger_t; typedef int8_t d_int8; typedef uint8_t d_uns8; typedef int16_t d_int16; typedef uint16_t d_uns16; typedef int32_t d_int32; typedef uint32_t d_uns32; typedef int64_t d_int64; typedef uint64_t d_uns64; typedef float d_float32; typedef double d_float64; typedef long double d_float80; typedef d_uns8 d_char; typedef d_uns16 d_wchar; typedef d_uns32 d_dchar; #ifdef IN_GCC #include "d-gcc-real.h" #else typedef long double real_t; #endif // Modify OutBuffer::writewchar to write the correct size of wchar #if _WIN32 #define writewchar writeword #else // This needs a configuration test... #define writewchar write4 #endif #ifdef IN_GCC #include "d-gcc-complex_t.h" #endif // taken from GDC // for handling printf incompatibilities #if __MSVCRT__ #define PRIuSIZE "Iu" #define PRIxSIZE "Ix" #elif __MINGW32__ #define PRIuSIZE "u" #define PRIxSIZE "x" #else #define PRIuSIZE "zu" #define PRIxSIZE "zx" #endif struct Module; //typedef unsigned Loc; // file location struct Loc { char *filename; unsigned linnum; Loc() { linnum = 0; filename = NULL; } Loc(int x) { linnum = x; filename = NULL; } Loc(Module *mod, unsigned linnum); char *toChars() const; }; #ifndef GCC_SAFE_DMD #define TRUE 1 #define FALSE 0 #endif #define INTERFACE_OFFSET 0 // if 1, put classinfo as first entry // in interface vtbl[]'s #define INTERFACE_VIRTUAL 0 // 1 means if an interface appears // in the inheritance graph multiple // times, only one is used enum LINK { LINKdefault, LINKd, LINKc, LINKcpp, LINKwindows, LINKpascal, // LDC LINKintrinsic, }; enum DYNCAST { DYNCAST_OBJECT, DYNCAST_EXPRESSION, DYNCAST_DSYMBOL, DYNCAST_TYPE, DYNCAST_IDENTIFIER, DYNCAST_TUPLE, }; enum MATCH { MATCHnomatch, // no match MATCHconvert, // match with conversions #if DMDV2 MATCHconst, // match with conversion to const #endif MATCHexact // exact match }; void error(Loc loc, const char *format, ...); void verror(Loc loc, const char *format, va_list); void fatal(); void err_nomem(); void inifile(const char *argv0, const char *inifile); void halt(); /*** Where to send error messages ***/ #if IN_GCC #define stdmsg stderr #else #define stdmsg stdout #endif #endif /* DMD_MARS_H */