changeset 389:722f5e90c39c

Made setup for runtime calls in dmd frontend allocate less.
author Christian Kamm <kamm incasoftware de>
date Thu, 24 Jul 2008 18:51:36 +0200
parents eb110c4730c0
children e04389bafb3e
files dmd/mtype.c dmd/statement.c
diffstat 2 files changed, 129 insertions(+), 67 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/mtype.c	Thu Jul 24 18:21:48 2008 +0200
+++ b/dmd/mtype.c	Thu Jul 24 18:51:36 2008 +0200
@@ -1539,19 +1539,28 @@
     if (ident == Id::reverse && (n->ty == Tchar || n->ty == Twchar))
     {
 	Expression *ec;
-	FuncDeclaration *fd;
 	Expressions *arguments;
-	char *nm;
-	static char *name[2] = { "_adReverseChar", "_adReverseWchar" };
-
-	nm = name[n->ty == Twchar];
+
 	//LLVMDC: Build arguments.
-	Arguments* args = new Arguments;
-	Type* arrty = n->ty == Twchar ? Type::twchar->arrayOf() : Type::tchar->arrayOf();
-	args->push(new Argument(STCin, arrty, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, arrty, nm);
-
-	ec = new VarExp(0, fd);
+	static FuncDeclaration *adReverseChar_fd = NULL;
+	if(!adReverseChar_fd) {
+	    Arguments* args = new Arguments;
+	    Type* arrty = Type::tchar->arrayOf();
+	    args->push(new Argument(STCin, arrty, NULL, NULL));
+	    adReverseChar_fd = FuncDeclaration::genCfunc(args, arrty, "_adReverseChar");
+	}
+	static FuncDeclaration *adReverseWchar_fd = NULL;
+	if(!adReverseWchar_fd) {
+	    Arguments* args = new Arguments;
+	    Type* arrty = Type::twchar->arrayOf();
+	    args->push(new Argument(STCin, arrty, NULL, NULL));
+	    adReverseWchar_fd = FuncDeclaration::genCfunc(args, arrty, "_adReverseWchar");
+	}
+
+	if(n->ty == Twchar)
+	    ec = new VarExp(0, adReverseWchar_fd);
+	else
+	    ec = new VarExp(0, adReverseChar_fd);
 	e = e->castTo(sc, n->arrayOf());	// convert to dynamic array
 	arguments = new Expressions();
 	arguments->push(e);
@@ -1561,19 +1570,28 @@
     else if (ident == Id::sort && (n->ty == Tchar || n->ty == Twchar))
     {
 	Expression *ec;
-	FuncDeclaration *fd;
 	Expressions *arguments;
-	char *nm;
-	static char *name[2] = { "_adSortChar", "_adSortWchar" };
-
-	nm = name[n->ty == Twchar];
+
 	//LLVMDC: Build arguments.
-	Arguments* args = new Arguments;
-	Type* arrty = n->ty == Twchar ? Type::twchar->arrayOf() : Type::tchar->arrayOf();
-	args->push(new Argument(STCin, arrty, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, arrty, nm);
-
-	ec = new VarExp(0, fd);
+	static FuncDeclaration *adSortChar_fd = NULL;
+	if(!adSortChar_fd) {
+	    Arguments* args = new Arguments;
+	    Type* arrty = Type::tchar->arrayOf();
+	    args->push(new Argument(STCin, arrty, NULL, NULL));
+	    adSortChar_fd = FuncDeclaration::genCfunc(args, arrty, "_adSortChar");
+	}
+	static FuncDeclaration *adSortWchar_fd = NULL;
+	if(!adSortWchar_fd) {
+	    Arguments* args = new Arguments;
+	    Type* arrty = Type::twchar->arrayOf();
+	    args->push(new Argument(STCin, arrty, NULL, NULL));
+	    adSortWchar_fd = FuncDeclaration::genCfunc(args, arrty, "_adSortWchar");
+	}
+
+	if(n->ty == Twchar)
+	    ec = new VarExp(0, adSortWchar_fd);
+	else
+	    ec = new VarExp(0, adSortChar_fd);
 	e = e->castTo(sc, n->arrayOf());	// convert to dynamic array
 	arguments = new Expressions();
 	arguments->push(e);
@@ -1583,7 +1601,6 @@
     else if (ident == Id::reverse || ident == Id::dup)
     {
 	Expression *ec;
-	FuncDeclaration *fd;
 	Expressions *arguments;
 	int size = next->size(e->loc);
 	int dup;
@@ -1591,16 +1608,25 @@
 	assert(size);
 	dup = (ident == Id::dup);
 	//LLVMDC: Build arguments.
-	Arguments* args = new Arguments;
-	if(dup) {
+	static FuncDeclaration *adDup_fd = NULL;
+	if(!adDup_fd) {
+	    Arguments* args = new Arguments;
 	    args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
 	    args->push(new Argument(STCin, Type::topaque->arrayOf(), NULL, NULL));
-	} else {
+	    adDup_fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), Id::adDup);
+	}
+	static FuncDeclaration *adReverse_fd = NULL;
+	if(!adReverse_fd) {
+	    Arguments* args = new Arguments;
 	    args->push(new Argument(STCin, Type::topaque->arrayOf(), NULL, NULL));
 	    args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
+	    adReverse_fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), Id::adReverse);
 	}
-	fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), dup ? Id::adDup : Id::adReverse);
-	ec = new VarExp(0, fd);
+
+	if(dup)
+	    ec = new VarExp(0, adDup_fd);
+	else
+	    ec = new VarExp(0, adReverse_fd);
 	e = e->castTo(sc, n->arrayOf());	// convert to dynamic array
 	arguments = new Expressions();
 	if (dup)
