[llvm] [llvm-profgen] More tweaks to warnings (PR #68608)
Hongtao Yu via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 22 17:00:07 PDT 2023
https://github.com/htyu updated https://github.com/llvm/llvm-project/pull/68608
>From 421a7487b6b656a9d638c69c27d9152104f59c67 Mon Sep 17 00:00:00 2001
From: Hongtao Yu <hoy at fb.com>
Date: Mon, 9 Oct 2023 09:23:43 -0700
Subject: [PATCH] [llvm-profgen] More tweaks to warnings.
---
llvm/tools/llvm-profgen/ProfiledBinary.cpp | 46 +++++++++++++++-------
llvm/tools/llvm-profgen/ProfiledBinary.h | 6 ++-
2 files changed, 36 insertions(+), 16 deletions(-)
diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.cpp b/llvm/tools/llvm-profgen/ProfiledBinary.cpp
index 6db25b5541b4581..b40c5f8cbbe068e 100644
--- a/llvm/tools/llvm-profgen/ProfiledBinary.cpp
+++ b/llvm/tools/llvm-profgen/ProfiledBinary.cpp
@@ -480,12 +480,6 @@ bool ProfiledBinary::dissassembleSymbol(std::size_t SI, ArrayRef<uint8_t> Bytes,
if (ShowDisassembly)
outs() << '<' << SymbolName << ">:\n";
- auto WarnInvalidInsts = [](uint64_t Start, uint64_t End) {
- WithColor::warning() << "Invalid instructions at "
- << format("%8" PRIx64, Start) << " - "
- << format("%8" PRIx64, End) << "\n";
- };
-
uint64_t Address = StartAddress;
// Size of a consecutive invalid instruction range starting from Address -1
// backwards.
@@ -578,7 +572,8 @@ bool ProfiledBinary::dissassembleSymbol(std::size_t SI, ArrayRef<uint8_t> Bytes,
}
if (InvalidInstLength) {
- WarnInvalidInsts(Address - InvalidInstLength, Address - 1);
+ AddrsWithInvalidInstruction.insert(
+ {Address - InvalidInstLength, Address - 1});
InvalidInstLength = 0;
}
} else {
@@ -589,7 +584,8 @@ bool ProfiledBinary::dissassembleSymbol(std::size_t SI, ArrayRef<uint8_t> Bytes,
}
if (InvalidInstLength)
- WarnInvalidInsts(Address - InvalidInstLength, Address - 1);
+ AddrsWithInvalidInstruction.insert(
+ {Address - InvalidInstLength, Address - 1});
if (ShowDisassembly)
outs() << "\n";
@@ -708,6 +704,19 @@ void ProfiledBinary::disassemble(const ELFObjectFileBase *Obj) {
}
}
+ if (!AddrsWithInvalidInstruction.empty()) {
+ if (ShowDetailedWarning) {
+ for (auto &Addr : AddrsWithInvalidInstruction) {
+ WithColor::warning()
+ << "Invalid instructions at " << format("%8" PRIx64, Addr.first)
+ << " - " << format("%8" PRIx64, Addr.second) << "\n";
+ }
+ }
+ WithColor::warning() << "Found " << AddrsWithInvalidInstruction.size()
+ << " invalid instructions\n";
+ AddrsWithInvalidInstruction.clear();
+ }
+
// Dissassemble rodata section to check if FS discriminator symbol exists.
checkUseFSDiscriminator(Obj, AllSymbols);
}
@@ -792,10 +801,12 @@ void ProfiledBinary::loadSymbolsFromDWARFUnit(DWARFUnit &CompilationUnit) {
FRange.StartAddress = StartAddress;
FRange.EndAddress = EndAddress;
} else {
- WithColor::warning()
- << "Duplicated symbol start address at "
- << format("%8" PRIx64, StartAddress) << " "
- << R.first->second.getFuncName() << " and " << Name << "\n";
+ AddrsWithMultipleSymbols.insert(StartAddress);
+ if (ShowDetailedWarning)
+ WithColor::warning()
+ << "Duplicated symbol start address at "
+ << format("%8" PRIx64, StartAddress) << " "
+ << R.first->second.getFuncName() << " and " << Name << "\n";
}
}
}
@@ -839,14 +850,18 @@ void ProfiledBinary::loadSymbolsFromDWARF(ObjectFile &Obj) {
if (BinaryFunctions.empty())
WithColor::warning() << "Loading of DWARF info completed, but no binary "
"functions have been retrieved.\n";
-
-
// Populate the hash binary function map for MD5 function name lookup. This
// is done after BinaryFunctions are finalized.
for (auto &BinaryFunction : BinaryFunctions) {
HashBinaryFunctions[MD5Hash(StringRef(BinaryFunction.first))] =
&BinaryFunction.second;
}
+
+ if (!AddrsWithMultipleSymbols.empty()) {
+ WithColor::warning() << "Found " << AddrsWithMultipleSymbols.size()
+ << " start addresses with multiple symbols\n";
+ AddrsWithMultipleSymbols.clear();
+ }
}
void ProfiledBinary::populateSymbolListFromDWARF(
@@ -881,7 +896,8 @@ SampleContextFrameVector ProfiledBinary::symbolize(const InstructionPointer &IP,
SampleContextFrameVector CallStack;
for (int32_t I = InlineStack.getNumberOfFrames() - 1; I >= 0; I--) {
const auto &CallerFrame = InlineStack.getFrame(I);
- if (CallerFrame.FunctionName.empty() || (CallerFrame.FunctionName == "<invalid>"))
+ if (CallerFrame.FunctionName.empty() ||
+ (CallerFrame.FunctionName == "<invalid>"))
break;
StringRef FunctionName(CallerFrame.FunctionName);
diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.h b/llvm/tools/llvm-profgen/ProfiledBinary.h
index 8c607d665dee81e..8f42ff11a38a91d 100644
--- a/llvm/tools/llvm-profgen/ProfiledBinary.h
+++ b/llvm/tools/llvm-profgen/ProfiledBinary.h
@@ -230,6 +230,10 @@ class ProfiledBinary {
// GUID to Elf symbol start address map
DenseMap<uint64_t, uint64_t> SymbolStartAddrs;
+ // These maps are for temporary use of warning diagnosis.
+ DenseSet<int64_t> AddrsWithMultipleSymbols;
+ DenseSet<std::pair<uint64_t, uint64_t>> AddrsWithInvalidInstruction;
+
// Start address to Elf symbol GUID map
std::unordered_multimap<uint64_t, uint64_t> StartAddrToSymMap;
@@ -529,7 +533,7 @@ class ProfiledBinary {
void flushSymbolizer() { Symbolizer.reset(); }
- MissingFrameInferrer* getMissingContextInferrer() {
+ MissingFrameInferrer *getMissingContextInferrer() {
return MissingContextInferrer.get();
}
More information about the llvm-commits
mailing list