-
Notifications
You must be signed in to change notification settings - Fork 12.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[LLD][COFF] Support anti-dependency symbols (#112542)
Co-authored-by: Billy Laws <blaws05@gmail.com> Anti-dependency symbols are allowed to be duplicated, with the first definition taking precedence. If a regular weak alias is present, it is preferred over an anti-dependency definition. Chaining anti-dependencies is not allowed.
- Loading branch information
Showing
7 changed files
with
163 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
REQUIRES: x86 | ||
RUN: split-file %s %t.dir && cd %t.dir | ||
|
||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows chain-bad.s -o chain-bad.obj | ||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows chain-bad2.s -o chain-bad2.obj | ||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows globals-bad.s -o globals-bad.obj | ||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows chain-good.s -o chain-good.obj | ||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows chain-good2.s -o chain-good2.obj | ||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows globals-good.s -o globals-good.obj | ||
|
||
Temporary anti-dependency chains are allowed as long as they are broken by non-alias symbols. | ||
|
||
RUN: lld-link -machine:amd64 -dll -noentry -out:test.dll chain-good.obj globals-good.obj | ||
RUN: lld-link -machine:amd64 -dll -noentry -out:test.dll chain-good2.obj globals-good.obj | ||
|
||
Chaining of anti-dependency symbols is not allowed. | ||
|
||
RUN: not lld-link -machine:amd64 -dll -noentry -out:test.dll chain-bad.obj globals-bad.obj 2>&1 \ | ||
RUN: | FileCheck -check-prefix=ANTIDEP %s | ||
RUN: not lld-link -machine:amd64 -dll -noentry -out:test.dll chain-bad2.obj globals-bad.obj 2>&1 \ | ||
RUN: | FileCheck -check-prefix=ANTIDEP %s | ||
|
||
ANTIDEP: lld-link: error: undefined symbol: sym | ||
ANTIDEP-NEXT: >>> referenced by chain-bad | ||
|
||
#--- chain-bad.s | ||
.weak_anti_dep sym | ||
.set sym,sym2 | ||
.weak_anti_dep sym2 | ||
.set sym2,sym3 | ||
|
||
#--- chain-bad2.s | ||
.weak_anti_dep sym2 | ||
.set sym2,sym3 | ||
.weak sym | ||
.set sym,sym2 | ||
|
||
#--- globals-bad.s | ||
.section .test,"r" | ||
.global sym3 | ||
.set sym3,3 | ||
|
||
#--- chain-good.s | ||
.weak_anti_dep sym | ||
.set sym,sym2 | ||
.weak_anti_dep sym2 | ||
.set sym2,sym3 | ||
.weak_anti_dep sym3 | ||
.set sym3,sym4 | ||
.weak_anti_dep sym4 | ||
|
||
#--- chain-good2.s | ||
.weak_anti_dep sym | ||
.set sym,sym2 | ||
.weak_anti_dep sym2 | ||
.set sym2,sym3 | ||
.weak_anti_dep sym3 | ||
.set sym3,weak_sym | ||
.weak weak_sym | ||
.set weak_sym,sym4 | ||
.weak_anti_dep sym4 | ||
|
||
#--- globals-good.s | ||
.section .test,"r" | ||
.global sym2 | ||
.set sym2,2 | ||
.global sym4 | ||
.set sym4,4 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
REQUIRES: x86 | ||
RUN: split-file %s %t.dir && cd %t.dir | ||
|
||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows antidep.s -o antidep.obj | ||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows antidep2.s -o antidep2.obj | ||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows weak.s -o weak.obj | ||
RUN: llvm-mc -filetype=obj -triple=x86_64-windows test.s -o test.obj | ||
|
||
Check that a regular weak alias overrides an anti-dependency symbol. | ||
|
||
RUN: lld-link -dll -noentry -out:out1.dll antidep.obj weak.obj test.obj | ||
RUN: llvm-readobj --hex-dump=.test out1.dll | FileCheck --check-prefix=CHECK2 %s | ||
|
||
RUN: lld-link -dll -noentry -out:out2.dll weak.obj antidep.obj test.obj | ||
RUN: llvm-readobj --hex-dump=.test out2.dll | FileCheck --check-prefix=CHECK2 %s | ||
|
||
RUN: lld-link -dll -noentry -out:out3.dll antidep.obj weak.obj test.obj -lld-allow-duplicate-weak | ||
RUN: llvm-readobj --hex-dump=.test out3.dll | FileCheck --check-prefix=CHECK2 %s | ||
|
||
RUN: lld-link -dll -noentry -out:out4.dll weak.obj antidep.obj test.obj -lld-allow-duplicate-weak | ||
RUN: llvm-readobj --hex-dump=.test out4.dll | FileCheck --check-prefix=CHECK2 %s | ||
|
||
When an anti-dependency symbol is duplicated, the first definition takes precedence over subsequent ones. | ||
|
||
RUN: lld-link -dll -noentry -out:out5.dll antidep.obj antidep2.obj test.obj | ||
RUN: llvm-readobj --hex-dump=.test out5.dll | FileCheck --check-prefix=CHECK1 %s | ||
|
||
RUN: lld-link -dll -noentry -out:out6.dll antidep2.obj antidep.obj test.obj | ||
RUN: llvm-readobj --hex-dump=.test out6.dll | FileCheck --check-prefix=CHECK2 %s | ||
|
||
CHECK1: 01000000 | ||
CHECK2: 02000000 | ||
|
||
#--- antidep.s | ||
.weak_anti_dep sym | ||
.set sym,target1 | ||
|
||
#--- antidep2.s | ||
.weak_anti_dep sym | ||
.set sym,target2 | ||
|
||
#--- weak.s | ||
.weak sym | ||
.set sym,target2 | ||
|
||
#--- test.s | ||
.section .target,"dr" | ||
.globl target1 | ||
.set target1,1 | ||
.globl target2 | ||
.set target2,2 | ||
|
||
.section .test,"dr" | ||
.long sym |