summaryrefslogtreecommitdiff
path: root/tools/llvm-bcanalyzer
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-06 20:54:32 +0000
committerChris Lattner <sabre@nondot.org>2009-04-06 20:54:32 +0000
commite2a466bfa9e4f43c90602da5f602c16c2c83c866 (patch)
treea3066b35fb761605f2761533e9060b109850b5cd /tools/llvm-bcanalyzer
parent59d5f83b32753b3c9d5defa4d1374f7c9042eb46 (diff)
downloadllvm-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.cpp21
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: ";