changeset 140:31c086f76669

dmd.lib now only contains the backend backward references from the backend to the frontend are implemented in ddmd win32_lib.mak is replaced by a patch also fixed VisualD project file predefined versions
author Trass3r
date Tue, 14 Sep 2010 01:54:48 +0200
parents bc45b1c53019
children 7171e6ea651d
files commands.linux.txt commands.txt ddmd.visualdproj dmd/Type.d dmd/VolatileStatement.d dmd/backend/OPER.d dmd/backend/Util.d dmd/backend/glue.d dmd/backend/iasm.d dmd/codegen/Util.d dmd/codegen/linkhelper.d dmdpatch.patch win32_lib.mak
diffstat 13 files changed, 400 insertions(+), 536 deletions(-) [+]
line wrap: on
line diff
--- a/commands.linux.txt	Tue Sep 14 01:13:58 2010 +0200
+++ b/commands.linux.txt	Tue Sep 14 01:54:48 2010 +0200
@@ -392,3 +392,4 @@
 dmd/backend/rel.d
 dmd/backend/LIST.d
 dmd/codegen/Util.d
+dmd/codegen/linkhelper.d
\ No newline at end of file
--- a/commands.txt	Tue Sep 14 01:13:58 2010 +0200
+++ b/commands.txt	Tue Sep 14 01:54:48 2010 +0200
@@ -387,4 +387,5 @@
 dmd\backend\iasm.d
 dmd\backend\rel.d
 dmd\backend\LIST.d
-dmd\codegen\Util.d
\ No newline at end of file
+dmd\codegen\Util.d
+dmd\codegen\linkhelper.d
\ No newline at end of file
--- a/ddmd.visualdproj	Tue Sep 14 01:13:58 2010 +0200
+++ b/ddmd.visualdproj	Tue Sep 14 01:54:48 2010 +0200
@@ -59,7 +59,7 @@
   <debuglevel>0</debuglevel>
   <debugids />
   <versionlevel>0</versionlevel>
-  <versionids>DMDV2 TX86 MARS _WIN32 TARGET_WINDOS OMFOBJ WindowsXP DumbClone BREAKABI SEH STRUCTTHISREF SNAN_DEFAULT_INIT SARRAYVALUE</versionids>
+  <versionids>DMDV2 TX86 MARS _WIN32 TARGET_WINDOS OMFOBJ WindowsXP DumbClone BREAKABI SEH STRUCTTHISREF CCASTSYNTAX CARRAYDECL SNAN_DEFAULT_INIT SARRAYVALUE</versionids>
   <dump_source>0</dump_source>
   <mapverbosity>0</mapverbosity>
   <createImplib>0</createImplib>
@@ -146,7 +146,7 @@
   <debuglevel>0</debuglevel>
   <debugids />
   <versionlevel>0</versionlevel>
-  <versionids>DMDV2 TX86 MARS _WIN32 TARGET_WINDOS OMFOBJ WindowsXP DumbClone BREAKABI SEH STRUCTTHISREF SNAN_DEFAULT_INIT SARRAYVALUE</versionids>
+  <versionids>DMDV2 TX86 MARS _WIN32 TARGET_WINDOS OMFOBJ WindowsXP DumbClone BREAKABI SEH STRUCTTHISREF CCASTSYNTAX CARRAYDECL SNAN_DEFAULT_INIT SARRAYVALUE</versionids>
   <dump_source>0</dump_source>
   <mapverbosity>0</mapverbosity>
   <createImplib>0</createImplib>
@@ -246,6 +246,7 @@
    </Folder>
    <Folder name="codegen">
     <File path="dmd\codegen\Util.d" />
+    <File path="dmd\codegen\linkhelper.d" />
    </Folder>
    <Folder name="condition">
     <Folder name="util">
--- a/dmd/Type.d	Tue Sep 14 01:13:58 2010 +0200
+++ b/dmd/Type.d	Tue Sep 14 01:54:48 2010 +0200
@@ -89,15 +89,15 @@
  * REALALIGNSIZE = alignment for reals
  */
 version (TARGET_OSX) {
-	int REALSIZE = 16;
+	extern(C++) int REALSIZE = 16;
 	int REALPAD = 6;
 	int REALALIGNSIZE = 16;
 } else version (POSIX) { /// TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS
-	int REALSIZE = 12;
+	extern(C++) int REALSIZE = 12;
 	int REALPAD = 2;
 	int REALALIGNSIZE = 4;
 } else {
-	int REALSIZE = 10;
+	extern(C++) int REALSIZE = 10;
 	int REALPAD = 0;
 	int REALALIGNSIZE = 2;
 }
--- a/dmd/VolatileStatement.d	Tue Sep 14 01:13:58 2010 +0200
+++ b/dmd/VolatileStatement.d	Tue Sep 14 01:54:48 2010 +0200
@@ -15,6 +15,9 @@
 import dmd.backend.Blockx;
 import dmd.backend.Util;
 import dmd.backend.BC;
+import dmd.backend.elem;
+import dmd.backend.OPER;
+import dmd.backend.mTY;
 //import dmd.backend.BFL;
 
 class VolatileStatement : Statement
@@ -70,6 +73,23 @@
 		return this;
 	}
 
