[JITLink][COFF] Implement IMAGE_COMDAT_SELECT_LARGEST partially.
authorSunho Kim <ksunhokim123@gmail.com>
Tue, 26 Jul 2022 03:51:33 +0000 (12:51 +0900)
committerSunho Kim <ksunhokim123@gmail.com>
Tue, 26 Jul 2022 03:51:33 +0000 (12:51 +0900)
Implement IMAGE_COMDAT_SELECT_LARGEST partially. It's going to fail if larger symbol appears but this hasn't happened at least in vcruntime library.

We probably would not implement this properly as it requires complicated runtime patching which is not of nature of JIT. However, we'd like to validate if larger section appears and report to the user in the near future.

Reviewed By: lhames

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

llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp
llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test

index 365da3b..3a6162d 100644 (file)
@@ -491,10 +491,16 @@ Expected<Symbol *> COFFLinkGraphBuilder::createCOMDATExportRequest(
     break;
   }
   case COFF::IMAGE_COMDAT_SELECT_LARGEST: {
-    // FIXME: Support IMAGE_COMDAT_SELECT_LARGEST when LinkGraph is able to
-    // handle this.
-    return make_error<JITLinkError>(
-        "IMAGE_COMDAT_SELECT_LARGEST is not supported.");
+    // FIXME: Support IMAGE_COMDAT_SELECT_LARGEST properly when LinkGraph is
+    // able to handle this.
+    LLVM_DEBUG({
+      dbgs() << "    " << SymIndex
+             << ": Partially supported IMAGE_COMDAT_SELECT_LARGEST was used"
+                " in section "
+             << Symbol.getSectionNumber() << "\n";
+    });
+    L = Linkage::Weak;
+    break;
   }
   case COFF::IMAGE_COMDAT_SELECT_NEWEST: {
     // Even link.exe doesn't support this selection properly.
index d20aac1..c6152a5 100644 (file)
@@ -1,10 +1,14 @@
 # REQUIRES: asserts
-# XFAIL: *
 # RUN: yaml2obj %s -o %t
 # RUN: llvm-jitlink -noexec --debug-only=jitlink -noexec %t 2>&1
 # 
-# Check jitlink return an error when IMAGE_COMDAT_SELECT_LARGEST selection type is encountered.
+# Check jitlink handles largest selection type as plain weak symbol.
 #
+# CHECK: Creating graph symbols...
+# CHECK:      2: Creating defined graph symbol for COFF symbol ".text" in .text (index: 2)
+# CHECK-NEXT:   0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: local, dead  -   <anonymous symbol>
+# CHECK-NEXT: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2
+# CHECK-NEXT:   0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead  -   func
 
 --- !COFF
 header: