[llvm] df344e1 - [JITLink][COFF] Implement IMAGE_COMDAT_SELECT_LARGEST partially.

Sunho Kim via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 25 20:52:04 PDT 2022


Author: Sunho Kim
Date: 2022-07-26T12:51:33+09:00
New Revision: df344e1f44282848eefac252fbe1a7b4d6031430

URL: https://github.com/llvm/llvm-project/commit/df344e1f44282848eefac252fbe1a7b4d6031430
DIFF: https://github.com/llvm/llvm-project/commit/df344e1f44282848eefac252fbe1a7b4d6031430.diff

LOG: [JITLink][COFF] Implement IMAGE_COMDAT_SELECT_LARGEST partially.

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

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp
index 365da3b2719f..3a6162db75c4 100644
--- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp
@@ -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.

diff  --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test
index d20aac11fa46..c6152a50f6f6 100644
--- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test
+++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test
@@ -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:


        


More information about the llvm-commits mailing list