[llvm] 71eff61 - [JITLink][COFF] Handle duplicate external symbols.

Sunho Kim via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 25 20:45:57 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-commits mailing list