From 71eff61be6934518c2ebd102ae58fed6469e788b Mon Sep 17 00:00:00 2001 From: Sunho Kim Date: Tue, 26 Jul 2022 12:44:04 +0900 Subject: [PATCH] [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 --- .../JITLink/COFFLinkGraphBuilder.cpp | 6 ++- .../ExecutionEngine/JITLink/COFFLinkGraphBuilder.h | 2 + .../JITLink/X86/COFF_duplicate_externals.test | 52 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 llvm/test/ExecutionEngine/JITLink/X86/COFF_duplicate_externals.test diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp index fd9c2d5..dcaefd7 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()->TagIndex; diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h index 72e2214..26cb857 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h @@ -161,6 +161,8 @@ private: Section *CommonSection = nullptr; std::vector GraphBlocks; std::vector GraphSymbols; + + DenseMap ExternalSymbols; }; template 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 0000000..e929c01 --- /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 -- 2.7.4