Keep _d_newclass() semantics, re-introduce _d_allocclass() instead

And use that one in DtoNewClass(), keeping 3rd party code from breaking.
This commit is contained in:
Martin 2016-08-14 20:52:39 +02:00
parent 97921fbb8d
commit a5e5bd1716
6 changed files with 20 additions and 6 deletions

View file

@ -192,6 +192,14 @@ else
return cast(Object)p;
}
version (LDC)
{
extern (C) Object _d_allocclass(const ClassInfo ci) nothrow
{
return cast(Object)allocmemory(ci.init.length);
}
}
extern (C) void* _d_newitemT(TypeInfo ti) nothrow
{
auto p = allocmemory(ti.tsize);

View file

@ -84,8 +84,8 @@ DValue *DtoNewClass(Loc &loc, TypeClass *tc, NewExp *newexp) {
// allocate
LLValue *mem;
if (newexp->onstack) {
// FIXME align scope class to its largest member
mem = DtoRawAlloca(DtoType(tc)->getContainedType(0), 0, ".newclass_alloca");
mem = DtoRawAlloca(DtoType(tc)->getContainedType(0), DtoAlignment(tc),
".newclass_alloca");
}
// custom allocator
else if (newexp->allocator) {
@ -97,7 +97,7 @@ DValue *DtoNewClass(Loc &loc, TypeClass *tc, NewExp *newexp) {
// default allocator
else {
llvm::Function *fn =
getRuntimeFunction(loc, gIR->module, "_d_newclass");
getRuntimeFunction(loc, gIR->module, "_d_allocclass");
LLConstant *ci = DtoBitCast(getIrAggr(tc->sym)->getClassInfoSymbol(),
DtoType(Type::typeinfoclass->type));
mem =

View file

@ -255,7 +255,7 @@ public:
}
};
// FunctionInfo for _d_newclass
// FunctionInfo for _d_allocclass
class AllocClassFI : public FunctionInfo {
public:
bool analyze(CallSite CS, const Analysis &A) override {
@ -436,7 +436,7 @@ GarbageCollect2Stack::GarbageCollect2Stack()
KnownFunctions["_d_allocmemoryT"] = &AllocMemoryT;
KnownFunctions["_d_newarrayU"] = &NewArrayU;
KnownFunctions["_d_newarrayT"] = &NewArrayT;
KnownFunctions["_d_newclass"] = &AllocClass;
KnownFunctions["_d_allocclass"] = &AllocClass;
KnownFunctions["_d_allocmemory"] = &AllocMemory;
}

View file

@ -372,6 +372,7 @@ void SimplifyDRuntimeCalls::InitOptimizations() {
Optimizations["_d_newarraymiT"] = &Allocation;
Optimizations["_d_newarraymvT"] = &Allocation;
Optimizations["_d_newclass"] = &Allocation;
Optimizations["_d_allocclass"] = &Allocation;
}
/// runOnFunction - Top level algorithm.

View file

@ -85,6 +85,7 @@ static void checkForImplicitGCCall(const Loc &loc, const char *name) {
"_d_newarraymiTX",
"_d_newarrayU",
"_d_newclass",
"_d_allocclass",
"_d_newitemT",
"_d_newitemiT",
};
@ -397,6 +398,10 @@ static void buildRuntimeModule() {
createFwdDecl(LINKc, objectTy, {"_d_newclass"}, {classInfoTy}, {STCconst},
Attr_NoAlias);
// Object _d_allocclass(const ClassInfo ci)
createFwdDecl(LINKc, objectTy, {"_d_allocclass"}, {classInfoTy}, {STCconst},
Attr_NoAlias);
// void* _d_newitemT (TypeInfo ti)
// void* _d_newitemiT(TypeInfo ti)
createFwdDecl(LINKc, voidPtrTy, {"_d_newitemT", "_d_newitemiT"}, {typeInfoTy},

@ -1 +1 @@
Subproject commit 5c5dd37e433afdb5b1f2cd33f170014cdd96312a
Subproject commit 0aeb4da53e922f7d17401dd13f69b8e355f327f9