Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/CIR/CodeGen/CIRGenClass.cpp
213799 views
1
//===----------------------------------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This contains code dealing with C++ code generation of classes
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "CIRGenCXXABI.h"
14
#include "CIRGenFunction.h"
15
16
#include "clang/AST/ExprCXX.h"
17
#include "clang/AST/RecordLayout.h"
18
#include "clang/AST/Type.h"
19
#include "clang/CIR/MissingFeatures.h"
20
21
using namespace clang;
22
using namespace clang::CIRGen;
23
24
/// Checks whether the given constructor is a valid subject for the
25
/// complete-to-base constructor delegation optimization, i.e. emitting the
26
/// complete constructor as a simple call to the base constructor.
27
bool CIRGenFunction::isConstructorDelegationValid(
28
const CXXConstructorDecl *ctor) {
29
// Currently we disable the optimization for classes with virtual bases
30
// because (1) the address of parameter variables need to be consistent across
31
// all initializers but (2) the delegate function call necessarily creates a
32
// second copy of the parameter variable.
33
//
34
// The limiting example (purely theoretical AFAIK):
35
// struct A { A(int &c) { c++; } };
36
// struct A : virtual A {
37
// B(int count) : A(count) { printf("%d\n", count); }
38
// };
39
// ...although even this example could in principle be emitted as a delegation
40
// since the address of the parameter doesn't escape.
41
if (ctor->getParent()->getNumVBases())
42
return false;
43
44
// We also disable the optimization for variadic functions because it's
45
// impossible to "re-pass" varargs.
46
if (ctor->getType()->castAs<FunctionProtoType>()->isVariadic())
47
return false;
48
49
// FIXME: Decide if we can do a delegation of a delegating constructor.
50
if (ctor->isDelegatingConstructor())
51
return false;
52
53
return true;
54
}
55
56
static void emitLValueForAnyFieldInitialization(CIRGenFunction &cgf,
57
CXXCtorInitializer *memberInit,
58
LValue &lhs) {
59
FieldDecl *field = memberInit->getAnyMember();
60
if (memberInit->isIndirectMemberInitializer()) {
61
// If we are initializing an anonymous union field, drill down to the field.
62
IndirectFieldDecl *indirectField = memberInit->getIndirectMember();
63
for (const auto *nd : indirectField->chain()) {
64
auto *fd = cast<clang::FieldDecl>(nd);
65
lhs = cgf.emitLValueForFieldInitialization(lhs, fd, fd->getName());
66
}
67
} else {
68
lhs = cgf.emitLValueForFieldInitialization(lhs, field, field->getName());
69
}
70
}
71
72
static void emitMemberInitializer(CIRGenFunction &cgf,
73
const CXXRecordDecl *classDecl,
74
CXXCtorInitializer *memberInit,
75
const CXXConstructorDecl *constructor,
76
FunctionArgList &args) {
77
assert(memberInit->isAnyMemberInitializer() &&
78
"Mush have member initializer!");
79
assert(memberInit->getInit() && "Must have initializer!");
80
81
assert(!cir::MissingFeatures::generateDebugInfo());
82
83
// non-static data member initializers
84
FieldDecl *field = memberInit->getAnyMember();
85
QualType fieldType = field->getType();
86
87
mlir::Value thisPtr = cgf.loadCXXThis();
88
QualType recordTy = cgf.getContext().getTypeDeclType(classDecl);
89
90
// If a base constructor is being emitted, create an LValue that has the
91
// non-virtual alignment.
92
LValue lhs = (cgf.curGD.getCtorType() == Ctor_Base)
93
? cgf.makeNaturalAlignPointeeAddrLValue(thisPtr, recordTy)
94
: cgf.makeNaturalAlignAddrLValue(thisPtr, recordTy);
95
96
emitLValueForAnyFieldInitialization(cgf, memberInit, lhs);
97
98
// Special case: If we are in a copy or move constructor, and we are copying
99
// an array off PODs or classes with trivial copy constructors, ignore the AST
100
// and perform the copy we know is equivalent.
101
// FIXME: This is hacky at best... if we had a bit more explicit information
102
// in the AST, we could generalize it more easily.
103
const ConstantArrayType *array =
104
cgf.getContext().getAsConstantArrayType(fieldType);
105
if (array && constructor->isDefaulted() &&
106
constructor->isCopyOrMoveConstructor()) {
107
QualType baseElementTy = cgf.getContext().getBaseElementType(array);
108
// NOTE(cir): CodeGen allows record types to be memcpy'd if applicable,
109
// whereas ClangIR wants to represent all object construction explicitly.
110
if (!baseElementTy->isRecordType()) {
111
cgf.cgm.errorNYI(memberInit->getSourceRange(),
112
"emitMemberInitializer: array of non-record type");
113
return;
114
}
115
}
116
117
cgf.emitInitializerForField(field, lhs, memberInit->getInit());
118
}
119
120
static bool isInitializerOfDynamicClass(const CXXCtorInitializer *baseInit) {
121
const Type *baseType = baseInit->getBaseClass();
122
const auto *baseClassDecl =
123
cast<CXXRecordDecl>(baseType->castAs<RecordType>()->getDecl());
124
return baseClassDecl->isDynamicClass();
125
}
126
127
/// Gets the address of a direct base class within a complete object.
128
/// This should only be used for (1) non-virtual bases or (2) virtual bases
129
/// when the type is known to be complete (e.g. in complete destructors).
130
///
131
/// The object pointed to by 'thisAddr' is assumed to be non-null.
132
Address CIRGenFunction::getAddressOfDirectBaseInCompleteClass(
133
mlir::Location loc, Address thisAddr, const CXXRecordDecl *derived,
134
const CXXRecordDecl *base, bool baseIsVirtual) {
135
// 'thisAddr' must be a pointer (in some address space) to Derived.
136
assert(thisAddr.getElementType() == convertType(derived));
137
138
// Compute the offset of the virtual base.
139
CharUnits offset;
140
const ASTRecordLayout &layout = getContext().getASTRecordLayout(derived);
141
if (baseIsVirtual)
142
offset = layout.getVBaseClassOffset(base);
143
else
144
offset = layout.getBaseClassOffset(base);
145
146
return builder.createBaseClassAddr(loc, thisAddr, convertType(base),
147
offset.getQuantity(),
148
/*assumeNotNull=*/true);
149
}
150
151
void CIRGenFunction::emitBaseInitializer(mlir::Location loc,
152
const CXXRecordDecl *classDecl,
153
CXXCtorInitializer *baseInit) {
154
assert(curFuncDecl && "loading 'this' without a func declaration?");
155
assert(isa<CXXMethodDecl>(curFuncDecl));
156
157
assert(baseInit->isBaseInitializer() && "Must have base initializer!");
158
159
Address thisPtr = loadCXXThisAddress();
160
161
const Type *baseType = baseInit->getBaseClass();
162
const auto *baseClassDecl =
163
cast<CXXRecordDecl>(baseType->castAs<RecordType>()->getDecl());
164
165
bool isBaseVirtual = baseInit->isBaseVirtual();
166
167
// If the initializer for the base (other than the constructor
168
// itself) accesses 'this' in any way, we need to initialize the
169
// vtables.
170
if (classDecl->isDynamicClass()) {
171
cgm.errorNYI(loc, "emitBaseInitializer: dynamic class");
172
return;
173
}
174
175
// We can pretend to be a complete class because it only matters for
176
// virtual bases, and we only do virtual bases for complete ctors.
177
Address v = getAddressOfDirectBaseInCompleteClass(
178
loc, thisPtr, classDecl, baseClassDecl, isBaseVirtual);
179
assert(!cir::MissingFeatures::aggValueSlotGC());
180
AggValueSlot aggSlot = AggValueSlot::forAddr(
181
v, Qualifiers(), AggValueSlot::IsDestructed, AggValueSlot::IsNotAliased,
182
getOverlapForBaseInit(classDecl, baseClassDecl, isBaseVirtual));
183
184
emitAggExpr(baseInit->getInit(), aggSlot);
185
186
assert(!cir::MissingFeatures::requiresCleanups());
187
}
188
189
/// This routine generates necessary code to initialize base classes and
190
/// non-static data members belonging to this constructor.
191
void CIRGenFunction::emitCtorPrologue(const CXXConstructorDecl *cd,
192
CXXCtorType ctorType,
193
FunctionArgList &args) {
194
if (cd->isDelegatingConstructor()) {
195
emitDelegatingCXXConstructorCall(cd, args);
196
return;
197
}
198
199
// If there are no member initializers, we can just return.
200
if (cd->getNumCtorInitializers() == 0)
201
return;
202
203
const CXXRecordDecl *classDecl = cd->getParent();
204
205
// This code doesn't use range-based iteration because we may need to emit
206
// code between the virtual base initializers and the non-virtual base or
207
// between the non-virtual base initializers and the member initializers.
208
CXXConstructorDecl::init_const_iterator b = cd->init_begin(),
209
e = cd->init_end();
210
211
// Virtual base initializers first, if any. They aren't needed if:
212
// - This is a base ctor variant
213
// - There are no vbases
214
// - The class is abstract, so a complete object of it cannot be constructed
215
//
216
// The check for an abstract class is necessary because sema may not have
217
// marked virtual base destructors referenced.
218
bool constructVBases = ctorType != Ctor_Base &&
219
classDecl->getNumVBases() != 0 &&
220
!classDecl->isAbstract();
221
if (constructVBases) {
222
cgm.errorNYI(cd->getSourceRange(), "emitCtorPrologue: virtual base");
223
return;
224
}
225
226
const mlir::Value oldThisValue = cxxThisValue;
227
if (!constructVBases && (*b)->isBaseInitializer() && (*b)->isBaseVirtual()) {
228
cgm.errorNYI(cd->getSourceRange(),
229
"emitCtorPrologue: virtual base initializer");
230
return;
231
}
232
233
// Handle non-virtual base initializers.
234
for (; b != e && (*b)->isBaseInitializer(); b++) {
235
assert(!(*b)->isBaseVirtual());
236
237
if (cgm.getCodeGenOpts().StrictVTablePointers &&
238
cgm.getCodeGenOpts().OptimizationLevel > 0 &&
239
isInitializerOfDynamicClass(*b)) {
240
cgm.errorNYI(cd->getSourceRange(),
241
"emitCtorPrologue: strict vtable pointers");
242
return;
243
}
244
emitBaseInitializer(getLoc(cd->getBeginLoc()), classDecl, *b);
245
}
246
247
cxxThisValue = oldThisValue;
248
249
if (classDecl->isDynamicClass()) {
250
cgm.errorNYI(cd->getSourceRange(),
251
"emitCtorPrologue: initialize vtable pointers");
252
return;
253
}
254
255
// Finally, initialize class members.
256
FieldConstructionScope fcs(*this, loadCXXThisAddress());
257
// Classic codegen uses a special class to attempt to replace member
258
// initializers with memcpy. We could possibly defer that to the
259
// lowering or optimization phases to keep the memory accesses more
260
// explicit. For now, we don't insert memcpy at all.
261
assert(!cir::MissingFeatures::ctorMemcpyizer());
262
for (; b != e; b++) {
263
CXXCtorInitializer *member = (*b);
264
assert(!member->isBaseInitializer());
265
assert(member->isAnyMemberInitializer() &&
266
"Delegating initializer on non-delegating constructor");
267
emitMemberInitializer(*this, cd->getParent(), member, cd, args);
268
}
269
}
270
271
Address CIRGenFunction::loadCXXThisAddress() {
272
assert(curFuncDecl && "loading 'this' without a func declaration?");
273
assert(isa<CXXMethodDecl>(curFuncDecl));
274
275
// Lazily compute CXXThisAlignment.
276
if (cxxThisAlignment.isZero()) {
277
// Just use the best known alignment for the parent.
278
// TODO: if we're currently emitting a complete-object ctor/dtor, we can
279
// always use the complete-object alignment.
280
auto rd = cast<CXXMethodDecl>(curFuncDecl)->getParent();
281
cxxThisAlignment = cgm.getClassPointerAlignment(rd);
282
}
283
284
return Address(loadCXXThis(), cxxThisAlignment);
285
}
286
287
void CIRGenFunction::emitInitializerForField(FieldDecl *field, LValue lhs,
288
Expr *init) {
289
QualType fieldType = field->getType();
290
switch (getEvaluationKind(fieldType)) {
291
case cir::TEK_Scalar:
292
if (lhs.isSimple())
293
emitExprAsInit(init, field, lhs, false);
294
else
295
cgm.errorNYI(field->getSourceRange(),
296
"emitInitializerForField: non-simple scalar");
297
break;
298
case cir::TEK_Complex:
299
cgm.errorNYI(field->getSourceRange(), "emitInitializerForField: complex");
300
break;
301
case cir::TEK_Aggregate: {
302
cgm.errorNYI(field->getSourceRange(), "emitInitializerForField: aggregate");
303
break;
304
}
305
}
306
307
// Ensure that we destroy this object if an exception is thrown later in the
308
// constructor.
309
QualType::DestructionKind dtorKind = fieldType.isDestructedType();
310
(void)dtorKind;
311
assert(!cir::MissingFeatures::requiresCleanups());
312
}
313
314
void CIRGenFunction::emitDelegateCXXConstructorCall(
315
const CXXConstructorDecl *ctor, CXXCtorType ctorType,
316
const FunctionArgList &args, SourceLocation loc) {
317
CallArgList delegateArgs;
318
319
FunctionArgList::const_iterator i = args.begin(), e = args.end();
320
assert(i != e && "no parameters to constructor");
321
322
// this
323
Address thisAddr = loadCXXThisAddress();
324
delegateArgs.add(RValue::get(thisAddr.getPointer()), (*i)->getType());
325
++i;
326
327
// FIXME: The location of the VTT parameter in the parameter list is specific
328
// to the Itanium ABI and shouldn't be hardcoded here.
329
if (cgm.getCXXABI().needsVTTParameter(curGD)) {
330
cgm.errorNYI(loc, "emitDelegateCXXConstructorCall: VTT parameter");
331
return;
332
}
333
334
// Explicit arguments.
335
for (; i != e; ++i) {
336
const VarDecl *param = *i;
337
// FIXME: per-argument source location
338
emitDelegateCallArg(delegateArgs, param, loc);
339
}
340
341
assert(!cir::MissingFeatures::sanitizers());
342
343
emitCXXConstructorCall(ctor, ctorType, /*ForVirtualBase=*/false,
344
/*Delegating=*/true, thisAddr, delegateArgs, loc);
345
}
346
347
void CIRGenFunction::emitImplicitAssignmentOperatorBody(FunctionArgList &args) {
348
const auto *assignOp = cast<CXXMethodDecl>(curGD.getDecl());
349
assert(assignOp->isCopyAssignmentOperator() ||
350
assignOp->isMoveAssignmentOperator());
351
const Stmt *rootS = assignOp->getBody();
352
assert(isa<CompoundStmt>(rootS) &&
353
"Body of an implicit assignment operator should be compound stmt.");
354
const auto *rootCS = cast<CompoundStmt>(rootS);
355
356
assert(!cir::MissingFeatures::incrementProfileCounter());
357
assert(!cir::MissingFeatures::runCleanupsScope());
358
359
// Classic codegen uses a special class to attempt to replace member
360
// initializers with memcpy. We could possibly defer that to the
361
// lowering or optimization phases to keep the memory accesses more
362
// explicit. For now, we don't insert memcpy at all, though in some
363
// cases the AST contains a call to memcpy.
364
assert(!cir::MissingFeatures::assignMemcpyizer());
365
for (Stmt *s : rootCS->body())
366
if (emitStmt(s, /*useCurrentScope=*/true).failed())
367
cgm.errorNYI(s->getSourceRange(),
368
std::string("emitImplicitAssignmentOperatorBody: ") +
369
s->getStmtClassName());
370
}
371
372
void CIRGenFunction::emitDelegatingCXXConstructorCall(
373
const CXXConstructorDecl *ctor, const FunctionArgList &args) {
374
assert(ctor->isDelegatingConstructor());
375
376
Address thisPtr = loadCXXThisAddress();
377
378
assert(!cir::MissingFeatures::objCGC());
379
assert(!cir::MissingFeatures::sanitizers());
380
AggValueSlot aggSlot = AggValueSlot::forAddr(
381
thisPtr, Qualifiers(), AggValueSlot::IsDestructed,
382
AggValueSlot::IsNotAliased, AggValueSlot::MayOverlap,
383
AggValueSlot::IsNotZeroed);
384
385
emitAggExpr(ctor->init_begin()[0]->getInit(), aggSlot);
386
387
const CXXRecordDecl *classDecl = ctor->getParent();
388
if (cgm.getLangOpts().Exceptions && !classDecl->hasTrivialDestructor()) {
389
cgm.errorNYI(ctor->getSourceRange(),
390
"emitDelegatingCXXConstructorCall: exception");
391
return;
392
}
393
}
394
395
Address CIRGenFunction::getAddressOfBaseClass(
396
Address value, const CXXRecordDecl *derived,
397
llvm::iterator_range<CastExpr::path_const_iterator> path,
398
bool nullCheckValue, SourceLocation loc) {
399
assert(!path.empty() && "Base path should not be empty!");
400
401
if ((*path.begin())->isVirtual()) {
402
// The implementation here is actually complete, but let's flag this
403
// as an error until the rest of the virtual base class support is in place.
404
cgm.errorNYI(loc, "getAddrOfBaseClass: virtual base");
405
return Address::invalid();
406
}
407
408
// Compute the static offset of the ultimate destination within its
409
// allocating subobject (the virtual base, if there is one, or else
410
// the "complete" object that we see).
411
CharUnits nonVirtualOffset =
412
cgm.computeNonVirtualBaseClassOffset(derived, path);
413
414
// Get the base pointer type.
415
mlir::Type baseValueTy = convertType((path.end()[-1])->getType());
416
assert(!cir::MissingFeatures::addressSpace());
417
418
// The if statement here is redundant now, but it will be needed when we add
419
// support for virtual base classes.
420
// If there is no virtual base, use cir.base_class_addr. It takes care of
421
// the adjustment and the null pointer check.
422
if (nonVirtualOffset.isZero()) {
423
assert(!cir::MissingFeatures::sanitizers());
424
return builder.createBaseClassAddr(getLoc(loc), value, baseValueTy, 0,
425
/*assumeNotNull=*/true);
426
}
427
428
assert(!cir::MissingFeatures::sanitizers());
429
430
// Apply the offset
431
value = builder.createBaseClassAddr(getLoc(loc), value, baseValueTy,
432
nonVirtualOffset.getQuantity(),
433
/*assumeNotNull=*/true);
434
435
// Cast to the destination type.
436
value = value.withElementType(builder, baseValueTy);
437
438
return value;
439
}
440
441
void CIRGenFunction::emitCXXConstructorCall(const clang::CXXConstructorDecl *d,
442
clang::CXXCtorType type,
443
bool forVirtualBase,
444
bool delegating,
445
AggValueSlot thisAVS,
446
const clang::CXXConstructExpr *e) {
447
CallArgList args;
448
Address thisAddr = thisAVS.getAddress();
449
QualType thisType = d->getThisType();
450
mlir::Value thisPtr = thisAddr.getPointer();
451
452
assert(!cir::MissingFeatures::addressSpace());
453
454
args.add(RValue::get(thisPtr), thisType);
455
456
// In LLVM Codegen: If this is a trivial constructor, just emit what's needed.
457
// If this is a union copy constructor, we must emit a memcpy, because the AST
458
// does not model that copy.
459
assert(!cir::MissingFeatures::isMemcpyEquivalentSpecialMember());
460
461
const FunctionProtoType *fpt = d->getType()->castAs<FunctionProtoType>();
462
463
assert(!cir::MissingFeatures::opCallArgEvaluationOrder());
464
465
emitCallArgs(args, fpt, e->arguments(), e->getConstructor(),
466
/*ParamsToSkip=*/0);
467
468
assert(!cir::MissingFeatures::sanitizers());
469
emitCXXConstructorCall(d, type, forVirtualBase, delegating, thisAddr, args,
470
e->getExprLoc());
471
}
472
473
void CIRGenFunction::emitCXXConstructorCall(
474
const CXXConstructorDecl *d, CXXCtorType type, bool forVirtualBase,
475
bool delegating, Address thisAddr, CallArgList &args, SourceLocation loc) {
476
477
const CXXRecordDecl *crd = d->getParent();
478
479
// If this is a call to a trivial default constructor:
480
// In LLVM: do nothing.
481
// In CIR: emit as a regular call, other later passes should lower the
482
// ctor call into trivial initialization.
483
assert(!cir::MissingFeatures::isTrivialCtorOrDtor());
484
485
assert(!cir::MissingFeatures::isMemcpyEquivalentSpecialMember());
486
487
bool passPrototypeArgs = true;
488
489
// Check whether we can actually emit the constructor before trying to do so.
490
if (d->getInheritedConstructor()) {
491
cgm.errorNYI(d->getSourceRange(),
492
"emitCXXConstructorCall: inherited constructor");
493
return;
494
}
495
496
// Insert any ABI-specific implicit constructor arguments.
497
assert(!cir::MissingFeatures::implicitConstructorArgs());
498
499
// Emit the call.
500
auto calleePtr = cgm.getAddrOfCXXStructor(GlobalDecl(d, type));
501
const CIRGenFunctionInfo &info = cgm.getTypes().arrangeCXXConstructorCall(
502
args, d, type, passPrototypeArgs);
503
CIRGenCallee callee = CIRGenCallee::forDirect(calleePtr, GlobalDecl(d, type));
504
cir::CIRCallOpInterface c;
505
emitCall(info, callee, ReturnValueSlot(), args, &c, getLoc(loc));
506
507
if (cgm.getCodeGenOpts().OptimizationLevel != 0 && !crd->isDynamicClass() &&
508
type != Ctor_Base && cgm.getCodeGenOpts().StrictVTablePointers)
509
cgm.errorNYI(d->getSourceRange(), "vtable assumption loads");
510
}
511
512