[Patch][RFC] Verifying inputs to the Linker

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 24 05:29:57 PDT 2016


The attached patch is an attempt to fix pr28072.

The point as Duncan pointed out is that the file is already partially
linked by just reading it.

Long term I think the solution is to make metadata owned by the module
and then the linker will lazily read it and be in charge of all the
linking. Running a verifier in each input will defeat the lazy
loading, but will be legal.

Right now we are at the unfortunate position that to support odr
merging we cannot verify the inputs, which mildly annoying (see test
update).

Cheers,
Rafael
-------------- next part --------------
diff --git a/test/Linker/Inputs/odr.ll b/test/Linker/Inputs/odr.ll
new file mode 100644
index 0000000..5c1d17a
--- /dev/null
+++ b/test/Linker/Inputs/odr.ll
@@ -0,0 +1,8 @@
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug, retainedTypes: !2)
+!1 = !DIFile(filename: "../../src/core/weakHashTable.cc", directory: "/Users/meister/Development/clasp/wbuild/clasp_boehm_o")
+!2 = !{!3}
+!3 = distinct !DICompositeType(tag: DW_TAG_class_type, file: !1, identifier: "zed")
+!4 = !{i32 2, !"Debug Info Version", i32 3}
diff --git a/test/Linker/odr.ll b/test/Linker/odr.ll
new file mode 100644
index 0000000..db54995
--- /dev/null
+++ b/test/Linker/odr.ll
@@ -0,0 +1,18 @@
+; Use llvm-as to verify each module
+; RUN: llvm-as %s -o %t1.bc
+; RUN: llvm-as %p/Inputs/odr.ll -o %t2.bc
+; Check that we can link it
+; RUN: llvm-link %t1.bc %t2.bc -o %t
+ at bar = global i64 0, align 8
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!7}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug, retainedTypes: !2, globals: !5)
+!1 = !DIFile(filename: "a", directory: "")
+!2 = !{!3}
+!3 = distinct !DICompositeType(tag: DW_TAG_class_type, scope: !4, file: !1, identifier: "zed")
+!4 = distinct !DISubprogram(name: "b", scope: null, isLocal: false, isDefinition: true, isOptimized: false, unit: !0)
+!5 = !{!6}
+!6 = distinct !DIGlobalVariable(name: "c", scope: null, isLocal: false, isDefinition: true, variable: i64* @bar)
+!7 = !{i32 2, !"Debug Info Version", i32 3}
diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp
index b0606d7..15623e6 100644
--- a/tools/llvm-link/llvm-link.cpp
+++ b/tools/llvm-link/llvm-link.cpp
@@ -299,10 +299,9 @@ static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L,
       return false;
     }
 
-    if (verifyModule(*M, &errs())) {
-      errs() << argv0 << ": " << File << ": error: input module is broken!\n";
-      return false;
-    }
+    // Note that we cannot verify input files in here. We use ODR type merging
+    // which means that debug metadata in the src module might already be
+    // pointing to the destination.
 
     // If a module summary index is supplied, load it so linkInModule can treat
     // local functions/variables as exported and promote if necessary.


More information about the llvm-commits mailing list