brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · aad286f Raw
137 lines · cpp
1//==--- CodeGenABITypes.cpp - Convert Clang types to LLVM types for ABI ----==//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-exception6//7//===----------------------------------------------------------------------===//8//9// CodeGenABITypes is a simple interface for getting LLVM types for10// the parameters and the return value of a function given the Clang11// types.12//13// The class is implemented as a public wrapper around the private14// CodeGenTypes class in lib/CodeGen.15//16//===----------------------------------------------------------------------===//17 18#include "clang/CodeGen/CodeGenABITypes.h"19#include "CGCXXABI.h"20#include "CGRecordLayout.h"21#include "CodeGenFunction.h"22#include "CodeGenModule.h"23#include "clang/CodeGen/CGFunctionInfo.h"24 25using namespace clang;26using namespace CodeGen;27 28void CodeGen::addDefaultFunctionDefinitionAttributes(CodeGenModule &CGM,29                                                     llvm::AttrBuilder &attrs) {30  CGM.addDefaultFunctionDefinitionAttributes(attrs);31}32 33const CGFunctionInfo &34CodeGen::arrangeObjCMessageSendSignature(CodeGenModule &CGM,35                                         const ObjCMethodDecl *MD,36                                         QualType receiverType) {37  return CGM.getTypes().arrangeObjCMessageSendSignature(MD, receiverType);38}39 40const CGFunctionInfo &41CodeGen::arrangeFreeFunctionType(CodeGenModule &CGM,42                                 CanQual<FunctionProtoType> Ty) {43  return CGM.getTypes().arrangeFreeFunctionType(Ty);44}45 46const CGFunctionInfo &47CodeGen::arrangeFreeFunctionType(CodeGenModule &CGM,48                                 CanQual<FunctionNoProtoType> Ty) {49  return CGM.getTypes().arrangeFreeFunctionType(Ty);50}51 52const CGFunctionInfo &53CodeGen::arrangeCXXMethodType(CodeGenModule &CGM,54                              const CXXRecordDecl *RD,55                              const FunctionProtoType *FTP,56                              const CXXMethodDecl *MD) {57  return CGM.getTypes().arrangeCXXMethodType(RD, FTP, MD);58}59 60const CGFunctionInfo &CodeGen::arrangeCXXMethodCall(61    CodeGenModule &CGM, CanQualType returnType, ArrayRef<CanQualType> argTypes,62    FunctionType::ExtInfo info,63    ArrayRef<FunctionProtoType::ExtParameterInfo> paramInfos,64    RequiredArgs args) {65  return CGM.getTypes().arrangeLLVMFunctionInfo(66      returnType, FnInfoOpts::IsInstanceMethod, argTypes, info, paramInfos,67      args);68}69 70const CGFunctionInfo &CodeGen::arrangeFreeFunctionCall(71    CodeGenModule &CGM, CanQualType returnType, ArrayRef<CanQualType> argTypes,72    FunctionType::ExtInfo info,73    ArrayRef<FunctionProtoType::ExtParameterInfo> paramInfos,74    RequiredArgs args) {75  return CGM.getTypes().arrangeLLVMFunctionInfo(76      returnType, FnInfoOpts::None, argTypes, info, paramInfos, args);77}78 79ImplicitCXXConstructorArgs80CodeGen::getImplicitCXXConstructorArgs(CodeGenModule &CGM,81                                       const CXXConstructorDecl *D) {82  // We have to create a dummy CodeGenFunction here to pass to83  // getImplicitConstructorArgs(). In some cases (base and delegating84  // constructor calls), getImplicitConstructorArgs() can reach into the85  // CodeGenFunction to find parameters of the calling constructor to pass on to86  // the called constructor, but that can't happen here because we're asking for87  // the args for a complete, non-delegating constructor call.88  CodeGenFunction CGF(CGM, /* suppressNewContext= */ true);89  CGCXXABI::AddedStructorArgs addedArgs =90      CGM.getCXXABI().getImplicitConstructorArgs(CGF, D, Ctor_Complete,91                                                 /* ForVirtualBase= */ false,92                                                 /* Delegating= */ false);93  ImplicitCXXConstructorArgs implicitArgs;94  for (const auto &arg : addedArgs.Prefix) {95    implicitArgs.Prefix.push_back(arg.Value);96  }97  for (const auto &arg : addedArgs.Suffix) {98    implicitArgs.Suffix.push_back(arg.Value);99  }100  return implicitArgs;101}102 103llvm::FunctionType *104CodeGen::convertFreeFunctionType(CodeGenModule &CGM, const FunctionDecl *FD) {105  assert(FD != nullptr && "Expected a non-null function declaration!");106  llvm::Type *T = CGM.getTypes().ConvertType(FD->getType());107 108  if (auto FT = dyn_cast<llvm::FunctionType>(T))109    return FT;110 111  return nullptr;112}113 114llvm::Type *115CodeGen::convertTypeForMemory(CodeGenModule &CGM, QualType T) {116  return CGM.getTypes().ConvertTypeForMem(T);117}118 119unsigned CodeGen::getLLVMFieldNumber(CodeGenModule &CGM,120                                     const RecordDecl *RD,121                                     const FieldDecl *FD) {122  return CGM.getTypes().getCGRecordLayout(RD).getLLVMFieldNo(FD);123}124 125llvm::Value *CodeGen::getCXXDestructorImplicitParam(126    CodeGenModule &CGM, llvm::BasicBlock *InsertBlock,127    llvm::BasicBlock::iterator InsertPoint, const CXXDestructorDecl *D,128    CXXDtorType Type, bool ForVirtualBase, bool Delegating) {129  CodeGenFunction CGF(CGM, /*suppressNewContext=*/true);130  CGF.CurCodeDecl = D;131  CGF.CurFuncDecl = D;132  CGF.CurFn = InsertBlock->getParent();133  CGF.Builder.SetInsertPoint(InsertBlock, InsertPoint);134  return CGM.getCXXABI().getCXXDestructorImplicitParam(135      CGF, D, Type, ForVirtualBase, Delegating);136}137