Skip to content

Commit

Permalink
[llvm-profdata] Fix a dangling reference to an error string
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@318502 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
vedantk committed Nov 17, 2017
1 parent 3d7c6e8 commit 0ff70a6
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 3 deletions.
4 changes: 4 additions & 0 deletions test/tools/llvm-profdata/Inputs/counter-mismatch-1.proftext
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
foo
1024
1
0
5 changes: 5 additions & 0 deletions test/tools/llvm-profdata/Inputs/counter-mismatch-2.proftext
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
foo
1024
2
0
0
6 changes: 6 additions & 0 deletions test/tools/llvm-profdata/Inputs/counter-mismatch-3.proftext
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
foo
1024
3
0
0
0
7 changes: 7 additions & 0 deletions test/tools/llvm-profdata/Inputs/counter-mismatch-4.proftext
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
foo
1024
4
0
0
0
0
10 changes: 10 additions & 0 deletions test/tools/llvm-profdata/threaded-count-mismatch.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Test multithreaded error reporting.

RUN: not llvm-profdata merge -j 4 -o %t.profdata \
RUN: %S/Inputs/counter-mismatch-1.proftext \
RUN: %S/Inputs/counter-mismatch-2.proftext \
RUN: %S/Inputs/counter-mismatch-3.proftext \
RUN: %S/Inputs/counter-mismatch-4.proftext \
RUN: 2>&1 | FileCheck %s

CHECK: Function basic block count change detected (counter mismatch)
14 changes: 11 additions & 3 deletions tools/llvm-profdata/llvm-profdata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ using namespace llvm;

enum ProfileFormat { PF_None = 0, PF_Text, PF_Binary, PF_GCC };

static void exitWithError(const Twine &Message, StringRef Whence = "",
StringRef Hint = "") {
static void exitWithError(Twine Message, std::string Whence = "",
std::string Hint = "") {
errs() << "error: ";
if (!Whence.empty())
errs() << Whence << ": ";
Expand Down Expand Up @@ -119,7 +119,7 @@ struct WriterContext {
std::mutex Lock;
InstrProfWriter Writer;
Error Err;
StringRef ErrWhence;
std::string ErrWhence;
std::mutex &ErrLock;
SmallSet<instrprof_error, 4> &WriterErrorCodes;

Expand All @@ -137,6 +137,9 @@ static void loadInput(const WeightedFile &Input, WriterContext *WC) {
if (WC->Err)
return;

// Copy the filename, because llvm::ThreadPool copied the input "const
// WeightedFile &" by value, making a reference to the filename within it
// invalid outside of this packaged task.
WC->ErrWhence = Input.Filename;

auto ReaderOrErr = InstrProfReader::create(Input.Filename);
Expand Down Expand Up @@ -180,6 +183,11 @@ static void loadInput(const WeightedFile &Input, WriterContext *WC) {

/// Merge the \p Src writer context into \p Dst.
static void mergeWriterContexts(WriterContext *Dst, WriterContext *Src) {
// If we've already seen a hard error, continuing with the merge would
// clobber it.
if (Dst->Err || Src->Err)
return;

bool Reported = false;
Dst->Writer.mergeRecordsFromWriter(std::move(Src->Writer), [&](Error E) {
if (Reported) {
Expand Down

0 comments on commit 0ff70a6

Please sign in to comment.