# HG changeset patch # User lindquist # Date 1193965393 -3600 # Node ID 339422268de101fd8fcad85a3be200dff8472878 # Parent d8dd47ef397365fd2d7e3e5f6fbe039edc166027 [svn r87] Fixed some memory bloat when passing string literals as char[] params (double temporary before) diff -r d8dd47ef3973 -r 339422268de1 gen/elem.c --- a/gen/elem.c Fri Nov 02 01:17:26 2007 +0100 +++ b/gen/elem.c Fri Nov 02 02:03:13 2007 +0100 @@ -20,6 +20,7 @@ callconv = (unsigned)-1; isthis = false; istypeinfo = false; + temp = false; vardecl = 0; funcdecl = 0; diff -r d8dd47ef3973 -r 339422268de1 gen/elem.h --- a/gen/elem.h Fri Nov 02 01:17:26 2007 +0100 +++ b/gen/elem.h Fri Nov 02 02:03:13 2007 +0100 @@ -33,6 +33,7 @@ unsigned callconv; bool isthis; bool istypeinfo; + bool temp; VarDeclaration* vardecl; FuncDeclaration* funcdecl; diff -r d8dd47ef3973 -r 339422268de1 gen/toir.c --- a/gen/toir.c Fri Nov 02 01:17:26 2007 +0100 +++ b/gen/toir.c Fri Nov 02 02:03:13 2007 +0100 @@ -362,9 +362,10 @@ if (dtype->ty == Tarray) { llvm::Constant* clen = llvm::ConstantInt::get(DtoSize_t(),len,false); if (!p->topexp() || p->topexp()->e2 != this) { - llvm::Value* tmpmem = new llvm::AllocaInst(DtoType(dtype),"tmp",p->topallocapoint()); + llvm::Value* tmpmem = new llvm::AllocaInst(DtoType(dtype),"tempstring",p->topallocapoint()); DtoSetArray(tmpmem, clen, arrptr); e->mem = tmpmem; + e->temp = true; } else if (p->topexp()->e2 == this) { llvm::Value* arr = p->topexp()->v; diff -r d8dd47ef3973 -r 339422268de1 gen/tollvm.c --- a/gen/tollvm.c Fri Nov 02 01:17:26 2007 +0100 +++ b/gen/tollvm.c Fri Nov 02 02:03:13 2007 +0100 @@ -1196,6 +1196,9 @@ allocaInst = new llvm::AllocaInst(realtypell, "tmpparam", gIR->topallocapoint()); DtoSetArray(allocaInst, arg->arg, arg->mem); } + else if (arg->temp) { + allocaInst = arg->mem; + } else { allocaInst = new llvm::AllocaInst(pty->getElementType(), "tmpparam", gIR->topallocapoint()); DtoArrayAssign(allocaInst,arg->mem); @@ -1204,7 +1207,6 @@ else assert(0); - assert(allocaInst != 0); retval = allocaInst; } }