#include "TargetInfo.h" #include "ABIInfo.h" #include "CIRGenFunction.h" #include "clang/CIR/Dialect/IR/CIRAttrs.h" #include "clang/CIR/Dialect/IR/CIRDialect.h" using namespace clang; using namespace clang::CIRGen; bool clang::CIRGen::isEmptyRecordForLayout(const ASTContext &context, QualType t) { const auto *rd = t->getAsRecordDecl(); if (!rd) return false; // 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; } mlir::Value TargetCIRGenInfo::performAddrSpaceCast( CIRGenFunction &cgf, mlir::Value v, cir::TargetAddressSpaceAttr srcAddr, mlir::Type destTy, bool isNonNull) const { // Since target may map different address spaces in AST to the same address // space, an address space conversion may end up as a bitcast. if (cir::GlobalOp globalOp = v.getDefiningOp()) cgf.cgm.errorNYI("Global op addrspace cast"); // Try to preserve the source's name to make IR more readable. return cgf.getBuilder().createAddrSpaceCast(v, destTy); }