#include "TargetInfo.h" #include "ABIInfo.h" using namespace clang; using namespace clang::CIRGen; bool clang::CIRGen::isEmptyRecordForLayout(const ASTContext &context, QualType t) { const RecordType *rt = t->getAs(); if (!rt) return false; const RecordDecl *rd = rt->getDecl(); // If this is a C++ record, check the bases first. if (const CXXRecordDecl *cxxrd = dyn_cast(rd)) { if (cxxrd->isDynamicClass()) return false; for (const auto &I : cxxrd->bases()) if (!isEmptyRecordForLayout(context, I.getType())) return false; } for (const auto *I : rd->fields()) if (!isEmptyFieldForLayout(context, I)) return false; return true; } bool clang::CIRGen::isEmptyFieldForLayout(const ASTContext &context, const FieldDecl *fd) { if (fd->isZeroLengthBitField()) return true; if (fd->isUnnamedBitField()) return false; return isEmptyRecordForLayout(context, fd->getType()); } namespace { class X8664ABIInfo : public ABIInfo { public: X8664ABIInfo(CIRGenTypes &cgt) : ABIInfo(cgt) {} }; class X8664TargetCIRGenInfo : public TargetCIRGenInfo { public: X8664TargetCIRGenInfo(CIRGenTypes &cgt) : TargetCIRGenInfo(std::make_unique(cgt)) {} }; } // namespace std::unique_ptr clang::CIRGen::createX8664TargetCIRGenInfo(CIRGenTypes &cgt) { return std::make_unique(cgt); } ABIInfo::~ABIInfo() noexcept = default; bool TargetCIRGenInfo::isNoProtoCallVariadic( const FunctionNoProtoType *fnType) const { // The following conventions are known to require this to be false: // x86_stdcall // MIPS // For everything else, we just prefer false unless we opt out. return false; }