diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h @@ -114,6 +114,7 @@ struct ComdatExportRequest { COFFSymbolIndex SymbolIndex; jitlink::Linkage Linkage; + orc::ExecutorAddrDiff Size; }; std::vector> PendingComdatExports; diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp @@ -579,7 +579,8 @@ dbgs() << " " << SymIndex << ": Partially supported IMAGE_COMDAT_SELECT_LARGEST was used" " in section " - << Symbol.getSectionNumber() << "\n"; + << Symbol.getSectionNumber() << " (size: " << Definition->Length + << ")\n"; }); L = Linkage::Weak; break; @@ -594,9 +595,9 @@ formatv("{0:d}", Definition->Selection)); } } - PendingComdatExports[Symbol.getSectionNumber()] = {SymIndex, L}; - return &G->addAnonymousSymbol(*B, Symbol.getValue(), Definition->Length, - false, false); + PendingComdatExports[Symbol.getSectionNumber()] = {SymIndex, L, + Definition->Length}; + return nullptr; } // Process the second symbol of COMDAT sequence. @@ -604,31 +605,27 @@ COFFLinkGraphBuilder::exportCOMDATSymbol(COFFSymbolIndex SymIndex, StringRef SymbolName, object::COFFSymbolRef Symbol) { + Block *B = getGraphBlock(Symbol.getSectionNumber()); auto &PendingComdatExport = PendingComdatExports[Symbol.getSectionNumber()]; - COFFSymbolIndex TargetIndex = PendingComdatExport->SymbolIndex; - Linkage L = PendingComdatExport->Linkage; - jitlink::Symbol *Target = getGraphSymbol(TargetIndex); - assert(Target && "COMDAT leaader is invalid."); - assert((llvm::count_if(G->defined_symbols(), - [&](const jitlink::Symbol *Sym) { - return Sym->getName() == SymbolName; - }) == 0) && - "Duplicate defined symbol"); - Target->setName(SymbolName); - Target->setLinkage(L); - Target->setCallable(Symbol.getComplexType() == - COFF::IMAGE_SYM_DTYPE_FUNCTION); - Target->setScope(Scope::Default); + // NOTE: ComdatDef->Legnth is the size of "section" not size of symbol. + // We use zero symbol size to not reach out of bound of block when symbol + // offset is non-zero. + auto GSym = &G->addDefinedSymbol( + *B, Symbol.getValue(), SymbolName, 0, PendingComdatExport->Linkage, + Scope::Default, Symbol.getComplexType() == COFF::IMAGE_SYM_DTYPE_FUNCTION, + false); LLVM_DEBUG({ dbgs() << " " << SymIndex << ": Exporting COMDAT graph symbol for COFF symbol \"" << SymbolName << "\" in section " << Symbol.getSectionNumber() << "\n"; - dbgs() << " " << *Target << "\n"; + dbgs() << " " << *GSym << "\n"; }); + setGraphSymbol(Symbol.getSectionNumber(), PendingComdatExport->SymbolIndex, + *GSym); + DefinedSymbols[SymbolName] = GSym; PendingComdatExport = None; - DefinedSymbols[SymbolName] = Target; - return Target; + return GSym; } } // namespace jitlink } // namespace llvm \ No newline at end of file diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_any.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_any.test --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_any.test +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_any.test @@ -5,10 +5,8 @@ # Check a weak symbol is created for a COMDAT symbol with IMAGE_COMDAT_SELECT_ANY selection type. # # CHECK: Creating graph symbols... -# CHECK: 2: Creating defined graph symbol for COFF symbol ".text" in .text (index: 2) -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: local, dead - -# CHECK-NEXT: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead - func +# CHECK: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 +# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000000, linkage: weak, scope: default, dead - func --- !COFF header: diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_exact_match.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_exact_match.test --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_exact_match.test +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_exact_match.test @@ -6,10 +6,8 @@ # Doesn't check the content validation. # # CHECK: Creating graph symbols... -# CHECK: 2: Creating defined graph symbol for COFF symbol ".text" in .text (index: 2) -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: local, dead - -# CHECK-NEXT: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead - func +# CHECK: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 +# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000000, linkage: weak, scope: default, dead - func --- !COFF header: diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_intervene.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_intervene.test --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_intervene.test +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_intervene.test @@ -6,9 +6,9 @@ # # CHECK: Creating graph symbols... # CHECK: 6: Exporting COMDAT graph symbol for COFF symbol "func2" in section 3 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead - func2 +# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000000, linkage: weak, scope: default, dead - func2 # CHECK: 7: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead - func +# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000000, linkage: weak, scope: default, dead - func --- !COFF header: diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_largest.test @@ -5,10 +5,8 @@ # Check jitlink handles largest selection type as plain weak symbol. # # CHECK: Creating graph symbols... -# CHECK: 2: Creating defined graph symbol for COFF symbol ".text" in .text (index: 2) -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: local, dead - -# CHECK-NEXT: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead - func +# CHECK: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 +# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000000, linkage: weak, scope: default, dead - func --- !COFF header: diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_noduplicate.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_noduplicate.test --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_noduplicate.test +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_noduplicate.test @@ -5,10 +5,8 @@ # Check a strong symbol is created for a COMDAT symbol with IMAGE_COMDAT_SELECT_NODUPLICATES selection type. # # CHECK: Creating graph symbols... -# CHECK: 2: Creating defined graph symbol for COFF symbol ".text" in .text (index: 2) -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: local, dead - -# CHECK-NEXT: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: default, dead - func +# CHECK: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 +# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000000, linkage: strong, scope: default, dead - func --- !COFF header: diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_any.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_offset.test copy from llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_any.test copy to llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_offset.test --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_any.test +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_offset.test @@ -2,13 +2,11 @@ # RUN: yaml2obj %s -o %t # RUN: llvm-jitlink -noexec --debug-only=jitlink -noexec %t 2>&1 | FileCheck %s # -# Check a weak symbol is created for a COMDAT symbol with IMAGE_COMDAT_SELECT_ANY selection type. +# Check a COMDAT symbol with an offset is handled correctly. # # CHECK: Creating graph symbols... -# CHECK: 2: Creating defined graph symbol for COFF symbol ".text" in .text (index: 2) -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: local, dead - -# CHECK-NEXT: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead - func +# CHECK: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 +# CHECK-NEXT: 0x1 (block + 0x00000001): size: 0x00000000, linkage: weak, scope: default, dead - func --- !COFF header: @@ -50,7 +48,7 @@ Number: 2 Selection: IMAGE_COMDAT_SELECT_ANY - Name: func - Value: 0 + Value: 1 SectionNumber: 2 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_FUNCTION diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_same_size.test b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_same_size.test --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_same_size.test +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_same_size.test @@ -6,10 +6,8 @@ # Doesn't check the size validation. # # CHECK: Creating graph symbols... -# CHECK: 2: Creating defined graph symbol for COFF symbol ".text" in .text (index: 2) -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: local, dead - -# CHECK-NEXT: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead - func +# CHECK: 4: Exporting COMDAT graph symbol for COFF symbol "func" in section 2 +# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000000, linkage: weak, scope: default, dead - func --- !COFF header: diff --git a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_weak.s b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_weak.s --- a/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_weak.s +++ b/llvm/test/ExecutionEngine/JITLink/X86/COFF_comdat_weak.s @@ -5,10 +5,8 @@ # Check a COMDAT any symbol is exported as a weak symbol. # # CHECK: Creating graph symbols... -# CHECK: 6: Creating defined graph symbol for COFF symbol ".text" in .text (index: 4) -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: strong, scope: local, dead - -# CHECK-NEXT: 8: Exporting COMDAT graph symbol for COFF symbol "func" in section 4 -# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000001, linkage: weak, scope: default, dead - func +# CHECK: 8: Exporting COMDAT graph symbol for COFF symbol "func" in section 4 +# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000000, linkage: weak, scope: default, dead - func .text