diff options
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
| -rw-r--r-- | lib/CodeGen/CGCXX.cpp | 54 | 
1 files changed, 21 insertions, 33 deletions
| diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 8b0733fbec3ef..6d903a0d09e23 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -1,9 +1,8 @@  //===--- CGCXX.cpp - Emit LLVM Code for declarations ----------------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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  //  //===----------------------------------------------------------------------===//  // @@ -204,55 +203,44 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) {    return false;  } -llvm::Function *CodeGenModule::codegenCXXStructor(const CXXMethodDecl *MD, -                                                  StructorType Type) { -  const CGFunctionInfo &FnInfo = -      getTypes().arrangeCXXStructorDeclaration(MD, Type); +llvm::Function *CodeGenModule::codegenCXXStructor(GlobalDecl GD) { +  const CGFunctionInfo &FnInfo = getTypes().arrangeCXXStructorDeclaration(GD);    auto *Fn = cast<llvm::Function>( -      getAddrOfCXXStructor(MD, Type, &FnInfo, /*FnType=*/nullptr, +      getAddrOfCXXStructor(GD, &FnInfo, /*FnType=*/nullptr,                             /*DontDefer=*/true, ForDefinition)); -  GlobalDecl GD; -  if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) { -    GD = GlobalDecl(DD, toCXXDtorType(Type)); -  } else { -    const auto *CD = cast<CXXConstructorDecl>(MD); -    GD = GlobalDecl(CD, toCXXCtorType(Type)); -  } -    setFunctionLinkage(GD, Fn);    CodeGenFunction(*this).GenerateCode(GD, Fn, FnInfo);    setNonAliasAttributes(GD, Fn); -  SetLLVMFunctionAttributesForDefinition(MD, Fn); +  SetLLVMFunctionAttributesForDefinition(cast<CXXMethodDecl>(GD.getDecl()), Fn);    return Fn;  } -llvm::Constant *CodeGenModule::getAddrOfCXXStructor( -    const CXXMethodDecl *MD, StructorType Type, const CGFunctionInfo *FnInfo, -    llvm::FunctionType *FnType, bool DontDefer, -    ForDefinition_t IsForDefinition) { -  GlobalDecl GD; -  if (auto *CD = dyn_cast<CXXConstructorDecl>(MD)) { -    GD = GlobalDecl(CD, toCXXCtorType(Type)); -  } else { +llvm::FunctionCallee CodeGenModule::getAddrAndTypeOfCXXStructor( +    GlobalDecl GD, const CGFunctionInfo *FnInfo, llvm::FunctionType *FnType, +    bool DontDefer, ForDefinition_t IsForDefinition) { +  auto *MD = cast<CXXMethodDecl>(GD.getDecl()); + +  if (isa<CXXDestructorDecl>(MD)) {      // Always alias equivalent complete destructors to base destructors in the      // MS ABI.      if (getTarget().getCXXABI().isMicrosoft() && -        Type == StructorType::Complete && MD->getParent()->getNumVBases() == 0) -      Type = StructorType::Base; -    GD = GlobalDecl(cast<CXXDestructorDecl>(MD), toCXXDtorType(Type)); +        GD.getDtorType() == Dtor_Complete && +        MD->getParent()->getNumVBases() == 0) +      GD = GD.getWithDtorType(Dtor_Base);    }    if (!FnType) {      if (!FnInfo) -      FnInfo = &getTypes().arrangeCXXStructorDeclaration(MD, Type); +      FnInfo = &getTypes().arrangeCXXStructorDeclaration(GD);      FnType = getTypes().GetFunctionType(*FnInfo);    } -  return GetOrCreateLLVMFunction( +  llvm::Constant *Ptr = GetOrCreateLLVMFunction(        getMangledName(GD), FnType, GD, /*ForVTable=*/false, DontDefer, -      /*isThunk=*/false, /*ExtraAttrs=*/llvm::AttributeList(), IsForDefinition); +      /*IsThunk=*/false, /*ExtraAttrs=*/llvm::AttributeList(), IsForDefinition); +  return {FnType, Ptr};  }  static CGCallee BuildAppleKextVirtualCall(CodeGenFunction &CGF, @@ -312,7 +300,7 @@ CodeGenFunction::BuildAppleKextVirtualDestructorCall(    assert(DD->isVirtual() && Type != Dtor_Base);    // Compute the function type we're calling.    const CGFunctionInfo &FInfo = CGM.getTypes().arrangeCXXStructorDeclaration( -      DD, StructorType::Complete); +      GlobalDecl(DD, Dtor_Complete));    llvm::Type *Ty = CGM.getTypes().GetFunctionType(FInfo);    return ::BuildAppleKextVirtualCall(*this, GlobalDecl(DD, Type), Ty, RD);  } | 
