Hi Vedant, This looks good! Thanks!
Regards, Djordje On 11.7.19. 02:11, Vedant Kumar wrote: > Hi Djordje, > > Just a heads-up that I’ve landed r365716 to fix a crash in a stage2 build of > AppleClang with -femit-debug-entry-values enabled. > > I went ahead and landed the fix as it seemed simple enough. Let me know if > you have any concerns. > > Thanks, > Vedant > >> On Jun 26, 2019, at 6:32 AM, Djordje Todorovic via cfe-commits >> <cfe-commits@lists.llvm.org> wrote: >> >> Author: djtodoro >> Date: Wed Jun 26 06:32:02 2019 >> New Revision: 364424 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=364424&view=rev >> Log: >> [clang/DIVar] Emit the flag for params that have unmodified value >> >> Emit the debug info flag that indicates that a parameter has unchanged >> value throughout a function. >> >> ([5/13] Introduce the debug entry values.) >> >> Co-authored-by: Ananth Sowda <aso...@cisco.com> >> Co-authored-by: Nikola Prica <nikola.pr...@rt-rk.com> >> Co-authored-by: Ivan Baev <ib...@cisco.com> >> >> Differential Revision: https://reviews.llvm.org/D58035 >> >> Added: >> cfe/trunk/test/CodeGen/debug-info-param-modification.c >> Modified: >> cfe/trunk/lib/CodeGen/CGDebugInfo.cpp >> cfe/trunk/lib/CodeGen/CGDebugInfo.h >> >> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=364424&r1=364423&r2=364424&view=diff >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Jun 26 06:32:02 2019 >> @@ -18,6 +18,7 @@ >> #include "CodeGenFunction.h" >> #include "CodeGenModule.h" >> #include "ConstantEmitter.h" >> +#include "clang/Analysis/Analyses/ExprMutationAnalyzer.h" >> #include "clang/AST/ASTContext.h" >> #include "clang/AST/DeclFriend.h" >> #include "clang/AST/DeclObjC.h" >> @@ -3588,6 +3589,12 @@ void CGDebugInfo::EmitFunctionStart(Glob >> if (HasDecl && isa<FunctionDecl>(D)) >> DeclCache[D->getCanonicalDecl()].reset(SP); >> >> + // We use the SPDefCache only in the case when the debug entry values >> option >> + // is set, in order to speed up parameters modification analysis. >> + if (CGM.getCodeGenOpts().EnableDebugEntryValues && HasDecl && >> + isa<FunctionDecl>(D)) >> + SPDefCache[cast<FunctionDecl>(D)].reset(SP); >> + >> if (CGM.getCodeGenOpts().DwarfVersion >= 5) { >> // Starting with DWARF V5 method declarations are emitted as children of >> // the interface type. >> @@ -3964,6 +3971,11 @@ llvm::DILocalVariable *CGDebugInfo::Emit >> llvm::DebugLoc::get(Line, Column, Scope, >> CurInlinedAt), >> Builder.GetInsertBlock()); >> >> + if (CGM.getCodeGenOpts().EnableDebugEntryValues && ArgNo) { >> + if (auto *PD = dyn_cast<ParmVarDecl>(VD)) >> + ParamCache[PD].reset(D); >> + } >> + >> return D; >> } >> >> @@ -4555,6 +4567,29 @@ void CGDebugInfo::setDwoId(uint64_t Sign >> TheCU->setDWOId(Signature); >> } >> >> +/// Analyzes each function parameter to determine whether it is constant >> +/// throughout the function body. >> +static void analyzeParametersModification( >> + ASTContext &Ctx, >> + llvm::DenseMap<const FunctionDecl *, llvm::TrackingMDRef> &SPDefCache, >> + llvm::DenseMap<const ParmVarDecl *, llvm::TrackingMDRef> &ParamCache) { >> + for (auto &SP : SPDefCache) { >> + auto *FD = SP.first; >> + assert(FD->hasBody() && "Functions must have body here"); >> + const Stmt *FuncBody = (*FD).getBody(); >> + for (auto Parm : FD->parameters()) { >> + ExprMutationAnalyzer FuncAnalyzer(*FuncBody, Ctx); >> + if (FuncAnalyzer.isMutated(Parm)) >> + continue; >> + >> + auto I = ParamCache.find(Parm); >> + assert(I != ParamCache.end() && "Parameters should be already >> cached"); >> + auto *DIParm = cast<llvm::DILocalVariable>(I->second); >> + DIParm->setIsNotModified(); >> + } >> + } >> +} >> + >> void CGDebugInfo::finalize() { >> // Creating types might create further types - invalidating the current >> // element and the size(), so don't cache/reference them. >> @@ -4627,6 +4662,10 @@ void CGDebugInfo::finalize() { >> if (auto MD = TypeCache[RT]) >> DBuilder.retainType(cast<llvm::DIType>(MD)); >> >> + if (CGM.getCodeGenOpts().EnableDebugEntryValues) >> + // This will be used to emit debug entry values. >> + analyzeParametersModification(CGM.getContext(), SPDefCache, ParamCache); >> + >> DBuilder.finalize(); >> } >> >> >> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=364424&r1=364423&r2=364424&view=diff >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original) >> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Wed Jun 26 06:32:02 2019 >> @@ -134,6 +134,10 @@ class CGDebugInfo { >> >> llvm::DenseMap<const char *, llvm::TrackingMDRef> DIFileCache; >> llvm::DenseMap<const FunctionDecl *, llvm::TrackingMDRef> SPCache; >> + /// Cache function definitions relevant to use for parameters mutation >> + /// analysis. >> + llvm::DenseMap<const FunctionDecl *, llvm::TrackingMDRef> SPDefCache; >> + llvm::DenseMap<const ParmVarDecl *, llvm::TrackingMDRef> ParamCache; >> /// Cache declarations relevant to DW_TAG_imported_declarations (C++ >> /// using declarations) that aren't covered by other more specific caches. >> llvm::DenseMap<const Decl *, llvm::TrackingMDRef> DeclCache; >> >> Added: cfe/trunk/test/CodeGen/debug-info-param-modification.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-param-modification.c?rev=364424&view=auto >> ============================================================================== >> --- cfe/trunk/test/CodeGen/debug-info-param-modification.c (added) >> +++ cfe/trunk/test/CodeGen/debug-info-param-modification.c Wed Jun 26 >> 06:32:02 2019 >> @@ -0,0 +1,12 @@ >> +// RUN: %clang -Xclang -femit-debug-entry-values -g -O2 -S -target >> x86_64-none-linux-gnu -emit-llvm %s -o - | FileCheck %s >> -check-prefix=CHECK-ENTRY-VAL-OPT >> +// CHECK-ENTRY-VAL-OPT: !DILocalVariable(name: "a", arg: 1, scope: {{.*}}, >> file: {{.*}}, line: {{.*}}, type: {{.*}}) >> +// CHECK-ENTRY-VAL-OPT: !DILocalVariable(name: "b", arg: 2, scope: {{.*}}, >> file: {{.*}}, line: {{.*}}, type: {{.*}}, flags: DIFlagArgumentNotModified) >> +// >> +// RUN: %clang -g -O2 -target x86_64-none-linux-gnu -S -emit-llvm %s -o - | >> FileCheck %s >> +// CHECK-NOT: !DILocalVariable(name: "b", arg: 2, scope: {{.*}}, file: >> {{.*}}, line: {{.*}}, type: {{.*}}, flags: DIFlagArgumentNotModified) >> +// >> + >> +int fn2 (int a, int b) { >> + ++a; >> + return b; >> +} >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits