diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-06 20:54:32 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-06 20:54:32 +0000 |
commit | e2a466bfa9e4f43c90602da5f602c16c2c83c866 (patch) | |
tree | a3066b35fb761605f2761533e9060b109850b5cd /tools/llvm-bcanalyzer | |
parent | 59d5f83b32753b3c9d5defa4d1374f7c9042eb46 (diff) | |
download | llvm-e2a466bfa9e4f43c90602da5f602c16c2c83c866.tar.gz llvm-e2a466bfa9e4f43c90602da5f602c16c2c83c866.tar.bz2 llvm-e2a466bfa9e4f43c90602da5f602c16c2c83c866.tar.xz |
Teach llvm-bcanalyzer to skip over the header we use on LLVM IR files.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68458 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-bcanalyzer')
-rw-r--r-- | tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp b/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp index 52a198ae79..cde27fac48 100644 --- a/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp +++ b/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp @@ -30,6 +30,7 @@ #include "llvm/Analysis/Verifier.h" #include "llvm/Bitcode/BitstreamReader.h" #include "llvm/Bitcode/LLVMBitCodes.h" +#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" @@ -382,16 +383,24 @@ static void PrintSize(double Bits) { /// AnalyzeBitcode - Analyze the bitcode file specified by InputFilename. static int AnalyzeBitcode() { // Read the input file. - MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename.c_str()); + MemoryBuffer *MemBuf = MemoryBuffer::getFileOrSTDIN(InputFilename.c_str()); - if (Buffer == 0) + if (MemBuf == 0) return Error("Error reading '" + InputFilename + "'."); - if (Buffer->getBufferSize() & 3) + if (MemBuf->getBufferSize() & 3) return Error("Bitcode stream should be a multiple of 4 bytes in length"); - unsigned char *BufPtr = (unsigned char *)Buffer->getBufferStart(); - BitstreamReader Stream(BufPtr, BufPtr+Buffer->getBufferSize()); + unsigned char *BufPtr = (unsigned char *)MemBuf->getBufferStart(); + unsigned char *EndBufPtr = BufPtr+MemBuf->getBufferSize(); + + // If we have a wrapper header, parse it and ignore the non-bc file contents. + // The magic number is 0x0B17C0DE stored in little endian. + if (isBitcodeWrapper(BufPtr, EndBufPtr)) + if (SkipBitcodeWrapperHeader(BufPtr, EndBufPtr)) + return Error("Invalid bitcode wrapper header"); + + BitstreamReader Stream(BufPtr, EndBufPtr); // Read the stream signature. @@ -425,7 +434,7 @@ static int AnalyzeBitcode() { if (Dump) std::cerr << "\n\n"; - uint64_t BufferSizeBits = Buffer->getBufferSize()*CHAR_BIT; + uint64_t BufferSizeBits = (EndBufPtr-BufPtr)*CHAR_BIT; // Print a summary of the read file. std::cerr << "Summary of " << InputFilename << ":\n"; std::cerr << " Total size: "; |