[PATCH] D129937: [JITLink][COFF] Handle duplicate external symbols.

Sunho Kim via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 16 11:48:19 PDT 2022


sunho created this revision.
sunho added reviewers: lhames, sgraenitz, slydiman.
Herald added subscribers: StephenFan, hiraditya.
Herald added a project: All.
sunho requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Handles duplicate external symbols. This happens in few static libraries generaed from msvc toolchain.


https://reviews.llvm.org/D129937

Files:
  llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp
  llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h
  llvm/test/ExecutionEngine/JITLink/X86/COFF_duplicate_externals.test


Index: llvm/test/ExecutionEngine/JITLink/X86/COFF_duplicate_externals.test
===================================================================
--- /dev/null
+++ 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
Index: llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h
===================================================================
--- llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h
+++ llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h
@@ -161,6 +161,8 @@
   Section *CommonSection = nullptr;
   std::vector<Block *> GraphBlocks;
   std::vector<Symbol *> GraphSymbols;
+
+  DenseMap<StringRef, Symbol *> ExternalSymbols;
 };
 
 template <typename RelocHandlerFunction>
Index: llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp
===================================================================
--- llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp
+++ llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp
@@ -223,8 +223,10 @@
                << 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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129937.445246.patch
Type: text/x-patch
Size: 3432 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220716/26092622/attachment.bin>


More information about the llvm-commits mailing list