Object: Teach irsymtab::read() to try to use the irsymtab that we wrote to disk.

Fixes PR27551.

Differential Revision: https://reviews.llvm.org/D33974

llvm-svn: 306488
This commit is contained in:
Peter Collingbourne
2017-06-27 23:50:24 +00:00
parent 92648c25a4
commit 99b98c21f2
6 changed files with 89 additions and 9 deletions

View File

@@ -5360,8 +5360,9 @@ const std::error_category &llvm::BitcodeErrorCategory() {
return *ErrorCategory;
}
static Expected<StringRef> readStrtab(BitstreamCursor &Stream) {
if (Stream.EnterSubBlock(bitc::STRTAB_BLOCK_ID))
static Expected<StringRef> readBlobInRecord(BitstreamCursor &Stream,
unsigned Block, unsigned RecordID) {
if (Stream.EnterSubBlock(Block))
return error("Invalid record");
StringRef Strtab;
@@ -5382,7 +5383,7 @@ static Expected<StringRef> readStrtab(BitstreamCursor &Stream) {
case BitstreamEntry::Record:
StringRef Blob;
SmallVector<uint64_t, 1> Record;
if (Stream.readRecord(Entry.ID, Record, &Blob) == bitc::STRTAB_BLOB)
if (Stream.readRecord(Entry.ID, Record, &Blob) == RecordID)
Strtab = Blob;
break;
}
@@ -5450,7 +5451,8 @@ llvm::getBitcodeFileContents(MemoryBufferRef Buffer) {
}
if (Entry.ID == bitc::STRTAB_BLOCK_ID) {
Expected<StringRef> Strtab = readStrtab(Stream);
Expected<StringRef> Strtab =
readBlobInRecord(Stream, bitc::STRTAB_BLOCK_ID, bitc::STRTAB_BLOB);
if (!Strtab)
return Strtab.takeError();
// This string table is used by every preceding bitcode module that does
@@ -5462,6 +5464,28 @@ llvm::getBitcodeFileContents(MemoryBufferRef Buffer) {
break;
I->Strtab = *Strtab;
}
// Similarly, the string table is used by every preceding symbol table;
// normally there will be just one unless the bitcode file was created
// by binary concatenation.
if (!F.Symtab.empty() && F.StrtabForSymtab.empty())
F.StrtabForSymtab = *Strtab;
continue;
}
if (Entry.ID == bitc::SYMTAB_BLOCK_ID) {
Expected<StringRef> SymtabOrErr =
readBlobInRecord(Stream, bitc::SYMTAB_BLOCK_ID, bitc::SYMTAB_BLOB);
if (!SymtabOrErr)
return SymtabOrErr.takeError();
// We can expect the bitcode file to have multiple symbol tables if it
// was created by binary concatenation. In that case we silently
// ignore any subsequent symbol tables, which is fine because this is a
// low level function. The client is expected to notice that the number
// of modules in the symbol table does not match the number of modules
// in the input file and regenerate the symbol table.
if (F.Symtab.empty())
F.Symtab = *SymtabOrErr;
continue;
}