diff options
| author | Akira Hatanaka <ahatanaka@apple.com> | 2016-01-29 05:55:09 +0000 |
|---|---|---|
| committer | Akira Hatanaka <ahatanaka@apple.com> | 2016-01-29 05:55:09 +0000 |
| commit | 4f472a886782431387d55f234584080f3a4f9a96 (patch) | |
| tree | 9b919230f180fbc0b55983c17e946ae2cea755d4 /llvm | |
| parent | f2bb710da516001a14ce9074c5ca1b8313426bce (diff) | |
| download | bcm5719-llvm-4f472a886782431387d55f234584080f3a4f9a96.tar.gz bcm5719-llvm-4f472a886782431387d55f234584080f3a4f9a96.zip | |
[llvm-bcanalyzer] Dump bitcode wrapper header
This patch enables llvm-bcanalyzer to print the bitcode wrapper header
if the file has one, which is needed to test the changes made in
r258627 (bitcode-wrapper-header-armv7m.ll is the test case for r258627).
Differential Revision: http://reviews.llvm.org/D16642
llvm-svn: 259162
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Bitcode/ReaderWriter.h | 23 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 12 | ||||
| -rw-r--r-- | llvm/test/Bitcode/bitcode-wrapper-header-armv7m.ll | 5 | ||||
| -rw-r--r-- | llvm/test/Bitcode/bitcode-wrapper-header-x86_64.ll | 5 | ||||
| -rw-r--r-- | llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp | 21 |
5 files changed, 47 insertions, 19 deletions
diff --git a/llvm/include/llvm/Bitcode/ReaderWriter.h b/llvm/include/llvm/Bitcode/ReaderWriter.h index 60d865fd235..a812e8c92da 100644 --- a/llvm/include/llvm/Bitcode/ReaderWriter.h +++ b/llvm/include/llvm/Bitcode/ReaderWriter.h @@ -30,6 +30,14 @@ namespace llvm { class ModulePass; class raw_ostream; + /// Offsets of the 32-bit fields of bitcode wrapper header. + static const unsigned BWH_MagicField = 0*4; + static const unsigned BWH_VersionField = 1*4; + static const unsigned BWH_OffsetField = 2*4; + static const unsigned BWH_SizeField = 3*4; + static const unsigned BWH_CPUTypeField = 4*4; + static const unsigned BWH_HeaderSize = 5*4; + /// Read the header of the specified bitcode buffer and prepare for lazy /// deserialization of function bodies. If ShouldLazyLoadMetadata is true, /// lazily load metadata as well. If successful, this moves Buffer. On @@ -163,17 +171,12 @@ namespace llvm { inline bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, const unsigned char *&BufEnd, bool VerifyBufferSize) { - enum { - KnownHeaderSize = 4*4, // Size of header we read. - OffsetField = 2*4, // Offset in bytes to Offset field. - SizeField = 3*4 // Offset in bytes to Size field. - }; - - // Must contain the header! - if (BufEnd-BufPtr < KnownHeaderSize) return true; + // Must contain the offset and size field! + if (BufEnd - BufPtr < BWH_SizeField + 4) + return true; - unsigned Offset = support::endian::read32le(&BufPtr[OffsetField]); - unsigned Size = support::endian::read32le(&BufPtr[SizeField]); + unsigned Offset = support::endian::read32le(&BufPtr[BWH_OffsetField]); + unsigned Size = support::endian::read32le(&BufPtr[BWH_SizeField]); // Verify that Offset+Size fits in the file. if (VerifyBufferSize && Offset+Size > unsigned(BufEnd-BufPtr)) diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index c3a7411353b..3f1d2683532 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -2966,10 +2966,6 @@ static void WriteModule(const Module *M, BitstreamWriter &Stream, /// uint32_t CPUType; // CPU specifier. /// ... potentially more later ... /// }; -enum { - DarwinBCSizeFieldOffset = 3*4, // Offset to bitcode_size. - DarwinBCHeaderSize = 5*4 -}; static void WriteInt32ToBuffer(uint32_t Value, SmallVectorImpl<char> &Buffer, uint32_t &Position) { @@ -3005,10 +3001,10 @@ static void EmitDarwinBCHeaderAndTrailer(SmallVectorImpl<char> &Buffer, CPUType = DARWIN_CPU_TYPE_ARM; // Traditional Bitcode starts after header. - assert(Buffer.size() >= DarwinBCHeaderSize && + assert(Buffer.size() >= BWH_HeaderSize && "Expected header size to be reserved"); - unsigned BCOffset = DarwinBCHeaderSize; - unsigned BCSize = Buffer.size()-DarwinBCHeaderSize; + unsigned BCOffset = BWH_HeaderSize; + unsigned BCSize = Buffer.size() - BWH_HeaderSize; // Write the magic and version. unsigned Position = 0; @@ -3046,7 +3042,7 @@ void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out, // header. Triple TT(M->getTargetTriple()); if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) - Buffer.insert(Buffer.begin(), DarwinBCHeaderSize, 0); + Buffer.insert(Buffer.begin(), BWH_HeaderSize, 0); // Emit the module into the buffer. { diff --git a/llvm/test/Bitcode/bitcode-wrapper-header-armv7m.ll b/llvm/test/Bitcode/bitcode-wrapper-header-armv7m.ll new file mode 100644 index 00000000000..0639e01c096 --- /dev/null +++ b/llvm/test/Bitcode/bitcode-wrapper-header-armv7m.ll @@ -0,0 +1,5 @@ +; RUN: llvm-as < %s | llvm-bcanalyzer -dump | FileCheck %s + +target triple = "thumbv7m-apple-unknown-macho" + +; CHECK: <BITCODE_WRAPPER_HEADER Magic=0x0b17c0de Version=0x{{[0-9a-f]+}} Offset=0x00000014 Size=0x{{[0-9a-f]+}} CPUType=0x0000000c/> diff --git a/llvm/test/Bitcode/bitcode-wrapper-header-x86_64.ll b/llvm/test/Bitcode/bitcode-wrapper-header-x86_64.ll new file mode 100644 index 00000000000..dbad71922b5 --- /dev/null +++ b/llvm/test/Bitcode/bitcode-wrapper-header-x86_64.ll @@ -0,0 +1,5 @@ +; RUN: llvm-as < %s | llvm-bcanalyzer -dump | FileCheck %s + +target triple = "x86_64-apple-macosx10.11.0" + +; CHECK: <BITCODE_WRAPPER_HEADER Magic=0x0b17c0de Version=0x{{[0-9a-f]+}} Offset=0x00000014 Size=0x{{[0-9a-f]+}} CPUType=0x01000007/> diff --git a/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp b/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp index fe68689def6..48523f99441 100644 --- a/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp +++ b/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp @@ -600,9 +600,28 @@ static bool openBitcodeFile(StringRef Path, // 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 (isBitcodeWrapper(BufPtr, EndBufPtr)) { + if (EndBufPtr - BufPtr < BWH_HeaderSize) + return Error("Invalid bitcode wrapper header"); + + if (Dump) { + unsigned Magic = support::endian::read32le(&BufPtr[BWH_MagicField]); + unsigned Version = support::endian::read32le(&BufPtr[BWH_VersionField]); + unsigned Offset = support::endian::read32le(&BufPtr[BWH_OffsetField]); + unsigned Size = support::endian::read32le(&BufPtr[BWH_SizeField]); + unsigned CPUType = support::endian::read32le(&BufPtr[BWH_CPUTypeField]); + + outs() << "<BITCODE_WRAPPER_HEADER" + << " Magic=" << format_hex(Magic, 10) + << " Version=" << format_hex(Version, 10) + << " Offset=" << format_hex(Offset, 10) + << " Size=" << format_hex(Size, 10) + << " CPUType=" << format_hex(CPUType, 10) << "/>\n"; + } + if (SkipBitcodeWrapperHeader(BufPtr, EndBufPtr, true)) return Error("Invalid bitcode wrapper header"); + } StreamFile = BitstreamReader(BufPtr, EndBufPtr); Stream = BitstreamCursor(StreamFile); |

