BitcodeReader: Delay metadata parsing until reading a function body
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Sun, 24 Apr 2016 15:04:28 +0000 (15:04 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Sun, 24 Apr 2016 15:04:28 +0000 (15:04 +0000)
There's hardly any functionality change here.  Instead of calling
materializeMetadata on the first call to materialize(GlobalValue*), wait
until the first one that's actually going to do something.  Noticed by
inspection; I don't have a concrete case where this makes a difference.

Added an assertion in materializeMetadata to be sure this (or a future
change) doesn't delay materializeMetadata after function-level metadata.

llvm-svn: 267345

llvm/lib/Bitcode/Reader/BitcodeReader.cpp

index 571306e..90934cc 100644 (file)
@@ -2108,6 +2108,9 @@ void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
 /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
 /// module level metadata.
 std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
+  assert((ModuleLevel || DeferredMetadataInfo.empty()) &&
+         "Must read all module-level metadata before function-level");
+
   IsMetadataMaterialized = true;
   unsigned NextMetadataNo = MetadataList.size();
 
@@ -5547,9 +5550,6 @@ std::error_code BitcodeReader::findFunctionInStream(
 void BitcodeReader::releaseBuffer() { Buffer.release(); }
 
 std::error_code BitcodeReader::materialize(GlobalValue *GV) {
-  if (std::error_code EC = materializeMetadata())
-    return EC;
-
   Function *F = dyn_cast<Function>(GV);
   // If it's not a function or is already material, ignore the request.
   if (!F || !F->isMaterializable())
@@ -5563,6 +5563,10 @@ std::error_code BitcodeReader::materialize(GlobalValue *GV) {
     if (std::error_code EC = findFunctionInStream(F, DFII))
       return EC;
 
+  // Materialize metadata before parsing any function bodies.
+  if (std::error_code EC = materializeMetadata())
+    return EC;
+
   // Move the bit stream to the saved position of the deferred function body.
   Stream.JumpToBit(DFII->second);