mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[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
This commit is contained in:
parent
d08f8d7586
commit
ca9330d23c
12
test/Bitcode/stream-types.c
Normal file
12
test/Bitcode/stream-types.c
Normal file
@ -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
|
1
test/Bitcode/stream-types.c.ast
Normal file
1
test/Bitcode/stream-types.c.ast
Normal file
@ -0,0 +1 @@
|
|||||||
|
CPCH
|
1
test/Bitcode/stream-types.c.ast.incomplete
Normal file
1
test/Bitcode/stream-types.c.ast.incomplete
Normal file
@ -0,0 +1 @@
|
|||||||
|
CP
|
1
test/Bitcode/stream-types.c.dia
Normal file
1
test/Bitcode/stream-types.c.dia
Normal file
@ -0,0 +1 @@
|
|||||||
|
DIAG
|
1
test/Bitcode/stream-types.c.dia.incomplete
Normal file
1
test/Bitcode/stream-types.c.dia.incomplete
Normal file
@ -0,0 +1 @@
|
|||||||
|
DIA
|
@ -75,7 +75,9 @@ namespace {
|
|||||||
/// CurStreamTypeType - A type for CurStreamType
|
/// CurStreamTypeType - A type for CurStreamType
|
||||||
enum CurStreamTypeType {
|
enum CurStreamTypeType {
|
||||||
UnknownBitstream,
|
UnknownBitstream,
|
||||||
LLVMIRBitstream
|
LLVMIRBitstream,
|
||||||
|
ClangSerializedASTBitstream,
|
||||||
|
ClangSerializedDiagnosticsBitstream,
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -746,6 +748,35 @@ static void PrintSize(uint64_t Bits) {
|
|||||||
(double)Bits/8, (unsigned long)(Bits/32));
|
(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,
|
static bool openBitcodeFile(StringRef Path,
|
||||||
std::unique_ptr<MemoryBuffer> &MemBuf,
|
std::unique_ptr<MemoryBuffer> &MemBuf,
|
||||||
BitstreamCursor &Stream,
|
BitstreamCursor &Stream,
|
||||||
@ -789,22 +820,7 @@ static bool openBitcodeFile(StringRef Path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Stream = BitstreamCursor(ArrayRef<uint8_t>(BufPtr, EndBufPtr));
|
Stream = BitstreamCursor(ArrayRef<uint8_t>(BufPtr, EndBufPtr));
|
||||||
|
CurStreamType = ReadSignature(Stream);
|
||||||
// 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;
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -873,8 +889,18 @@ static int AnalyzeBitcode() {
|
|||||||
outs() << "\n";
|
outs() << "\n";
|
||||||
outs() << " Stream type: ";
|
outs() << " Stream type: ";
|
||||||
switch (CurStreamType) {
|
switch (CurStreamType) {
|
||||||
case UnknownBitstream: outs() << "unknown\n"; break;
|
case UnknownBitstream:
|
||||||
case LLVMIRBitstream: outs() << "LLVM IR\n"; break;
|
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() << " # Toplevel Blocks: " << NumTopBlocks << "\n";
|
||||||
outs() << "\n";
|
outs() << "\n";
|
||||||
|
Loading…
Reference in New Issue
Block a user