[llvm] 47669af - [llvm-profgen] Ignore inline frames with an emtpy function name (#66678)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 18 12:40:10 PDT 2023
Author: Hongtao Yu
Date: 2023-09-18T12:40:06-07:00
New Revision: 47669af47fafd5d0b0dc117938ae7a1cffc8d344
URL: https://github.com/llvm/llvm-project/commit/47669af47fafd5d0b0dc117938ae7a1cffc8d344
DIFF: https://github.com/llvm/llvm-project/commit/47669af47fafd5d0b0dc117938ae7a1cffc8d344.diff
LOG: [llvm-profgen] Ignore inline frames with an emtpy function name (#66678)
Broken debug information can give empty names for an inlined frame, e.g,
```
0x1d605c68: ryKeyINS7_17SmartCounterTypesEEESt10shared_ptrINS7_15AsyncCacheValueIS9_EEESaIhESt6atomicEEE9fetch_subElSt12memory_order at Filename: edata.h
Function start filename: edata.h
Function start line: 266
Function start address: 0x1d605c68
Line: 267
Column: 0
(inlined by) at Filename: edata.h
Function start filename: edata.h
Function start line: 274
Function start address: 0x1d605c68
Line: 275
Column: 0
(inlined by) _EEEmmEv at Filename: arena.c
Function start filename: arena.c
Function start line: 1303
Line: 1308
Column: 0
```
This patch avoids creating a sample context with an empty function name
by stopping tracking at that frame. This prevents a hash failure that
leads to an ICE, where empty context serves at an empty key for the
underlying MapVector
https://github.com/llvm/llvm-project/blob/7624de5beae2f142abfdb3e32a63c263a586d768/llvm/lib/ProfileData/SampleProfWriter.cpp#L261
Added:
Modified:
llvm/include/llvm/ProfileData/SampleProf.h
llvm/tools/llvm-profgen/ProfiledBinary.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ProfileData/SampleProf.h b/llvm/include/llvm/ProfileData/SampleProf.h
index 9b2416e39b6cc9a..78a16499accd64a 100644
--- a/llvm/include/llvm/ProfileData/SampleProf.h
+++ b/llvm/include/llvm/ProfileData/SampleProf.h
@@ -533,7 +533,9 @@ class SampleContext {
SampleContext() : State(UnknownContext), Attributes(ContextNone) {}
SampleContext(StringRef Name)
- : Name(Name), State(UnknownContext), Attributes(ContextNone) {}
+ : Name(Name), State(UnknownContext), Attributes(ContextNone) {
+ assert(!Name.empty() && "Name is empty");
+ }
SampleContext(SampleContextFrames Context,
ContextStateMask CState = RawContext)
diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.cpp b/llvm/tools/llvm-profgen/ProfiledBinary.cpp
index 5fb51d3ac9eba78..f26b2bd5df5eda5 100644
--- a/llvm/tools/llvm-profgen/ProfiledBinary.cpp
+++ b/llvm/tools/llvm-profgen/ProfiledBinary.cpp
@@ -865,7 +865,7 @@ 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 == "<invalid>")
+ if (CallerFrame.FunctionName.empty() || (CallerFrame.FunctionName == "<invalid>"))
break;
StringRef FunctionName(CallerFrame.FunctionName);
More information about the llvm-commits
mailing list