summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-objcopy
diff options
context:
space:
mode:
authorJordan Rupprecht <rupprecht@google.com>2018-08-17 22:34:48 +0000
committerJordan Rupprecht <rupprecht@google.com>2018-08-17 22:34:48 +0000
commitbe8ebccaed22135669fd3716ed4cd235085ef5fd (patch)
tree3e49c58a2d41d305e9c27d1b54d9049ad6881131 /llvm/test/tools/llvm-objcopy
parent04df67e268eaf4c63b7fd0712b0c54a6db89c1cf (diff)
downloadbcm5719-llvm-be8ebccaed22135669fd3716ed4cd235085ef5fd.tar.gz
bcm5719-llvm-be8ebccaed22135669fd3716ed4cd235085ef5fd.zip
[llvm-objcopy] Implement -G/--keep-global-symbol(s).
Summary: Port GNU Objcopy -G/--keep-global-symbol(s). This is slightly different than the already-implemented --globalize-symbol, which marks a symbol as global when copying. When --keep-global-symbol (alias -G) is used, *only* those symbols marked will stay global, and all other globals are demoted to local. (Also note that it doesn't *promote* a symbol to global). Additionally, there is a pluralized version of the flag --keep-global-symbols, which effectively applies --keep-global-symbol for every non-comment in a file. Reviewers: jakehehrlich, jhenderson, alexshap Reviewed By: jhenderson Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D50589 llvm-svn: 340105
Diffstat (limited to 'llvm/test/tools/llvm-objcopy')
-rw-r--r--llvm/test/tools/llvm-objcopy/keep-global-symbols-mix-globalize.test51
-rw-r--r--llvm/test/tools/llvm-objcopy/keep-global-symbols.test95
2 files changed, 146 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/keep-global-symbols-mix-globalize.test b/llvm/test/tools/llvm-objcopy/keep-global-symbols-mix-globalize.test
new file mode 100644
index 00000000000..2de5807173c
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/keep-global-symbols-mix-globalize.test
@@ -0,0 +1,51 @@
+# RUN: yaml2obj %s > %t.o
+
+# Tests --keep-global-symbol when used in combination with --globalize-symbol on
+# a different symbol.
+
+# RUN: llvm-objcopy \
+# RUN: --globalize-symbol Local1 \
+# RUN: --keep-global-symbol Local2 \
+# RUN: --globalize-symbol Weak1 \
+# RUN: --keep-global-symbol Weak2 \
+# RUN: --globalize-symbol Global1 \
+# RUN: --keep-global-symbol Global2 \
+# RUN: %t.o %t.2.o
+# RUN: llvm-readobj -elf-output-style=GNU -symbols %t.2.o | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+Symbols:
+ Local:
+ - Name: Local1
+ Section: .text
+ - Name: Local2
+ Section: .text
+ Weak:
+ - Name: Weak1
+ Section: .text
+ - Name: Weak2
+ Section: .text
+ Global:
+ - Name: Global1
+ Section: .text
+ - Name: Global2
+ Section: .text
+
+# CHECK: Symbol table '.symtab' contains 7 entries:
+# CHECK-NEXT: Num: Value Size Type Bind Vis Ndx Name
+# CHECK-NEXT: 0: {{.*}} LOCAL {{.*}}
+# CHECK-NEXT: 1: {{.*}} LOCAL {{.*}} Local2
+# CHECK-NEXT: 2: {{.*}} GLOBAL {{.*}} Local1
+# CHECK-NEXT: 3: {{.*}} GLOBAL {{.*}} Global1
+# CHECK-NEXT: 4: {{.*}} GLOBAL {{.*}} Global2
+# CHECK-NEXT: 5: {{.*}} GLOBAL {{.*}} Weak1
+# CHECK-NEXT: 6: {{.*}} WEAK {{.*}} Weak2
diff --git a/llvm/test/tools/llvm-objcopy/keep-global-symbols.test b/llvm/test/tools/llvm-objcopy/keep-global-symbols.test
new file mode 100644
index 00000000000..4f580b4ae8a
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/keep-global-symbols.test
@@ -0,0 +1,95 @@
+# RUN: yaml2obj %s > %t.o
+
+# Tests that only global symbols (via -G/--keep-global-symbols) are kept via
+# the several different variants of -G/--keep-global-symbol(s).
+#
+# Local1: Local because "-G Local1" doesn't make symbols global.
+# Local2: Global because of "--globalize-symbol Local2".
+# Weak1: Weak because "-G Weak1" doesn't make symbols global.
+# Weak2: Global because of "--globalize-symbol Weak2".
+# Weak3: Local because no -G flag covers it.
+# Global1: Global because of "-G Global1".
+# Global2: Global because of "--keep-global-symbol Global2".
+# Global3: Global because of "--keep-global-symbols %t-globals1.txt".
+# Global4: Global because of "--keep-global-symbols %t-globals2.txt".
+# Global5: Local, it appears in %t-globals2.txt but only in comments and as
+# part of another symbol
+# Global6: Local, it appears in %t-globals2.txt but only part of another symbol
+# "Global5 Global6": Global, because it appears in %t-globals2.txt, but we only
+# trim leading and trailing whitespace. We don't just take the first chunk
+# that looks like a symbol.
+
+# RUN: echo Global2 > %t-globals1.txt
+# RUN: echo " Global3 " > %t-globals2.txt
+# RUN: echo "Global4 # Global5" >> %t-globals2.txt
+# RUN: echo " Global5 Global6 " >> %t-globals2.txt
+# RUN: echo "Unknown" >> %t-globals2.txt
+# RUN: echo " " >> %t-globals2.txt
+# RUN: echo "# File with no symbols" > %t-globals3.txt
+
+# RUN: llvm-objcopy \
+# RUN: -G Global1 \
+# RUN: --keep-global-symbol Global2 \
+# RUN: --keep-global-symbols %t-globals1.txt \
+# RUN: --keep-global-symbols %t-globals2.txt \
+# RUN: -G Local1 \
+# RUN: --globalize-symbol Local2 \
+# RUN: -G Weak1 \
+# RUN: --globalize-symbol Weak2 \
+# RUN: %t.o %t.2.o
+# RUN: llvm-readobj -elf-output-style=GNU -symbols %t.2.o | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+Symbols:
+ Local:
+ - Name: Local1
+ Section: .text
+ - Name: Local2
+ Section: .text
+ Weak:
+ - Name: Weak1
+ Section: .text
+ - Name: Weak2
+ Section: .text
+ - Name: Weak3
+ Section: .text
+ Global:
+ - Name: Global1
+ Section: .text
+ - Name: Global2
+ Section: .text
+ - Name: Global3
+ Section: .text
+ - Name: Global4
+ Section: .text
+ - Name: Global5
+ Section: .text
+ - Name: Global6
+ Section: .text
+ - Name: "Global5 Global6"
+ Section: .text
+
+# CHECK: Symbol table '.symtab' contains 13 entries:
+# CHECK-NEXT: Num: Value Size Type Bind Vis Ndx Name
+# CHECK-NEXT: 0: {{.*}} LOCAL {{.*}}
+# CHECK-NEXT: 1: {{.*}} LOCAL {{.*}} Local1
+# CHECK-NEXT: 2: {{.*}} LOCAL {{.*}} Global5
+# CHECK-NEXT: 3: {{.*}} LOCAL {{.*}} Global6
+# CHECK-NEXT: 4: {{.*}} LOCAL {{.*}} Weak3
+# CHECK-NEXT: 5: {{.*}} GLOBAL {{.*}} Local2
+# CHECK-NEXT: 6: {{.*}} GLOBAL {{.*}} Global1
+# CHECK-NEXT: 7: {{.*}} GLOBAL {{.*}} Global2
+# CHECK-NEXT: 8: {{.*}} GLOBAL {{.*}} Global3
+# CHECK-NEXT: 9: {{.*}} GLOBAL {{.*}} Global4
+# CHECK-NEXT: 10: {{.*}} GLOBAL {{.*}} Global5 Global6
+# CHECK-NEXT: 11: {{.*}} WEAK {{.*}} Weak1
+# CHECK-NEXT: 12: {{.*}} GLOBAL {{.*}} Weak2
OpenPOWER on IntegriCloud