+    static void el_setVolatile(elem* e)
+	{
+		while (1)
+		{
+			e.Ety |= mTYvolatile;
+			if (OTunary(e.Eoper))
+				e = e.E1;
+			else if (OTbinary(e.Eoper))
+			{
+				el_setVolatile(e.E2);
+				e = e.E1;
+			}
+			else
+				break;
+		}
+	}
+
     override void toIR(IRState* irs)
 	{
 		block* b;
--- a/dmd/backend/OPER.d	Tue Sep 14 01:13:58 2010 +0200
+++ b/dmd/backend/OPER.d	Tue Sep 14 01:54:48 2010 +0200
@@ -324,12 +324,17 @@
 #define _OTboolnop	1
 +/
 
-ubyte OTbinary(OPER op) {
+ubyte OTbinary(OPER op)
+{
 	return (optab1[op] & _OT._OTbinary);
 }
 
+ubyte OTunary(OPER op)
+{
+	return (optab1[op] & _OT._OTunary);
+}
+
 /+
-#define OTunary(op)	(optab1[op]&_OTunary)
 #define OTleaf(op)	(!(optab1[op]&(_OTunary|_OTbinary)))
 #define OTcommut(op)	(optab1[op]&_OTcommut)
 #define OTassoc(op)	(optab1[op]&_OTassoc)
--- a/dmd/backend/Util.d	Tue Sep 14 01:13:58 2010 +0200
+++ b/dmd/backend/Util.d	Tue Sep 14 01:54:48 2010 +0200
@@ -167,7 +167,7 @@
 	elem_p el_copytree(elem_p);
 	int el_allbits(elem *e, int bit);
 	block* block_goto(Blockx* bctx, BC bc, block* bn);
-	block* block_calloc(Blockx* blx);
+//	block* block_calloc(Blockx* blx);
 	targ_size_t type_paramsize_i(type* t);
 	int os_critsecsize();
 	void el_setVolatile(elem* e);
@@ -175,6 +175,15 @@
 	elem* el_const(tym_t, eve*);
 	elem *el_params(void** args, int length);
 	
+	/****************************************
+	 * Allocate a new block, and set the tryblock.
+	 */
+	block *block_calloc(Blockx *blx)
+	{
+		block* b = block_calloc();
+		b.Btry = blx.tryblock;
+		return b;
+	}
 	
 	version (SEH) {
 		void nteh_declarvars(Blockx* bx);
--- a/dmd/backend/glue.d	Tue Sep 14 01:13:58 2010 +0200
+++ b/dmd/backend/glue.d	Tue Sep 14 01:54:48 2010 +0200
@@ -20,12 +20,12 @@
 import core.stdc.string;
 
 __gshared Array obj_symbols_towrite;
+__gshared Outbuffer objbuf;
 
 version (Windows)
 {
 	extern (C++) extern
 	{
-		__gshared Outbuffer objbuf;
 		int go_flag(char* cp);
 		void util_set64();
 		void util_set386();
@@ -35,7 +35,6 @@
 {
 	extern (C++)
 	{
-		extern(C) extern __gshared Outbuffer objbuf;
 		int go_flag(char* cp);
 		void util_set64();
 		void util_set386();
--- a/dmd/backend/iasm.d	Tue Sep 14 01:13:58 2010 +0200
+++ b/dmd/backend/iasm.d	Tue Sep 14 01:54:48 2010 +0200
@@ -36,6 +36,7 @@
 import dmd.backend.Config;
 import dmd.backend.targ_types;
 import dmd.backend.elem;
+import dmd.backend.block;
 import dmd.Util;
 
 import std.stdio : writef, writefln;
@@ -4466,3 +4467,22 @@
 		(szReg[1] == 't' || szReg[1] == 'T'));
 }
 }
+
+extern(C)
+{
+	// backward reference from backend
+	
+	extern int refparam;
+	
+	/**********************************
+	 * Return mask of registers used by block bp.
+	 */
+	regm_t iasm_regs(block *bp)
+	{
+		debug if (debuga)
+			printf("Block iasm regs = 0x%X\n", bp.usIasmregs);
+
+		refparam |= bp.bIasmrefparam;
+		return bp.usIasmregs;
+	}
+}
\ No newline at end of file
--- a/dmd/codegen/Util.d	Tue Sep 14 01:13:58 2010 +0200
+++ b/dmd/codegen/Util.d	Tue Sep 14 01:54:48 2010 +0200
@@ -55,6 +55,7 @@
 import dmd.backend.RTLSYM;
 import dmd.backend.block;
 import dmd.backend.LIST;
+import dmd.backend.iasm : binary;
 
 import std.string;
 import core.stdc.string;
@@ -652,13 +653,123 @@
  * Returns that operator, -1 if not an intrinsic function.
  */
 
-extern (C++) extern int intrinsic_op(char* name);
- 
+//extern (C++) extern int intrinsic_op(char* name);
+
 OPER intrinsic_oper(const(char)* name)
 {
-	int result = intrinsic_op(cast(char*)name);
-	if (result == -1) return OPER.OPMAX;
-	return cast(OPER)result;
+	version(DMDV1)
+	static const(char) *namearray[] =
+	[
+		"4math3cosFeZe",
+		"4math3sinFeZe",
+		"4math4fabsFeZe",
+		"4math4rintFeZe",
+		"4math4sqrtFdZd",
+		"4math4sqrtFeZe",
+		"4math4sqrtFfZf",
+		"4math4yl2xFeeZe",
+		"4math5ldexpFeiZe",
+		"4math6rndtolFeZl",
+		"4math6yl2xp1FeeZe",
+
+		"9intrinsic2btFPkkZi",
+		"9intrinsic3bsfFkZi",
+		"9intrinsic3bsrFkZi",
+		"9intrinsic3btcFPkkZi",
+		"9intrinsic3btrFPkkZi",
+		"9intrinsic3btsFPkkZi",
+		"9intrinsic3inpFkZh",
+		"9intrinsic4inplFkZk",
+		"9intrinsic4inpwFkZt",
+		"9intrinsic4outpFkhZh",
+		"9intrinsic5bswapFkZk",
+		"9intrinsic5outplFkkZk",
+		"9intrinsic5outpwFktZt",
+	];
+else
+	static const(char) *namearray[] =
+	[
+		/* The names are mangled differently because of the pure and
+		 * nothrow attributes.
+		 */
+		"4math3cosFNaNbNfeZe",
+		"4math3sinFNaNbNfeZe",
+		"4math4fabsFNaNbNfeZe",
+		"4math4rintFNaNbNfeZe",
+		"4math4sqrtFNaNbNfdZd",
+		"4math4sqrtFNaNbNfeZe",
+		"4math4sqrtFNaNbNffZf",
+		"4math4yl2xFNaNbNfeeZe",
+		"4math5ldexpFNaNbNfeiZe",
+		"4math6rndtolFNaNbNfeZl",
+		"4math6yl2xp1FNaNbNfeeZe",
+
+		"9intrinsic2btFNaNbxPkkZi",
+		"9intrinsic3bsfFNaNbkZi",
+		"9intrinsic3bsrFNaNbkZi",
+		"9intrinsic3btcFNbPkkZi",
+		"9intrinsic3btrFNbPkkZi",
+		"9intrinsic3btsFNbPkkZi",
+		"9intrinsic3inpFNbkZh",
+		"9intrinsic4inplFNbkZk",
+		"9intrinsic4inpwFNbkZt",
+		"9intrinsic4outpFNbkhZh",
+		"9intrinsic5bswapFNaNbkZk",
+		"9intrinsic5outplFNbkkZk",
+		"9intrinsic5outpwFNbktZt",
+	];
+
+	static const OPER ioptab[] =
+	[
+		OPcos,
+		OPsin,
+		OPabs,
+		OPrint,
+		OPsqrt,
+		OPsqrt,
+		OPsqrt,
+		OPyl2x,
+		OPscale,
+		OPrndtol,
+		OPyl2xp1,
+
+		OPbt,
+		OPbsf,
+		OPbsr,
+		OPbtc,
+		OPbtr,
+		OPbts,
+		OPinp,
+		OPinp,
+		OPinp,
+		OPoutp,
+		OPbswap,
+		OPoutp,
+		OPoutp,
+	];
+
+	debug 
+	{
+		assert(namearray.length == ioptab.length);
+		// assume sorted namearray
+		for (int i = 0; i < namearray.length - 1; i++)
+		{
+			if (strcmp(namearray[i], namearray[i + 1]) >= 0)
+			{
+				printf("namearray[%d] = '%s'\n", i, namearray[i]);
+				assert(0);
+			}
+		}
+	}
+
+	size_t length = strlen(name);
+	if (length < 11 || !(name[7] == 'm' || name[7] == 'i') || name[0..6] != "_D3std")
+		return OPMAX;
+
+	int p = binary(name + 6, namearray.ptr, namearray.length);
+	if(p == -1)
+		return OPMAX;
+	return ioptab[p];
 }
 
 /**************************************
@@ -790,13 +901,13 @@
 		{
 			elength = *pe;
 			*pe = el_same(&elength);
-			elength = el_una(OPER.OP64_32, TYM.TYuint, elength);
+			elength = el_una(OP64_32, TYM.TYuint, elength);
 
 		L3:
 			slength = lengthVar.toSymbol();
 			//symbol_add(slength);
 
-			einit = el_bin(OPER.OPeq, TYM.TYuint, el_var(slength), elength);
+			einit = el_bin(OPeq, TYM.TYuint, el_var(slength), elength);
 		}
     }
     return einit;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmd/codegen/linkhelper.d	Tue Sep 14 01:54:48 2010 +0200
@@ -0,0 +1,32 @@
+module dmd.codegen.linkhelper;
+
+import dmd.Loc;
+import dmd.Util;
+
+import core.stdc.stdarg;
+import std.conv;
+
+// help resolve some linker dependencies from the backend back into the frontend
+
+extern(C++)
+{
+	// msc.c wants to access global from out_config_init(), but it should never be called
+	struct Global {}
+	Global global;
+
+	void error(const char *filename, uint linnum, const char *format, ...)
+	{
+		Loc loc;
+		loc.filename = to!string(filename);
+		loc.linnum = linnum;
+
+		va_list ap;
+		va_start(ap, format);
+		
+		char buf[1024];
+		vsprintf(buf.ptr, format, ap);
+		va_end( ap );
+		
+		dmd.Util.error(loc, to!string(buf));
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmdpatch.patch	Tue Sep 14 01:54:48 2010 +0200
@@ -0,0 +1,183 @@
+# HG changeset patch
+# User trass3r
+# Date 1284418540 -7200
+# Node ID a4ec24e030fdda493d8d1249ef966e0beed13e1e
+# Parent  0ebf1721e4d32cfb38376c6688a767627aa63758
+t
+
+diff -r 0ebf1721e4d3 -r a4ec24e030fd src/dmd/class.c
+--- a/src/dmd/class.c	Mon Sep 13 15:46:31 2010 +0200
++++ b/src/dmd/class.c	Tue Sep 14 00:55:40 2010 +0200
+@@ -61,7 +61,7 @@
+     if (id)
+     {	// Look for special class names
+ 
+-	if (id == Id::__sizeof || id == Id::alignof || id == Id::mangleof)
++	if (id == Id::__sizeof || id == Id::__alignof || id == Id::mangleof)
+ 	    error("illegal class name");
+ 
+ 	// BUG: What if this is the wrong TypeInfo, i.e. it is nested?
+diff -r 0ebf1721e4d3 -r a4ec24e030fd src/dmd/dsymbol.c
+--- a/src/dmd/dsymbol.c	Mon Sep 13 15:46:31 2010 +0200
++++ b/src/dmd/dsymbol.c	Tue Sep 14 00:55:40 2010 +0200
+@@ -488,7 +488,7 @@
+ 	}
+ 	if (sd->isAggregateDeclaration() || sd->isEnumDeclaration())
+ 	{
+-	    if (ident == Id::__sizeof || ident == Id::alignof || ident == Id::mangleof)
++	    if (ident == Id::__sizeof || ident == Id::__alignof || ident == Id::mangleof)
+ 		error(".%s property cannot be redefined", ident->toChars());
+ 	}
+ 	return 1;
+diff -r 0ebf1721e4d3 -r a4ec24e030fd src/dmd/expression.c
+--- a/src/dmd/expression.c	Mon Sep 13 15:46:31 2010 +0200
++++ b/src/dmd/expression.c	Tue Sep 14 00:55:40 2010 +0200
+@@ -5953,7 +5953,7 @@
+     }
+     else if (t1b->ty == Tpointer &&
+ 	     ident != Id::init && ident != Id::__sizeof &&
+-	     ident != Id::alignof && ident != Id::offsetof &&
++	     ident != Id::__alignof && ident != Id::offsetof &&
+ 	     ident != Id::mangleof && ident != Id::stringof)
+     {	/* Rewrite:
+          *   p.ident
+diff -r 0ebf1721e4d3 -r a4ec24e030fd src/dmd/idgen.c
+--- a/src/dmd/idgen.c	Mon Sep 13 15:46:31 2010 +0200
++++ b/src/dmd/idgen.c	Tue Sep 14 00:55:40 2010 +0200
+@@ -44,7 +44,7 @@
+     { "init" },
+     { "size" },
+     { "__sizeof", "sizeof" },
+-    { "alignof" },
++    { "__alignof", "alignof" },
+     { "mangleof" },
+     { "stringof" },
+     { "tupleof" },
+diff -r 0ebf1721e4d3 -r a4ec24e030fd src/dmd/mtype.c
+--- a/src/dmd/mtype.c	Mon Sep 13 15:46:31 2010 +0200
++++ b/src/dmd/mtype.c	Tue Sep 14 00:55:40 2010 +0200
+@@ -1610,7 +1610,7 @@
+ 	error(loc, ".size property should be replaced with .sizeof");
+ 	e = new ErrorExp();
+     }
+-    else if (ident == Id::alignof)
++    else if (ident == Id::__alignof)
+     {
+ 	e = new IntegerExp(loc, alignsize(), Type::tsize_t);
+     }
+@@ -1749,7 +1749,7 @@
+     assert(sym);
+ 
+     if (ident != Id::__sizeof &&
+-	ident != Id::alignof &&
++	ident != Id::__alignof &&
+ 	ident != Id::init &&
+ 	ident != Id::mangleof &&
+ 	ident != Id::stringof &&
+diff -r 0ebf1721e4d3 -r a4ec24e030fd src/dmd/win32.mak
+--- a/src/dmd/win32.mak	Mon Sep 13 15:46:31 2010 +0200
++++ b/src/dmd/win32.mak	Tue Sep 14 00:55:40 2010 +0200
+@@ -8,7 +8,8 @@
+ DMDSVN=\svnproj\dmd\trunk\src
+ SCROOT=$D\dm
+ INCLUDE=$(SCROOT)\include
+-CC=\dm\bin\dmc
++CC=$(SCROOT)\bin\dmc
++LIB=$(SCROOT)\bin\lib
+ LIBNT=$(SCROOT)\lib
+ SNN=$(SCROOT)\lib\snn
+ DIR=\dmd2
+@@ -24,7 +25,7 @@
+ XFLG=
+ MODEL=n
+ OPT=
+-DEBUG=-gl -D
++DEBUG=-g -D
+ #PREC=-H -HItotal.h -HO
+ PREC=
+ LFLAGS=
+@@ -59,11 +60,17 @@
+ 	$(MAKE) OPT=-o "DEBUG=" LFLAGS=-L/delexe dmd.exe
+ #	$(MAKE) OPT=-o "DEBUG=" LFLAGS=-L/ma/co/delexe dmd.exe
+ 
++lib:
++	$(MAKE) OPT=-o "DEBUG=" dmd.lib
++
+ ################ NT COMMAND LINE DEBUG #########################
+ 
+ debdmd:
+ 	$(MAKE) OPT= "DEBUG=-D -g" LFLAGS=-L/ma/co dmd.exe
+ 
++deblib:
++	$(MAKE) OPT= "DEBUG=-D -g" dmd.lib
++
+ #########################################
+ 
+ # D front end
+@@ -155,8 +162,11 @@
+ #########################################
+ 
+ $(TARGET).exe : $(OBJS) win32.mak
+-	dmc -o$(TARGET).exe $(OBJS) -cpp -mn -Ar $(LFLAGS)
++	$(CC) -o$(TARGET).exe $(OBJS) -cpp -mn -Ar $(LFLAGS)
+ 
++$(TARGET).lib : $(OBJS) win32.mak
++	$(LIB) -c -p128 $(TARGET).lib $(OBJ8) $(ROOTOBJS) msc.obj tk.obj util.obj entity.obj ph.obj eh.obj
++	$(LIB) -d $(TARGET).lib iasm.obj
+ 
+ ##################### INCLUDE MACROS #####################
+ 
+@@ -171,11 +181,11 @@
+ 	msgsx
+ 
+ msgsx.exe : msgsx.c
+-	dmc msgsx -mn -D$(TARGET) $(DEFINES) $(WINLIBS)
++	$(CC) msgsx -mn -D$(TARGET) $(DEFINES) $(WINLIBS)
+ 
+ elxxx.c cdxxx.c optab.c debtab.c fltables.c tytab.c : \
+ 	$C\cdef.h $C\cc.h $C\oper.h $C\ty.h $C\optabgen.c
+-	dmc -cpp -ooptabgen.exe $C\optabgen -DMARS -I$(TK) $(WINLIBS) #-L$(LINKS)
++	$(CC) -cpp -ooptabgen.exe $C\optabgen -DMARS -I$(TK) $(WINLIBS) #-L$(LINKS)
+ 	optabgen
+ 
+ impcnvtab.c : impcnvgen.c
+@@ -183,7 +193,7 @@
+ 	impcnvgen
+ 
+ id.h id.c : idgen.c
+-	dmc -cpp idgen
++	$(CC) -cpp idgen
+ 	idgen
+ 
+ ##################### SPECIAL BUILDS #####################
+diff -r 0ebf1721e4d3 -r a4ec24e030fd src/druntime/win32.mak
+--- a/src/druntime/win32.mak	Mon Sep 13 15:46:31 2010 +0200
++++ b/src/druntime/win32.mak	Tue Sep 14 00:55:40 2010 +0200
+@@ -1,5 +1,5 @@
+ 
+-DMD=dmd
++DMD=..\..\windows\bin\dmd
+ 
+ CC=dmc
+ 
+@@ -300,7 +300,7 @@
+ # NOTE: a pre-compiled minit.obj has been provided in dmd for Win32 and
+ #       minit.asm is not used by dmd for Linux
+ 
+-OBJS= errno_c.obj complex.obj critical.obj deh.obj monitor.obj src\rt\minit.obj
++OBJS= errno_c.obj complex.obj critical.obj deh.obj monitor.obj minit.obj
+ OBJS_TO_DELETE= errno_c.obj complex.obj critical.obj deh.obj monitor.obj
+ 
+ DOCS=\
+diff -r 0ebf1721e4d3 -r a4ec24e030fd src/phobos/win32.mak
+--- a/src/phobos/win32.mak	Mon Sep 13 15:46:31 2010 +0200
++++ b/src/phobos/win32.mak	Tue Sep 14 00:55:40 2010 +0200
+@@ -51,7 +51,7 @@
+ 
+ DMD=$(DIR)\bin\dmd
+ #DMD=..\dmd
+-DMD=dmd
++DMD=..\..\windows\bin\dmd
+ 
+ ## Location of where to write the html documentation files
+ 
--- a/win32_lib.mak	Tue Sep 14 01:13:58 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,518 +0,0 @@
-#_ win32_lib.mak
-# Copyright (C) 1999-2009 by Digital Mars, http://www.digitalmars.com
-# Written by Walter Bright
-# All Rights Reserved
-# Build dmd with Digital Mars C++ compiler
-
-D=
-DMDSVN=\svnproj\dmd\trunk\src
-SCROOT=$D\dm
-INCLUDE=$(SCROOT)\include
-CC=\dm\bin\dmc
-LIBNT=$(SCROOT)\lib
-SNN=$(SCROOT)\lib\snn
-DIR=\dmd2
-CP=cp
-
-C=backend
-TK=tk
-ROOT=root
-
-MAKE=make -fwin32_lib.mak C=$C TK=$(TK) ROOT=$(ROOT)
-
-TARGET=dmd
-XFLG=
-MODEL=n
-OPT=
-DEBUG=-gl -D
-#PREC=-H -HItotal.h -HO
-PREC=
-LFLAGS=
-
-LINKN=$(SCROOT)\bin\link /de
-
-CFLAGS=-I$(ROOT);$(INCLUDE) $(XFLG) $(OPT) $(DEBUG) -cpp -D_DH
-MFLAGS=-I$C;$(TK) -DMARS -cpp $(DEBUG) -e -wx -D_DH
-
-# Makerules:
-.c.obj:
-	$(CC) -c $(CFLAGS) $(PREC) $*
-
-.asm.obj:
-	$(CC) -c $(CFLAGS) $*
-
-defaulttarget: debdmd
-
-################ RELEASES #########################
-
-release:
-	$(MAKE) clean
-	$(MAKE) dmd
-	$(MAKE) clean
-
-################ NT COMMAND LINE RELEASE #########################
-
-trace:
-	$(MAKE) OPT=-o "DEBUG=-gt -Nc" LFLAGS=-L/ma/co/delexe dmd.lib
-
-dmd:
-	$(MAKE) OPT=-o "DEBUG=" LFLAGS=-L/delexe dmd.lib
-#	$(MAKE) OPT=-o "DEBUG=" LFLAGS=-L/ma/co/delexe dmd.exe
-
-################ NT COMMAND LINE DEBUG #########################
-
-debdmd:
-	$(MAKE) OPT= "DEBUG=-D -g" LFLAGS=-L/ma/co dmd.lib
-
-#########################################
-
-# D front end
-
-OBJ1= mars2.obj enum.obj struct.obj dsymbol.obj import.obj id.obj \
-	staticassert.obj identifier.obj mtype.obj expression.obj \
-	optimize.obj template.obj lexer.obj declaration.obj cast.obj \
-	init.obj func.obj utf.obj unialpha.obj parse.obj statement.obj \
-	constfold.obj version.obj inifile.obj typinf.obj \
-	module.obj scope.obj dump.obj cond.obj inline.obj opover.obj \
-	entity.obj class.obj mangle.obj attrib.obj impcnvtab.obj \
-	link.obj access.obj doc.obj macro.obj hdrgen.obj delegatize.obj \
-	interpret.obj traits.obj aliasthis.obj \
-	builtin.obj clone.obj libomf.obj arrayop.obj irstate.obj \
-	glue.obj msc.obj ph.obj tk.obj s2ir.obj todt.obj e2ir.obj tocsym.obj \
-	util.obj bit.obj eh.obj toobj.obj toctype.obj tocvdebug.obj toir.obj \
-	json.obj
-
-# from C/C++ compiler optimizer and back end
-
-OBJ8= go.obj gdag.obj gother.obj gflow.obj gloop.obj var.obj el.obj \
-	newman.obj glocal.obj os.obj nteh.obj evalu8.obj cgcs.obj \
-	rtlsym.obj html.obj cgelem.obj cgen.obj cgreg.obj out.obj \
-	blockopt.obj cgobj.obj cg.obj cgcv.obj type.obj dt.obj \
-	debug.obj code.obj cg87.obj cgsched.obj ee.obj csymbol.obj \
-	cgcod.obj cod1.obj cod2.obj cod3.obj cod4.obj cod5.obj outbuf.obj \
-	bcomplex.obj iasm.obj ptrntab.obj aa.obj ti_achar.obj md5.obj
-
-# from ROOT
-
-ROOTOBJS= lstring.obj array.obj gnuc.obj man.obj rmem.obj port.obj root.obj \
-	stringtable.obj dchar.obj response.obj async.obj
-
-OBJS= $(OBJ1) $(OBJ8) $(ROOTOBJS)
-
-SRCS= mars2.c enum.c struct.c dsymbol.c import.c idgen.c impcnvgen.c utf.h \
-	utf.c entity.c identifier.c mtype.c expression.c optimize.c \
-	template.h template.c lexer.c declaration.c cast.c \
-	cond.h cond.c link.c aggregate.h staticassert.h parse.c statement.c \
-	constfold.c version.h version.c inifile.c iasm.c staticassert.c \
-	module.c scope.c dump.c init.h init.c attrib.h attrib.c opover.c \
-	eh.c toctype.c class.c mangle.c bit.c tocsym.c func.c inline.c \
-	access.c complex_t.h unialpha.c irstate.h irstate.c glue.c msc.c \
-	ph.c tk.c s2ir.c todt.c e2ir.c util.c toobj.c cppmangle.c \
-	identifier.h parse.h objfile.h scope.h enum.h import.h \
-	typinf.c tocvdebug.c toelfdebug.c mars.h module.h mtype.h dsymbol.h \
-	declaration.h lexer.h expression.h statement.h doc.h doc.c \
-	macro.h macro.c hdrgen.h hdrgen.c arraytypes.h \
-	delegatize.c toir.h toir.c interpret.c traits.c builtin.c \
-	clone.c lib.h libomf.c libelf.c libmach.c arrayop.c \
-	aliasthis.h aliasthis.c json.h json.c
-
-# From C++ compiler
-
-BACKSRC= $C\cdef.h $C\cc.h $C\oper.h $C\ty.h $C\optabgen.c \
-	$C\global.h $C\parser.h $C\code.h $C\type.h $C\dt.h $C\cgcv.h \
-	$C\el.h $C\iasm.h $C\rtlsym.h $C\html.h \
-	$C\bcomplex.c $C\blockopt.c $C\cg.c $C\cg87.c \
-	$C\cgcod.c $C\cgcs.c $C\cgcv.c $C\cgelem.c $C\cgen.c $C\cgobj.c \
-	$C\cgreg.c $C\var.c \
-	$C\cgsched.c $C\cod1.c $C\cod2.c $C\cod3.c $C\cod4.c $C\cod5.c \
-	$C\code.c $C\symbol.c $C\debug.c $C\dt.c $C\ee.c $C\el.c \
-	$C\evalu8.c $C\go.c $C\gflow.c $C\gdag.c \
-	$C\gother.c $C\glocal.c $C\gloop.c $C\html.c $C\newman.c \
-	$C\nteh.c $C\os.c $C\out.c $C\outbuf.c $C\ptrntab.c $C\rtlsym.c \
-	$C\type.c $C\melf.h $C\mach.h $C\bcomplex.h \
-	$C\cdeflnx.h $C\outbuf.h $C\token.h $C\tassert.h \
-	$C\elfobj.c $C\cv4.h $C\dwarf2.h $C\cpp.h $C\exh.h $C\go.h \
-	$C\dwarf.c $C\dwarf.h $C\cppman.c $C\machobj.c \
-	$C\strtold.c $C\aa.h $C\aa.c $C\tinfo.h $C\ti_achar.c \
-	$C\md5.h $C\md5.c
-
-# From TK
-
-TKSRC= $(TK)\filespec.h $(TK)\mem.h $(TK)\list.h $(TK)\vec.h \
-	$(TK)\filespec.c $(TK)\mem.c $(TK)\vec.c $(TK)\list.c
-
-# From root
-
-ROOTSRC= $(ROOT)\dchar.h $(ROOT)\dchar.c $(ROOT)\lstring.h \
-	$(ROOT)\lstring.c $(ROOT)\root.h $(ROOT)\root.c $(ROOT)\array.c \
-	$(ROOT)\rmem.h $(ROOT)\rmem.c $(ROOT)\port.h \
-	$(ROOT)\stringtable.h $(ROOT)\stringtable.c \
-	$(ROOT)\gnuc.h $(ROOT)\gnuc.c $(ROOT)\man.c $(ROOT)\port.c \
-	$(ROOT)\response.c $(ROOT)\async.h $(ROOT)\async.c
-
-MAKEFILES=win32.mak win32_lib.mak linux.mak osx.mak freebsd.mak solaris.mak
-
-#########################################
-
-$(TARGET).lib : $(OBJS) win32_lib.mak
-	lib -c -p128 $(TARGET).lib $(OBJS)
-
-##################### INCLUDE MACROS #####################
-
-CCH=
-#TOTALH=$(CCH) total.sym
-TOTALH=$(CCH) id.h
-CH= $C\cc.h $C\global.h $C\parser.h $C\oper.h $C\code.h $C\type.h $C\dt.h $C\cgcv.h $C\el.h $C\iasm.h
-
-##################### GENERATED SOURCE #####################
-
-msgs.h msgs.c sj1041.msg sj1036.msg sj1031.msg : msgsx.exe
-	msgsx
-
-msgsx.exe : msgsx.c
-	dmc msgsx -mn -D$(TARGET) $(DEFINES) $(WINLIBS)
-
-elxxx.c cdxxx.c optab.c debtab.c fltables.c tytab.c : \
-	$C\cdef.h $C\cc.h $C\oper.h $C\ty.h $C\optabgen.c
-	dmc -cpp -ooptabgen.exe $C\optabgen -DMARS -I$(TK) $(WINLIBS) #-L$(LINKS)
-	optabgen
-
-impcnvtab.c : impcnvgen.c
-	$(CC) -I$(ROOT) -cpp impcnvgen
-	impcnvgen
-
-id.h id.c : idgen.c
-	dmc -cpp idgen
-	idgen
-
-##################### SPECIAL BUILDS #####################
-
-total.sym : $(ROOT)\root.h mars.h lexer.h parse.h enum.h dsymbol.h \
-	mtype.h expression.h attrib.h init.h cond.h version.h \
-	declaration.h statement.h scope.h import.h module.h id.h \
-	template.h aggregate.h arraytypes.h lib.h total.h
-	$(CC) -c $(CFLAGS) -HFtotal.sym total.h
-
-impcnvtab.obj : mtype.h impcnvtab.c
-	$(CC) -c -I$(ROOT) -cpp impcnvtab
-
-iasm.obj : $(CH) $(TOTALH) $C\iasm.h iasm.c
-	$(CC) -c $(MFLAGS) -I$(ROOT) iasm
-
-bcomplex.obj : $C\bcomplex.c
-	$(CC) -c $(MFLAGS) $C\bcomplex
-
-aa.obj : $C\tinfo.h $C\aa.h $C\aa.c
-	$(CC) -c $(MFLAGS) -I. $C\aa
-
-bit.obj : expression.h bit.c
-	$(CC) -c -I$(ROOT) $(MFLAGS) bit
-
-blockopt.obj : $C\blockopt.c
-	$(CC) -c $(MFLAGS) $C\blockopt
-
-cg.obj : $C\cg.c
-	$(CC) -c $(MFLAGS) -I. $C\cg
-
-cg87.obj : $C\cg87.c
-	$(CC) -c $(MFLAGS) $C\cg87
-
-cgcod.obj : $C\cgcod.c
-	$(CC) -c $(MFLAGS) -I. $C\cgcod
-
-cgcs.obj : $C\cgcs.c
-	$(CC) -c $(MFLAGS) $C\cgcs
-
-cgcv.obj : $C\cgcv.c
-	$(CC) -c $(MFLAGS) $C\cgcv
-
-cgelem.obj : $C\rtlsym.h $C\cgelem.c
-	$(CC) -c $(MFLAGS) -I. $C\cgelem
-
-cgen.obj : $C\rtlsym.h $C\cgen.c
-	$(CC) -c $(MFLAGS) $C\cgen
-
-cgobj.obj : $C\md5.h $C\cgobj.c
-	$(CC) -c $(MFLAGS) $C\cgobj
-
-cgreg.obj : $C\cgreg.c
-	$(CC) -c $(MFLAGS) $C\cgreg
-
-cgsched.obj : $C\rtlsym.h $C\cgsched.c
-	$(CC) -c $(MFLAGS) $C\cgsched
-
-cod1.obj : $C\rtlsym.h $C\cod1.c
-	$(CC) -c $(MFLAGS) $C\cod1
-
-cod2.obj : $C\rtlsym.h $C\cod2.c
-	$(CC) -c $(MFLAGS) $C\cod2
-
-cod3.obj : $C\rtlsym.h $C\cod3.c
-	$(CC) -c $(MFLAGS) $C\cod3
-
-cod4.obj : $C\cod4.c
-	$(CC) -c $(MFLAGS) $C\cod4
-
-cod5.obj : $C\cod5.c
-	$(CC) -c $(MFLAGS) $C\cod5
-
-code.obj : $C\code.c
-	$(CC) -c $(MFLAGS) $C\code
-
-irstate.obj : irstate.h irstate.c
-	$(CC) -c $(MFLAGS) irstate
-
-csymbol.obj : $C\symbol.c
-	$(CC) -c $(MFLAGS) $C\symbol -ocsymbol.obj
-
-debug.obj : $C\debug.c
-	$(CC) -c $(MFLAGS) -I. $C\debug
-
-dt.obj : $C\dt.h $C\dt.c
-	$(CC) -c $(MFLAGS) $C\dt
-
-ee.obj : $C\ee.c
-	$(CC) -c $(MFLAGS) $C\ee
-
-eh.obj : $C\cc.h $C\code.h $C\type.h $C\dt.h eh.c
-	$(CC) -c $(MFLAGS) eh
-
-el.obj : $C\rtlsym.h $C\el.h $C\el.c
-	$(CC) -c $(MFLAGS) $C\el
-
-evalu8.obj : $C\evalu8.c
-	$(CC) -c $(MFLAGS) $C\evalu8
-
-go.obj : $C\go.c
-	$(CC) -c $(MFLAGS) $C\go
-
-gflow.obj : $C\gflow.c
-	$(CC) -c $(MFLAGS) $C\gflow
-
-gdag.obj : $C\gdag.c
-	$(CC) -c $(MFLAGS) $C\gdag
-
-gother.obj : $C\gother.c
-	$(CC) -c $(MFLAGS) $C\gother
-
-glocal.obj : $C\rtlsym.h $C\glocal.c
-	$(CC) -c $(MFLAGS) $C\glocal
-
-gloop.obj : $C\gloop.c
-	$(CC) -c $(MFLAGS) $C\gloop
-
-glue.obj : $(CH) $(TOTALH) $C\rtlsym.h mars.h module.h glue.c
-	$(CC) -c $(MFLAGS) -I$(ROOT) glue
-
-html.obj : $(CH) $(TOTALH) $C\html.h $C\html.c
-	$(CC) -c -I$(ROOT) $(MFLAGS) $C\html
-
-mars2.obj : $(TOTALH) module.h mars.h mars2.c
-	$(CC) -c $(CFLAGS) $(PREC) $* -Ae
-
-md5.obj : $C\md5.h $C\md5.c
-	$(CC) -c $(MFLAGS) $C\md5
-
-module.obj : $(TOTALH) $C\html.h module.c
-	$(CC) -c $(CFLAGS) -I$C $(PREC) module.c
-
-msc.obj : $(CH) mars.h msc.c
-	$(CC) -c $(MFLAGS) msc
-
-newman.obj : $(CH) $C\newman.c
-	$(CC) -c $(MFLAGS) $C\newman
-
-nteh.obj : $C\rtlsym.h $C\nteh.c
-	$(CC) -c $(MFLAGS) $C\nteh
-
-os.obj : $C\os.c
-	$(CC) -c $(MFLAGS) $C\os
-
-out.obj : $C\out.c
-	$(CC) -c $(MFLAGS) $C\out
-
-outbuf.obj : $C\outbuf.h $C\outbuf.c
-	$(CC) -c $(MFLAGS) $C\outbuf
-
-ph.obj : ph.c
-	$(CC) -c $(MFLAGS) ph
-
-ptrntab.obj : $C\iasm.h $C\ptrntab.c
-	$(CC) -c $(MFLAGS) $C\ptrntab
-
-rtlsym.obj : $C\rtlsym.h $C\rtlsym.c
-	$(CC) -c $(MFLAGS) $C\rtlsym
-
-ti_achar.obj : $C\tinfo.h $C\ti_achar.c
-	$(CC) -c $(MFLAGS) -I. $C\ti_achar
-
-toctype.obj : $(CH) $(TOTALH) $C\rtlsym.h mars.h module.h toctype.c
-	$(CC) -c $(MFLAGS) -I$(ROOT) toctype
-
-tocvdebug.obj : $(CH) $(TOTALH) $C\rtlsym.h mars.h module.h tocvdebug.c
-	$(CC) -c $(MFLAGS) -I$(ROOT) tocvdebug
-
-toobj.obj : $(CH) $(TOTALH) mars.h module.h toobj.c
-	$(CC) -c $(MFLAGS) -I$(ROOT) toobj
-
-type.obj : $C\type.c
-	$(CC) -c $(MFLAGS) $C\type
-
-typinf.obj : $(CH) $(TOTALH) $C\rtlsym.h mars.h module.h typinf.c
-	$(CC) -c $(MFLAGS) -I$(ROOT) typinf
-
-todt.obj : mtype.h expression.h $C\dt.h todt.c
-	$(CC) -c -I$(ROOT) $(MFLAGS) todt
-
-s2ir.obj : $C\rtlsym.h statement.h s2ir.c
-	$(CC) -c -I$(ROOT) $(MFLAGS) s2ir
-
-e2ir.obj : $C\rtlsym.h expression.h toir.h e2ir.c
-	$(CC) -c -I$(ROOT) $(MFLAGS) e2ir
-
-toir.obj : $C\rtlsym.h expression.h toir.h toir.c
-	$(CC) -c -I$(ROOT) $(MFLAGS) toir
-
-tocsym.obj : $(CH) $(TOTALH) mars.h module.h tocsym.c
-	$(CC) -c $(MFLAGS) -I$(ROOT) tocsym
-
-util.obj : util.c
-	$(CC) -c $(MFLAGS) util
-
-var.obj : $C\var.c optab.c
-	$(CC) -c $(MFLAGS) -I. $C\var
-
-
-tk.obj : tk.c
-	$(CC) -c $(MFLAGS) tk.c
-
-# ROOT
-
-array.obj : $(ROOT)\array.c
-	$(CC) -c $(CFLAGS) $(ROOT)\array.c
-
-async.obj : $(ROOT)\async.h $(ROOT)\async.c
-	$(CC) -c $(CFLAGS) $(ROOT)\async.c
-
-dchar.obj : $(ROOT)\dchar.c
-	$(CC) -c $(CFLAGS) $(ROOT)\dchar.c
-
-gnuc.obj : $(ROOT)\gnuc.c
-	$(CC) -c $(CFLAGS) $(ROOT)\gnuc.c
-
-lstring.obj : $(ROOT)\lstring.c
-	$(CC) -c $(CFLAGS) $(ROOT)\lstring.c
-
-man.obj : $(ROOT)\man.c
-	$(CC) -c $(CFLAGS) $(ROOT)\man.c
-
-rmem.obj : $(ROOT)\rmem.c
-	$(CC) -c $(CFLAGS) $(ROOT)\rmem.c
-
-port.obj : $(ROOT)\port.c
-	$(CC) -c $(CFLAGS) $(ROOT)\port.c
-
-root.obj : $(ROOT)\root.c
-	$(CC) -c $(CFLAGS) $(ROOT)\root.c
-
-response.obj : $(ROOT)\response.c
-	$(CC) -c $(CFLAGS) $(ROOT)\response.c
-
-stringtable.obj : $(ROOT)\stringtable.c
-	$(CC) -c $(CFLAGS) $(ROOT)\stringtable.c
-
-
-################# Source file dependencies ###############
-
-access.obj : $(TOTALH) enum.h aggregate.h init.h attrib.h access.c
-aliasthis.obj : $(TOTALH) aliasthis.h aliasthis.c
-arrayop.obj : $(TOTALH) identifier.h declaration.h arrayop.c
-attrib.obj : $(TOTALH) identifier.h declaration.h attrib.h attrib.c
-builtin.obj : $(TOTALH) builtin.c
-cast.obj : $(TOTALH) expression.h mtype.h cast.c
-class.obj : $(TOTALH) enum.h class.c
-clone.obj : $(TOTALH) clone.c
-constfold.obj : $(TOTALH) expression.h constfold.c
-cond.obj : $(TOTALH) identifier.h declaration.h cond.h cond.c
-declaration.obj : $(TOTALH) identifier.h attrib.h declaration.h declaration.c
-delegatize.obj : $(TOTALH) delegatize.c
-doc.obj : $(TOTALH) doc.h doc.c
-enum.obj : $(TOTALH) identifier.h enum.h enum.c
-expression.obj : $(TOTALH) expression.h expression.c
-func.obj : $(TOTALH) identifier.h attrib.h declaration.h func.c
-hdrgen.obj : $(TOTALH) hdrgen.h hdrgen.c
-id.obj : $(TOTALH) id.h id.c
-identifier.obj : $(TOTALH) identifier.h identifier.c
-import.obj : $(TOTALH) dsymbol.h import.h import.c
-inifile.obj : $(TOTALH) inifile.c
-init.obj : $(TOTALH) init.h init.c
-inline.obj : $(TOTALH) inline.c
-interpret.obj : $(TOTALH) interpret.c
-json.obj : $(TOTALH) json.h json.c
-lexer.obj : $(TOTALH) lexer.c
-libomf.obj : $(TOTALH) lib.h libomf.c
-link.obj : $(TOTALH) link.c
-macro.obj : $(TOTALH) macro.h macro.c
-mangle.obj : $(TOTALH) dsymbol.h declaration.h mangle.c
-#module.obj : $(TOTALH) mars.h $C\html.h module.h module.c
-opover.obj : $(TOTALH) expression.h opover.c
-optimize.obj : $(TOTALH) expression.h optimize.c
-parse.obj : $(TOTALH) attrib.h lexer.h parse.h parse.c
-scope.obj : $(TOTALH) scope.h scope.c
-statement.obj : $(TOTALH) statement.h statement.c
-staticassert.obj : $(TOTALH) staticassert.h staticassert.c
-struct.obj : $(TOTALH) identifier.h enum.h struct.c
-traits.obj : $(TOTALH) traits.c
-dsymbol.obj : $(TOTALH) identifier.h dsymbol.h dsymbol.c
-mtype.obj : $(TOTALH) mtype.h mtype.c
-#typinf.obj : $(TOTALH) mtype.h typinf.c
-utf.obj : utf.h utf.c
-template.obj : $(TOTALH) template.h template.c
-version.obj : $(TOTALH) identifier.h dsymbol.h cond.h version.h version.c
-
-################### Utilities ################
-
-clean:
-	del *.obj
-	del total.sym
-	del msgs.h msgs.c
-	del elxxx.c cdxxx.c optab.c debtab.c fltables.c tytab.c
-	del impcnvtab.c
-
-zip : $(MAKEFILES)
-	del dmdsrc.zip
-	zip32 dmdsrc $(MAKEFILES)
-	zip32 dmdsrc $(SRCS)
-	zip32 dmdsrc $(BACKSRC)
-	zip32 dmdsrc $(TKSRC)
-	zip32 dmdsrc $(ROOTSRC)
-
-################### Install ################
-
-install:
-	copy dmd.exe $(DIR)\windows\bin\ 
-	copy phobos\phobos.lib $(DIR)\windows\lib 
-	$(CP) $(SRCS) $(DIR)\src\dmd\ 
-	$(CP) $(ROOTSRC) $(DIR)\src\dmd\root\ 
-	$(CP) $(TKSRC) $(DIR)\src\dmd\tk\  
-	$(CP) $(BACKSRC) $(DIR)\src\dmd\backend\  
-	$(CP) $(MAKEFILES) $(DIR)\src\dmd\  
-	copy gpl.txt $(DIR)\src\dmd\ 
-	copy readme.txt $(DIR)\src\dmd\ 
-	copy artistic.txt $(DIR)\src\dmd\ 
-	copy backendlicense.txt $(DIR)\src\dmd\ 
-
-################### Write to SVN ################
-
-svn:
-	$(CP) $(SRCS) $(DMDSVN)\ 
-	$(CP) $(ROOTSRC) $(DMDSVN)\root\ 
-	$(CP) $(TKSRC) $(DMDSVN)\tk\  
-	$(CP) $(BACKSRC) $(DMDSVN)\backend\  
-	$(CP) $(MAKEFILES) $(DMDSVN)\  
-	copy gpl.txt $(DMDSVN)\ 
-	copy readme.txt $(DMDSVN)\ 
-	copy artistic.txt $(DMDSVN)\ 
-	copy backendlicense.txt $(DMDSVN)\ 
-
-###################################