diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-08-01 16:54:33 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-08-01 16:54:33 +0000 |
commit | 69a9e017855fe95bf96ff98101558d3dba4335d4 (patch) | |
tree | 070d3fd43c8548216380fc99f128da1f38a70ea3 /lib/Serialization | |
parent | 5d51a1d22d862dfae44eaa098af4e09bbfebae72 (diff) |
Move the serialization of the MODULE_OFFSET_MAP out of the source-manager-writing code and into the general chained-PCH writing code
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136624 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Serialization')
-rw-r--r-- | lib/Serialization/ASTWriter.cpp | 67 |
1 files changed, 35 insertions, 32 deletions
diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 649b05e21d..06200d8db0 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -1570,38 +1570,6 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, Record.push_back(SourceMgr.getNextLocalOffset() - 1); // skip dummy Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record, data(SLocEntryOffsets)); - // If we have module dependencies, write the mapping from source locations to - // their containing modules, so that the reader can build the remapping. - if (Chain) { - // The map consists solely of a blob with the following format: - // *(offset:i32 len:i16 name:len*i8) - // Sorted by offset. - typedef std::pair<uint32_t, StringRef> ModuleOffset; - SmallVector<ModuleOffset, 16> Modules; - - Chain->ModuleMgr.exportLookup(Modules); - - Abbrev = new BitCodeAbbrev(); - Abbrev->Add(BitCodeAbbrevOp(MODULE_OFFSET_MAP)); - Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); - unsigned SLocMapAbbrev = Stream.EmitAbbrev(Abbrev); - llvm::SmallString<2048> Buffer; - { - llvm::raw_svector_ostream Out(Buffer); - for (SmallVector<ModuleOffset, 16>::iterator I = Modules.begin(), - E = Modules.end(); - I != E; ++I) { - io::Emit32(Out, I->first); - io::Emit16(Out, I->second.size()); - Out.write(I->second.data(), I->second.size()); - } - } - Record.clear(); - Record.push_back(MODULE_OFFSET_MAP); - Stream.EmitRecordWithBlob(SLocMapAbbrev, Record, - Buffer.data(), Buffer.size()); - } - Abbrev = new BitCodeAbbrev(); Abbrev->Add(BitCodeAbbrevOp(FILE_SOURCE_LOCATION_OFFSETS)); Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // # of slocs @@ -2938,6 +2906,7 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls, if (StatCalls && isysroot.empty()) WriteStatCache(*StatCalls); WriteSourceManagerBlock(Context.getSourceManager(), PP, isysroot); + // Write the record of special types. Record.clear(); @@ -3069,6 +3038,40 @@ void ASTWriter::WriteASTChain(Sema &SemaRef, MemorizeStatCalls *StatCalls, // done by tracking the largest ID in the chain WriteSourceManagerBlock(Context.getSourceManager(), PP, isysroot); + // Write the mapping information describing our module dependencies and how + // each of those modules were mapped into our own offset/ID space, so that + // the reader can build the appropriate mapping to its own offset/ID space. + + // If we have module dependencies, write the mapping from source locations to + // their containing modules, so that the reader can build the remapping. + // The map consists solely of a blob with the following format: + // *(offset:i32 len:i16 name:len*i8) + // Sorted by offset. + typedef std::pair<uint32_t, StringRef> ModuleOffset; + SmallVector<ModuleOffset, 16> Modules; + + Chain->ModuleMgr.exportLookup(Modules); + + llvm::BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); + Abbrev->Add(BitCodeAbbrevOp(MODULE_OFFSET_MAP)); + Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); + unsigned SLocMapAbbrev = Stream.EmitAbbrev(Abbrev); + llvm::SmallString<2048> Buffer; + { + llvm::raw_svector_ostream Out(Buffer); + for (SmallVector<ModuleOffset, 16>::iterator I = Modules.begin(), + E = Modules.end(); + I != E; ++I) { + io::Emit32(Out, I->first); + io::Emit16(Out, I->second.size()); + Out.write(I->second.data(), I->second.size()); + } + } + Record.clear(); + Record.push_back(MODULE_OFFSET_MAP); + Stream.EmitRecordWithBlob(SLocMapAbbrev, Record, + Buffer.data(), Buffer.size()); + // The special types are in the chained PCH. // We don't start with the translation unit, but with its decls that |