Author: Melanie Blower Date: 2021-07-20T11:01:22-04:00 New Revision: ea864c9933021030e33411da79b5155a78b33325
URL: https://github.com/llvm/llvm-project/commit/ea864c9933021030e33411da79b5155a78b33325 DIFF: https://github.com/llvm/llvm-project/commit/ea864c9933021030e33411da79b5155a78b33325.diff LOG: [clang][patch][NFC] Refactor calculation of FunctionDecl to avoid duplicate code Added: Modified: clang/lib/CodeGen/CodeGenFunction.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 91480b0824a2..a2384456ea94 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -710,9 +710,9 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, DidCallStackSave = false; CurCodeDecl = D; - if (const auto *FD = dyn_cast_or_null<FunctionDecl>(D)) - if (FD->usesSEHTry()) - CurSEHParent = FD; + const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D); + if (FD && FD->usesSEHTry()) + CurSEHParent = FD; CurFuncDecl = (D ? D->getNonClosureContext() : nullptr); FnRetTy = RetTy; CurFn = Fn; @@ -803,10 +803,9 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, // are not aware of how to move the extra UBSan instructions across the split // coroutine boundaries. if (D && SanOpts.has(SanitizerKind::Null)) - if (const auto *FD = dyn_cast<FunctionDecl>(D)) - if (FD->getBody() && - FD->getBody()->getStmtClass() == Stmt::CoroutineBodyStmtClass) - SanOpts.Mask &= ~SanitizerKind::Null; + if (FD && FD->getBody() && + FD->getBody()->getStmtClass() == Stmt::CoroutineBodyStmtClass) + SanOpts.Mask &= ~SanitizerKind::Null; // Apply xray attributes to the function (as a string, for now) bool AlwaysXRayAttr = false; @@ -896,32 +895,27 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, if (D && D->hasAttr<NoProfileFunctionAttr>()) Fn->addFnAttr(llvm::Attribute::NoProfile); - if (getLangOpts().OpenCL) { + if (FD && getLangOpts().OpenCL) { // Add metadata for a kernel function. - if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) - EmitOpenCLKernelMetadata(FD, Fn); + EmitOpenCLKernelMetadata(FD, Fn); } // If we are checking function types, emit a function type signature as // prologue data. - if (getLangOpts().CPlusPlus && SanOpts.has(SanitizerKind::Function)) { - if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) { - if (llvm::Constant *PrologueSig = getPrologueSignature(CGM, FD)) { - // Remove any (C++17) exception specifications, to allow calling e.g. a - // noexcept function through a non-noexcept pointer. - auto ProtoTy = - getContext().getFunctionTypeWithExceptionSpec(FD->getType(), - EST_None); - llvm::Constant *FTRTTIConst = - CGM.GetAddrOfRTTIDescriptor(ProtoTy, /*ForEH=*/true); - llvm::Constant *FTRTTIConstEncoded = - EncodeAddrForUseInPrologue(Fn, FTRTTIConst); - llvm::Constant *PrologueStructElems[] = {PrologueSig, - FTRTTIConstEncoded}; - llvm::Constant *PrologueStructConst = - llvm::ConstantStruct::getAnon(PrologueStructElems, /*Packed=*/true); - Fn->setPrologueData(PrologueStructConst); - } + if (FD && getLangOpts().CPlusPlus && SanOpts.has(SanitizerKind::Function)) { + if (llvm::Constant *PrologueSig = getPrologueSignature(CGM, FD)) { + // Remove any (C++17) exception specifications, to allow calling e.g. a + // noexcept function through a non-noexcept pointer. + auto ProtoTy = getContext().getFunctionTypeWithExceptionSpec( + FD->getType(), EST_None); + llvm::Constant *FTRTTIConst = + CGM.GetAddrOfRTTIDescriptor(ProtoTy, /*ForEH=*/true); + llvm::Constant *FTRTTIConstEncoded = + EncodeAddrForUseInPrologue(Fn, FTRTTIConst); + llvm::Constant *PrologueStructElems[] = {PrologueSig, FTRTTIConstEncoded}; + llvm::Constant *PrologueStructConst = + llvm::ConstantStruct::getAnon(PrologueStructElems, /*Packed=*/true); + Fn->setPrologueData(PrologueStructConst); } } @@ -948,14 +942,12 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, // kernels cannot include RTTI information, exception classes, // recursive code, virtual functions or make use of C++ libraries that // are not compiled for the device. - if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) { - if ((getLangOpts().CPlusPlus && FD->isMain()) || getLangOpts().OpenCL || - getLangOpts().SYCLIsDevice || - (getLangOpts().CUDA && FD->hasAttr<CUDAGlobalAttr>())) - Fn->addFnAttr(llvm::Attribute::NoRecurse); - } + if (FD && ((getLangOpts().CPlusPlus && FD->isMain()) || + getLangOpts().OpenCL || getLangOpts().SYCLIsDevice || + (getLangOpts().CUDA && FD->hasAttr<CUDAGlobalAttr>()))) + Fn->addFnAttr(llvm::Attribute::NoRecurse); - if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) { + if (FD) { Builder.setIsFPConstrained(FD->hasAttr<StrictFPAttr>()); if (FD->hasAttr<StrictFPAttr>()) Fn->addFnAttr(llvm::Attribute::StrictFP); @@ -963,10 +955,9 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, // If a custom alignment is used, force realigning to this alignment on // any main function which certainly will need it. - if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) - if ((FD->isMain() || FD->isMSVCRTEntryPoint()) && - CGM.getCodeGenOpts().StackAlignment) - Fn->addFnAttr("stackrealign"); + if (FD && ((FD->isMain() || FD->isMSVCRTEntryPoint()) && + CGM.getCodeGenOpts().StackAlignment)) + Fn->addFnAttr("stackrealign"); llvm::BasicBlock *EntryBB = createBasicBlock("entry", CurFn); @@ -993,7 +984,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, // such as 'this' and 'vtt', show up in the debug info. Preserve the calling // convention. CallingConv CC = CallingConv::CC_C; - if (auto *FD = dyn_cast_or_null<FunctionDecl>(D)) + if (FD) if (const auto *SrcFnTy = FD->getType()->getAs<FunctionType>()) CC = SrcFnTy->getCallConv(); SmallVector<QualType, 16> ArgTypes; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits