[ProfileData] Report errors from InstrProfSymtab::create
authorVedant Kumar <vsk@apple.com>
Thu, 21 Apr 2016 21:07:25 +0000 (21:07 +0000)
committerVedant Kumar <vsk@apple.com>
Thu, 21 Apr 2016 21:07:25 +0000 (21:07 +0000)
InstrProfSymtab::create can fail with instrprof_error::malformed, but
this error is silently dropped. Propagate the error up to the caller so
we fail early.

Eventually, I'd like to transition ProfileData over to the new Error
class so we can't ignore hard failures like this.

llvm-svn: 267055

llvm/include/llvm/ProfileData/InstrProfReader.h
llvm/lib/ProfileData/InstrProfReader.cpp

index 74610f7..303d9af 100644 (file)
@@ -196,7 +196,7 @@ public:
   }
 
 private:
-  void createSymtab(InstrProfSymtab &Symtab);
+  std::error_code createSymtab(InstrProfSymtab &Symtab);
   std::error_code readNextHeader(const char *CurrentPos);
   std::error_code readHeader(const RawInstrProf::Header &Header);
   template <class IntT> IntT swap(IntT Int) const {
index 27142e0..b3b89d7 100644 (file)
@@ -297,8 +297,11 @@ RawInstrProfReader<IntPtrT>::readNextHeader(const char *CurrentPos) {
 }
 
 template <class IntPtrT>
-void RawInstrProfReader<IntPtrT>::createSymtab(InstrProfSymtab &Symtab) {
-  Symtab.create(StringRef(NamesStart, NamesSize));
+std::error_code
+RawInstrProfReader<IntPtrT>::createSymtab(InstrProfSymtab &Symtab) {
+  std::error_code EC = Symtab.create(StringRef(NamesStart, NamesSize));
+  if (EC)
+    return EC;
   for (const RawInstrProf::ProfileData<IntPtrT> *I = Data; I != DataEnd; ++I) {
     const IntPtrT FPtr = swap(I->FunctionPointer);
     if (!FPtr)
@@ -306,6 +309,7 @@ void RawInstrProfReader<IntPtrT>::createSymtab(InstrProfSymtab &Symtab) {
     Symtab.mapAddress(FPtr, I->NameRef);
   }
   Symtab.finalizeSymtab();
+  return success();
 }
 
 template <class IntPtrT>
@@ -345,7 +349,9 @@ RawInstrProfReader<IntPtrT>::readHeader(const RawInstrProf::Header &Header) {
   ProfileEnd = Start + ProfileSize;
 
   std::unique_ptr<InstrProfSymtab> NewSymtab = make_unique<InstrProfSymtab>();
-  createSymtab(*NewSymtab.get());
+  if (auto EC = createSymtab(*NewSymtab.get()))
+    return EC;
+
   Symtab = std::move(NewSymtab);
   return success();
 }