mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
7e667c56cf
There are two ways one could implement hiding of linkonce_odr symbols in LTO: * LLVM tells the linker which symbols can be hidden if not used from native files. * The linker tells LLVM which symbols are not used from other object files, but will be put in the dso symbol table if present. GOLD's API is the second option. It was implemented almost 1:1 in llvm by passing the list down to internalize. LLVM already had partial support for the first option. It is also very similar to how ld64 handles hiding these symbols when *not* doing LTO. This patch then * removes the APIs for the DSO list. * marks LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN all linkonce_odr unnamed_addr global values and other linkonce_odr whose address is not used. * makes the gold plugin responsible for handling the API mismatch. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193800 91177308-0d34-0410-b5e6-96231b3b80d8
51 lines
1.9 KiB
LLVM
51 lines
1.9 KiB
LLVM
; No arguments means internalize everything
|
|
; RUN: opt < %s -internalize -S | FileCheck --check-prefix=ALL %s
|
|
|
|
; Non existent files should be treated as if they were empty (so internalize
|
|
; everything)
|
|
; RUN: opt < %s -internalize -internalize-public-api-file /nonexistent/file 2> /dev/null -S | FileCheck --check-prefix=ALL %s
|
|
|
|
; Internalize all but foo and j
|
|
; RUN: opt < %s -internalize -internalize-public-api-list foo -internalize-public-api-list j -S | FileCheck --check-prefix=FOO_AND_J %s
|
|
|
|
; RUN: opt < %s -S -internalize -internalize-public-api-list bar -internalize-public-api-list foo -internalize-public-api-file /nonexistent/file 2> /dev/null | FileCheck --check-prefix=FOO_AND_BAR %s
|
|
|
|
; -file and -list options should be merged, the apifile contains foo and j
|
|
; RUN: opt < %s -internalize -internalize-public-api-list bar -internalize-public-api-file %S/apifile -S | FileCheck --check-prefix=FOO_J_AND_BAR %s
|
|
|
|
; ALL: @i = internal global
|
|
; FOO_AND_J: @i = internal global
|
|
; FOO_AND_BAR: @i = internal global
|
|
; FOO_J_AND_BAR: @i = internal global
|
|
@i = global i32 0
|
|
|
|
; ALL: @j = internal global
|
|
; FOO_AND_J: @j = global
|
|
; FOO_AND_BAR: @j = internal global
|
|
; FOO_J_AND_BAR: @j = global
|
|
@j = global i32 0
|
|
|
|
; ALL: define internal void @main() {
|
|
; FOO_AND_J: define internal void @main() {
|
|
; FOO_AND_BAR: define internal void @main() {
|
|
; FOO_J_AND_BAR: define internal void @main() {
|
|
define void @main() {
|
|
ret void
|
|
}
|
|
|
|
; ALL: define internal void @foo() {
|
|
; FOO_AND_J: define void @foo() {
|
|
; FOO_AND_BAR: define void @foo() {
|
|
; FOO_J_AND_BAR: define void @foo() {
|
|
define void @foo() {
|
|
ret void
|
|
}
|
|
|
|
; ALL: define available_externally void @bar() {
|
|
; FOO_AND_J: define available_externally void @bar() {
|
|
; FOO_AND_BAR: define available_externally void @bar() {
|
|
; FOO_J_AND_BAR: define available_externally void @bar() {
|
|
define available_externally void @bar() {
|
|
ret void
|
|
}
|