From 5be5607a0fa62a5eca4fc9db3ce112e66cd76cfb Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Thu, 9 May 2013 00:19:10 +0000 Subject: [PATCH] [serialization] Write a BLOCKINFO block so llvm-bcanalyzer is useful. This adds names to the other blocks and records in the file. The tests now require llvm-bcanalyzer to run; please build that along with 'FileCheck' and 'not'. Swift SVN r5109 --- lib/Serialization/Serialization.cpp | 55 ++++++++++++++++++++++++++--- test/Serialization/empty.swift | 24 +++++++++++++ test/Serialization/test.swift | 3 -- 3 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 test/Serialization/empty.swift delete mode 100644 test/Serialization/test.swift diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp index fe3a823eb24..8ec4bff5c41 100644 --- a/lib/Serialization/Serialization.cpp +++ b/lib/Serialization/Serialization.cpp @@ -35,7 +35,11 @@ namespace { /// A reusable buffer for emitting records. SmallVector ScratchRecord; - /// Writes the Swift module file header and BLOCKINFO block. + /// Writes the BLOCKINFO block. + void writeBlockInfoBlock(); + + /// Writes the Swift module file header, BLOCKINFO block, and + /// non-TU-specific metadata. void writeHeader(); /// Writes the input file paths. @@ -53,6 +57,51 @@ namespace { }; } // end anonymous namespace + +/// Record the name of a block. +static void emitBlockID(llvm::BitstreamWriter &out, unsigned ID, + StringRef name, + SmallVectorImpl &nameBuffer) { + SmallVector idBuffer; + idBuffer.push_back(ID); + out.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID, idBuffer); + + // Emit the block name if present. + if (name.empty()) + return; + nameBuffer.resize(name.size()); + memcpy(nameBuffer.data(), name.data(), name.size()); + out.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME, nameBuffer); +} + +/// Record the name of a record within a block. +static void emitRecordID(llvm::BitstreamWriter &out, unsigned ID, + StringRef name, + SmallVectorImpl &nameBuffer) { + assert(ID < 256 && "can't fit record ID in next to name"); + nameBuffer.resize(name.size()+1); + nameBuffer[0] = ID; + memcpy(nameBuffer.data()+1, name.data(), name.size()); + out.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, nameBuffer); +} + +void Serializer::writeBlockInfoBlock() { + BCBlockRAII restoreBlock(Out, llvm::bitc::BLOCKINFO_BLOCK_ID, 2); + + SmallVector nameBuffer; +#define BLOCK(X) emitBlockID(Out, X ## _ID, #X, nameBuffer) +#define RECORD(X) emitRecordID(Out, X, #X, nameBuffer) + + BLOCK(CONTROL_BLOCK); + RECORD(METADATA); + + BLOCK(INPUT_BLOCK); + RECORD(SOURCE_FILE); + +#undef BLOCK +#undef RECORD +} + void Serializer::writeHeader() { // Swift module file type: 'SMod'. Out.Emit((unsigned)'S', 8); @@ -60,9 +109,7 @@ void Serializer::writeHeader() { Out.Emit((unsigned)'o', 8); Out.Emit((unsigned)'d', 8); - { - BCBlockRAII restoreBlock(Out, llvm::bitc::BLOCKINFO_BLOCK_ID, 2); - } + writeBlockInfoBlock(); { BCBlockRAII restoreBlock(Out, CONTROL_BLOCK_ID, 3); diff --git a/test/Serialization/empty.swift b/test/Serialization/empty.swift new file mode 100644 index 00000000000..23cee15224a --- /dev/null +++ b/test/Serialization/empty.swift @@ -0,0 +1,24 @@ +// RUN: %swift -emit-module -o %t.sm %s +// RUN: llvm-bcanalyzer %t.sm | FileCheck %s + + +// CHECK: Block ID #0 (BLOCKINFO_BLOCK): +// CHECK-NEXT: Num Instances: 1 + +// CHECK: Block ID #8 (CONTROL_BLOCK): +// CHECK-NEXT: Num Instances: 1 +// CHECK-NEXT: Total Size: +// CHECK-NEXT: Percent of file: +// CHECK-NEXT: Num SubBlocks: 0 +// CHECK-NEXT: Num Abbrevs: 1 +// CHECK-NEXT: Num Records: 1 +// CHECK-NEXT: Percent Abbrevs: 100.0000% + +// CHECK: Block ID #9 (INPUT_BLOCK): +// CHECK-NEXT: Num Instances: 1 +// CHECK-NEXT: Total Size: +// CHECK-NEXT: Percent of file: +// CHECK-NEXT: Num SubBlocks: 0 +// CHECK-NEXT: Num Abbrevs: 1 +// CHECK-NEXT: Num Records: 1 +// CHECK-NEXT: Percent Abbrevs: 100.0000% diff --git a/test/Serialization/test.swift b/test/Serialization/test.swift deleted file mode 100644 index 6572f3e7aaf..00000000000 --- a/test/Serialization/test.swift +++ /dev/null @@ -1,3 +0,0 @@ -// RUN: %swift -emit-module -o %t.sm %s - -// Just don't crash.