[ThinLTO] Handle bitcode without function summary sections gracefully

Summary:
Several fixes to the handling of bitcode files without function summary
sections so that they are skipped during ThinLTO processing in llvm-lto
and the gold plugin when appropriate instead of aborting.

1 Don't assert when trying to add a FunctionInfo that doesn't have
  a summary attached.
2 Skip FunctionInfo structures that don't have attached function summary
  sections when trying to create the combined function summary.
3 In both llvm-lto and gold-plugin, check whether a bitcode file has
  a function summary section before trying to parse the index, and skip
  the bitcode file if it does not.
4 Fix hasFunctionSummaryInMemBuffer in BitcodeReader, which had a bug
  where we returned to early while looking for the summary section.

Also added llvm-lto and gold-plugin based tests for cases where we
don't have function summaries in the bitcode file. I verified that
either the first couple fixes described above are enough to avoid the
crashes, or fixes 1,3,4. But have combined them all here for added
robustness.

Reviewers: joker.eph

Subscribers: llvm-commits, joker.eph

Differential Revision: http://reviews.llvm.org/D14903

llvm-svn: 253796
This commit is contained in:
Teresa Johnson
2015-11-21 21:55:48 +00:00
parent 2829c1cf7b
commit 6290dbc0f7
7 changed files with 61 additions and 19 deletions

View File

@@ -5566,12 +5566,14 @@ std::error_code FunctionIndexBitcodeReader::parseModule() {
case BitstreamEntry::SubBlock:
if (CheckFuncSummaryPresenceOnly) {
if (Entry.ID == bitc::FUNCTION_SUMMARY_BLOCK_ID)
if (Entry.ID == bitc::FUNCTION_SUMMARY_BLOCK_ID) {
SeenFuncSummary = true;
// No need to parse the rest since we found the summary.
return std::error_code();
}
if (Stream.SkipBlock())
return error("Invalid record");
// No need to parse the rest since we found the summary.
return std::error_code();
continue;
}
switch (Entry.ID) {
default: // Skip unknown content.