diff --git a/.gitignore b/.gitignore index 96d1d75c77..944fd79fcb 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ src/cdxxx.c src/debtab.c src/dmd +src/dmd_frontend src/ddmd src/dmd.conf src/elxxx.c @@ -18,6 +19,7 @@ test/test_results *.obj src/idgen.exe src/dmd.exe +src/dmd_frontend.exe src/optabgen.exe src/verstr.h *.map diff --git a/src/aggregate.d b/src/aggregate.d index 145d7ad353..9c847df612 100644 --- a/src/aggregate.d +++ b/src/aggregate.d @@ -11,7 +11,7 @@ module ddmd.aggregate; import core.stdc.stdio; import ddmd.access; import ddmd.arraytypes; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.clone; import ddmd.dclass; import ddmd.declaration; diff --git a/src/arraytypes.d b/src/arraytypes.d index ee7cef07f0..036d7b8572 100644 --- a/src/arraytypes.d +++ b/src/arraytypes.d @@ -9,7 +9,7 @@ module ddmd.arraytypes; import ddmd.aggregate; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.dclass; import ddmd.declaration; import ddmd.dmodule; diff --git a/src/backend.d b/src/backend.d index eee30fbd41..73fd1c4692 100644 --- a/src/backend.d +++ b/src/backend.d @@ -8,33 +8,14 @@ module ddmd.backend; -import ddmd.aggregate; -import ddmd.dmodule; -import ddmd.dscope; -import ddmd.expression; -import ddmd.lib; -import ddmd.mtype; -import ddmd.root.file; - struct Symbol; struct code; struct block; struct Blockx; struct elem; -extern extern (C++) void backend_init(); -extern extern (C++) void backend_term(); -extern extern (C++) void obj_start(char* srcfile); -extern extern (C++) void obj_end(Library library, File* objfile); -extern extern (C++) void obj_write_deferred(Library library); - -extern extern (C++) void genObjFile(Module m, bool multiobj); - -extern extern (C++) Symbol* toInitializer(AggregateDeclaration sd); - // type.h - alias tym_t = uint; alias mangle_t = ubyte; alias targ_size_t = ulong; diff --git a/src/dclass.d b/src/dclass.d index d917db38a8..cf44b3ee2e 100644 --- a/src/dclass.d +++ b/src/dclass.d @@ -11,7 +11,7 @@ module ddmd.dclass; import core.stdc.string; import ddmd.aggregate; import ddmd.arraytypes; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.clone; import ddmd.declaration; import ddmd.dmodule; diff --git a/src/denum.d b/src/denum.d index fa6797a30f..74034189a7 100644 --- a/src/denum.d +++ b/src/denum.d @@ -10,7 +10,7 @@ module ddmd.denum; import core.stdc.stdio; import ddmd.access; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.declaration; import ddmd.dmodule; import ddmd.doc; diff --git a/src/dmodule.d b/src/dmodule.d index f1d9dbb1b9..d6636cdee7 100644 --- a/src/dmodule.d +++ b/src/dmodule.d @@ -13,7 +13,7 @@ import core.stdc.stdlib; import core.stdc.string; import ddmd.aggregate; import ddmd.arraytypes; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.dimport; import ddmd.dmacro; import ddmd.doc; diff --git a/src/dstruct.d b/src/dstruct.d index 93175f49c8..1e2a337ccd 100644 --- a/src/dstruct.d +++ b/src/dstruct.d @@ -11,7 +11,7 @@ module ddmd.dstruct; import ddmd.aggregate; import ddmd.argtypes; import ddmd.arraytypes; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.clone; import ddmd.declaration; import ddmd.dmodule; diff --git a/src/dsymbol.d b/src/dsymbol.d index f7bd2d8ded..11de3950ab 100644 --- a/src/dsymbol.d +++ b/src/dsymbol.d @@ -15,7 +15,7 @@ import ddmd.aggregate; import ddmd.aliasthis; import ddmd.arraytypes; import ddmd.attrib; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.dclass; import ddmd.declaration; import ddmd.denum; diff --git a/src/dtemplate.d b/src/dtemplate.d index da268cbd01..9362846312 100644 --- a/src/dtemplate.d +++ b/src/dtemplate.d @@ -15,7 +15,7 @@ import ddmd.aggregate; import ddmd.aliasthis; import ddmd.arraytypes; import ddmd.attrib; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.dcast; import ddmd.dclass; import ddmd.declaration; diff --git a/src/expression.d b/src/expression.d index 746e3c0332..976441167b 100644 --- a/src/expression.d +++ b/src/expression.d @@ -19,7 +19,7 @@ import ddmd.argtypes; import ddmd.arrayop; import ddmd.arraytypes; import ddmd.attrib; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.canthrow; import ddmd.clone; import ddmd.complex; diff --git a/src/func.d b/src/func.d index a6c25d1aa8..10b4da80f0 100644 --- a/src/func.d +++ b/src/func.d @@ -13,7 +13,7 @@ import core.stdc.string; import ddmd.aggregate; import ddmd.arraytypes; import ddmd.attrib; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.builtin; import ddmd.ctfeexpr; import ddmd.dclass; @@ -48,8 +48,6 @@ import ddmd.target; import ddmd.tokens; import ddmd.visitor; -extern extern (C++) RET retStyle(TypeFunction tf); - enum ILS : int { ILSuninitialized, // not computed yet diff --git a/src/gluelayer.d b/src/gluelayer.d new file mode 100644 index 0000000000..1b12cb81a1 --- /dev/null +++ b/src/gluelayer.d @@ -0,0 +1,121 @@ +// Compiler implementation of the D programming language +// Copyright (c) 1999-2015 by Digital Mars +// All Rights Reserved +// written by Walter Bright +// http://www.digitalmars.com +// Distributed under the Boost Software License, Version 1.0. +// http://www.boost.org/LICENSE_1_0.txt + +module ddmd.gluelayer; + +import ddmd.aggregate; +import ddmd.dmodule; +import ddmd.dscope; +import ddmd.dsymbol; +import ddmd.expression; +import ddmd.lib; +import ddmd.mtype; +import ddmd.statement; +import ddmd.root.file; + +version (NoBackend) +{ + struct Symbol; + struct code; + struct block; + struct Blockx; + struct elem; + struct TYPE; + alias type = TYPE; + + // tocsym + + extern (C++) Symbol* toInitializer(AggregateDeclaration ad) + { + return null; + } + + // glue + + extern (C++) void obj_write_deferred(Library library) + { + } + + extern (C++) void obj_start(char* srcfile) + { + } + + extern (C++) void obj_end(Library library, File* objfile) + { + } + + extern (C++) void genObjFile(Module m, bool multiobj) + { + } + + // msc + + extern (C++) void backend_init() + { + } + + extern (C++) void backend_term() + { + } + + // iasm + + extern (C++) Statement asmSemantic(AsmStatement s, Scope* sc) + { + assert(0); + } + + // toir + + extern (C++) RET retStyle(TypeFunction tf) + { + return RETregs; + } + + extern (C++) void toObjFile(Dsymbol ds, bool multiobj) + { + } + + version (OSX) + { + extern(C++) void objc_initSymbols() + { + } + } +} +else +{ + import ddmd.backend; + + alias Symbol = ddmd.backend.Symbol; + alias code = ddmd.backend.code; + alias block = ddmd.backend.block; + alias Blockx = ddmd.backend.Blockx; + alias elem = ddmd.backend.elem; + alias type = ddmd.backend.type; + + extern extern (C++) Symbol* toInitializer(AggregateDeclaration sd); + + extern extern (C++) void obj_write_deferred(Library library); + extern extern (C++) void obj_start(char* srcfile); + extern extern (C++) void obj_end(Library library, File* objfile); + extern extern (C++) void genObjFile(Module m, bool multiobj); + + extern extern (C++) void backend_init(); + extern extern (C++) void backend_term(); + + extern extern (C++) Statement asmSemantic(AsmStatement s, Scope* sc); + + extern extern (C++) RET retStyle(TypeFunction tf); + extern extern (C++) void toObjFile(Dsymbol ds, bool multiobj); + + version (OSX) + { + extern(C++) void objc_initSymbols(); + } +} diff --git a/src/gluestub.d b/src/gluestub.d deleted file mode 100644 index 895af3b02e..0000000000 --- a/src/gluestub.d +++ /dev/null @@ -1,73 +0,0 @@ -/* Compiler implementation of the D programming language - * Copyright (c) 1999-2014 by Digital Mars - * All Rights Reserved - * http://www.digitalmars.com - * Distributed under the Boost Software License, Version 1.0. - * http://www.boost.org/LICENSE_1_0.txt - * https://github.com/D-Programming-Language/dmd/blob/master/src/gluestub.c - */ - -module ddmd.gluestub; - -import ddmd.backend; -import ddmd.aggregate; -import ddmd.dmodule; -import ddmd.dscope; -import ddmd.dsymbol; -import ddmd.lib; -import ddmd.mtype; -import ddmd.root.file; -import ddmd.statement; - -// tocsym - -extern (C++) Symbol* toInitializer(AggregateDeclaration ad) -{ - return null; -} - -// glue - -extern (C++) void obj_write_deferred(Library library) -{ -} - -extern (C++) void obj_start(char* srcfile) -{ -} - -extern (C++) void obj_end(Library library, File* objfile) -{ -} - -extern (C++) void genObjFile(Module m, bool multiobj) -{ -} - -// msc - -extern (C++) void backend_init() -{ -} - -extern (C++) void backend_term() -{ -} - -// iasm - -extern (C++) Statement asmSemantic(AsmStatement s, Scope* sc) -{ - assert(0); -} - -// toir - -extern (C++) RET retStyle(TypeFunction tf) -{ - return RETregs; -} - -extern (C++) void toObjFile(Dsymbol ds, bool multiobj) -{ -} diff --git a/src/mars.d b/src/mars.d index e769d1b408..2fd9733a9e 100644 --- a/src/mars.d +++ b/src/mars.d @@ -16,7 +16,7 @@ import core.stdc.stdio; import core.stdc.stdlib; import core.stdc.string; import ddmd.arraytypes; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.builtin; import ddmd.cond; import ddmd.dinifile; diff --git a/src/mtype.d b/src/mtype.d index fc0a2edb96..a990c902af 100644 --- a/src/mtype.d +++ b/src/mtype.d @@ -22,7 +22,7 @@ import ddmd.aliasthis; import ddmd.argtypes; import ddmd.arraytypes; import ddmd.attrib; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.complex; import ddmd.ctfeexpr; import ddmd.dcast; diff --git a/src/objc.d b/src/objc.d index 794c284f67..d80cbf1fff 100644 --- a/src/objc.d +++ b/src/objc.d @@ -18,14 +18,13 @@ import ddmd.dstruct; import ddmd.expression; import ddmd.func; import ddmd.globals; +import ddmd.gluelayer; import ddmd.id; import ddmd.identifier; import ddmd.mtype; import ddmd.root.outbuffer; import ddmd.root.stringtable; -extern(C++) void objc_initSymbols(); - struct ObjcSelector { // MARK: Selector diff --git a/src/posix.mak b/src/posix.mak index 2e926da8a2..3b19d132d0 100644 --- a/src/posix.mak +++ b/src/posix.mak @@ -179,20 +179,20 @@ endif endif -DMD_SRCS=$(addsuffix .d,access aggregate aliasthis apply argtypes arrayop \ - arraytypes attrib backend builtin canthrow clone complex cond constfold \ +FRONT_SRCS=$(addsuffix .d,access aggregate aliasthis apply argtypes arrayop \ + arraytypes attrib builtin canthrow clone complex cond constfold \ cppmangle ctfeexpr dcast dclass declaration delegatize denum dimport \ dinifile dinterpret dmacro dmangle dmodule doc dscope dstruct dsymbol \ dtemplate dunittest dversion entity errors escape expression func \ globals hdrgen id identifier impcnvtab imphint init inline intrange \ json lexer lib link mars mtype nogc nspace opover optimize parse sapply \ sideeffect statement staticassert target tokens traits utf visitor \ - typinf irstate toelfdebug toctype) + typinf) ifeq ($(D_OBJC),1) - DMD_SRCS += objc.d + FRONT_SRCS += objc.d else - DMD_SRCS += objc_stubs.d + FRONT_SRCS += objc_stubs.d endif ROOT_SRCS = $(addsuffix .d,$(addprefix $(ROOT)/,aav array file filename \ @@ -210,11 +210,15 @@ else endif ifeq (osx,$(OS)) - DMD_SRCS += libmach.d scanmach.d + FRONT_SRCS += libmach.d scanmach.d else - DMD_SRCS += libelf.d scanelf.d + FRONT_SRCS += libelf.d scanelf.d endif +GLUE_SRCS=$(addsuffix .d,backend irstate toelfdebug toctype gluelayer) + +DMD_SRCS=$(FRONT_SRCS) $(GLUE_SRCS) + BACK_OBJS = go.o gdag.o gother.o gflow.o gloop.o var.o el.o \ glocal.o os.o nteh.o evalu8.o cgcs.o \ rtlsym.o cgelem.o cgen.o cgreg.o out.o \ @@ -285,7 +289,7 @@ DEPS = $(patsubst %.o,%.deps,$(DMD_OBJS) $(GLUE_OBJS) $(BACK_OBJS)) all: dmd -auto-tester-build: dmd checkwhitespace +auto-tester-build: dmd checkwhitespace dmd_frontend .PHONY: auto-tester-build glue.a: $(GLUE_OBJS) @@ -294,6 +298,9 @@ glue.a: $(GLUE_OBJS) backend.a: $(BACK_OBJS) $(AR) rcs backend.a $(BACK_OBJS) +dmd_frontend: $(FRONT_SRCS) gluelayer.d $(ROOT_SRCS) newdelete.o $(STRING_IMPORT_FILES) $(HOST_DMD_PATH) + CC=$(HOST_CC) $(HOST_DMD_RUN) -of$@ $(MODEL_FLAG) -vtls -J. -L-lstdc++ $(DFLAGS) $(filter-out $(STRING_IMPORT_FILES) $(HOST_DMD_PATH),$^) -version=NoBackend + ifdef ENABLE_LTO dmd: $(DMD_SRCS) $(ROOT_SRCS) newdelete.o $(GLUE_OBJS) $(BACK_OBJS) $(STRING_IMPORT_FILES) $(HOST_DMD_PATH) CC=$(HOST_CC) $(HOST_DMD_RUN) -of$@ $(MODEL_FLAG) -vtls -J. -L-lstdc++ $(DFLAGS) $(filter-out $(STRING_IMPORT_FILES) $(HOST_DMD_PATH),$^) diff --git a/src/statement.d b/src/statement.d index 905c1d896f..4181869f77 100644 --- a/src/statement.d +++ b/src/statement.d @@ -15,7 +15,7 @@ import ddmd.aliasthis; import ddmd.arrayop; import ddmd.arraytypes; import ddmd.attrib; -import ddmd.backend; +import ddmd.gluelayer; import ddmd.canthrow; import ddmd.clone; import ddmd.cond; @@ -54,8 +54,6 @@ import ddmd.target; import ddmd.tokens; import ddmd.visitor; -extern extern (C++) Statement asmSemantic(AsmStatement s, Scope* sc); - extern (C++) Identifier fixupLabelName(Scope* sc, Identifier ident) { uint flags = (sc.flags & SCOPEcontract); diff --git a/src/typinf.d b/src/typinf.d index caa574beb5..1340a4e5f2 100644 --- a/src/typinf.d +++ b/src/typinf.d @@ -15,11 +15,10 @@ import ddmd.dstruct; import ddmd.dsymbol; import ddmd.errors; import ddmd.globals; +import ddmd.gluelayer; import ddmd.mtype; import ddmd.visitor; -extern (C++) void toObjFile(Dsymbol ds, bool multiobj); - /**************************************************** * Get the exact TypeInfo. */ diff --git a/src/win32.mak b/src/win32.mak index 13f0f03e92..e2bdab2399 100644 --- a/src/win32.mak +++ b/src/win32.mak @@ -136,9 +136,8 @@ DMDMAKE=$(MAKE) -fwin32.mak C=$C TK=$(TK) ROOT=$(ROOT) HOST_DC="$(HOST_DC)" ############################### Rule Variables ############################### # D front end -# mars.obj -DMD_SRCS=access.d aggregate.d aliasthis.d apply.d argtypes.d arrayop.d \ - arraytypes.d attrib.d backend.d builtin.d canthrow.d clone.d complex.d \ +FRONT_SRCS=access.d aggregate.d aliasthis.d apply.d argtypes.d arrayop.d \ + arraytypes.d attrib.d builtin.d canthrow.d clone.d complex.d \ cond.d constfold.d cppmangle.d ctfeexpr.d dcast.d dclass.d \ declaration.d delegatize.d denum.d dimport.d dinifile.d dinterpret.d \ dmacro.d dmangle.d dmodule.d doc.d dscope.d dstruct.d dsymbol.d \ @@ -148,7 +147,11 @@ DMD_SRCS=access.d aggregate.d aliasthis.d apply.d argtypes.d arrayop.d \ mars.d mtype.d nogc.d nspace.d objc_stubs.d opover.d optimize.d parse.d \ sapply.d sideeffect.d statement.d staticassert.d target.d tokens.d \ traits.d utf.d visitor.d libomf.d scanomf.d typinf.d \ - libmscoff.d scanmscoff.d irstate.d toctype.d + libmscoff.d scanmscoff.d + +GLUE_SRCS=irstate.d toctype.d backend.d gluelayer.d + +DMD_SRCS=$(FRONT_SRCS) $(GLUE_SRCS) # Glue layer GLUEOBJ=glue.obj msc.obj s2ir.obj todt.obj e2ir.obj tocsym.obj \ @@ -188,7 +191,8 @@ GLUESRC= glue.c msc.c s2ir.c todt.c e2ir.c tocsym.c \ toobj.c tocvdebug.c toir.h toir.c \ irstate.h iasm.c \ toelfdebug.d libelf.d scanelf.d libmach.d scanmach.d \ - tk.c eh.c objc_glue_stubs.c objc_glue.c gluestub.d + tk.c eh.c objc_glue_stubs.c objc_glue.c \ + $(GLUE_SRCS) # D back end BACKSRC= $C\cdef.h $C\cc.h $C\oper.h $C\ty.h $C\optabgen.c \ @@ -244,7 +248,7 @@ MAKEFILES=win32.mak posix.mak osmodel.mak defaulttarget: debdmd -auto-tester-build: dmd checkwhitespace +auto-tester-build: dmd checkwhitespace dmd_frontend.exe dmd: reldmd @@ -272,6 +276,9 @@ backend.lib : $(BACKOBJ) LIBS= glue.lib backend.lib +dmd_frontend.exe: $(FRONT_SRCS) gluelayer.d $(ROOT_SRCS) newdelete.obj verstr.h + $(HOST_DC) $(DSRC) -of$@ -vtls -J. -L/STACK:8388608 $(DFLAGS) $(FRONT_SRCS) gluelayer.d $(ROOT_SRCS) newdelete.obj -version=NoBackend + $(TARGETEXE): $(DMD_SRCS) $(ROOT_SRCS) newdelete.obj $(LIBS) verstr.h $(HOST_DC) $(DSRC) -of$@ -vtls -J. -L/STACK:8388608 $(DFLAGS) $(DMD_SRCS) $(ROOT_SRCS) newdelete.obj $(LIBS)