1## This test checks that llvm-objcopy accepts glob (or "shell wildcard") syntax
2## for the --wildcard (-w) flag correctly.
3
4# RUN: yaml2obj --docnum=1 %s -o %t.o
5
6## * matches all characters.
7# RUN: llvm-objcopy --remove-section='.f*' %t.o %t.glob.o
8# RUN: llvm-readobj --sections %t.glob.o \
9# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,BAR
10
11## Glob matches are full matches. ("*a" does not match ".bar").
12# RUN: llvm-objcopy --remove-section='*a' %t.o %t.full.o
13# RUN: llvm-readobj --sections %t.full.o \
14# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO,BAR
15
16## ? matches one character.
17# RUN: llvm-objcopy --remove-section='.b?r' %t.o %t.question.o
18# RUN: llvm-readobj --sections %t.question.o \
19# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO
20
21## ! (as a leading character) prevents matches, and is not dependent on
22## ordering.
23# RUN: llvm-objcopy --remove-section='.???' --remove-section='!.f*' \
24# RUN:   %t.o %t.negmatch1.o
25# RUN: llvm-readobj --sections %t.negmatch1.o \
26# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO
27# RUN: llvm-objcopy --remove-section='!.f*' --remove-section='.???' \
28# RUN:   %t.o %t.negmatch2.o
29# RUN: llvm-readobj --sections %t.negmatch2.o \
30# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO
31# RUN: llvm-objcopy --remove-section='.???' --remove-section='!.f*' \
32# RUN:   --remove-section='.???' %t.o %t.negmatch3.o
33# RUN: llvm-readobj --sections %t.negmatch3.o \
34# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO
35
36## [a-z] matches a range of characters.
37# RUN: llvm-objcopy --remove-section='.[a-c][a-a][q-s]' %t.o %t.range.o
38# RUN: llvm-readobj --sections %t.range.o \
39# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO
40
41## [^a-z] or [!a-z] match a negated range of characters.
42# RUN: llvm-objcopy --remove-section='.[^x]oo' %t.o %t.negrange.1.o
43# RUN: llvm-readobj --sections %t.negrange.1.o \
44# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,BAR
45# RUN: llvm-objcopy --remove-section='.[!x]oo' %t.o %t.negrange.2.o
46# RUN: llvm-readobj --sections %t.negrange.2.o \
47# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,BAR
48
49--- !ELF
50FileHeader:
51  Class:   ELFCLASS64
52  Data:    ELFDATA2LSB
53  Type:    ET_REL
54  Machine: EM_X86_64
55Sections:
56  - Name: .foo
57    Type: SHT_PROGBITS
58  - Name: .bar
59    Type: SHT_PROGBITS
60Symbols: []
61
62## Use a separate test file with special characters for the following tests.
63
64# RUN: yaml2obj --docnum=2 %s -o %t.special.o
65
66## \ escapes wildcard characters.
67# RUN: llvm-objcopy --remove-section='\*' %t.special.o %t.escape.1.o
68# RUN: llvm-readobj --sections %t.escape.1.o \
69# RUN:   | FileCheck %s --implicit-check-not=Name: \
70# RUN:   --check-prefixes=CHECK,DOT,QUESTION,LEFT-BRACKET,RIGHT-BRACKET,INVALID-GLOB,Z,XYZ,FOO
71# RUN: llvm-objcopy --remove-section='\?' %t.special.o %t.escape.2.o
72# RUN: llvm-readobj --sections %t.escape.2.o \
73# RUN:   | FileCheck %s --implicit-check-not=Name: \
74# RUN:   --check-prefixes=CHECK,DOT,ASTERISK,LEFT-BRACKET,RIGHT-BRACKET,INVALID-GLOB,Z,XYZ,FOO
75
76## Special characters are not treated like regular expression characters.
77# RUN: llvm-objcopy --remove-section='.' %t.special.o %t.dot.o
78# RUN: llvm-readobj --sections %t.dot.o \
79# RUN:   | FileCheck %s --implicit-check-not=Name: \
80# RUN:   --check-prefixes=CHECK,ASTERISK,QUESTION,LEFT-BRACKET,RIGHT-BRACKET,INVALID-GLOB,Z,XYZ,FOO
81
82## Special characters in character classes are treated literally.
83## [*] should not get expanded to [.*], which would match both '.' and '*'
84# RUN: llvm-objcopy --remove-section='[*]' %t.special.o %t.class.1.o
85# RUN: llvm-readobj --sections %t.class.1.o \
86# RUN:   | FileCheck %s --implicit-check-not=Name: \
87# RUN:   --check-prefixes=CHECK,DOT,QUESTION,LEFT-BRACKET,RIGHT-BRACKET,INVALID-GLOB,Z,XYZ,FOO
88
89## ] doesn't close the character class as a first character. This glob matches
90## a single character which is one of ']xyz'. ']' and 'z' are removed, and more explicitly,
91## section 'xyz]' is not removed, i.e. the glob is not interpreted as "an empty
92## character class followed by 'xyz]'"
93# RUN: llvm-objcopy --remove-section='[]xyz]' %t.special.o %t.class.2.o
94# RUN: llvm-readobj --sections %t.class.2.o \
95# RUN:   | FileCheck %s --implicit-check-not=Name: \
96# RUN:   --check-prefixes=CHECK,DOT,ASTERISK,QUESTION,LEFT-BRACKET,INVALID-GLOB,XYZ,FOO
97
98## An invalid glob expression is interpreted as a literal instead.
99# RUN: llvm-objcopy --remove-section='][]' %t.special.o %t.class.3.o 2>&1 \
100# RUN:   | FileCheck %s --check-prefix=WARN
101# RUN: llvm-readobj --sections %t.class.3.o \
102# RUN:   | FileCheck %s --implicit-check-not=Name: \
103# RUN:   --check-prefixes=CHECK,DOT,ASTERISK,QUESTION,LEFT-BRACKET,RIGHT-BRACKET,Z,XYZ,FOO
104
105--- !ELF
106FileHeader:
107  Class:   ELFCLASS64
108  Data:    ELFDATA2LSB
109  Type:    ET_REL
110  Machine: EM_X86_64
111Sections:
112  - Name: .
113    Type: SHT_PROGBITS
114  - Name: '*'
115    Type: SHT_PROGBITS
116  - Name: '?'
117    Type: SHT_PROGBITS
118  - Name: '['
119    Type: SHT_PROGBITS
120  - Name: ']'
121    Type: SHT_PROGBITS
122  - Name: '][]'
123    Type: SHT_PROGBITS
124  - Name: z
125    Type: SHT_PROGBITS
126  - Name: 'xyz]'
127    Type: SHT_PROGBITS
128  - Name: '[]xyz]'
129    Type: SHT_PROGBITS
130  - Name: .foo
131    Type: SHT_PROGBITS
132Symbols: []
133
134# WARN: warning: invalid glob pattern: ][]
135
136# CHECK: LoadName:
137# CHECK:         Name: (0)
138# DOT:           Name: .
139# ASTERISK:      Name: *
140# QUESTION:      Name: ?
141# LEFT-BRACKET:  Name: [
142# RIGHT-BRACKET: Name: ]
143# INVALID-GLOB:  Name: ][]
144# Z:             Name: z
145# XYZ:           Name: xyz]
146# XYZ:           Name: []xyz]
147# FOO:           Name: .foo
148# BAR:           Name: .bar
149# CHECK:         Name: .symtab
150# CHECK:         Name: .strtab
151# CHECK:         Name: .shstrtab
152