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