diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/CodeGen/CGDeclCXX.cpp')
| -rw-r--r-- | contrib/llvm-project/clang/lib/CodeGen/CGDeclCXX.cpp | 34 | 
1 files changed, 19 insertions, 15 deletions
diff --git a/contrib/llvm-project/clang/lib/CodeGen/CGDeclCXX.cpp b/contrib/llvm-project/clang/lib/CodeGen/CGDeclCXX.cpp index 7a0605b8450a..3baa0a080f5d 100644 --- a/contrib/llvm-project/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/contrib/llvm-project/clang/lib/CodeGen/CGDeclCXX.cpp @@ -10,11 +10,12 @@  //  //===----------------------------------------------------------------------===// -#include "CodeGenFunction.h"  #include "CGCXXABI.h"  #include "CGObjCRuntime.h"  #include "CGOpenMPRuntime.h" +#include "CodeGenFunction.h"  #include "TargetInfo.h" +#include "clang/AST/Attr.h"  #include "clang/Basic/CodeGenOptions.h"  #include "llvm/ADT/StringExtras.h"  #include "llvm/IR/Intrinsics.h" @@ -54,10 +55,11 @@ static void EmitDeclInit(CodeGenFunction &CGF, const VarDecl &D,      CGF.EmitComplexExprIntoLValue(Init, lv, /*isInit*/ true);      return;    case TEK_Aggregate: -    CGF.EmitAggExpr(Init, AggValueSlot::forLValue(lv,AggValueSlot::IsDestructed, -                                          AggValueSlot::DoesNotNeedGCBarriers, -                                                  AggValueSlot::IsNotAliased, -                                                  AggValueSlot::DoesNotOverlap)); +    CGF.EmitAggExpr(Init, +                    AggValueSlot::forLValue(lv, CGF, AggValueSlot::IsDestructed, +                                            AggValueSlot::DoesNotNeedGCBarriers, +                                            AggValueSlot::IsNotAliased, +                                            AggValueSlot::DoesNotOverlap));      return;    }    llvm_unreachable("bad evaluation kind"); @@ -73,16 +75,10 @@ static void EmitDeclDestroy(CodeGenFunction &CGF, const VarDecl &D,    // that isn't balanced out by a destructor call as intended by the    // attribute. This also checks for -fno-c++-static-destructors and    // bails even if the attribute is not present. -  if (D.isNoDestroy(CGF.getContext())) -    return; - -  CodeGenModule &CGM = CGF.CGM; +  QualType::DestructionKind DtorKind = D.needsDestruction(CGF.getContext());    // FIXME:  __attribute__((cleanup)) ? -  QualType Type = D.getType(); -  QualType::DestructionKind DtorKind = Type.isDestructedType(); -    switch (DtorKind) {    case QualType::DK_none:      return; @@ -101,6 +97,9 @@ static void EmitDeclDestroy(CodeGenFunction &CGF, const VarDecl &D,    llvm::FunctionCallee Func;    llvm::Constant *Argument; +  CodeGenModule &CGM = CGF.CGM; +  QualType Type = D.getType(); +    // Special-case non-array C++ destructors, if they have the right signature.    // Under some ABIs, destructors return this instead of void, and cannot be    // passed directly to __cxa_atexit if the target does not allow this @@ -251,8 +250,8 @@ llvm::Function *CodeGenFunction::createAtExitStub(const VarDecl &VD,    llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr);   // Make sure the call and the callee agree on calling convention. -  if (llvm::Function *dtorFn = -          dyn_cast<llvm::Function>(dtor.getCallee()->stripPointerCasts())) +  if (auto *dtorFn = dyn_cast<llvm::Function>( +          dtor.getCallee()->stripPointerCastsAndAliases()))      call->setCallingConv(dtorFn->getCallingConv());    CGF.FinishFunction(); @@ -440,7 +439,7 @@ CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D,    // that are of class type, cannot have a non-empty constructor. All    // the checks have been done in Sema by now. Whatever initializers    // are allowed are empty and we just need to ignore them here. -  if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice && +  if (getLangOpts().CUDAIsDevice && !getLangOpts().GPUAllowDeviceInit &&        (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||         D->hasAttr<CUDASharedAttr>()))      return; @@ -611,6 +610,11 @@ CodeGenModule::EmitCXXGlobalInitFunc() {      Fn->setCallingConv(llvm::CallingConv::SPIR_KERNEL);    } +  if (getLangOpts().HIP) { +    Fn->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL); +    Fn->addFnAttr("device-init"); +  } +    CXXGlobalInits.clear();  }  | 
