[llvm-branch-commits] [llvm] 71eff61 - [JITLink][COFF] Handle duplicate external symbols.
Sunho Kim via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jul 25 20:44:11 PDT 2022
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
More information about the llvm-branch-commits
mailing list