Skip to content

Commit 785d376

Browse files
committed
[ORC][JITLink] Treat common symbols as weak definitions.
Duplicate common definitions should be coaleseced, rather than being treated as duplicate definitions. Strong definitions should override common definitions. rdar://132314264
1 parent 9d1d0cc commit 785d376

File tree

8 files changed

+77
-11
lines changed

8 files changed

+77
-11
lines changed

llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ Expected<Symbol *> COFFLinkGraphBuilder::createDefinedSymbol(
467467
return &G->addDefinedSymbol(
468468
G->createZeroFillBlock(getCommonSection(), Symbol.getValue(),
469469
orc::ExecutorAddr(), Symbol.getValue(), 0),
470-
0, SymbolName, Symbol.getValue(), Linkage::Strong, Scope::Default,
470+
0, SymbolName, Symbol.getValue(), Linkage::Weak, Scope::Default,
471471
false, false);
472472
}
473473
if (Symbol.isAbsolute())

llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
472472
Symbol &GSym = G->addDefinedSymbol(
473473
G->createZeroFillBlock(getCommonSection(), Sym.st_size,
474474
orc::ExecutorAddr(), Sym.getValue(), 0),
475-
0, *Name, Sym.st_size, Linkage::Strong, Scope::Default, false, false);
475+
0, *Name, Sym.st_size, Linkage::Weak, Scope::Default, false, false);
476476
setGraphSymbol(SymIndex, GSym);
477477
continue;
478478
}

llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ Error MachOLinkGraphBuilder::graphifyRegularSymbols() {
366366
orc::ExecutorAddrDiff(NSym.Value),
367367
orc::ExecutorAddr(),
368368
1ull << MachO::GET_COMM_ALIGN(NSym.Desc), 0),
369-
0, *NSym.Name, orc::ExecutorAddrDiff(NSym.Value), Linkage::Strong,
369+
0, *NSym.Name, orc::ExecutorAddrDiff(NSym.Value), Linkage::Weak,
370370
NSym.S, false, NSym.Desc & MachO::N_NO_DEAD_STRIP);
371371
} else {
372372
if (!NSym.Name)

llvm/lib/ExecutionEngine/Orc/Core.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -932,13 +932,17 @@ Error JITDylib::resolve(MaterializationResponsibility &MR,
932932
if (SymI->second.getFlags().hasError())
933933
SymbolsInErrorState.insert(KV.first);
934934
else {
935-
auto Flags = KV.second.getFlags();
936-
Flags &= ~JITSymbolFlags::Common;
937-
assert(Flags ==
938-
(SymI->second.getFlags() & ~JITSymbolFlags::Common) &&
935+
auto ExpectedFlags = SymI->second.getFlags();
936+
if (ExpectedFlags & JITSymbolFlags::Common) {
937+
ExpectedFlags &= ~JITSymbolFlags::Common;
938+
ExpectedFlags |= JITSymbolFlags::Weak;
939+
}
940+
941+
assert(KV.second.getFlags() == ExpectedFlags &&
939942
"Resolved flags should match the declared flags");
940943

941-
Worklist.push_back({SymI, {KV.second.getAddress(), Flags}});
944+
Worklist.push_back(
945+
{SymI, {KV.second.getAddress(), SymI->second.getFlags()}});
942946
}
943947
}
944948

@@ -2899,8 +2903,12 @@ Error ExecutionSession::OL_notifyResolved(MaterializationResponsibility &MR,
28992903
"Resolving symbol outside this responsibility set");
29002904
assert(!I->second.hasMaterializationSideEffectsOnly() &&
29012905
"Can't resolve materialization-side-effects-only symbol");
2902-
assert((KV.second.getFlags() & ~JITSymbolFlags::Common) ==
2903-
(I->second & ~JITSymbolFlags::Common) &&
2906+
auto ExpectedFlags = I->second;
2907+
if (ExpectedFlags & JITSymbolFlags::Common) {
2908+
ExpectedFlags &= ~JITSymbolFlags::Common;
2909+
ExpectedFlags |= JITSymbolFlags::Weak;
2910+
}
2911+
assert(KV.second.getFlags() == ExpectedFlags &&
29042912
"Resolving symbol with incorrect flags");
29052913
}
29062914
#endif
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.section __TEXT,__text,regular,pure_instructions
2+
.globl _getXAddr
3+
.p2align 2
4+
_getXAddr:
5+
adrp x0, _x@GOTPAGE
6+
ldr x0, [x0, _x@GOTPAGEOFF]
7+
ret
8+
9+
.comm _x,4,2
10+
.subsections_via_symbols
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.section __TEXT,__text,regular,pure_instructions
2+
.globl _getXAddr
3+
.p2align 2
4+
_getXAddr:
5+
adrp x0, _x@PAGE
6+
add x0, x0, _x@PAGEOFF
7+
ret
8+
9+
.section __DATA,__data
10+
.globl _x
11+
.p2align 2, 0x0
12+
_x:
13+
.long 42
14+
15+
.subsections_via_symbols
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# RUN: rm -rf %t && mkdir -p %t
2+
# RUN: llvm-mc -triple=arm64-apple-darwin19 -filetype=obj -o %t/main.o %s
3+
# RUN: llvm-mc -triple=arm64-apple-darwin19 -filetype=obj -o %t/aux_common.o \
4+
# RUN: %S/Inputs/MachO_common_x_and_addr_getter.s
5+
# RUN: llvm-mc -triple=arm64-apple-darwin19 -filetype=obj -o %t/aux_strong.o \
6+
# RUN: %S/Inputs/MachO_strong_x_and_addr_getter.s
7+
# RUN: llvm-jitlink -noexec %t/main.o %t/aux_common.o
8+
# RUN: llvm-jitlink -noexec -check=%s %t/main.o %t/aux_strong.o
9+
#
10+
# Check that linking multiple common definitions of the same symbol (in this
11+
# case _x) doesn't lead to an "Unexpected definitions" error.
12+
#
13+
# rdar://132314264
14+
#
15+
# Check that strong defs override:
16+
# jitlink-check: *{8}_x = 42
17+
18+
.section __TEXT,__text,regular,pure_instructions
19+
.globl _main
20+
.p2align 2
21+
_main:
22+
stp x29, x30, [sp, #-16]!
23+
mov x29, sp
24+
bl _getXAddr
25+
adrp x8, _x@GOTPAGE
26+
ldr x8, [x8, _x@GOTPAGEOFF]
27+
cmp x0, x8
28+
cset w0, eq
29+
ldp x29, x30, [sp], #16
30+
ret
31+
32+
.comm _x,4,2
33+
.subsections_via_symbols

llvm/test/ExecutionEngine/JITLink/x86-64/COFF_common_symbol.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#
77
# CHECK: Creating graph symbols...
88
# CHECK: 7: Creating defined graph symbol for COFF symbol "var" in (common) (index: 0)
9-
# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000004, linkage: strong, scope: default, dead - var
9+
# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000004, linkage: weak, scope: default, dead - var
1010

1111
.text
1212

0 commit comments

Comments
 (0)