summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2016-01-29 05:55:09 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2016-01-29 05:55:09 +0000
commit4f472a886782431387d55f234584080f3a4f9a96 (patch)
tree9b919230f180fbc0b55983c17e946ae2cea755d4 /llvm
parentf2bb710da516001a14ce9074c5ca1b8313426bce (diff)
downloadbcm5719-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.h23
-rw-r--r--llvm/lib/Bitcode/Writer/BitcodeWriter.cpp12
-rw-r--r--llvm/test/Bitcode/bitcode-wrapper-header-armv7m.ll5
-rw-r--r--llvm/test/Bitcode/bitcode-wrapper-header-x86_64.ll5
-rw-r--r--llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp21
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);
OpenPOWER on IntegriCloud