Index: llvm/trunk/test/Bitcode/stream-types.c =================================================================== --- llvm/trunk/test/Bitcode/stream-types.c +++ llvm/trunk/test/Bitcode/stream-types.c @@ -0,0 +1,12 @@ +// Tests that llvm-bcanalyzer recognizes the correct "stream type" for various +// common bitstream formats. + +// RUN: llvm-bcanalyzer -dump %s.ast | FileCheck %s -check-prefix=CHECK-AST +// CHECK-AST: Stream type: Clang Serialized AST + +// RUN: llvm-bcanalyzer -dump %s.dia | FileCheck %s -check-prefix=CHECK-DIAG +// CHECK-DIAG: Stream type: Clang Serialized Diagnostics + +// RUN: not llvm-bcanalyzer -dump %s.ast.incomplete 2>&1 | FileCheck %s -check-prefix=CHECK-INCOMPLETE +// RUN: not llvm-bcanalyzer -dump %s.dia.incomplete 2>&1 | FileCheck %s -check-prefix=CHECK-INCOMPLETE +// CHECK-INCOMPLETE: Bitcode stream should be a multiple of 4 bytes in length Index: llvm/trunk/test/Bitcode/stream-types.c.ast =================================================================== --- llvm/trunk/test/Bitcode/stream-types.c.ast +++ llvm/trunk/test/Bitcode/stream-types.c.ast @@ -0,0 +1 @@ +CPCH \ No newline at end of file Index: llvm/trunk/test/Bitcode/stream-types.c.ast.incomplete =================================================================== --- llvm/trunk/test/Bitcode/stream-types.c.ast.incomplete +++ llvm/trunk/test/Bitcode/stream-types.c.ast.incomplete @@ -0,0 +1 @@ +CP \ No newline at end of file Index: llvm/trunk/test/Bitcode/stream-types.c.dia =================================================================== --- llvm/trunk/test/Bitcode/stream-types.c.dia +++ llvm/trunk/test/Bitcode/stream-types.c.dia @@ -0,0 +1 @@ +DIAG \ No newline at end of file Index: llvm/trunk/test/Bitcode/stream-types.c.dia.incomplete =================================================================== --- llvm/trunk/test/Bitcode/stream-types.c.dia.incomplete +++ llvm/trunk/test/Bitcode/stream-types.c.dia.incomplete @@ -0,0 +1 @@ +DIA \ No newline at end of file Index: llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp =================================================================== --- llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp +++ llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp @@ -75,7 +75,9 @@ /// CurStreamTypeType - A type for CurStreamType enum CurStreamTypeType { UnknownBitstream, - LLVMIRBitstream + LLVMIRBitstream, + ClangSerializedASTBitstream, + ClangSerializedDiagnosticsBitstream, }; } @@ -746,6 +748,35 @@ (double)Bits/8, (unsigned long)(Bits/32)); } +static CurStreamTypeType ReadSignature(BitstreamCursor &Stream) { + char Signature[6]; + Signature[0] = Stream.Read(8); + Signature[1] = Stream.Read(8); + + // Autodetect the file contents, if it is one we know. + if (Signature[0] == 'C' && Signature[1] == 'P') { + Signature[2] = Stream.Read(8); + Signature[3] = Stream.Read(8); + if (Signature[2] == 'C' && Signature[3] == 'H') + return ClangSerializedASTBitstream; + } else if (Signature[0] == 'D' && Signature[1] == 'I') { + Signature[2] = Stream.Read(8); + Signature[3] = Stream.Read(8); + if (Signature[2] == 'A' && Signature[3] == 'G') + return ClangSerializedDiagnosticsBitstream; + } else { + Signature[2] = Stream.Read(4); + Signature[3] = Stream.Read(4); + Signature[4] = Stream.Read(4); + Signature[5] = Stream.Read(4); + if (Signature[0] == 'B' && Signature[1] == 'C' && + Signature[2] == 0x0 && Signature[3] == 0xC && + Signature[4] == 0xE && Signature[5] == 0xD) + return LLVMIRBitstream; + } + return UnknownBitstream; +} + static bool openBitcodeFile(StringRef Path, std::unique_ptr &MemBuf, BitstreamCursor &Stream, @@ -789,22 +820,7 @@ } Stream = BitstreamCursor(ArrayRef(BufPtr, EndBufPtr)); - - // Read the stream signature. - char Signature[6]; - Signature[0] = Stream.Read(8); - Signature[1] = Stream.Read(8); - Signature[2] = Stream.Read(4); - Signature[3] = Stream.Read(4); - Signature[4] = Stream.Read(4); - Signature[5] = Stream.Read(4); - - // Autodetect the file contents, if it is one we know. - CurStreamType = UnknownBitstream; - if (Signature[0] == 'B' && Signature[1] == 'C' && - Signature[2] == 0x0 && Signature[3] == 0xC && - Signature[4] == 0xE && Signature[5] == 0xD) - CurStreamType = LLVMIRBitstream; + CurStreamType = ReadSignature(Stream); return false; } @@ -873,8 +889,18 @@ outs() << "\n"; outs() << " Stream type: "; switch (CurStreamType) { - case UnknownBitstream: outs() << "unknown\n"; break; - case LLVMIRBitstream: outs() << "LLVM IR\n"; break; + case UnknownBitstream: + outs() << "unknown\n"; + break; + case LLVMIRBitstream: + outs() << "LLVM IR\n"; + break; + case ClangSerializedASTBitstream: + outs() << "Clang Serialized AST\n"; + break; + case ClangSerializedDiagnosticsBitstream: + outs() << "Clang Serialized Diagnostics\n"; + break; } outs() << " # Toplevel Blocks: " << NumTopBlocks << "\n"; outs() << "\n";