mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-02 16:11:08 +03:00
Adapt to new _d_arraysetlengthT template lowering
This commit is contained in:
parent
8151a5f65c
commit
a6dc3fa73a
6 changed files with 10 additions and 49 deletions
|
@ -748,34 +748,6 @@ DSliceValue *DtoNewMulDimDynArray(const Loc &loc, Type *arrayType,
|
||||||
return getSlice(arrayType, newptr);
|
return getSlice(arrayType, newptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
DSliceValue *DtoResizeDynArray(const Loc &loc, Type *arrayType, DValue *array,
|
|
||||||
LLValue *newdim) {
|
|
||||||
IF_LOG Logger::println("DtoResizeDynArray : %s", arrayType->toChars());
|
|
||||||
LOG_SCOPE;
|
|
||||||
|
|
||||||
assert(array);
|
|
||||||
assert(newdim);
|
|
||||||
assert(arrayType);
|
|
||||||
assert(arrayType->toBasetype()->ty == TY::Tarray);
|
|
||||||
|
|
||||||
// decide on what runtime function to call based on whether the type is zero
|
|
||||||
// initialized
|
|
||||||
bool zeroInit = arrayType->toBasetype()->nextOf()->isZeroInit();
|
|
||||||
|
|
||||||
// call runtime
|
|
||||||
LLFunction *fn =
|
|
||||||
getRuntimeFunction(loc, gIR->module, zeroInit ? "_d_arraysetlengthT"
|
|
||||||
: "_d_arraysetlengthiT");
|
|
||||||
|
|
||||||
LLValue *newArray = gIR->CreateCallOrInvoke(
|
|
||||||
fn, DtoTypeInfoOf(loc, arrayType), newdim,
|
|
||||||
DtoBitCast(DtoLVal(array), fn->getFunctionType()->getParamType(2)),
|
|
||||||
".gc_mem");
|
|
||||||
|
|
||||||
return getSlice(arrayType, newArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static LLValue *DtoSlicePtr(DValue *dval) {
|
static LLValue *DtoSlicePtr(DValue *dval) {
|
||||||
|
|
|
@ -64,8 +64,6 @@ DSliceValue *DtoNewDynArray(const Loc &loc, Type *arrayType, DValue *dim,
|
||||||
bool defaultInit = true);
|
bool defaultInit = true);
|
||||||
DSliceValue *DtoNewMulDimDynArray(const Loc &loc, Type *arrayType,
|
DSliceValue *DtoNewMulDimDynArray(const Loc &loc, Type *arrayType,
|
||||||
DValue **dims, size_t ndims);
|
DValue **dims, size_t ndims);
|
||||||
DSliceValue *DtoResizeDynArray(const Loc &loc, Type *arrayType, DValue *array,
|
|
||||||
llvm::Value *newdim);
|
|
||||||
|
|
||||||
DSliceValue *DtoCatArrays(const Loc &loc, Type *type, Expression *e1,
|
DSliceValue *DtoCatArrays(const Loc &loc, Type *type, Expression *e1,
|
||||||
Expression *e2);
|
Expression *e2);
|
||||||
|
|
|
@ -606,12 +606,6 @@ static void buildRuntimeModule() {
|
||||||
createFwdDecl(LINK::c, voidArrayTy, {"_d_newarraymTX", "_d_newarraymiTX"},
|
createFwdDecl(LINK::c, voidArrayTy, {"_d_newarraymTX", "_d_newarraymiTX"},
|
||||||
{typeInfoTy, sizeTy->arrayOf()}, {STCconst, 0});
|
{typeInfoTy, sizeTy->arrayOf()}, {STCconst, 0});
|
||||||
|
|
||||||
// void[] _d_arraysetlengthT (const TypeInfo ti, size_t newlength, void[]* p)
|
|
||||||
// void[] _d_arraysetlengthiT(const TypeInfo ti, size_t newlength, void[]* p)
|
|
||||||
createFwdDecl(LINK::c, voidArrayTy,
|
|
||||||
{"_d_arraysetlengthT", "_d_arraysetlengthiT"},
|
|
||||||
{typeInfoTy, sizeTy, voidArrayPtrTy}, {STCconst, 0, 0});
|
|
||||||
|
|
||||||
// void[] _d_arrayappendcd(ref byte[] x, dchar c)
|
// void[] _d_arrayappendcd(ref byte[] x, dchar c)
|
||||||
// void[] _d_arrayappendwd(ref byte[] x, dchar c)
|
// void[] _d_arrayappendwd(ref byte[] x, dchar c)
|
||||||
createFwdDecl(LINK::c, voidArrayTy, {"_d_arrayappendcd", "_d_arrayappendwd"},
|
createFwdDecl(LINK::c, voidArrayTy, {"_d_arrayappendcd", "_d_arrayappendwd"},
|
||||||
|
|
19
gen/toir.cpp
19
gen/toir.cpp
|
@ -456,6 +456,14 @@ public:
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void visit(LoweredAssignExp *e) override {
|
||||||
|
IF_LOG Logger::print("LoweredAssignExp::toElem: %s @ %s\n", e->toChars(),
|
||||||
|
e->type->toChars());
|
||||||
|
LOG_SCOPE;
|
||||||
|
|
||||||
|
result = toElem(e->lowering);
|
||||||
|
}
|
||||||
|
|
||||||
void visit(AssignExp *e) override {
|
void visit(AssignExp *e) override {
|
||||||
IF_LOG Logger::print("AssignExp::toElem: %s | (%s)(%s = %s)\n",
|
IF_LOG Logger::print("AssignExp::toElem: %s | (%s)(%s = %s)\n",
|
||||||
e->toChars(), e->type->toChars(),
|
e->toChars(), e->type->toChars(),
|
||||||
|
@ -463,17 +471,6 @@ public:
|
||||||
e->e2->type ? e->e2->type->toChars() : nullptr);
|
e->e2->type ? e->e2->type->toChars() : nullptr);
|
||||||
LOG_SCOPE;
|
LOG_SCOPE;
|
||||||
|
|
||||||
if (auto ale = e->e1->isArrayLengthExp()) {
|
|
||||||
Logger::println("performing array.length assignment");
|
|
||||||
DLValue arrval(ale->e1->type, DtoLVal(ale->e1));
|
|
||||||
DValue *newlen = toElem(e->e2);
|
|
||||||
DSliceValue *slice =
|
|
||||||
DtoResizeDynArray(e->loc, arrval.type, &arrval, DtoRVal(newlen));
|
|
||||||
DtoStore(DtoRVal(slice), DtoLVal(&arrval));
|
|
||||||
result = newlen;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialization of ref variable?
|
// Initialization of ref variable?
|
||||||
// Can't just override ConstructExp::toElem because not all EXP::construct
|
// Can't just override ConstructExp::toElem because not all EXP::construct
|
||||||
// operations are actually instances of ConstructExp... Long live the DMD
|
// operations are actually instances of ConstructExp... Long live the DMD
|
||||||
|
|
|
@ -36,7 +36,7 @@ template _d_arraysetlengthTImpl(Tarr : T[], T)
|
||||||
*/
|
*/
|
||||||
size_t _d_arraysetlengthT(return scope ref Tarr arr, size_t newlength) @trusted pure nothrow
|
size_t _d_arraysetlengthT(return scope ref Tarr arr, size_t newlength) @trusted pure nothrow
|
||||||
{
|
{
|
||||||
pragma(inline, false);
|
version (DigitalMars) pragma(inline, false);
|
||||||
version (D_TypeInfo)
|
version (D_TypeInfo)
|
||||||
{
|
{
|
||||||
auto ti = typeid(Tarr);
|
auto ti = typeid(Tarr);
|
||||||
|
|
|
@ -29,7 +29,7 @@ void func()
|
||||||
//CHECK: dcompute.d([[@LINE+1]]): Error: {{.*}} interfaces and classes not allowed in `@compute` code
|
//CHECK: dcompute.d([[@LINE+1]]): Error: {{.*}} interfaces and classes not allowed in `@compute` code
|
||||||
C cc;
|
C cc;
|
||||||
int[] quux;
|
int[] quux;
|
||||||
//CHECK: dcompute.d([[@LINE+1]]): Error: can only call functions from other `@compute` modules in `@compute` code
|
//CHECK: dcompute.d([[@LINE+1]]): Error: setting `length` in `@compute` code not allowed
|
||||||
quux.length = 1;
|
quux.length = 1;
|
||||||
//CHECK: dcompute.d([[@LINE+1]]): Error: can only call functions from other `@compute` modules in `@compute` code
|
//CHECK: dcompute.d([[@LINE+1]]): Error: can only call functions from other `@compute` modules in `@compute` code
|
||||||
quux ~= 42;
|
quux ~= 42;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue