Skip to content

Commit a34b175

Browse files
authored
[DLCov] Origin-Tracking: Add debugify support (#143594)
This patch is part of a series that adds origin-tracking to the debugify source location coverage checks, allowing us to report symbolized stack traces of the point where missing source locations appear. This patch completes the feature, having debugify handle origin stack traces by symbolizing them when an associated bug is found and printing them into the JSON report file as part of the bug entry. This patch also updates the script that parses the JSON report and creates a human-readable HTML report, adding an "Origin" entry to the table that contains an expandable textbox containing the symbolized stack trace.
1 parent de3c841 commit a34b175

File tree

8 files changed

+279
-23
lines changed

8 files changed

+279
-23
lines changed

llvm/docs/HowToUpdateDebugInfo.rst

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,41 @@ tests. Changes to this pass are not allowed to break existing tests.
420420
check lines. In cases where this can't be avoided (say, if a test wouldn't
421421
be precise enough), moving the test to its own file is preferred.
422422

423-
.. _MIRDebugify:
423+
Using Coverage Tracking to remove false positives
424+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
425+
426+
As described :ref:`above<WhenToDropLocation>`, there are valid reasons for
427+
instructions to not have source locations. Therefore, when detecting dropped or
428+
not-generated source locations, it may be preferable to avoid detecting cases
429+
where the missing source location is intentional. For this, you can use the
430+
"coverage tracking" feature in LLVM to prevent these from appearing in the
431+
``debugify`` output. This is enabled in a build of LLVM by setting the CMake
432+
flag ``-DLLVM_ENABLE_DEBUGLOC_COVERAGE_TRACKING=COVERAGE``. When this has been
433+
set, LLVM will enable runtime tracking of
434+
:ref:`DebugLoc annotations<NewInstLocations>`, allowing ``debugify`` to ignore
435+
instructions that have an explicitly recorded reason given for not having a
436+
source location.
437+
438+
For triaging source location bugs detected with ``debugify``, you may find it
439+
helpful to instead set the CMake flag to enable "origin tracking",
440+
``-DLLVM_ENABLE_DEBUGLOC_COVERAGE_TRACKING=COVERAGE_AND_ORIGIN``. This flag adds
441+
more detail to ``debugify``'s output, by including one or more stacktraces with
442+
every missing source location, capturing the point at which the empty source
443+
location was created, and every point at which it was copied to an instruction,
444+
making it trivial in most cases to find the origin of the underlying bug. If
445+
using origin tracking, it is recommended to also build LLVM with debug info
446+
enabled, so that the stacktrace can be accurately symbolized.
447+
448+
.. note::
449+
450+
The coverage tracking feature has been designed primarily for use with the
451+
:ref:`original debug info preservation<OriginalDI>` mode of ``debugify``, and
452+
so may not be reliable in other settings. When using this mode, the
453+
stacktraces produced by the ``COVERAGE_AND_ORIGIN`` setting will be printed
454+
in an easy-to-read format as part of the reports generated by the
455+
``llvm-original-di-preservation.py`` script.
456+
457+
.. _OriginalDI:
424458

425459
Test original debug info preservation in optimizations
426460
------------------------------------------------------
@@ -478,6 +512,8 @@ as follows:
478512
Please do note that there are some known false positives, for source locations
479513
and debug record checking, so that will be addressed as a future work.
480514

515+
.. _MIRDebugify:
516+
481517
Mutation testing for MIR-level transformations
482518
----------------------------------------------
483519

llvm/include/llvm/Support/Signals.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,8 @@
2626
namespace llvm {
2727
// Typedefs that are convenient but only used by the stack-trace-collection code
2828
// added if DebugLoc origin-tracking is enabled.
29-
using AddressSet = DenseSet<void *, DenseMapInfo<void *, void>>;
30-
using SymbolizedAddressMap =
31-
DenseMap<void *, SmallVector<std::string, 0>, DenseMapInfo<void *, void>,
32-
detail::DenseMapPair<void *, SmallVector<std::string, 0>>>;
29+
using AddressSet = DenseSet<void *>;
30+
using SymbolizedAddressMap = DenseMap<void *, SmallVector<std::string, 0>>;
3331
} // namespace llvm
3432
#endif
3533

