Add initial support for debug counting

Summary:

We have support for bisection, and bugpoint can reduce testcases
often to a single pass. But that doesn't help reduce it to a single
transform by a single pass.  Which debug counting lets us do.

Debug counting lets you instrument a pass so that it only executes a
certain thing (rwhatever you want) after skipping it a certain time of
times, and then only does a certain number of executions before saying
"skip" again.

To make it concrete, for predicateinfo, if i instrument use renaming,
i can make it so it skips renaming the first N uses, renames the next
N, and then skips the rest.

This lets you narrow down a miscompilation to, often, a single
transformation, and then also debug it (by using the same command line
parameters).

Reviewers: chandlerc, davide, mehdi_amini

Subscribers: mgorny, llvm-commits

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

llvm-svn: 295593
This commit is contained in:
Daniel Berlin 2017-02-19 04:28:56 +00:00
parent 3cc0d4e058
commit 25f1db1111
3 changed files with 9 additions and 5 deletions

View File

@ -343,6 +343,9 @@ public:
virtual void printOptionValue(size_t GlobalWidth, bool Force) const = 0; virtual void printOptionValue(size_t GlobalWidth, bool Force) const = 0;
static void printHelpStr(StringRef HelpStr, size_t Indent,
size_t FirstLineIndentedBy);
virtual void getExtraOptionNames(SmallVectorImpl<StringRef> &) {} virtual void getExtraOptionNames(SmallVectorImpl<StringRef> &) {}
// addOccurrence - Wrapper around handleOccurrence that enforces Flags. // addOccurrence - Wrapper around handleOccurrence that enforces Flags.

View File

@ -47,6 +47,7 @@ add_llvm_library(LLVMSupport
CrashRecoveryContext.cpp CrashRecoveryContext.cpp
DataExtractor.cpp DataExtractor.cpp
Debug.cpp Debug.cpp
DebugCounter.cpp
DeltaAlgorithm.cpp DeltaAlgorithm.cpp
DAGDeltaAlgorithm.cpp DAGDeltaAlgorithm.cpp
Dwarf.cpp Dwarf.cpp

View File

@ -1404,7 +1404,7 @@ static StringRef getValueStr(const Option &O, StringRef DefaultMsg) {
// Return the width of the option tag for printing... // Return the width of the option tag for printing...
size_t alias::getOptionWidth() const { return ArgStr.size() + 6; } size_t alias::getOptionWidth() const { return ArgStr.size() + 6; }
static void printHelpStr(StringRef HelpStr, size_t Indent, void Option::printHelpStr(StringRef HelpStr, size_t Indent,
size_t FirstLineIndentedBy) { size_t FirstLineIndentedBy) {
std::pair<StringRef, StringRef> Split = HelpStr.split('\n'); std::pair<StringRef, StringRef> Split = HelpStr.split('\n');
outs().indent(Indent - FirstLineIndentedBy) << " - " << Split.first << "\n"; outs().indent(Indent - FirstLineIndentedBy) << " - " << Split.first << "\n";
@ -1448,7 +1448,7 @@ void basic_parser_impl::printOptionInfo(const Option &O,
if (!ValName.empty()) if (!ValName.empty())
outs() << "=<" << getValueStr(O, ValName) << '>'; outs() << "=<" << getValueStr(O, ValName) << '>';
printHelpStr(O.HelpStr, GlobalWidth, getOptionWidth(O)); Option::printHelpStr(O.HelpStr, GlobalWidth, getOptionWidth(O));
} }
void basic_parser_impl::printOptionName(const Option &O, void basic_parser_impl::printOptionName(const Option &O,
@ -1587,7 +1587,7 @@ void generic_parser_base::printOptionInfo(const Option &O,
size_t GlobalWidth) const { size_t GlobalWidth) const {
if (O.hasArgStr()) { if (O.hasArgStr()) {
outs() << " -" << O.ArgStr; outs() << " -" << O.ArgStr;
printHelpStr(O.HelpStr, GlobalWidth, O.ArgStr.size() + 6); Option::printHelpStr(O.HelpStr, GlobalWidth, O.ArgStr.size() + 6);
for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
size_t NumSpaces = GlobalWidth - getOption(i).size() - 8; size_t NumSpaces = GlobalWidth - getOption(i).size() - 8;
@ -1600,7 +1600,7 @@ void generic_parser_base::printOptionInfo(const Option &O,
for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
auto Option = getOption(i); auto Option = getOption(i);
outs() << " -" << Option; outs() << " -" << Option;
printHelpStr(getDescription(i), GlobalWidth, Option.size() + 8); Option::printHelpStr(getDescription(i), GlobalWidth, Option.size() + 8);
} }
} }
} }