[ThinLTO] Delay metadata materializtion in function importer
authorTeresa Johnson <tejohnson@google.com>
Fri, 8 Jan 2016 14:17:41 +0000 (14:17 +0000)
committerTeresa Johnson <tejohnson@google.com>
Fri, 8 Jan 2016 14:17:41 +0000 (14:17 +0000)
The function importer was still materializing metadata when modules were
loaded for function importing. We only want to materialize it when we
are going to invoke the metadata linking postpass. Materializing it
before function importing is not only unnecessary, but also causes
metadata referenced by imported functions to be mapped in early, and
then not connected to the rest of the module level metadata when it is
ultimately linked in.

Augmented the test case to specifically check for the metadata being
properly connected, which it wasn't before this fix.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257171 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/FunctionImport.cpp
test/Transforms/FunctionImport/funcimport_debug.ll

index d8b677b966f2d91a99a70ada6849fcd3c27961ac..d194c5e424df9d75fea93294189190cefdcf341d 100644 (file)
@@ -41,15 +41,16 @@ static std::unique_ptr<Module> loadFile(const std::string &FileName,
                                         LLVMContext &Context) {
   SMDiagnostic Err;
   DEBUG(dbgs() << "Loading '" << FileName << "'\n");
                                         LLVMContext &Context) {
   SMDiagnostic Err;
   DEBUG(dbgs() << "Loading '" << FileName << "'\n");
-  std::unique_ptr<Module> Result = getLazyIRFileModule(FileName, Err, Context);
+  // Metadata isn't loaded or linked until after all functions are
+  // imported, after which it will be materialized and linked.
+  std::unique_ptr<Module> Result =
+      getLazyIRFileModule(FileName, Err, Context,
+                          /* ShouldLazyLoadMetadata = */ true);
   if (!Result) {
     Err.print("function-import", errs());
     return nullptr;
   }
 
   if (!Result) {
     Err.print("function-import", errs());
     return nullptr;
   }
 
-  Result->materializeMetadata();
-  UpgradeDebugInfo(*Result);
-
   return Result;
 }
 
   return Result;
 }
 
@@ -324,6 +325,10 @@ bool FunctionImporter::importFunctions(Module &DestModule) {
        ModuleToTempMDValsMap) {
     // Load the specified source module.
     auto &SrcModule = ModuleLoaderCache(SME.getKey());
        ModuleToTempMDValsMap) {
     // Load the specified source module.
     auto &SrcModule = ModuleLoaderCache(SME.getKey());
+    // The modules were created with lazy metadata loading. Materialize it
+    // now, before linking it.
+    SrcModule.materializeMetadata();
+    UpgradeDebugInfo(SrcModule);
 
     // Link in all necessary metadata from this module.
     if (TheLinker.linkInMetadata(SrcModule, SME.getValue().get()))
 
     // Link in all necessary metadata from this module.
     if (TheLinker.linkInMetadata(SrcModule, SME.getValue().get()))
index c57b5e14af1b95535a5c8176e020e1bb3130f3cd..96b73a3f6bc76bfe9a475ab299d0f05991b4c94f 100644 (file)
@@ -7,8 +7,18 @@
 ; RUN: opt -function-import -summary-file %t3.thinlto.bc %s -S | FileCheck %s
 
 ; CHECK: define available_externally void @func()
 ; RUN: opt -function-import -summary-file %t3.thinlto.bc %s -S | FileCheck %s
 
 ; CHECK: define available_externally void @func()
-; CHECK: distinct !DISubprogram(name: "main"
-; CHECK: distinct !DISubprogram(name: "func"
+
+; Check that we have exactly two subprograms (that func's subprogram wasn't
+; linked more than once for example), and that they are connected to
+; the subprogram list on a compute unit.
+; CHECK: !{{[0-9]+}} = distinct !DICompileUnit({{.*}} subprograms: ![[SPs1:[0-9]+]]
+; CHECK: ![[SPs1]] = !{![[MAINSP:[0-9]+]]}
+; CHECK: ![[MAINSP]] = distinct !DISubprogram(name: "main"
+; CHECK: !{{[0-9]+}} = distinct !DICompileUnit({{.*}} subprograms: ![[SPs2:[0-9]+]]
+; CHECK-NOT: ![[SPs2]] = !{{{.*}}null{{.*}}}
+; CHECK: ![[SPs2]] = !{![[FUNCSP:[0-9]+]]}
+; CHECK: ![[FUNCSP]] = distinct !DISubprogram(name: "func"
+; CHECK-NOT: distinct !DISubprogram
 
 ; ModuleID = 'funcimport_debug.o'
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 
 ; ModuleID = 'funcimport_debug.o'
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"