@@ -1614,16 +1640,29 @@
     else if (ident == Id::sort)
     {
 	Expression *ec;
-	FuncDeclaration *fd;
 	Expressions *arguments;
+	bool isBit = (n->ty == Tbit);
 
 	//LLVMDC: Build arguments.
-	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::topaque->arrayOf(), NULL, NULL));
-	args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(),
-		(char*)(n->ty == Tbit ? "_adSortBit" : "_adSort"));
-	ec = new VarExp(0, fd);
+	static FuncDeclaration *adSort_fd = NULL;
+	if(!adSort_fd) {
+	    Arguments* args = new Arguments;
+	    args->push(new Argument(STCin, Type::topaque->arrayOf(), NULL, NULL));
+	    args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
+	    adSort_fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), "_adSort");
+	}
+	static FuncDeclaration *adSortBit_fd = NULL;
+	if(!adSortBit_fd) {
+	    Arguments* args = new Arguments;
+	    args->push(new Argument(STCin, Type::topaque->arrayOf(), NULL, NULL));
+	    args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
+	    adSortBit_fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), "_adSortBit");
+	}
+
+	if(isBit)
+	    ec = new VarExp(0, adSortBit_fd);
+	else
+	    ec = new VarExp(0, adSort_fd);
 	e = e->castTo(sc, n->arrayOf());	// convert to dynamic array
 	arguments = new Expressions();
 	arguments->push(e);
@@ -2293,33 +2332,39 @@
     if (ident == Id::length)
     {
 	Expression *ec;
-	FuncDeclaration *fd;
 	Expressions *arguments;
 
 	//LLVMDC: Build arguments.
-	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::tsize_t, Id::aaLen);
-	ec = new VarExp(0, fd);
+	static FuncDeclaration *aaLen_fd = NULL;
+	if(!aaLen_fd) {
+	    Arguments* args = new Arguments;
+	    args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
+	    aaLen_fd = FuncDeclaration::genCfunc(args, Type::tsize_t, Id::aaLen);
+	}
+
+	ec = new VarExp(0, aaLen_fd);
 	arguments = new Expressions();
 	arguments->push(e);
 	e = new CallExp(e->loc, ec, arguments);
