r364424 - [clang/DIVar] Emit the flag for params that have unmodified value
Djordje Todorovic via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 11 00:09:41 PDT 2019
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 at 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 <asowda at cisco.com>
>> Co-authored-by: Nikola Prica <nikola.prica at rt-rk.com>
>> Co-authored-by: Ivan Baev <ibaev at 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 at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list