17#include "mlir/IR/Types.h"
20#include "llvm/ADT/SmallVector.h"
27 : cgm(cgm), vtContext(cgm.getASTContext().getVTableContext()) {}
36 cir::FuncOp thunkFn,
bool forVTable,
47 cgm.
setDSOLocal(
static_cast<mlir::Operation *
>(thunkFn));
51 thunkFn.setComdat(
true);
55 mlir::Type ptrTy = builder.getUInt8PtrTy();
60mlir::Type CIRGenVTables::getVTableComponentType() {
66 mlir::Type componentType = getVTableComponentType();
68 tys.push_back(cir::ArrayType::get(componentType, layout.
getVTableSize(i)));
72 return cgm.getBuilder().getAnonRecordTy(tys,
false);
87 assert(rd->
isDynamicClass() &&
"Non-dynamic classes have no VTable.");
91 if (cgm.getTarget().getCXXABI().isMicrosoft())
115 return !keyFunction->
hasBody();
125 vtables.generateClassData(rd);
132 cgm.getCXXABI().emitVirtualInheritanceTables(rd);
134 cgm.getCXXABI().emitVTableDefinitions(*
this, rd);
137mlir::Attribute CIRGenVTables::getVTableComponent(
138 const VTableLayout &layout,
unsigned componentIndex, mlir::Attribute rtti,
139 unsigned &nextVTableThunkIndex,
unsigned vtableAddressPoint,
140 bool vtableHasLocalLinkage) {
149 cgm.
errorNYI(
"getVTableComponent: UnusedFunctionPointer");
150 return mlir::Attribute();
165 assert((mlir::isa<cir::GlobalViewAttr>(rtti) ||
166 mlir::isa<cir::ConstPtrAttr>(rtti)) &&
167 "expected GlobalViewAttr or ConstPtrAttr");
179 auto getSpecialVirtFn = [&](StringRef name) -> cir::FuncOp {
185 "getVTableComponent for OMP Device NVPTX");
200 fnPtr = pureVirtualFn;
202 if (!deletedVirtualFn)
204 getSpecialVirtFn(cgm.getCXXABI().getDeletedVirtualCallName());
205 fnPtr = deletedVirtualFn;
206 }
else if (nextVTableThunkIndex < layout.
vtable_thunks().size() &&
209 const ThunkInfo &thunkInfo =
211 nextVTableThunkIndex++;
216 cir::FuncType fnTy = cgm.getTypes().getFunctionTypeForVTable(gd);
217 fnPtr = cgm.getAddrOfFunction(gd, fnTy,
true);
220 return cir::GlobalViewAttr::get(
222 mlir::FlatSymbolRefAttr::get(fnPtr.getSymNameAttr()));
226 llvm_unreachable(
"Unexpected vtable component kind");
231 mlir::Attribute rtti,
232 bool vtableHasLocalLinkage) {
233 mlir::Type componentType = getVTableComponentType();
237 unsigned nextVTableThunkIndex = 0;
239 mlir::MLIRContext *mlirContext = &cgm.getMLIRContext();
242 for (
auto [vtableIndex, addressPoint] : llvm::enumerate(addressPoints)) {
245 size_t vtableEnd = vtableStart + layout.
getVTableSize(vtableIndex);
247 components.reserve(vtableEnd - vtableStart);
248 for (
size_t componentIndex : llvm::seq(vtableStart, vtableEnd))
249 components.push_back(
250 getVTableComponent(layout, componentIndex, rtti, nextVTableThunkIndex,
251 addressPoint, vtableHasLocalLinkage));
253 auto arr = cir::ConstArrayAttr::get(
254 cir::ArrayType::get(componentType, components.size()),
255 mlir::ArrayAttr::get(mlirContext, components));
256 vtables.push_back(arr);
260 const auto members = mlir::ArrayAttr::get(mlirContext, vtables);
261 cir::ConstRecordAttr record = cgm.getBuilder().getAnonConstRecord(members);
264 auto vtableAttr = cir::VTableAttr::get(record.getType(), record.getMembers());
267 cgm.setInitializer(vtableOp, vtableAttr);
272 cir::GlobalLinkageKind linkage, VTableAddressPointsMapTy &addressPoints) {
275 std::unique_ptr<VTableLayout> vtLayout(
280 addressPoints = vtLayout->getAddressPoints();
284 llvm::raw_svector_ostream
out(outName);
299 if (linkage == cir::GlobalLinkageKind::AvailableExternallyLinkage)
300 linkage = cir::GlobalLinkageKind::InternalLinkage;
302 llvm::Align align = cgm.getDataLayout().getABITypeAlign(vtType);
306 cir::GlobalOp vtable = cgm.createOrReplaceCXXRuntimeVariable(
312 mlir::Attribute rtti = cgm.getAddrOfRTTIDescriptor(
313 loc, cgm.getASTContext().getCanonicalTagType(base.
getBase()));
321 assert(!vtable.isDeclaration() &&
"Shouldn't set properties on declaration");
322 cgm.setGVProperties(vtable, rd);
335 return cir::GlobalLinkageKind::InternalLinkage;
339 const CXXMethodDecl *keyFunction = astContext.getCurrentKeyFunction(rd);
340 if (keyFunction && !rd->
hasAttr<DLLImportAttr>()) {
353 (def || codeGenOpts.OptimizationLevel > 0 ||
354 codeGenOpts.getDebugInfo() != llvm::codegenoptions::NoDebugInfo) &&
355 "Shouldn't query vtable linkage without key function, "
356 "optimizations, or debug info");
357 if (!def && codeGenOpts.OptimizationLevel > 0)
358 return cir::GlobalLinkageKind::AvailableExternallyLinkage;
361 return !astContext.getLangOpts().AppleKext
362 ? cir::GlobalLinkageKind::LinkOnceODRLinkage
363 : cir::GlobalLinkageKind::InternalLinkage;
364 return cir::GlobalLinkageKind::ExternalLinkage;
367 return cir::GlobalLinkageKind::LinkOnceODRLinkage;
370 return cir::GlobalLinkageKind::WeakODRLinkage;
373 llvm_unreachable(
"Should not have been asked to emit this");
378 if (astContext.getLangOpts().AppleKext)
379 return cir::GlobalLinkageKind::InternalLinkage;
381 auto discardableODRLinkage = cir::GlobalLinkageKind::LinkOnceODRLinkage;
382 auto nonDiscardableODRLinkage = cir::GlobalLinkageKind::WeakODRLinkage;
383 if (rd->
hasAttr<DLLExportAttr>()) {
385 discardableODRLinkage = nonDiscardableODRLinkage;
386 }
else if (rd->
hasAttr<DLLImportAttr>()) {
388 discardableODRLinkage = cir::GlobalLinkageKind::AvailableExternallyLinkage;
389 nonDiscardableODRLinkage =
390 cir::GlobalLinkageKind::AvailableExternallyLinkage;
397 return discardableODRLinkage;
401 "getVTableLinkage: explicit instantiation declaration");
402 return cir::GlobalLinkageKind::ExternalLinkage;
406 return nonDiscardableODRLinkage;
409 llvm_unreachable(
"Invalid TemplateSpecializationKind!");
413 assert(rd->
getNumVBases() &&
"Only classes with virtual bases need a VTT");
416 llvm::raw_svector_ostream
out(outName);
418 .mangleCXXVTT(rd,
out);
419 StringRef name = outName.str();
422 (void)cgm.getCXXABI().getAddrOfVTable(rd,
CharUnits());
424 VTTBuilder builder(cgm.getASTContext(), rd,
false);
426 auto arrayType = cir::ArrayType::get(cgm.getBuilder().getUInt8PtrTy(),
429 cgm.getDataLayout().getABITypeAlign(cgm.getBuilder().getUInt8PtrTy());
430 cir::GlobalOp vtt = cgm.createOrReplaceCXXRuntimeVariable(
433 cgm.setGVProperties(vtt, rd);
440 const VTTVTable &vtable, cir::GlobalLinkageKind linkage,
442 if (vtable.
getBase() == mostDerivedClass) {
444 "Most derived class vtable must have a zero offset!");
455 cir::GlobalLinkageKind linkage,
457 VTTBuilder builder(cgm.getASTContext(), rd,
true);
459 mlir::MLIRContext *mlirContext = &cgm.getMLIRContext();
461 auto arrayType = cir::ArrayType::get(cgm.getBuilder().getUInt8PtrTy(),
467 vtableAddressPoints.push_back(VTableAddressPointsMapTy());
469 vtableAddressPoints.back()));
475 cir::GlobalOp vtable = vtables[vttComponent.VTableIndex];
481 vttComponent.VTableBase);
483 addressPoint = vtableAddressPoints[vttComponent.VTableIndex].lookup(
484 vttComponent.VTableBase);
486 "Did not find ctor vtable address point!");
489 mlir::Attribute indices[2] = {
490 cgm.getBuilder().getI32IntegerAttr(addressPoint.
VTableIndex),
494 auto indicesAttr = mlir::ArrayAttr::get(mlirContext, indices);
495 cir::GlobalViewAttr init = cgm.getBuilder().getGlobalViewAttr(
496 cgm.getBuilder().getUInt8PtrTy(), vtable, indicesAttr);
498 vttComponents.push_back(init);
501 auto init = cir::ConstArrayAttr::get(
502 arrayType, mlir::ArrayAttr::get(mlirContext, vttComponents));
504 vttOp.setInitialValueAttr(init);
507 vttOp.setLinkage(linkage);
508 mlir::SymbolTable::setSymbolVisibility(
511 if (cgm.supportsCOMDAT() && vttOp.isWeakForLinker())
512 vttOp.setComdat(
true);
517 BaseSubobjectPairTy classSubobjectPair(rd, base);
519 SubVTTIndiciesMapTy::iterator it = subVTTIndicies.find(classSubobjectPair);
520 if (it != subVTTIndicies.end())
523 VTTBuilder builder(cgm.getASTContext(), rd,
false);
527 BaseSubobjectPairTy subclassSubobjectPair(rd, entry.first);
529 subVTTIndicies.insert(std::make_pair(subclassSubobjectPair, entry.second));
532 it = subVTTIndicies.find(classSubobjectPair);
533 assert(it != subVTTIndicies.end() &&
"Did not find index!");
540 auto it = secondaryVirtualPointerIndices.find(std::make_pair(rd, base));
542 if (it != secondaryVirtualPointerIndices.end())
545 VTTBuilder builder(cgm.getASTContext(), rd,
false);
549 std::pair<const CXXRecordDecl *, BaseSubobject> pair =
550 std::make_pair(rd, entry.first);
552 secondaryVirtualPointerIndices.insert(std::make_pair(pair, entry.second));
555 it = secondaryVirtualPointerIndices.find(std::make_pair(rd, base));
556 assert(it != secondaryVirtualPointerIndices.end() &&
"Did not find index!");
566 mlir::Value returnValue = rv.
getValue();
570 "return adjustment with null check for non-reference types");
577 cgf,
Address(returnValue, pointeeType, classAlign), classDecl,
582 "return adjustment with null check for non-reference types");
589 bool isUnprototyped) {
590 assert(!
curGD.getDecl() &&
"curGD was already set!");
599 resultType =
cgm.getASTContext().VoidTy;
600 else if (
cgm.getCXXABI().hasThisReturn(gd))
601 resultType = thisType;
602 else if (
cgm.getCXXABI().hasMostDerivedReturn(gd))
603 resultType =
cgm.getASTContext().VoidPtrTy;
609 cgm.getCXXABI().buildThisParam(*
this, functionArgs);
612 if (!isUnprototyped) {
616 cgm.getCXXABI().addImplicitStructorParams(*
this, resultType,
623 cir::FuncType funcType =
cgm.getTypes().getFunctionType(fnInfo);
631 cgm.getCXXABI().emitInstanceFunctionProlog(md->
getLocation(), *
this);
648 bool isUnprototyped) {
650 "Please use a new CGF for this thunk");
659 mlir::Value adjustedThisPtr =
661 thisValueClass, *thunk)
672 cgm.errorUnsupported(
673 md,
"return-adjusting thunk with incomplete parameter type");
675 llvm_unreachable(
"shouldn't try to emit musttail return-adjusting "
676 "thunks for variadic functions");
678 cgm.errorUnsupported(
679 md,
"non-trivial argument copy for return-adjusting thunk");
688 callArgs.add(
RValue::get(adjustedThisPtr), thisType);
691 cgm.getCXXABI().adjustCallArgsForDestructorThunk(*
this,
curGD, callArgs);
694 unsigned prefixArgs = callArgs.size() - 1;
707 assert(callFnInfo.argTypeSize() ==
curFnInfo->argTypeSize());
712 :
cgm.getCXXABI().hasMostDerivedReturn(
curGD)
713 ?
cgm.getASTContext().VoidPtrTy
724 mlir::Location loc = builder.getUnknownLoc();
736 cgm.getCXXABI().emitReturnFromThunk(*
this, rv, resultType);
745 mlir::Value adjustedThisPtr,
746 cir::FuncOp callee) {
748 cgm.errorNYI(
"musttail thunk");
754 bool isUnprototyped) {
757 assert(fn.isDeclaration() &&
"Function already has body?");
758 mlir::Block *entryBb = fn.addEntryBlock();
759 builder.setInsertionPointToStart(entryBb);
779 cgm.errorNYI(
"unprototyped thunk placeholder type");
781 ty =
cgm.getTypes().getFunctionType(fnInfo);
783 cir::FuncOp calleeOp =
cgm.getAddrOfFunction(gd, ty,
true);
790 bool isUnprototyped,
bool forVTable) {
814 llvm::raw_svector_ostream
out(name);
822 if (cgm.getASTContext().useAbbreviatedThunkName(gd, name.str())) {
831 cir::FuncType thunkVTableTy = cgm.getTypes().getFunctionTypeForVTable(gd);
832 cir::FuncOp thunk = cgm.getAddrOfThunk(name, thunkVTableTy, gd);
835 bool isUnprototyped = !cgm.getTypes().isFuncTypeConvertible(
843 isUnprototyped ? (cgm.errorNYI(
"unprototyped must-tail thunk"),
844 cgm.getTypes().arrangeGlobalDeclaration(gd))
845 : cgm.getTypes().arrangeGlobalDeclaration(gd);
846 cir::FuncType thunkFnTy = cgm.getTypes().getFunctionType(fnInfo);
850 cir::FuncOp thunkFn = thunk;
851 if (thunk.getFunctionType() != thunkFnTy) {
852 cir::FuncOp oldThunkFn = thunkFn;
854 assert(oldThunkFn.isDeclaration() &&
"Shouldn't replace non-declaration");
857 oldThunkFn.setName(StringRef());
859 cir::FuncOp::create(cgm.getBuilder(), thunk->getLoc(), name.str(),
860 thunkFnTy, cir::GlobalLinkageKind::ExternalLinkage);
861 cgm.setCIRFunctionAttributes(md, fnInfo, thunkFn,
false);
863 if (!oldThunkFn->use_empty())
864 oldThunkFn->replaceAllUsesWith(thunkFn);
870 bool abiHasKeyFunctions = cgm.getTarget().getCXXABI().hasKeyFunctions();
871 bool useAvailableExternallyLinkage = forVTable && abiHasKeyFunctions;
875 if (!thunkFn.isDeclaration()) {
876 if (!abiHasKeyFunctions || useAvailableExternallyLinkage) {
895 bool shouldCloneVarArgs =
false;
896 if (!isUnprototyped && thunkFn.getFunctionType().isVarArg()) {
897 shouldCloneVarArgs =
true;
899 switch (cgm.getTriple().getArch()) {
900 case llvm::Triple::x86_64:
901 case llvm::Triple::x86:
902 case llvm::Triple::aarch64:
903 shouldCloneVarArgs =
false;
911 if (shouldCloneVarArgs) {
912 if (useAvailableExternallyLinkage)
914 cgm.errorNYI(
"varargs thunk cloning");
917 mlir::OpBuilder::InsertionGuard guard(cgm.getBuilder());
919 cgf.
generateThunk(thunkFn, fnInfo, gd, thunkAdjustments, isUnprototyped);
935 vtContext->getThunkInfo(gd);
937 if (!thunkInfoVector)
940 for (
const ThunkInfo &thunk : *thunkInfoVector)
static RValue performReturnAdjustment(CIRGenFunction &cgf, QualType resultType, RValue rv, const ThunkInfo &thunk)
static cir::GlobalOp getAddrOfVTTVTable(CIRGenVTables &cgvt, CIRGenModule &cgm, const CXXRecordDecl *mostDerivedClass, const VTTVTable &vtable, cir::GlobalLinkageKind linkage, VTableLayout::AddressPointsMapTy &addressPoints)
static void setThunkProperties(CIRGenModule &cgm, const ThunkInfo &thunk, cir::FuncOp thunkFn, bool forVTable, GlobalDecl gd)
static bool shouldEmitVTableThunk(CIRGenModule &cgm, const CXXMethodDecl *md, bool isUnprototyped, bool forVTable)
mlir::TypedAttr getConstPtrAttr(mlir::Type type, int64_t value)
const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)
Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...
const LangOptions & getLangOpts() const
const TargetInfo & getTargetInfo() const
const CXXRecordDecl * getBase() const
getBase - Returns the base class declaration.
CharUnits getBaseOffset() const
getBaseOffset - Returns the base class offset.
cir::PointerType getUInt8PtrTy()
cir::FuncType getFuncType(llvm::ArrayRef< mlir::Type > params, mlir::Type retTy, bool isVarArg=false)
virtual bool exportThunk()=0
Returns true if the thunk should be exported.
virtual cir::GlobalOp getAddrOfVTable(const CXXRecordDecl *rd, CharUnits vptrOffset)=0
Get the address of the vtable for the given record decl which should be used for the vptr at the give...
virtual void setThunkLinkage(cir::FuncOp thunk, bool forVTable, GlobalDecl gd, bool returnAdjustment)=0
Set the linkage and visibility of a thunk function.
virtual mlir::Value performReturnAdjustment(CIRGenFunction &cgf, Address ret, const CXXRecordDecl *unadjustedClass, const ReturnAdjustment &ra)=0
Perform adjustment on a return pointer for a thunk (covariant returns).
virtual llvm::StringRef getPureVirtualCallName()=0
static CIRGenCallee forDirect(mlir::Operation *funcPtr, const CIRGenCalleeInfo &abstractInfo=CIRGenCalleeInfo())
void generateThunk(cir::FuncOp fn, const CIRGenFunctionInfo &fnInfo, GlobalDecl gd, const ThunkInfo &thunk, bool isUnprototyped)
Generate code for a thunk function.
clang::GlobalDecl curGD
The GlobalDecl for the current function being compiled or the global variable currently being initial...
bool curFuncIsThunk
In C++, whether we are code generating a thunk.
mlir::Value loadCXXThis()
Load the value for 'this'.
const clang::Decl * curFuncDecl
Address loadCXXThisAddress()
void emitMustTailThunk(GlobalDecl gd, mlir::Value adjustedThisPtr, cir::FuncOp callee)
Emit a musttail call for a thunk with a potentially different ABI.
llvm::ScopedHashTableScope< const clang::Decl *, mlir::Value > SymTableScopeTy
void startThunk(cir::FuncOp fn, GlobalDecl gd, const CIRGenFunctionInfo &fnInfo, bool isUnprototyped)
Start generating a thunk function.
mlir::Type convertTypeForMem(QualType t)
Address returnValue
The temporary alloca to hold the return value.
void emitCallAndReturnForThunk(cir::FuncOp callee, const ThunkInfo *thunk, bool isUnprototyped)
Emit the call and return for a thunk function.
static bool hasAggregateEvaluationKind(clang::QualType type)
void finishFunction(SourceLocation endLoc)
RValue emitCall(const CIRGenFunctionInfo &funcInfo, const CIRGenCallee &callee, ReturnValueSlot returnValue, const CallArgList &args, cir::CIRCallOpInterface *callOp, mlir::Location loc)
const clang::Decl * curCodeDecl
This is the inner-most code context, which includes blocks.
void startFunction(clang::GlobalDecl gd, clang::QualType returnType, cir::FuncOp fn, cir::FuncType funcType, FunctionArgList args, clang::SourceLocation loc, clang::SourceLocation startLoc)
Emit code for the start of a function.
void emitDelegateCallArg(CallArgList &args, const clang::VarDecl *param, clang::SourceLocation loc)
We are performing a delegate call; that is, the current function is delegating to another one.
const CIRGenFunctionInfo * curFnInfo
mlir::Value cxxabiThisValue
void finishThunk()
Finish generating a thunk function.
This class organizes the cross-function state that is used while generating CIR code.
DiagnosticBuilder errorNYI(SourceLocation, llvm::StringRef)
Helpers to emit "not yet implemented" error diagnostics.
clang::ASTContext & getASTContext() const
CIRGenBuilderTy & getBuilder()
void setDSOLocal(mlir::Operation *op) const
void setGVProperties(mlir::Operation *op, const NamedDecl *d) const
Set visibility, dllimport/dllexport and dso_local.
clang::CharUnits getClassPointerAlignment(const clang::CXXRecordDecl *rd)
Return the best known alignment for an unknown pointer to a particular class.
const clang::TargetInfo & getTarget() const
const llvm::Triple & getTriple() const
static mlir::SymbolTable::Visibility getMLIRVisibility(Visibility v)
mlir::Type getVTableComponentType()
cir::FuncOp createRuntimeFunction(cir::FuncType ty, llvm::StringRef name, mlir::NamedAttrList extraAttrs={}, bool isLocal=false, bool assumeConvergent=false)
cir::FuncOp getAddrOfThunk(StringRef name, mlir::Type fnTy, GlobalDecl gd)
Get or create a thunk function with the given name and type.
const clang::CodeGenOptions & getCodeGenOpts() const
const clang::LangOptions & getLangOpts() const
cir::FuncOp getOrCreateCIRFunction(llvm::StringRef mangledName, mlir::Type funcType, clang::GlobalDecl gd, bool forVTable, bool dontDefer=false, bool isThunk=false, ForDefinition_t isForDefinition=NotForDefinition, mlir::NamedAttrList extraAttrs={})
bool supportsCOMDAT() const
CIRGenCXXABI & getCXXABI() const
void setFunctionLinkage(GlobalDecl gd, cir::FuncOp f)
void emitVTable(const CXXRecordDecl *rd)
This is a callback from Sema to tell us that a particular vtable is required to be emitted in this tr...
cir::GlobalLinkageKind getVTableLinkage(const CXXRecordDecl *rd)
Return the appropriate linkage for the vtable, VTT, and type information of the given class.
cir::RecordType getVTableType(const clang::VTableLayout &layout)
Returns the type of a vtable with the given layout.
void createVTableInitializer(cir::GlobalOp &vtable, const clang::VTableLayout &layout, mlir::Attribute rtti, bool vtableHasLocalLinkage)
Add vtable components for the given vtable layout to the given global initializer.
cir::GlobalOp generateConstructionVTable(const CXXRecordDecl *rd, const BaseSubobject &base, bool baseIsVirtual, cir::GlobalLinkageKind linkage, VTableAddressPointsMapTy &addressPoints)
Generate a construction vtable for the given base subobject.
uint64_t getSubVTTIndex(const CXXRecordDecl *rd, BaseSubobject base)
Return the index of the sub-VTT for the base class of the given record decl.
void emitThunks(GlobalDecl gd)
Emit the associated thunks for the given global decl.
void emitVTTDefinition(cir::GlobalOp vttOp, cir::GlobalLinkageKind linkage, const CXXRecordDecl *rd)
Emit the definition of the given vtable.
CIRGenVTables(CIRGenModule &cgm)
cir::FuncOp maybeEmitThunk(GlobalDecl gd, const ThunkInfo &thunkAdjustments, bool forVTable)
Emit a thunk for the given global decl if needed, or return an existing thunk.
void generateClassData(const CXXRecordDecl *rd)
Generate all the class data required to be generated upon definition of a KeyFunction.
cir::GlobalOp getAddrOfVTT(const CXXRecordDecl *rd)
Get the address of the VTT for the given record decl.
clang::ItaniumVTableContext & getItaniumVTableContext()
bool isVTableExternal(const clang::CXXRecordDecl *rd)
At this point in the translation unit, does it appear that can we rely on the vtable being defined el...
uint64_t getSecondaryVirtualPointerIndex(const CXXRecordDecl *rd, BaseSubobject base)
Return the index in the VTT where the virtual pointer for the given subobject is located.
Type for representing both the decl and type of parameters to a function.
This trivial value class is used to represent the result of an expression that is evaluated.
static RValue get(mlir::Value v)
mlir::Value getValue() const
Return the value of this scalar value.
static RequiredArgs getFromProtoWithExtraSlots(const clang::FunctionProtoType *prototype, unsigned additional)
Compute the arguments required by the given formal prototype, given that there may be some additional...
Contains the address where the return value of a function can be stored, and whether the address is v...
Represents a C++ destructor within a class.
Represents a static or instance method of a struct/union/class.
QualType getThisType() const
Return the type of the this pointer.
Represents a C++ struct/union/class.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
bool isDynamicClass() const
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
CharUnits - This is an opaque type for sizes expressed in character units.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
ASTContext & getASTContext() const LLVM_READONLY
SourceLocation getLocation() const
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Represents a function declaration or definition.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
ArrayRef< ParmVarDecl * > parameters() const
param_iterator param_begin()
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
GlobalDecl - represents a global declaration.
CXXDtorType getDtorType() const
const Decl * getDecl() const
const VTableLayout & getVTableLayout(const CXXRecordDecl *RD)
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, const ThunkInfo &Thunk, bool ElideOverrideInfo, raw_ostream &)=0
virtual void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, bool ElideOverrideInfo, raw_ostream &)=0
bool isExternallyVisible() const
Represents a parameter to a function.
A (possibly-)qualified type.
Encodes a location in the source.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
virtual bool emitVectorDeletingDtors(const LangOptions &) const
Controls whether to emit MSVC vector deleting destructors.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Class for building VTT layout information.
const llvm::DenseMap< BaseSubobject, uint64_t > & getSecondaryVirtualPointerIndices() const
Returns a reference to the secondary virtual pointer indices.
const llvm::DenseMap< BaseSubobject, uint64_t > & getSubVTTIndices() const
Returns a reference to the sub-VTT indices.
const VTTComponentsVectorTy & getVTTComponents() const
const VTTVTablesVectorTy & getVTTVTables() const
CharUnits getBaseOffset() const
const CXXRecordDecl * getBase() const
BaseSubobject getBaseSubobject() const
Represents a single component in a vtable.
CharUnits getVBaseOffset() const
Kind getKind() const
Get the kind of this vtable component.
@ CK_DeletingDtorPointer
A pointer to the deleting destructor.
@ CK_UnusedFunctionPointer
An entry that is never used.
@ CK_CompleteDtorPointer
A pointer to the complete destructor.
CharUnits getOffsetToTop() const
GlobalDecl getGlobalDecl(bool HasVectorDeletingDtors) const
CharUnits getVCallOffset() const
SmallVector< ThunkInfo, 1 > ThunkInfoVectorTy
const AddressPointsIndexMapTy & getAddressPointIndices() const
size_t getVTableOffset(size_t i) const
llvm::DenseMap< BaseSubobject, AddressPointLocation > AddressPointsMapTy
AddressPointLocation getAddressPoint(BaseSubobject Base) const
ArrayRef< VTableComponent > vtable_components() const
size_t getNumVTables() const
ArrayRef< VTableThunkTy > vtable_thunks() const
size_t getVTableSize(size_t i) const
static bool isLocalLinkage(GlobalLinkageKind linkage)
const AstTypeMatcher< ArrayType > arrayType
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
@ Dtor_Base
Base object dtor.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
U cast(CodeGen::Address addr)
Diagnostic wrappers for TextAPI types for error reporting.
static bool objCLifetime()
static bool opGlobalUnnamedAddr()
static bool vtableEmitMetadata()
static bool setDLLStorageClass()
static bool opCallInAlloca()
static bool pointerAuthentication()
static bool opCallMustTail()
static bool returnValueSlotFeatures()
static bool cudaSupport()
static bool generateDebugInfo()
static bool vtableRelativeLayout()
Represents a scope, including function bodies, compound statements, and the substatements of if/while...
The this pointer adjustment as well as an optional return adjustment for a thunk.
ReturnAdjustment Return
The return adjustment.
unsigned AddressPointIndex