-	e->type = fd->type->next;
+	e->type = aaLen_fd->type->next;
     }
     else if (ident == Id::keys)
     {
 	Expression *ec;
-	FuncDeclaration *fd;
 	Expressions *arguments;
 	int size = key->size(e->loc);
 
 	assert(size);
 	//LLVMDC: Build arguments.
-	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
-	args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), Id::aaKeys);
-	ec = new VarExp(0, fd);
+	static FuncDeclaration *aaKeys_fd = NULL;
+	if(!aaKeys_fd) {
+	    Arguments* args = new Arguments;
+	    args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
+	    args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
+	    aaKeys_fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), Id::aaKeys);
+	}
+
+	ec = new VarExp(0, aaKeys_fd);
 	arguments = new Expressions();
 	arguments->push(e);
 	arguments->push(new IntegerExp(0, size, Type::tsize_t));
@@ -2329,16 +2374,19 @@
     else if (ident == Id::values)
     {
 	Expression *ec;
-	FuncDeclaration *fd;
 	Expressions *arguments;
 
 	//LLVMDC: Build arguments.
-	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
-	args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
-	args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), Id::aaValues);
-	ec = new VarExp(0, fd);
+	static FuncDeclaration *aaValues_fd = NULL;
+	if(!aaValues_fd) {
+	    Arguments* args = new Arguments;
+	    args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
+	    args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
+	    args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
+	    aaValues_fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), Id::aaValues);
+	}
+
+	ec = new VarExp(0, aaValues_fd);
 	arguments = new Expressions();
 	arguments->push(e);
 	size_t keysize = key->size(e->loc);
@@ -2351,15 +2399,18 @@
     else if (ident == Id::rehash)
     {
 	Expression *ec;
-	FuncDeclaration *fd;
 	Expressions *arguments;
 
 	//LLVMDC: Build arguments.
-	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
-	args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::tvoidptr, Id::aaRehash);
-	ec = new VarExp(0, fd);
+	static FuncDeclaration *aaRehash_fd = NULL;
+	if(!aaRehash_fd) {
+	    Arguments* args = new Arguments;
+	    args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
+	    args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
+	    aaRehash_fd = FuncDeclaration::genCfunc(args, Type::tvoidptr, Id::aaRehash);
+	}
+
+	ec = new VarExp(0, aaRehash_fd);
 	arguments = new Expressions();
 	arguments->push(e->addressOf(sc));
 	arguments->push(key->getInternalTypeInfo(sc));
--- a/dmd/statement.c	Thu Jul 24 18:21:48 2008 +0200
+++ b/dmd/statement.c	Thu Jul 24 18:51:36 2008 +0200
@@ -1599,22 +1599,33 @@
 		 *	_aaApply(aggr, keysize, flde)
 		 */
 		//LLVMDC: Build arguments.
-		Arguments* args = new Arguments;
-		args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
-		args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
-		if (dim == 2) {
+		static FuncDeclaration *aaApply2_fd = NULL;
+		if(!aaApply2_fd) {
+		    Arguments* args = new Arguments;
+		    args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
+		    args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
 		    Arguments* dgargs = new Arguments;
 		    dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL));
 		    dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL));
 		    TypeDelegate* dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd));
 		    args->push(new Argument(STCin, dgty, NULL, NULL));
-		    fdapply = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply2");
-		} else {
+		    aaApply2_fd = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply2");
+		}
+		static FuncDeclaration *aaApply_fd = NULL;
+		if(!aaApply_fd) {
+		    Arguments* args = new Arguments;
+		    args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
+		    args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
 		    Arguments* dgargs = new Arguments;
 		    dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL));
 		    TypeDelegate* dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd));
 		    args->push(new Argument(STCin, dgty, NULL, NULL));
-		    fdapply = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply");
+		    aaApply_fd = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply");
+		}
+		if (dim == 2) {
+		    fdapply = aaApply2_fd;
+		} else {
+		    fdapply = aaApply_fd;
 		}
 		ec = new VarExp(0, fdapply);
 		Expressions *exps = new Expressions();