| Index: lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp | 
| diff --git a/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp b/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp | 
| index c313eeb74e1e89589f23c068ce036ff58bebd3e3..d57caa9566ed92bddef4914df7eede2afebd7ff8 100644 | 
| --- a/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp | 
| +++ b/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp | 
| @@ -555,7 +555,6 @@ class NaClDisTopLevelParser : public NaClBitcodeParser { | 
|  | 
| public: | 
| NaClDisTopLevelParser(NaClBitcodeHeader &Header, | 
| -                        const unsigned char *HeaderBuffer, | 
| NaClBitstreamCursor &Cursor, | 
| naclbitc::ObjDumpStream &ObjDump) | 
| : NaClBitcodeParser(Cursor), | 
| @@ -566,7 +565,6 @@ public: | 
| AllowedIntrinsics(&Mod.getContext()), | 
| AssemblyFormatter(ObjDump), | 
| Header(Header), | 
| -        HeaderBuffer(HeaderBuffer), | 
| NumFunctions(0), | 
| NumGlobals(0), | 
| ExpectedNumGlobals(0), | 
| @@ -591,21 +589,23 @@ public: | 
| } | 
|  | 
| /// Generates an error with the given message. | 
| -  bool Error(const std::string &Message) override { | 
| +  bool ErrorAt(uint64_t Bit, const std::string &Message) final { | 
| // Use local error routine so that all errors are treated uniformly. | 
| -    ObjDump.Error() << Message << "\n"; | 
| +    ObjDump.Error(Bit) << Message << "\n"; | 
| return true; | 
| } | 
|  | 
| /// Flushes out objdump and then exits with fatal error. | 
| +  LLVM_ATTRIBUTE_NORETURN | 
| void Fatal() { | 
| -    Fatal(""); | 
| +    NaClBitcodeParser::Fatal(); | 
| } | 
|  | 
| /// Flushes out objdump and then exits with fatal error, using | 
| /// the given message. | 
| -  void Fatal(const std::string &Message) { | 
| -    ObjDump.Fatal(Message); | 
| +  LLVM_ATTRIBUTE_NORETURN | 
| +  void FatalAt(uint64_t Bit, const std::string &Message) final { | 
| +    ObjDump.Fatal(Bit, Message); | 
| } | 
|  | 
| /// Parses the top-level module block. | 
| @@ -1120,8 +1120,6 @@ private: | 
| AssemblyTextFormatter AssemblyFormatter; | 
| // The header appearing before the beginning of the input stream. | 
| NaClBitcodeHeader &Header; | 
| -  // Pointer to the buffer containing the header. | 
| -  const unsigned char *HeaderBuffer; | 
| // The list of known types (index i defines the type associated with | 
| // type index i). | 
| std::vector<Type*> TypeIdType; | 
| @@ -1371,8 +1369,8 @@ protected: | 
| return Context->Fatal(); | 
| } | 
|  | 
| -  void Fatal(const std::string &Message) { | 
| -    return Context->Fatal(Message); | 
| +  void FatalAt(uint64_t Bit, const std::string &Message) override { | 
| +    return Context->FatalAt(Bit, Message); | 
| } | 
|  | 
| const std::string &GetAssemblyIndent() const { | 
| @@ -3488,16 +3486,21 @@ void NaClDisModuleParser::ProcessRecord() { | 
| } | 
|  | 
| bool NaClDisTopLevelParser::ParseBlock(unsigned BlockID) { | 
| -  // Before parsing top-level module block. Describe header. | 
| -  NaClBitcodeRecordData Record; | 
| +  // Before parsing top-level module block. Describe header by | 
| +  // reconstructing the corresponding header record. | 
| +  NaClBitcodeRecordData HeaderRecord; | 
| size_t HeaderSize = Header.getHeaderSize(); | 
| -  Record.Code = naclbitc::BLK_CODE_HEADER; | 
| +  HeaderRecord.Code = naclbitc::BLK_CODE_HEADER; | 
| +  NaClBitstreamCursor &Cursor = Record.GetCursor(); | 
| +  uint64_t CurPos = Cursor.GetCurrentBitNo(); | 
| +  Cursor.JumpToBit(0); | 
| for (size_t i = 0; i < HeaderSize; ++i) { | 
| -    Record.Values.push_back(HeaderBuffer[i]); | 
| +    HeaderRecord.Values.push_back(Cursor.Read(CHAR_BIT)); | 
| } | 
| +  Cursor.JumpToBit(CurPos); | 
| if (ObjDump.GetDumpRecords() && ObjDump.GetDumpAssembly()) { | 
| if (HeaderSize >= 4) { | 
| -      const NaClRecordVector &Values = Record.Values; | 
| +      const NaClRecordVector &Values = HeaderRecord.Values; | 
| Tokens() << "Magic" << Space() << "Number" << Colon() | 
| << Space() << StartCluster() << StartCluster() << "'" | 
| << (char) Values[0] << (char) Values[1] | 
| @@ -3515,8 +3518,7 @@ bool NaClDisTopLevelParser::ParseBlock(unsigned BlockID) { | 
| Tokens() << Header.GetField(i)->Contents() << Endline(); | 
| } | 
| } | 
| -  ObjDump.Write(0, Record); | 
| -  ObjDump.SetStartOffset(HeaderSize * 8); | 
| +  ObjDump.Write(0, HeaderRecord); | 
|  | 
| if (BlockID != naclbitc::MODULE_BLOCK_ID) | 
| return Error("Module block expected at top-level, but not found"); | 
| @@ -3547,17 +3549,18 @@ bool NaClObjDump(MemoryBuffer *MemBuf, raw_ostream &Output, | 
|  | 
| // Read header and verify it is good. | 
| NaClBitcodeHeader Header; | 
| -  if (Header.Read(BufPtr, EndBufPtr) || !Header.IsSupported()) { | 
| +  if (Header.Read(HeaderPtr, EndBufPtr) || !Header.IsSupported()) { | 
| ObjDump.Error() << "Invalid PNaCl bitcode header.\n"; | 
| return true; | 
| } | 
|  | 
| // Create a bitstream reader to read the bitcode file. | 
| -  NaClBitstreamReader InputStreamFile(BufPtr, EndBufPtr); | 
| +  NaClBitstreamReader InputStreamFile(BufPtr, EndBufPtr, | 
| +                                      Header.getHeaderSize()); | 
| NaClBitstreamCursor InputStream(InputStreamFile); | 
|  | 
| // Parse the the bitcode file. | 
| -  ::NaClDisTopLevelParser Parser(Header, HeaderPtr, InputStream, ObjDump); | 
| +  ::NaClDisTopLevelParser Parser(Header, InputStream, ObjDump); | 
| int NumBlocksRead = 0; | 
| bool ErrorsFound = false; | 
| while (!InputStream.AtEndOfStream()) { | 
|  |