From 169fe68a25f7bff1710da966684b6a8f9070ad9a Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 24 Jul 2008 18:20:40 +0200 Subject: [PATCH 1/5] Fix argument types for wchar/char reverse and sort. --- dmd/mtype.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dmd/mtype.c b/dmd/mtype.c index 4e4bc990..2099f05a 100644 --- a/dmd/mtype.c +++ b/dmd/mtype.c @@ -1547,9 +1547,9 @@ Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident) nm = name[n->ty == Twchar]; //LLVMDC: Build arguments. Arguments* args = new Arguments; - Type* arrty = n->ty == Twchar ? Type::tchar->arrayOf() : Type::twchar->arrayOf(); + Type* arrty = n->ty == Twchar ? Type::twchar->arrayOf() : Type::tchar->arrayOf(); args->push(new Argument(STCin, arrty, NULL, NULL)); - fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), nm); + fd = FuncDeclaration::genCfunc(args, arrty, nm); ec = new VarExp(0, fd); e = e->castTo(sc, n->arrayOf()); // convert to dynamic array @@ -1569,9 +1569,9 @@ Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident) nm = name[n->ty == Twchar]; //LLVMDC: Build arguments. Arguments* args = new Arguments; - Type* arrty = n->ty == Twchar ? Type::tchar->arrayOf() : Type::twchar->arrayOf(); + Type* arrty = n->ty == Twchar ? Type::twchar->arrayOf() : Type::tchar->arrayOf(); args->push(new Argument(STCin, arrty, NULL, NULL)); - fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), nm); + fd = FuncDeclaration::genCfunc(args, arrty, nm); ec = new VarExp(0, fd); e = e->castTo(sc, n->arrayOf()); // convert to dynamic array From d4ab377db081c26ff2e766120b04bbecb9a9cf25 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 24 Jul 2008 18:21:48 +0200 Subject: [PATCH 2/5] Change from alloca to gc_malloc. The alloca produces a segfault with current llvm svn --- tango/lib/compiler/llvmdc/adi.d | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tango/lib/compiler/llvmdc/adi.d b/tango/lib/compiler/llvmdc/adi.d index 8ff15ba0..b4554ee3 100644 --- a/tango/lib/compiler/llvmdc/adi.d +++ b/tango/lib/compiler/llvmdc/adi.d @@ -264,9 +264,9 @@ extern (C) Array _adReverse(Array a, size_t szelem) if (szelem > 16) { //version (Win32) - tmp = cast(byte*) alloca(szelem); + //tmp = cast(byte*) alloca(szelem); //else - //tmp = gc_malloc(szelem); + tmp = cast(byte*) gc_malloc(szelem); } for (; lo < hi; lo += szelem, hi -= szelem) From e6dd53b61c79887a0935411cb4c6fb5dc561e12e Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 24 Jul 2008 18:51:36 +0200 Subject: [PATCH 3/5] Made setup for runtime calls in dmd frontend allocate less. --- dmd/mtype.c | 163 +++++++++++++++++++++++++++++++----------------- dmd/statement.c | 39 +++++++----- 2 files changed, 132 insertions(+), 70 deletions(-) diff --git a/dmd/mtype.c b/dmd/mtype.c index 2099f05a..4f72c4c0 100644 --- a/dmd/mtype.c +++ b/dmd/mtype.c @@ -1539,19 +1539,28 @@ Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident) 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); + 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"); + } - ec = new VarExp(0, fd); + 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 @@ Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident) 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); + 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"); + } - ec = new VarExp(0, fd); + 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 @@ Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident) 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 @@ Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident) 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 @@ Expression *TypeArray::dotExp(Scope *sc, Expression *e, Identifier *ident) 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 @@ Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident) 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 @@ Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident) 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 @@ Expression *TypeAArray::dotExp(Scope *sc, Expression *e, Identifier *ident) 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)); diff --git a/dmd/statement.c b/dmd/statement.c index 63089dcb..daf7127d 100644 --- a/dmd/statement.c +++ b/dmd/statement.c @@ -1599,22 +1599,33 @@ Statement *ForeachStatement::semantic(Scope *sc) * _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)); + 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)); + 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)); + aaApply_fd = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply"); + } if (dim == 2) { - 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"); + fdapply = aaApply2_fd; } else { - 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"); + fdapply = aaApply_fd; } ec = new VarExp(0, fdapply); Expressions *exps = new Expressions(); From 732cdc576603178e66149f2b33e1f525f9e5f11f Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Sat, 26 Jul 2008 13:38:25 +0200 Subject: [PATCH 4/5] Fix inline asm FS:4 by writing the displacement directly into the asm instead of using %fs:$0 with an input constraint. --- gen/d-asm-i386.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gen/d-asm-i386.h b/gen/d-asm-i386.h index bead7d3f..5863af7e 100644 --- a/gen/d-asm-i386.h +++ b/gen/d-asm-i386.h @@ -1929,7 +1929,8 @@ struct AsmProcessor if (operand->constDisplacement) { if (operand->symbolDisplacement.dim) insnTemplate->writebyte('+'); - addOperand(fmt, Arg_Integer, newIntExp(operand->constDisplacement), asmcode); + //addOperand(fmt, Arg_Integer, newIntExp(operand->constDisplacement), asmcode); + insnTemplate->printf("%d", operand->constDisplacement); if (opInfo->operands[i] & Opr_Dest) asmcode->clobbersMemory = 1; } From 666e95e44dccaf20a0cde7baa7c8b6e0a65ddebd Mon Sep 17 00:00:00 2001 From: Anders Bergh Date: Fri, 25 Jul 2008 00:39:24 +0200 Subject: [PATCH 5/5] Add missing "lib" directory --- lib/.empty | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/.empty diff --git a/lib/.empty b/lib/.empty new file mode 100644 index 00000000..c6cac692 --- /dev/null +++ b/lib/.empty @@ -0,0 +1 @@ +empty