//==--- CodeGenABITypes.cpp - Convert Clang types to LLVM types for ABI ----==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // CodeGenABITypes is a simple interface for getting LLVM types for // the parameters and the return value of a function given the Clang // types. // // The class is implemented as a public wrapper around the private // CodeGenTypes class in lib/CodeGen. // //===----------------------------------------------------------------------===// #include "clang/CodeGen/CodeGenABITypes.h" #include "CGCXXABI.h" #include "CGRecordLayout.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" #include "clang/CodeGen/CGFunctionInfo.h" #include "clang/Lex/HeaderSearchOptions.h" #include "clang/Lex/PreprocessorOptions.h" using namespace clang; using namespace CodeGen; void CodeGen::addDefaultFunctionDefinitionAttributes(CodeGenModule &CGM, llvm::AttrBuilder &attrs) { CGM.addDefaultFunctionDefinitionAttributes(attrs); } const CGFunctionInfo & CodeGen::arrangeObjCMessageSendSignature(CodeGenModule &CGM, const ObjCMethodDecl *MD, QualType receiverType) { return CGM.getTypes().arrangeObjCMessageSendSignature(MD, receiverType); } const CGFunctionInfo & CodeGen::arrangeFreeFunctionType(CodeGenModule &CGM, CanQual Ty) { return CGM.getTypes().arrangeFreeFunctionType(Ty); } const CGFunctionInfo & CodeGen::arrangeFreeFunctionType(CodeGenModule &CGM, CanQual Ty) { return CGM.getTypes().arrangeFreeFunctionType(Ty); } const CGFunctionInfo & CodeGen::arrangeCXXMethodType(CodeGenModule &CGM, const CXXRecordDecl *RD, const FunctionProtoType *FTP, const CXXMethodDecl *MD) { return CGM.getTypes().arrangeCXXMethodType(RD, FTP, MD); } const CGFunctionInfo & CodeGen::arrangeFreeFunctionCall(CodeGenModule &CGM, CanQualType returnType, ArrayRef argTypes, FunctionType::ExtInfo info, RequiredArgs args) { return CGM.getTypes().arrangeLLVMFunctionInfo( returnType, /*instanceMethod=*/false, /*chainCall=*/false, argTypes, info, {}, args); } ImplicitCXXConstructorArgs CodeGen::getImplicitCXXConstructorArgs(CodeGenModule &CGM, const CXXConstructorDecl *D) { // We have to create a dummy CodeGenFunction here to pass to // getImplicitConstructorArgs(). In some cases (base and delegating // constructor calls), getImplicitConstructorArgs() can reach into the // CodeGenFunction to find parameters of the calling constructor to pass on to // the called constructor, but that can't happen here because we're asking for // the args for a complete, non-delegating constructor call. CodeGenFunction CGF(CGM, /* suppressNewContext= */ true); CGCXXABI::AddedStructorArgs addedArgs = CGM.getCXXABI().getImplicitConstructorArgs(CGF, D, Ctor_Complete, /* ForVirtualBase= */ false, /* Delegating= */ false); ImplicitCXXConstructorArgs implicitArgs; for (const auto &arg : addedArgs.Prefix) { implicitArgs.Prefix.push_back(arg.Value); } for (const auto &arg : addedArgs.Suffix) { implicitArgs.Suffix.push_back(arg.Value); } return implicitArgs; } llvm::FunctionType * CodeGen::convertFreeFunctionType(CodeGenModule &CGM, const FunctionDecl *FD) { assert(FD != nullptr && "Expected a non-null function declaration!"); llvm::Type *T = CGM.getTypes().ConvertType(FD->getType()); if (auto FT = dyn_cast(T)) return FT; return nullptr; } llvm::Type * CodeGen::convertTypeForMemory(CodeGenModule &CGM, QualType T) { return CGM.getTypes().ConvertTypeForMem(T); } unsigned CodeGen::getLLVMFieldNumber(CodeGenModule &CGM, const RecordDecl *RD, const FieldDecl *FD) { return CGM.getTypes().getCGRecordLayout(RD).getLLVMFieldNo(FD); } llvm::Value *CodeGen::getCXXDestructorImplicitParam( CodeGenModule &CGM, llvm::BasicBlock *InsertBlock, llvm::BasicBlock::iterator InsertPoint, const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating) { CodeGenFunction CGF(CGM, /*suppressNewContext=*/true); CGF.CurCodeDecl = D; CGF.CurFuncDecl = D; CGF.CurFn = InsertBlock->getParent(); CGF.Builder.SetInsertPoint(InsertBlock, InsertPoint); return CGM.getCXXABI().getCXXDestructorImplicitParam( CGF, D, Type, ForVirtualBase, Delegating); }