1 # RUN: yaml2obj %s -o %t
2 # RUN: llvm-objcopy --remove-section=.text.bar %t %t1
3 # RUN: llvm-readobj --section-groups %t1 | FileCheck %s
5 # In this test the section .text.bar is getting removed, as a result,
6 # the indices of the sections which go after .text.bar will change,
7 # thus the fields Link, Info and the content of .group should be updated.
10 # CHECK-NEXT: Index: 1
13 # CHECK-NEXT: Type: COMDAT (0x1)
14 # CHECK-NEXT: Signature: foo
15 # CHECK: .text.foo (2)
27 AddressAlign: 0x0000000000000004
30 - SectionOrType: GRP_COMDAT
31 - SectionOrType: .text.foo
34 Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
35 AddressAlign: 0x0000000000000010
38 Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
39 AddressAlign: 0x0000000000000010
50 Size: 0x0000000000000000
55 Size: 0x0000000000000000
58 ## This checks that tool will emit an error when trying to remove the symbol
59 ## table when we have a group section linked with symtab.
60 # RUN: not llvm-objcopy -R .symtab %t %t2 2>&1 | FileCheck %s --check-prefix=ERR -DINPUT=%t
62 # ERR: error: '[[INPUT]]': section '.symtab' cannot be removed because it is referenced by the group section '.group'
64 ## The '.symtab' section could be removed using --allow-broken-links option.
65 # RUN: llvm-objcopy --allow-broken-links -R .symtab %t %t3
66 # RUN: llvm-readelf --sections %t3 | FileCheck %s --check-prefix=SECTIONS
68 # SECTIONS: There are 6 section headers
69 # SECTIONS: Name Type Address Off Size ES Flg Lk Inf
71 # SECTIONS-NEXT: .group {{.+}} {{.+}} {{.+}} {{.+}} {{.+}} 0 0
72 # SECTIONS-NEXT: .text.bar
73 # SECTIONS-NEXT: .text.foo
74 # SECTIONS-NEXT: .strtab
75 # SECTIONS-NEXT: .shstrtab
77 ## Show that llvm-objcopy can handle a group section with a zero sh_link and
79 # RUN: llvm-objcopy --allow-broken-links -R .symtab %t3 %t4
82 ## The signature symbol becomes local. Assume the intention is to localize the group.
83 ## Drop GRP_COMDAT so that the linker will suppress deduplication.
84 # RUN: llvm-objcopy --keep-global-symbol=bar %t %t5
85 # RUN: llvm-readelf -s --section-groups %t5 | FileCheck %s --check-prefix=LOCAL-SIG
87 # LOCAL-SIG: LOCAL DEFAULT [[#]] foo
88 # LOCAL-SIG: (unknown) group section [ 1] `.group' [foo] contains 1 sections:
90 ## The signature symbol remains non-local. Keep GRP_COMDAT.
91 # RUN: llvm-readelf -s --section-groups %t1 | FileCheck %s --check-prefix=WEAK-SIG
93 # WEAK-SIG: WEAK DEFAULT [[#]] foo
94 # WEAK-SIG: COMDAT group section [ 1] `.group' [foo] contains 1 sections:
96 # RUN: llvm-objcopy --globalize-symbol=foo %t %t6
97 # RUN: llvm-readelf -s --section-groups %t6 | FileCheck %s --check-prefix=GLOBAL-SIG
99 # GLOBAL-SIG: GLOBAL DEFAULT [[#]] foo
100 # GLOBAL-SIG: COMDAT group section [ 1] `.group' [foo] contains 1 sections:
102 ## If the signature is initially local and no operation has been performed to
103 ## specifically localize it, it isn't clear whether we should drop GRP_COMDAT.
104 ## The current convention is that compilers should not produce such input, so
105 ## our choice does not matter.
106 # RUN: yaml2obj --docnum=2 %s -o %t.localsig
107 # RUN: llvm-objcopy %t.localsig %t.localsig.out
108 # RUN: llvm-readelf -s --section-groups %t.localsig.out | FileCheck %s --check-prefix=LOCAL-SIG
121 - SectionOrType: GRP_COMDAT
122 - SectionOrType: .text.foo