brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 377c532 Raw
85 lines · cpp
1#include "TargetInfo.h"2#include "ABIInfo.h"3#include "CIRGenFunction.h"4#include "clang/CIR/Dialect/IR/CIRAttrs.h"5#include "clang/CIR/Dialect/IR/CIRDialect.h"6 7using namespace clang;8using namespace clang::CIRGen;9 10bool clang::CIRGen::isEmptyRecordForLayout(const ASTContext &context,11                                           QualType t) {12  const auto *rd = t->getAsRecordDecl();13  if (!rd)14    return false;15 16  // If this is a C++ record, check the bases first.17  if (const CXXRecordDecl *cxxrd = dyn_cast<CXXRecordDecl>(rd)) {18    if (cxxrd->isDynamicClass())19      return false;20 21    for (const auto &i : cxxrd->bases())22      if (!isEmptyRecordForLayout(context, i.getType()))23        return false;24  }25 26  for (const auto *i : rd->fields())27    if (!isEmptyFieldForLayout(context, i))28      return false;29 30  return true;31}32 33bool clang::CIRGen::isEmptyFieldForLayout(const ASTContext &context,34                                          const FieldDecl *fd) {35  if (fd->isZeroLengthBitField())36    return true;37 38  if (fd->isUnnamedBitField())39    return false;40 41  return isEmptyRecordForLayout(context, fd->getType());42}43 44namespace {45 46class X8664ABIInfo : public ABIInfo {47public:48  X8664ABIInfo(CIRGenTypes &cgt) : ABIInfo(cgt) {}49};50 51class X8664TargetCIRGenInfo : public TargetCIRGenInfo {52public:53  X8664TargetCIRGenInfo(CIRGenTypes &cgt)54      : TargetCIRGenInfo(std::make_unique<X8664ABIInfo>(cgt)) {}55};56 57} // namespace58 59std::unique_ptr<TargetCIRGenInfo>60clang::CIRGen::createX8664TargetCIRGenInfo(CIRGenTypes &cgt) {61  return std::make_unique<X8664TargetCIRGenInfo>(cgt);62}63 64ABIInfo::~ABIInfo() noexcept = default;65 66bool TargetCIRGenInfo::isNoProtoCallVariadic(67    const FunctionNoProtoType *fnType) const {68  // The following conventions are known to require this to be false:69  //   x86_stdcall70  //   MIPS71  // For everything else, we just prefer false unless we opt out.72  return false;73}74 75mlir::Value TargetCIRGenInfo::performAddrSpaceCast(76    CIRGenFunction &cgf, mlir::Value v, cir::TargetAddressSpaceAttr srcAddr,77    mlir::Type destTy, bool isNonNull) const {78  // Since target may map different address spaces in AST to the same address79  // space, an address space conversion may end up as a bitcast.80  if (cir::GlobalOp globalOp = v.getDefiningOp<cir::GlobalOp>())81    cgf.cgm.errorNYI("Global op addrspace cast");82  // Try to preserve the source's name to make IR more readable.83  return cgf.getBuilder().createAddrSpaceCast(v, destTy);84}85