llvm/lib/Transforms/Utils/Debugify.cpp

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
#include "llvm/Transforms/Utils/Debugify.h"
1717
#include "llvm/ADT/BitVector.h"
1818
#include "llvm/ADT/StringExtras.h"
19+
#include "llvm/Config/llvm-config.h"
1920
#include "llvm/IR/DIBuilder.h"
2021
#include "llvm/IR/DebugInfo.h"
22+
#include "llvm/IR/DebugLoc.h"
2123
#include "llvm/IR/InstIterator.h"
2224
#include "llvm/IR/Instructions.h"
2325
#include "llvm/IR/IntrinsicInst.h"
@@ -28,6 +30,11 @@
2830
#include "llvm/Support/FileSystem.h"
2931
#include "llvm/Support/JSON.h"
3032
#include <optional>
33+
#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
34+
// We need the Signals header to operate on stacktraces if we're using DebugLoc
35+
// origin-tracking.
36+
#include "llvm/Support/Signals.h"
37+
#endif
3138

3239
#define DEBUG_TYPE "debugify"
3340

@@ -59,6 +66,54 @@ cl::opt<Level> DebugifyLevel(
5966

6067
raw_ostream &dbg() { return Quiet ? nulls() : errs(); }
6168

69+
#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
70+
// These maps refer to addresses in the current LLVM process, so we can reuse
71+
// them everywhere - therefore, we store them at file scope.
72+
static SymbolizedAddressMap SymbolizedAddrs;
73+
static AddressSet UnsymbolizedAddrs;
74+
75+
std::string symbolizeStackTrace(const Instruction *I) {
76+
// We flush the set of unsymbolized addresses at the latest possible moment,
77+
// i.e. now.
78+
if (!UnsymbolizedAddrs.empty()) {
79+
sys::symbolizeAddresses(UnsymbolizedAddrs, SymbolizedAddrs);
80+
UnsymbolizedAddrs.clear();
81+
}
82+
const DbgLocOrigin::StackTracesTy &OriginStackTraces =
83+
I->getDebugLoc().getOriginStackTraces();
84+
std::string Result;
85+
raw_string_ostream OS(Result);
86+
for (size_t TraceIdx = 0; TraceIdx < OriginStackTraces.size(); ++TraceIdx) {
87+
if (TraceIdx != 0)
88+
OS << "========================================\n";
89+
auto &[Depth, StackTrace] = OriginStackTraces[TraceIdx];
90+
unsigned VirtualFrameNo = 0;
91+
for (int Frame = 0; Frame < Depth; ++Frame) {
92+
assert(SymbolizedAddrs.contains(StackTrace[Frame]) &&
93+
"Expected each address to have been symbolized.");
94+
for (std::string &SymbolizedFrame : SymbolizedAddrs[StackTrace[Frame]]) {
95+
OS << right_justify(formatv("#{0}", VirtualFrameNo++).str(),
96+
std::log10(Depth) + 2)
97+
<< ' ' << SymbolizedFrame << '\n';
98+
}
99+
}
100+
}
101+
return Result;
102+
}
103+
void collectStackAddresses(Instruction &I) {
104+
auto &OriginStackTraces = I.getDebugLoc().getOriginStackTraces();
105+
for (auto &[Depth, StackTrace] : OriginStackTraces) {
106+
for (int Frame = 0; Frame < Depth; ++Frame) {
107+
void *Addr = StackTrace[Frame];
108+
if (!SymbolizedAddrs.contains(Addr))
109+
UnsymbolizedAddrs.insert(Addr);
110+
}
111+
}
112+
}
113+
#else
114+
void collectStackAddresses(Instruction &I) {}
115+
#endif // LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
116+
62117
uint64_t getAllocSizeInBits(Module &M, Type *Ty) {
63118
return Ty->isSized() ? M.getDataLayout().getTypeAllocSizeInBits(Ty) : 0;
64119
}
@@ -375,6 +430,8 @@ bool llvm::collectDebugInfoMetadata(Module &M,
375430
LLVM_DEBUG(dbgs() << " Collecting info for inst: " << I << '\n');
376431
DebugInfoBeforePass.InstToDelete.insert({&I, &I});
377432

433+
// Track the addresses to symbolize, if the feature is enabled.
434+
collectStackAddresses(I);
378435
DebugInfoBeforePass.DILocations.insert({&I, hasLoc(I)});
379436
}
380437
}
@@ -450,14 +507,23 @@ static bool checkInstructions(const DebugInstMap &DILocsBefore,
450507
auto BBName = BB->hasName() ? BB->getName() : "no-name";
451508
auto InstName = Instruction::getOpcodeName(Instr->getOpcode());
452509

510+
auto CreateJSONBugEntry = [&](const char *Action) {
511+
Bugs.push_back(llvm::json::Object({
512+
{"metadata", "DILocation"},
513+
{"fn-name", FnName.str()},
514+
{"bb-name", BBName.str()},
515+
{"instr", InstName},
516+
{"action", Action},
517+
#if LLVM_ENABLE_DEBUGLOC_TRACKING_ORIGIN
518+
{"origin", symbolizeStackTrace(Instr)},
519+
#endif
520+
}));
521+
};
522+
453523
auto InstrIt = DILocsBefore.find(Instr);
454524
if (InstrIt == DILocsBefore.end()) {
455525
if (ShouldWriteIntoJSON)
456-
Bugs.push_back(llvm::json::Object({{"metadata", "DILocation"},
457-
{"fn-name", FnName.str()},
458-
{"bb-name", BBName.str()},
459-
{"instr", InstName},
460-
{"action", "not-generate"}}));
526+
CreateJSONBugEntry("not-generate");
461527
else
462528
dbg() << "WARNING: " << NameOfWrappedPass
463529
<< " did not generate DILocation for " << *Instr
@@ -470,11 +536,7 @@ static bool checkInstructions(const DebugInstMap &DILocsBefore,
470536
// If the instr had the !dbg attached before the pass, consider it as
471537
// a debug info issue.
472538
if (ShouldWriteIntoJSON)
473-
Bugs.push_back(llvm::json::Object({{"metadata", "DILocation"},
474-
{"fn-name", FnName.str()},
475-
{"bb-name", BBName.str()},
476-
{"instr", InstName},
477-
{"action", "drop"}}));
539+
CreateJSONBugEntry("drop");
478540
else
479541
dbg() << "WARNING: " << NameOfWrappedPass << " dropped DILocation of "
480542
<< *Instr << " (BB: " << BBName << ", Fn: " << FnName
@@ -612,6 +674,8 @@ bool llvm::checkDebugInfoMetadata(Module &M,
612674

613675
LLVM_DEBUG(dbgs() << " Collecting info for inst: " << I << '\n');
614676

677+
// Track the addresses to symbolize, if the feature is enabled.
678+
collectStackAddresses(I);
615679
DebugInfoAfterPass.DILocations.insert({&I, hasLoc(I)});
616680
}
617681
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<html>
2+
<head>
3+
<style>
4+
table, th, td {
5+
border: 1px solid black;
6+
}
7+
table.center {
8+
margin-left: auto;
9+
margin-right: auto;
10+
}
11+
</style>
12+
</head>
13+
<body>
14+
<table>
15+
<caption><b>Location Bugs found by the Debugify</b></caption>
16+
<tr>
17+
<th>File</th>
18+
<th>LLVM Pass Name</th>
19+
<th>LLVM IR Instruction</th>
20+
<th>Function Name</th>
21+
<th>Basic Block Name</th>
22+
<th>Action</th>
23+
<th>Origin</th>
24+
</tr>
25+
</tr>
26+
<tr>
27+
<td>test.ll</td>
28+
<td>LoopVectorizePass</td>
29+
<td>add</td>
30+
<td>fn</td>
31+
<td>no-name</td>
32+
<td>not-generate</td>
33+
<td><details><summary>View Origin StackTrace</summary><pre>Stack Trace 0:
34+
#0 0x00005895d035c935 llvm::DbgLocOrigin::DbgLocOrigin(bool) /tmp/llvm-project/llvm/lib/IR/DebugLoc.cpp:22:9
35+
#1 0x00005895d03af013 llvm::DILocAndCoverageTracking::DILocAndCoverageTracking() /tmp/llvm-project/llvm/include/llvm/IR/DebugLoc.h:90:11
36+
#2 0x00005895d03af013 llvm::DebugLoc::DebugLoc() /tmp/llvm-project/llvm/include/llvm/IR/DebugLoc.h:133:5
37+
#3 0x00005895d03af013 llvm::Instruction::Instruction(llvm::Type*, unsigned int, llvm::User::AllocInfo, llvm::InsertPosition) /tmp/llvm-project/llvm/lib/IR/Instruction.cpp:37:14
38+
#4 0x00005895d06862b5 llvm::PHINode::PHINode(llvm::Type*, unsigned int, llvm::Twine const&, llvm::InsertPosition) /tmp/llvm-project/llvm/include/llvm/IR/Instructions.h:0:9
39+
#5 0x00005895d06862b5 llvm::PHINode::Create(llvm::Type*, unsigned int, llvm::Twine const&, llvm::InsertPosition) /tmp/llvm-project/llvm/include/llvm/IR/Instructions.h:2651:9
40+
#6 0x00005895d06862b5 llvm::InstCombinerImpl::foldPHIArgGEPIntoPHI(llvm::PHINode&) /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp:617:9
41+
#7 0x00005895d0688fe0 llvm::InstCombinerImpl::visitPHINode(llvm::PHINode&) /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp:1456:22
42+
#8 0x00005895d05cd21f llvm::InstCombinerImpl::run() /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:5327:22
43+
#9 0x00005895d05d067e combineInstructionsOverFunction(llvm::Function&, llvm::InstructionWorklist&, llvm::AAResults*, llvm::AssumptionCache&, llvm::TargetLibraryInfo&, llvm::TargetTransformInfo&, llvm::DominatorTree&, llvm::OptimizationRemarkEmitter&, llvm::BlockFrequencyInfo*, llvm::BranchProbabilityInfo*, llvm::ProfileSummaryInfo*, llvm::InstCombineOptions const&) /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:5643:31
44+
#10 0x00005895d05cf9a9 llvm::InstCombinePass::run(llvm::Function&, llvm::AnalysisManager&) /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:5706:8
45+
#11 0x00005895d107d07d llvm::detail::PassModel>::run(llvm::Function&, llvm::AnalysisManager&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5
46+
#12 0x00005895d04204a7 llvm::PassManager>::run(llvm::Function&, llvm::AnalysisManager&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerImpl.h:85:8
47+
#13 0x00005895ce4cb09d llvm::detail::PassModel>, llvm::AnalysisManager>::run(llvm::Function&, llvm::AnalysisManager&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5
48+
#14 0x00005895cfae2865 llvm::CGSCCToFunctionPassAdaptor::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:0:38
49+
#15 0x00005895ce4cad5d llvm::detail::PassModel, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5
50+
#16 0x00005895cfade813 llvm::PassManager, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:93:12
51+
#17 0x00005895d1e3968d llvm::detail::PassModel, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>, llvm::AnalysisManager, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5
52+
#18 0x00005895cfae1224 llvm::DevirtSCCRepeatedPass::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:0:38
53+
#19 0x00005895d1e5067d llvm::detail::PassModel, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5</pre></details></td>
54+
</tr>
55+
<tr>
56+
</table>
57+
<br>
58+
<table>
59+
<caption><b>Summary of Location Bugs</b></caption>
60+
<tr>
61+
<th>LLVM Pass Name</th>
62+
<th>Number of bugs</th>
63+
</tr>
64+
<tr>
65+
<td>LoopVectorizePass</td>
66+
<td>1</td>
67+
</tr>
68+
<tr>
69+
</table>
70+
<br>
71+
<br>
72+
<table>
73+
<caption><b>SP Bugs found by the Debugify</b></caption>
74+
<tr>
75+
<th>File</th>
76+
<th>LLVM Pass Name</th>
77+
<th>Function Name</th>
78+
<th>Action</th>
79+
</tr>
80+
<tr>
81+
<td colspan='4'> No bugs found </td>
82+
</tr>
83+
</table>
84+
<br>
85+
<table>
86+
<caption><b>Summary of SP Bugs</b></caption>
87+
<tr>
88+
<th>LLVM Pass Name</th>
89+
<th>Number of bugs</th>
90+
</tr>
91+
<tr>
92+
<tr>
93+
<td colspan='2'> No bugs found </td>
94+
</tr>
95+
</table>
96+
<br>
97+
<br>
98+
<table>
99+
<caption><b>Variable Location Bugs found by the Debugify</b></caption>
100+
<tr>
101+
<th>File</th>
102+
<th>LLVM Pass Name</th>
103+
<th>Variable</th>
104+
<th>Function</th>
105+
<th>Action</th>
106+
</tr>
107+
<tr>
108+
<td colspan='4'> No bugs found </td>
109+
</tr>
110+
</table>
111+
<br>
112+
<table>
113+
<caption><b>Summary of Variable Location Bugs</b></caption>
114+
<tr>
115+
<th>LLVM Pass Name</th>
116+
<th>Number of bugs</th>
117+
</tr>
118+
<tr>
119+
<tr>
120+
<td colspan='2'> No bugs found </td>
121+
</tr>
122+
</table>
123+
</body>
124+
</html>

llvm/test/tools/llvm-original-di-preservation/Inputs/expected-skipped.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,15 @@
128128
<td>drop</td>
129129
</tr>
130130
<tr>
131+
</tr>
132+
<tr>
133+
<td>wrstabs.c</td>
134+
<td>Simplify the CFG</td>
135+
<td>tindex</td>
136+
<td>stab_bool_type</td>
137+
<td>drop</td>
138+
</tr>
139+
<tr>
131140
</tr>
132141
<tr>
133142
<td>prdbg.c</td>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"file":"test.ll", "pass":"LoopVectorizePass", "bugs": [[{"action":"not-generate","bb-name":"no-name","fn-name":"fn","instr":"add","metadata":"DILocation", "origin": "Stack Trace 0:\n #0 0x00005895d035c935 llvm::DbgLocOrigin::DbgLocOrigin(bool) /tmp/llvm-project/llvm/lib/IR/DebugLoc.cpp:22:9\n #1 0x00005895d03af013 llvm::DILocAndCoverageTracking::DILocAndCoverageTracking() /tmp/llvm-project/llvm/include/llvm/IR/DebugLoc.h:90:11\n #2 0x00005895d03af013 llvm::DebugLoc::DebugLoc() /tmp/llvm-project/llvm/include/llvm/IR/DebugLoc.h:133:5\n #3 0x00005895d03af013 llvm::Instruction::Instruction(llvm::Type*, unsigned int, llvm::User::AllocInfo, llvm::InsertPosition) /tmp/llvm-project/llvm/lib/IR/Instruction.cpp:37:14\n #4 0x00005895d06862b5 llvm::PHINode::PHINode(llvm::Type*, unsigned int, llvm::Twine const&, llvm::InsertPosition) /tmp/llvm-project/llvm/include/llvm/IR/Instructions.h:0:9\n #5 0x00005895d06862b5 llvm::PHINode::Create(llvm::Type*, unsigned int, llvm::Twine const&, llvm::InsertPosition) /tmp/llvm-project/llvm/include/llvm/IR/Instructions.h:2651:9\n #6 0x00005895d06862b5 llvm::InstCombinerImpl::foldPHIArgGEPIntoPHI(llvm::PHINode&) /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp:617:9\n #7 0x00005895d0688fe0 llvm::InstCombinerImpl::visitPHINode(llvm::PHINode&) /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp:1456:22\n #8 0x00005895d05cd21f llvm::InstCombinerImpl::run() /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:5327:22\n #9 0x00005895d05d067e combineInstructionsOverFunction(llvm::Function&, llvm::InstructionWorklist&, llvm::AAResults*, llvm::AssumptionCache&, llvm::TargetLibraryInfo&, llvm::TargetTransformInfo&, llvm::DominatorTree&, llvm::OptimizationRemarkEmitter&, llvm::BlockFrequencyInfo*, llvm::BranchProbabilityInfo*, llvm::ProfileSummaryInfo*, llvm::InstCombineOptions const&) /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:5643:31\n#10 0x00005895d05cf9a9 llvm::InstCombinePass::run(llvm::Function&, llvm::AnalysisManager&) /tmp/llvm-project/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:5706:8\n#11 0x00005895d107d07d llvm::detail::PassModel>::run(llvm::Function&, llvm::AnalysisManager&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5\n#12 0x00005895d04204a7 llvm::PassManager>::run(llvm::Function&, llvm::AnalysisManager&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerImpl.h:85:8\n#13 0x00005895ce4cb09d llvm::detail::PassModel>, llvm::AnalysisManager>::run(llvm::Function&, llvm::AnalysisManager&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5\n#14 0x00005895cfae2865 llvm::CGSCCToFunctionPassAdaptor::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:0:38\n#15 0x00005895ce4cad5d llvm::detail::PassModel, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5\n#16 0x00005895cfade813 llvm::PassManager, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:93:12\n#17 0x00005895d1e3968d llvm::detail::PassModel, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>, llvm::AnalysisManager, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5\n#18 0x00005895cfae1224 llvm::DevirtSCCRepeatedPass::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/lib/Analysis/CGSCCPassManager.cpp:0:38\n#19 0x00005895d1e5067d llvm::detail::PassModel, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&, llvm::AnalysisManager&, llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&) /tmp/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:91:5"}]]}

llvm/test/tools/llvm-original-di-preservation/basic.test

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
RUN: %llvm-original-di-preservation %p/Inputs/sample.json %t.html | FileCheck %s
22
RUN: diff -w %p/Inputs/expected-sample.html %t.html
3+
CHECK: The {{.+}}.html generated.
34
CHECK-NOT: Skipped lines:
45

56
RUN: %llvm-original-di-preservation %p/Inputs/corrupted.json %t2.html | FileCheck %s -check-prefix=CORRUPTED
@@ -9,5 +10,8 @@ CORRUPTED: Skipped bugs: 1
910

1011
RUN: %llvm-original-di-preservation -compress %p/Inputs/sample.json %t3.html | FileCheck %s -check-prefix=COMPRESSED
1112
RUN: diff -w %p/Inputs/expected-compressed.html %t3.html
13+
COMPRESSED: The {{.+}}.html generated.
1214
COMPRESSED-NOT: Skipped lines:
1315

16+
RUN: %llvm-original-di-preservation %p/Inputs/origin.json %t4.html | FileCheck %s
17+
RUN: diff -w %p/Inputs/expected-origin.html %t4.html

0 commit comments

Comments
 (0)