Author: Sunho Kim Date: 2022-07-26T12:44:04+09:00 New Revision: 71eff61be6934518c2ebd102ae58fed6469e788b
URL: https://github.com/llvm/llvm-project/commit/71eff61be6934518c2ebd102ae58fed6469e788b DIFF: https://github.com/llvm/llvm-project/commit/71eff61be6934518c2ebd102ae58fed6469e788b.diff LOG: [JITLink][COFF] Handle duplicate external symbols. Handles duplicate external symbols. This happens in few static libraries generaed from msvc toolchain. Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D129937 Added: llvm/test/ExecutionEngine/JITLink/X86/COFF_duplicate_externals.test Modified: llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h Removed: ################################################################################ diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp index fd9c2d5683b34..dcaefd7686877 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp @@ -231,8 +231,10 @@ Error COFFLinkGraphBuilder::graphifySymbols() { << getCOFFSectionName(SectionIndex, Sec, *Sym) << " (index: " << SectionIndex << ") \n"; }); - GSym = - &G->addExternalSymbol(SymbolName, Sym->getValue(), Linkage::Strong); + if (!ExternalSymbols.count(SymbolName)) + ExternalSymbols[SymbolName] = + &G->addExternalSymbol(SymbolName, Sym->getValue(), Linkage::Strong); + GSym = ExternalSymbols[SymbolName]; } else if (Sym->isWeakExternal()) { COFFSymbolIndex TagIndex = Sym->getAux<object::coff_aux_weak_external>()->TagIndex; diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h index 72e221489090f..26cb857427bf8 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h @@ -161,6 +161,8 @@ class COFFLinkGraphBuilder { Section *CommonSection = nullptr; std::vector<Block *> GraphBlocks; std::vector<Symbol *> GraphSymbols; + + DenseMap<StringRef, Symbol *> ExternalSymbols; }; template <typename RelocHandlerFunction> diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_duplicate_externals.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_duplicate_externals.test new file mode 100644 index 0000000000000..e929c01316860 --- /dev/null +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_duplicate_externals.test @@ -0,0 +1,52 @@ +# REQUIRES: asserts +# RUN: yaml2obj %s -o %t +# RUN: llvm-jitlink -noexec -abs __ImageBase=0xfff00000 \ +# RUN: --debug-only=jitlink \ +# RUN: -slab-allocate 100Kb -slab-address 0xfff00000 -slab-page-size 4096 \ +# RUN: %t 2>&1 | FileCheck %s +# +# Check duplicate undefined external symbols are handled correctly. +# +# CHECK: Creating graph symbols... +# CHECK: 3: Creating external graph symbol for COFF symbol "func" in (external) (index: 0) +# CHECK-NEXT: 4: Creating external graph symbol for COFF symbol "func" in (external) (index: 0) +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 16 + SectionData: '0000000000000000' +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 8 + NumberOfRelocations: 0 + CheckSum: 0 + NumberOfLinenumbers: 0 + Number: 1 + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: func + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: func + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits