diff options
| author | Brian Gesiak <modocache@gmail.com> | 2018-04-21 23:52:04 +0000 |
|---|---|---|
| committer | Brian Gesiak <modocache@gmail.com> | 2018-04-21 23:52:04 +0000 |
| commit | b13588982fc3cd859e0acd20dd606be634dcdb51 (patch) | |
| tree | 6ecc309778cfcd33ee5bb42c8107a079ff13e995 /llvm | |
| parent | e6bfb2c71deccc27cd209536189a3b4410b74f6b (diff) | |
| download | bcm5719-llvm-b13588982fc3cd859e0acd20dd606be634dcdb51.tar.gz bcm5719-llvm-b13588982fc3cd859e0acd20dd606be634dcdb51.zip | |
[bcanalyzer] Recognize more stream types
Summary:
`llvm-bcanalyzer` prints out the stream type of the file it is
analyzing. If the file begins with the LLVM IR magic number, it reports
a stream type of "LLVM IR". However, any other bitstream format is
reported as "unknown".
Add some checks for two other common bitstream formats: Clang AST
files, which begin with 'CPCH', and Clang serialized diagnostics, which
begin with 'DIAG'.
Test Plan: `check-llvm`
Reviewers: pcc, aprantl, mehdi_amini, davide, george.karpenkov, JDevlieghere
Reviewed By: JDevlieghere
Subscribers: JDevlieghere, bruno, davide, llvm-commits
Differential Revision: https://reviews.llvm.org/D41979
llvm-svn: 330529
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/test/Bitcode/stream-types.c | 12 | ||||
| -rw-r--r-- | llvm/test/Bitcode/stream-types.c.ast | 1 | ||||
| -rw-r--r-- | llvm/test/Bitcode/stream-types.c.ast.incomplete | 1 | ||||
| -rw-r--r-- | llvm/test/Bitcode/stream-types.c.dia | 1 | ||||
| -rw-r--r-- | llvm/test/Bitcode/stream-types.c.dia.incomplete | 1 | ||||
| -rw-r--r-- | llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp | 64 |
6 files changed, 61 insertions, 19 deletions
diff --git a/llvm/test/Bitcode/stream-types.c b/llvm/test/Bitcode/stream-types.c new file mode 100644 index 00000000000..cc547f2f2d7 --- /dev/null +++ b/llvm/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 diff --git a/llvm/test/Bitcode/stream-types.c.ast b/llvm/test/Bitcode/stream-types.c.ast new file mode 100644 index 00000000000..1c0169afc5e --- /dev/null +++ b/llvm/test/Bitcode/stream-types.c.ast @@ -0,0 +1 @@ +CPCH
\ No newline at end of file diff --git a/llvm/test/Bitcode/stream-types.c.ast.incomplete b/llvm/test/Bitcode/stream-types.c.ast.incomplete new file mode 100644 index 00000000000..255f3bcd43a --- /dev/null +++ b/llvm/test/Bitcode/stream-types.c.ast.incomplete @@ -0,0 +1 @@ +CP
\ No newline at end of file diff --git a/llvm/test/Bitcode/stream-types.c.dia b/llvm/test/Bitcode/stream-types.c.dia new file mode 100644 index 00000000000..af5962ab8ad --- /dev/null +++ b/llvm/test/Bitcode/stream-types.c.dia @@ -0,0 +1 @@ +DIAG
\ No newline at end of file diff --git a/llvm/test/Bitcode/stream-types.c.dia.incomplete b/llvm/test/Bitcode/stream-types.c.dia.incomplete new file mode 100644 index 00000000000..063271327ec --- /dev/null +++ b/llvm/test/Bitcode/stream-types.c.dia.incomplete @@ -0,0 +1 @@ +DIA
\ No newline at end of file diff --git a/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp b/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp index 1252ed5df8a..5b10b091ade 100644 --- a/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp +++ b/llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp @@ -75,7 +75,9 @@ namespace { /// CurStreamTypeType - A type for CurStreamType enum CurStreamTypeType { UnknownBitstream, - LLVMIRBitstream + LLVMIRBitstream, + ClangSerializedASTBitstream, + ClangSerializedDiagnosticsBitstream, }; } @@ -746,6 +748,35 @@ static void PrintSize(uint64_t Bits) { (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<MemoryBuffer> &MemBuf, BitstreamCursor &Stream, @@ -789,22 +820,7 @@ static bool openBitcodeFile(StringRef Path, } Stream = BitstreamCursor(ArrayRef<uint8_t>(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 @@ static int AnalyzeBitcode() { 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"; |

