Skip to content

Commit

Permalink
lvm-dwarfdump: Stop counting out-of-line subprogram in the "inlined f…
Browse files Browse the repository at this point in the history
…unctions" statistic.

DW_TAG_subprogram DIEs should not be counted in the inlined function statistic. This also addresses the source variables count, as that uses the inlined function count in its calculations.

Differential revision: https://reviews.llvm.org/D57849

llvm-svn: 353491
  • Loading branch information
cmtice committed Feb 8, 2019
1 parent ddeb2f2 commit cef4c29
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 20 deletions.
2 changes: 1 addition & 1 deletion llvm/test/tools/llvm-dwarfdump/X86/statistics.ll
@@ -1,6 +1,6 @@
; RUN: llc -O0 %s -o - -filetype=obj \
; RUN: | llvm-dwarfdump -statistics - | FileCheck %s
; CHECK: "version":1
; CHECK: "version":2

; int GlobalConst = 42;
; int Global;
Expand Down
Expand Up @@ -4,7 +4,7 @@
; Test that abstract origins in multiple CUs are uniqued.

; CHECK: "source functions":4,
; CHECK-SAME: "inlined functions":5,
; CHECK-SAME: "inlined functions":2,
; CHECK-SAME: "unique source variables":4
; CHECK-SAME: "source variables":6
; CHECK-SAME: "variables with location":6
Expand Down
Expand Up @@ -5,7 +5,7 @@
; The results for both tests should be identical.

; CHECK: "source functions":4,
; CHECK-SAME: "inlined functions":5,
; CHECK-SAME: "inlined functions":2,
; CHECK-SAME: "unique source variables":4
; CHECK-SAME: "source variables":6
; CHECK-SAME: "variables with location":6
Expand Down
45 changes: 28 additions & 17 deletions llvm/tools/llvm-dwarfdump/Statistics.cpp
Expand Up @@ -23,6 +23,9 @@ struct PerFunctionStats {
StringSet<> VarsInFunction;
/// Compile units also cover a PC range, but have this flag set to false.
bool IsFunction = false;
/// Verify function definition has PC addresses (for detecting when
/// a function has been inlined everywhere).
bool HasPCAddresses = false;
};

/// Holds accumulated global statistics about DIEs.
Expand Down Expand Up @@ -136,8 +139,10 @@ static void collectStatsForDie(DWARFDie Die, std::string FnPrefix,
GlobalStats.ScopeBytesFromFirstDefinition += BytesInScope;
assert(GlobalStats.ScopeBytesCovered <=
GlobalStats.ScopeBytesFromFirstDefinition);
} else {
} else if (Die.getTag() == dwarf::DW_TAG_member) {
FnStats.ConstantMembers++;
} else {
FnStats.TotalVarWithLoc += (unsigned)HasLoc;
}
}

Expand All @@ -164,6 +169,19 @@ static void collectStatsRecursive(DWARFDie Die, std::string FnPrefix,
if (Die.find(dwarf::DW_AT_declaration))
return;

// PC Ranges.
auto RangesOrError = Die.getAddressRanges();
if (!RangesOrError) {
llvm::consumeError(RangesOrError.takeError());
return;
}

auto Ranges = RangesOrError.get();
uint64_t BytesInThisScope = 0;
for (auto Range : Ranges)
BytesInThisScope += Range.HighPC - Range.LowPC;
ScopeLowPC = getLowPC(Die);

// Count the function.
if (!IsBlock) {
StringRef Name = Die.getName(DINameKind::LinkageName);
Expand All @@ -175,23 +193,13 @@ static void collectStatsRecursive(DWARFDie Die, std::string FnPrefix,
return;
// We've seen an (inlined) instance of this function.
auto &FnStats = FnStatMap[Name];
FnStats.NumFnInlined++;
if (IsInlinedFunction)
FnStats.NumFnInlined++;
FnStats.IsFunction = true;
if (BytesInThisScope && !IsInlinedFunction)
FnStats.HasPCAddresses = true;
}

// PC Ranges.
auto RangesOrError = Die.getAddressRanges();
if (!RangesOrError) {
llvm::consumeError(RangesOrError.takeError());
return;
}

auto Ranges = RangesOrError.get();
uint64_t BytesInThisScope = 0;
for (auto Range : Ranges)
BytesInThisScope += Range.HighPC - Range.LowPC;
ScopeLowPC = getLowPC(Die);

if (BytesInThisScope) {
BytesInScope = BytesInThisScope;
if (IsFunction)
Expand Down Expand Up @@ -258,7 +266,7 @@ bool collectStatsForObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
/// The version number should be increased every time the algorithm is changed
/// (including bug fixes). New metrics may be added without increasing the
/// version.
unsigned Version = 1;
unsigned Version = 2;
unsigned VarTotal = 0;
unsigned VarUnique = 0;
unsigned VarWithLoc = 0;
Expand All @@ -267,9 +275,12 @@ bool collectStatsForObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
for (auto &Entry : Statistics) {
PerFunctionStats &Stats = Entry.getValue();
unsigned TotalVars = Stats.VarsInFunction.size() * Stats.NumFnInlined;
// Count variables in concrete out-of-line functions and in global scope.
if (Stats.HasPCAddresses || !Stats.IsFunction)
TotalVars += Stats.VarsInFunction.size();
unsigned Constants = Stats.ConstantMembers;
VarWithLoc += Stats.TotalVarWithLoc + Constants;
VarTotal += TotalVars + Constants;
VarTotal += TotalVars;
VarUnique += Stats.VarsInFunction.size();
LLVM_DEBUG(for (auto &V : Stats.VarsInFunction) llvm::dbgs()
<< Entry.getKey() << ": " << V.getKey() << "\n");
Expand Down

0 comments on commit cef4c29

Please sign in to comment.