mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-15 20:33:14 +01:00
Fixed problems with label collisions when using labels inside inline asm. LabelStatement is now easily reached given its Identifier, which should be useful elsewhere too. Enabled inline asm for building the lib/compiler/llvmdc runtime code, fixing branches out of asm makes this possible.
333 lines
7.9 KiB
C
333 lines
7.9 KiB
C
|
|
// 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 V2 0 // Version 2.0 features
|
|
#define BREAKABI 1 // 0 if not ready to break the ABI just yet
|
|
|
|
struct Array;
|
|
|
|
// Put command line switches in here
|
|
struct Param
|
|
{
|
|
char obj; // write object file
|
|
char link; // perform link
|
|
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
|
|
char cpu; // target CPU
|
|
char is64bit; // generate 64 bit code
|
|
char isLE; // generate little endian code
|
|
char isLinux; // generate code for linux
|
|
char isWindows; // generate code for Windows
|
|
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 cov; // generate code coverage data
|
|
char nofloat; // code should not pull in floating point support
|
|
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;
|
|
|
|
char *defaultlibname; // default library for non-debug builds
|
|
char *debuglibname; // default library for debug builds
|
|
|
|
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;
|
|
|
|
// LLVMDC stuff
|
|
char *llvmArch;
|
|
char forceBE;
|
|
char *tt_arch;
|
|
char *tt_os;
|
|
char *data_layout;
|
|
char disassemble;
|
|
char llvmInline;
|
|
char llvmAnnotate;
|
|
char *runtimePath;
|
|
char useFP80;
|
|
char useInlineAsm;
|
|
char fqnPaths; // use fully qualified object names
|
|
};
|
|
|
|
struct Global
|
|
{
|
|
char *mars_ext;
|
|
char *sym_ext;
|
|
char *obj_ext;
|
|
char *ll_ext;
|
|
char *bc_ext;
|
|
char *nativeobj_ext;
|
|
char *doc_ext; // for Ddoc generated files
|
|
char *ddoc_ext; // for Ddoc macro include files
|
|
char *hdr_ext; // for D 'header' import files
|
|
char *copyright;
|
|
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;
|
|
char *version;
|
|
char *llvmdc_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,
|
|
};
|
|
|
|
enum DYNCAST
|
|
{
|
|
DYNCAST_OBJECT,
|
|
DYNCAST_EXPRESSION,
|
|
DYNCAST_DSYMBOL,
|
|
DYNCAST_TYPE,
|
|
DYNCAST_IDENTIFIER,
|
|
DYNCAST_TUPLE,
|
|
};
|
|
|
|
enum MATCH
|
|
{
|
|
MATCHnomatch, // no match
|
|
MATCHconvert, // match with conversions
|
|
#if V2
|
|
MATCHconst, // match with conversion to const
|
|
#endif
|
|
MATCHexact // exact match
|
|
};
|
|
|
|
// LLVMDC
|
|
enum ARCH
|
|
{
|
|
ARCHx86,
|
|
ARCHx86_64,
|
|
ARCHppc,
|
|
ARCHppc_64
|
|
};
|
|
|
|
void error(Loc loc, const char *format, ...);
|
|
void verror(Loc loc, const char *format, va_list);
|
|
void fatal();
|
|
void err_nomem();
|
|
void inifile(char *argv0, char *inifile);
|
|
void halt();
|
|
|
|
/*** Where to send error messages ***/
|
|
#if IN_GCC
|
|
#define stdmsg stderr
|
|
#else
|
|
#define stdmsg stdout
|
|
#endif
|
|
|
|
#endif /* DMD_MARS_H */
|