Files
clang-p2996/lld/test/MachO/common-symbol-resolution.s
Jez Ng cafed6f292 [lld-macho][nfc] Fix test to reflect that symbol attributes don't matter within an archive
We had a comment that claimed that defined symbols had priority
over common symbols if they occurred in the same archive. In fact, they
appear to have equal precedence. Our implementation already does this,
so I'm just updating the test comment. Also added a few other test
comments along the way for readability.

Reviewed By: #lld-macho, thakis

Differential Revision: https://reviews.llvm.org/D106595
2021-07-23 11:49:00 -04:00

110 lines
4.4 KiB
ArmAsm

# REQUIRES: x86
# RUN: rm -rf %t; split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/common.s -o %t/common.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/weak-common.s -o %t/weak-common.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/defined.s -o %t/defined.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/weak-defined.s -o %t/weak-defined.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libfoo.s -o %t/libfoo.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/calls-foo.s -o %t/calls-foo.o
# RUN: %lld -lSystem -order_file %t/order -dylib %t/libfoo.o -o %t/libfoo.dylib
# RUN: llvm-ar rcs %t/defined.a %t/defined.o
# RUN: llvm-ar rcs %t/weak-defined-and-common.a %t/weak-defined.o %t/common.o
# RUN: llvm-ar rcs %t/common-and-weak-defined.a %t/common.o %t/weak-defined.o
## The weak attribute appears to have no effect on common symbols. Given two
## common symbols of the same name, we always pick the one with the larger size,
## regardless of whether it is weak. Moreover, the resolved symbol in the output
## file will always be non-weak, even if the winning input symbol definition was
## weak.
# RUN: %lld -lSystem -order_file %t/order %t/common.o %t/weak-common.o %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=LARGER-COMMON
# RUN: %lld -lSystem -order_file %t/order %t/weak-common.o %t/common.o %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=LARGER-COMMON
## Defined symbols are the only ones that take precedence over common symbols.
# RUN: %lld -lSystem -order_file %t/order %t/defined.o %t/common.o %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=DEFINED
# RUN: %lld -lSystem -order_file %t/order %t/common.o %t/defined.o %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=DEFINED
# RUN: %lld -lSystem -order_file %t/order %t/weak-defined.o %t/common.o %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=WEAK-DEFINED
# RUN: %lld -lSystem -order_file %t/order %t/common.o %t/weak-defined.o %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=WEAK-DEFINED
## Common symbols take precedence over archive symbols.
# RUN: %lld -lSystem -order_file %t/order %t/defined.a %t/weak-common.o %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=LARGER-COMMON
# RUN: %lld -lSystem -order_file %t/order %t/weak-common.o %t/defined.a %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=LARGER-COMMON
## Defined symbols have the same precedence as common symbols within an archive.
# RUN: %lld -lSystem -order_file %t/order %t/weak-defined-and-common.a %t/calls-foo.o -o %t/calls-foo
# RUN: llvm-objdump --syms %t/calls-foo | FileCheck %s --check-prefix=WEAK-DEFINED
# RUN: %lld -lSystem -order_file %t/order %t/calls-foo.o %t/common-and-weak-defined.a -o %t/calls-foo
# RUN: llvm-objdump --syms %t/calls-foo | FileCheck %s --check-prefix=COMMON
## Common symbols take precedence over dylib symbols.
# RUN: %lld -lSystem -order_file %t/order %t/libfoo.dylib %t/weak-common.o %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=LARGER-COMMON
# RUN: %lld -lSystem -order_file %t/order %t/weak-common.o %t/libfoo.dylib %t/test.o -o %t/test
# RUN: llvm-objdump --syms %t/test | FileCheck %s --check-prefix=LARGER-COMMON
# LARGER-COMMON-DAG: [[#%x, FOO_ADDR:]] g O __DATA,__common _foo
# LARGER-COMMON-DAG: [[#FOO_ADDR + 2]] g O __DATA,__common _foo_end
# COMMON: g O __DATA,__common _foo
# DEFINED: g F __TEXT,__text _foo
# WEAK-DEFINED: w F __TEXT,__text _foo
#--- order
## %t/order is important as we determine the size of a given symbol via the
## address of the next symbol.
_foo
_foo_end
#--- common.s
.comm _foo, 1
.globl _bar
_bar:
#--- weak-common.s
.weak_definition _foo
.comm _foo, 2
#--- defined.s
.globl _foo
_foo:
.quad 0x1234
#--- weak-defined.s
.globl _foo
.weak_definition _foo
_foo:
.quad 0x1234
#--- libfoo.s
.globl _foo
_foo:
.quad 0x1234
#--- test.s
.comm _foo_end, 1
.globl _main
_main:
ret
#--- calls-foo.s
.comm _foo_end, 1
.globl _main
_main:
callq _foo
ret