From df344e1f44282848eefac252fbe1a7b4d6031430 Mon Sep 17 00:00:00 2001 From: Sunho Kim Date: Tue, 26 Jul 2022 12:51:33 +0900 Subject: [PATCH] [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 --- llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp | 14 ++++++++++---- .../ExecutionEngine/JITLink/X86/COFF_comdat_largest.test | 8 ++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp index 365da3b..3a6162d 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp @@ -491,10 +491,16 @@ Expected 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( - "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 d20aac1..c6152a5 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 - +# 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: -- 2.7.4