Skip to content

Commit

Permalink
[clang/DIVar] Emit the flag for params that have unmodified value
Browse files Browse the repository at this point in the history
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@cisco.com>
Co-authored-by: Nikola Prica <nikola.prica@rt-rk.com>
Co-authored-by: Ivan Baev <ibaev@cisco.com>

Differential Revision: https://reviews.llvm.org/D58035

llvm-svn: 364424
  • Loading branch information
djtodoro committed Jun 26, 2019
1 parent 1006a06 commit ed05d49
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
39 changes: 39 additions & 0 deletions clang/lib/CodeGen/CGDebugInfo.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -3588,6 +3589,12 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, SourceLocation Loc,
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.
Expand Down Expand Up @@ -3964,6 +3971,11 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
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;
}

Expand Down Expand Up @@ -4555,6 +4567,29 @@ void CGDebugInfo::setDwoId(uint64_t Signature) {
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.
Expand Down Expand Up @@ -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();
}

Expand Down
4 changes: 4 additions & 0 deletions clang/lib/CodeGen/CGDebugInfo.h
Expand Up @@ -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;
Expand Down
12 changes: 12 additions & 0 deletions clang/test/CodeGen/debug-info-param-modification.c
@@ -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;
}

0 comments on commit ed05d49

Please sign in to comment.