[PATCH] Introduce the InstrProfReader interface and a text reader

Bob Wilson bob.wilson at apple.com
Fri Mar 21 10:11:41 PDT 2014


The build changes all look OK to me. Please commit.

On Mar 19, 2014, at 4:45 PM, Justin Bogner <mail at justinbogner.com> wrote:

> "Duncan P. N. Exon Smith" <dexonsmith at apple.com> writes:
>>> This patch introduces the ProfileData library without going into details
>>> about the data format that instrumentation based profiling should use,
>>> instead just sticking to the naive text format we have now.
>>> 
>>> This is designed to make readers for multiple formats simple, so that a
>>> "raw" format for compiler-rt to commit and an efficient format for clang
>>> to consume is easy.
>>> 
>>> Eric, would you mind checking the build system changes? It builds with
>>> both clang and autoconf for me, but I'd appreciate a look over by
>>> someone who has a clue how our build works.
>>> 
>>> <TextInstrProfReader.patch>
>> 
>> LGTM, with a couple of fixups.
>> 
>> But I don’t understand our build system either, so you should wait for
>> someone to check that over.
> 
> Thanks for looking. New patch attached.
> 
>>> +class InstrProfReader {
>>> +  error_code LastError;
>>> +public:
>>> +  InstrProfReader() : LastError(instrprof_error::success) {}
>>> +  virtual ~InstrProfReader() {}
>>> +
>>> +  /// Read a single record.
>>> +  virtual error_code readNextRecord(InstrProfRecord &Record) = 0;
>>> +  /// Iterator over profile data.
>>> +  virtual InstrProfIterator begin() { return InstrProfIterator(this); }
>>> +  virtual InstrProfIterator end() { return InstrProfIterator(); }
>> 
>> Do these need to be virtual?
> 
> Nope!
> 
>>> +
>>> +    for (size_t II = 0, EE = I1->Counts.size(); II < EE; ++II) {
>> 
>> Ranged-based for here?
>> 
>>> +      uint64_t Sum = I1->Counts[II] + I2->Counts[II];
>>> +      if (Sum < I1->Counts[II])
>>> +        exitWithError("Counter overflow for " + I1->Name);
>>> +      Output << Sum << "\n";
>>>     }
>>> +    Output << "\n";
> 
> This iterates over two vectors, so not unless we have a zip() adapter.
> 
>>> +  if (Reader1->hasError())
>>> +    exitWithError(Reader1->getError().message(), Filename1);
>>> +  if (Reader2->hasError())
>>> +    exitWithError(Reader2->getError().message(), Filename1);
>> 
>> Should this be Filename2?
> 
> Yes.
> 
>>> +  if (!Reader1->isEOF() || !Reader2->isEOF())
>>> +    exitWithError("Number of instrumented functions differ.”);
>> 
>> If we’re assuming for now that the first file is canonical, I think
>> you should give Filename2 as the source of the error.
> 
> I prefer it this way. The errors in the loop have no filename, and this
> is the same type of problem.
> 
> <TextInstrProfReader-2.patch>_______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list