| # RUN: yaml2obj --docnum=1 %s -o %t.o | 
 | # RUN: echo '.*' > %t.symbols.regex | 
 |  | 
 | ## Check that the visibility of all symbols is properly set to DEFAULT. | 
 | # RUN: llvm-objcopy %t.o %t0.o --set-symbols-visibility=%t.symbols.regex=default --regex | 
 | # RUN: llvm-readelf -s %t0.o | FileCheck %s --check-prefix=DEF | 
 |  | 
 | # DEF-DAG: DEFAULT     1 default_local | 
 | # DEF-DAG: DEFAULT     1 internal_local | 
 | # DEF-DAG: DEFAULT     1 hidden_local | 
 | # DEF-DAG: DEFAULT     1 protected_local | 
 | # DEF-DAG: DEFAULT     1 default_global | 
 | # DEF-DAG: DEFAULT     1 default_weak | 
 | # DEF-DAG: DEFAULT     1 internal_global | 
 | # DEF-DAG: DEFAULT     1 internal_weak | 
 | # DEF-DAG: DEFAULT     1 hidden_global | 
 | # DEF-DAG: DEFAULT     1 hidden_weak | 
 | # DEF-DAG: DEFAULT     1 protected_global | 
 | # DEF-DAG: DEFAULT     1 protected_weak | 
 |  | 
 | ## Check that the visibility of all symbols is properly set to HIDDEN. | 
 | # RUN: llvm-objcopy %t.o %t1.o --set-symbols-visibility=%t.symbols.regex=hidden --regex | 
 | # RUN: llvm-readelf -s %t1.o | FileCheck %s --check-prefix=HID | 
 |  | 
 | # HID-DAG: HIDDEN      1 default_local | 
 | # HID-DAG: HIDDEN      1 internal_local | 
 | # HID-DAG: HIDDEN      1 hidden_local | 
 | # HID-DAG: HIDDEN      1 protected_local | 
 | # HID-DAG: HIDDEN      1 default_global | 
 | # HID-DAG: HIDDEN      1 default_weak | 
 | # HID-DAG: HIDDEN      1 internal_global | 
 | # HID-DAG: HIDDEN      1 internal_weak | 
 | # HID-DAG: HIDDEN      1 hidden_global | 
 | # HID-DAG: HIDDEN      1 hidden_weak | 
 | # HID-DAG: HIDDEN      1 protected_global | 
 | # HID-DAG: HIDDEN      1 protected_weak | 
 |  | 
 | ## Check that the visibility of all symbols is properly set to PROTECTED. | 
 | # RUN: llvm-objcopy %t.o %t2.o --set-symbols-visibility=%t.symbols.regex=protected --regex | 
 | # RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=PRO | 
 |  | 
 | # PRO-DAG: PROTECTED   1 default_local | 
 | # PRO-DAG: PROTECTED   1 internal_local | 
 | # PRO-DAG: PROTECTED   1 hidden_local | 
 | # PRO-DAG: PROTECTED   1 protected_local | 
 | # PRO-DAG: PROTECTED   1 default_global | 
 | # PRO-DAG: PROTECTED   1 default_weak | 
 | # PRO-DAG: PROTECTED   1 internal_global | 
 | # PRO-DAG: PROTECTED   1 internal_weak | 
 | # PRO-DAG: PROTECTED   1 hidden_global | 
 | # PRO-DAG: PROTECTED   1 hidden_weak | 
 | # PRO-DAG: PROTECTED   1 protected_global | 
 | # PRO-DAG: PROTECTED   1 protected_weak | 
 |  | 
 | ## Check that the visibility of all symbols is properly set to INTERNAL. | 
 | # RUN: llvm-objcopy %t.o %t3.o --set-symbols-visibility=%t.symbols.regex=internal --regex | 
 | # RUN: llvm-readelf -s %t3.o | FileCheck %s --check-prefix=INT | 
 |  | 
 | # INT-DAG: INTERNAL    1 default_local | 
 | # INT-DAG: INTERNAL    1 internal_local | 
 | # INT-DAG: INTERNAL    1 hidden_local | 
 | # INT-DAG: INTERNAL    1 protected_local | 
 | # INT-DAG: INTERNAL    1 default_global | 
 | # INT-DAG: INTERNAL    1 default_weak | 
 | # INT-DAG: INTERNAL    1 internal_global | 
 | # INT-DAG: INTERNAL    1 internal_weak | 
 | # INT-DAG: INTERNAL    1 hidden_global | 
 | # INT-DAG: INTERNAL    1 hidden_weak | 
 | # INT-DAG: INTERNAL    1 protected_global | 
 | # INT-DAG: INTERNAL    1 protected_weak | 
 |  | 
 | ## Check that setting the visibility of certain symbols that were read from | 
 | ## a file does not affect other symbols. | 
 | # RUN: echo -e "default_local\ninternal_local" > %t.symbol.list | 
 | # RUN: llvm-objcopy %t.o %t4.o --set-symbols-visibility=%t.symbol.list=hidden | 
 | # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=FILE | 
 |  | 
 | # FILE-DAG: HIDDEN      1 default_local | 
 | # FILE-DAG: HIDDEN      1 internal_local | 
 | ## Unaffected symbols: | 
 | # FILE-DAG: HIDDEN      1 hidden_local | 
 | # FILE-DAG: PROTECTED   1 protected_local | 
 | # FILE-DAG: DEFAULT     1 default_global | 
 | # FILE-DAG: DEFAULT     1 default_weak | 
 | # FILE-DAG: INTERNAL    1 internal_global | 
 | # FILE-DAG: INTERNAL    1 internal_weak | 
 | # FILE-DAG: HIDDEN      1 hidden_global | 
 | # FILE-DAG: HIDDEN      1 hidden_weak | 
 | # FILE-DAG: PROTECTED   1 protected_global | 
 | # FILE-DAG: PROTECTED   1 protected_weak | 
 |  | 
 | ## Check that the visibility of a single symbol is set correctly, | 
 | ## and that no other symbols are affected. | 
 | # RUN: llvm-objcopy %t.o %t5.o --set-symbol-visibility=default_local=hidden \ | 
 | # RUN:                         --set-symbol-visibility=internal_local=protected \ | 
 | # RUN:                         --set-symbol-visibility=hidden_local=internal \ | 
 | # RUN:                         --set-symbol-visibility=protected_local=default | 
 | # RUN: llvm-readelf -s %t5.o | FileCheck %s --check-prefix=SINGLE | 
 |  | 
 | # SINGLE-DAG: HIDDEN      1 default_local | 
 | # SINGLE-DAG: PROTECTED   1 internal_local | 
 | # SINGLE-DAG: INTERNAL    1 hidden_local | 
 | # SINGLE-DAG: DEFAULT     1 protected_local | 
 | ## Unaffected symbols: | 
 | # SINGLE-DAG: DEFAULT     1 default_global | 
 | # SINGLE-DAG: DEFAULT     1 default_weak | 
 | # SINGLE-DAG: INTERNAL    1 internal_global | 
 | # SINGLE-DAG: INTERNAL    1 internal_weak | 
 | # SINGLE-DAG: HIDDEN      1 hidden_global | 
 | # SINGLE-DAG: HIDDEN      1 hidden_weak | 
 | # SINGLE-DAG: PROTECTED   1 protected_global | 
 | # SINGLE-DAG: PROTECTED   1 protected_weak | 
 |  | 
 | ## Check that the visibility of symbols specified by a regex are set correctly, | 
 | ## and that no other symbols are affected. | 
 | # RUN: llvm-objcopy %t.o %t6.o --set-symbol-visibility='.*'_local=hidden --regex | 
 | # RUN: llvm-readelf -s %t6.o | FileCheck %s --check-prefix=REGEX | 
 |  | 
 | # REGEX-DAG: HIDDEN      1 default_local | 
 | # REGEX-DAG: HIDDEN      1 internal_local | 
 | # REGEX-DAG: HIDDEN      1 hidden_local | 
 | # REGEX-DAG: HIDDEN      1 protected_local | 
 | ## Unaffected symbols: | 
 | # REGEX-DAG: DEFAULT     1 default_global | 
 | # REGEX-DAG: DEFAULT     1 default_weak | 
 | # REGEX-DAG: INTERNAL    1 internal_global | 
 | # REGEX-DAG: INTERNAL    1 internal_weak | 
 | # REGEX-DAG: HIDDEN      1 hidden_global | 
 | # REGEX-DAG: HIDDEN      1 hidden_weak | 
 | # REGEX-DAG: PROTECTED   1 protected_global | 
 | # REGEX-DAG: PROTECTED   1 protected_weak | 
 |  | 
 | ## Check that the visibility of symbols specified by a wildcard are set correctly, | 
 | ## and that no other symbols are affected. | 
 | # RUN: llvm-objcopy %t.o %t7.o --set-symbol-visibility='*_local'=hidden --wildcard | 
 | # RUN: llvm-readelf -s %t7.o | FileCheck %s --check-prefix=WILDCARD | 
 |  | 
 | # WILDCARD-DAG: HIDDEN      1 default_local | 
 | # WILDCARD-DAG: HIDDEN      1 internal_local | 
 | # WILDCARD-DAG: HIDDEN      1 hidden_local | 
 | # WILDCARD-DAG: HIDDEN      1 protected_local | 
 | ## Unaffected symbols: | 
 | # WILDCARD-DAG: DEFAULT     1 default_global | 
 | # WILDCARD-DAG: DEFAULT     1 default_weak | 
 | # WILDCARD-DAG: INTERNAL    1 internal_global | 
 | # WILDCARD-DAG: INTERNAL    1 internal_weak | 
 | # WILDCARD-DAG: HIDDEN      1 hidden_global | 
 | # WILDCARD-DAG: HIDDEN      1 hidden_weak | 
 | # WILDCARD-DAG: PROTECTED   1 protected_global | 
 | # WILDCARD-DAG: PROTECTED   1 protected_weak | 
 |  | 
 | ## Check that the latest option that matches the same symbols as any of the previous | 
 | ## options overwrites the visibility of these symbols. | 
 | # RUN: echo -e '*_weak\n*_local' > %t.symbols.pattern | 
 | # RUN: llvm-objcopy %t.o %t8.o --set-symbol-visibility='default_*'=hidden \ | 
 | # RUN:                         --set-symbol-visibility='internal_*'=hidden \ | 
 | # RUN:                         --set-symbols-visibility=%t.symbols.pattern=protected \ | 
 | # RUN:                         --wildcard | 
 | # RUN: llvm-readelf -s %t8.o | FileCheck %s --check-prefix=REWRITE | 
 |  | 
 | # REWRITE-DAG: PROTECTED   1 default_local | 
 | # REWRITE-DAG: HIDDEN      1 default_global | 
 | # REWRITE-DAG: PROTECTED   1 default_weak | 
 | # REWRITE-DAG: PROTECTED   1 internal_local | 
 | # REWRITE-DAG: HIDDEN      1 internal_global | 
 | # REWRITE-DAG: PROTECTED   1 internal_weak | 
 | # REWRITE-DAG: PROTECTED   1 hidden_local | 
 | # REWRITE-DAG: PROTECTED   1 hidden_weak | 
 | # REWRITE-DAG: PROTECTED   1 protected_local | 
 | # REWRITE-DAG: PROTECTED   1 protected_weak | 
 | ## Unaffected symbols: | 
 | # REWRITE-DAG: HIDDEN      1 hidden_global | 
 | # REWRITE-DAG: PROTECTED   1 protected_global | 
 |  | 
 | ## Check that a symbol name with a special charater is treated as a plain name | 
 | ## when pattern matching options are not enabled. | 
 | # RUN: yaml2obj --docnum=2 %s -o %t9.o | 
 | # RUN: llvm-objcopy %t9.o --set-symbol-visibility='f*o'=hidden | 
 | # RUN: llvm-readelf -s %t9.o | FileCheck %s --check-prefix=SPECIAL | 
 |  | 
 | # SPECIAL-DAG: HIDDEN      1 f*o | 
 | ## Unaffected symbol: | 
 | # SPECIAL-DAG: DEFAULT     1 foo | 
 |  | 
 | # RUN: yaml2obj --docnum=3 %s -o %t10.o | 
 |  | 
 | ## Check that the visibility of undefined symbols can be changed as well. | 
 | # RUN: llvm-objcopy %t10.o --set-symbol-visibility=foo=hidden | 
 | # RUN: llvm-readelf -s %t10.o | FileCheck %s --check-prefix=UNDEF | 
 | # UNDEF: HIDDEN    UND foo | 
 |  | 
 | ## Check that passing an invalid visibility type generates an error message. | 
 | # RUN: echo 'foo' > %t.symbols | 
 | # RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols=invalid-type 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefix=TYPE | 
 | # RUN: not llvm-objcopy %t10.o --set-symbol-visibility=foo=invalid-type 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefix=TYPE | 
 | # TYPE: error: 'invalid-type' is not a valid symbol visibility | 
 |  | 
 | ## Check that omitting the '=' character generates an error. | 
 | # RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols,hidden 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefix=FORMAT -DOPTION=--set-symbols-visibility | 
 | # RUN: not llvm-objcopy %t10.o --set-symbol-visibility=foo default 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefix=FORMAT -DOPTION=--set-symbol-visibility | 
 | # FORMAT: error: bad format for [[OPTION]] | 
 |  | 
 | ## Check that using an invalid symbol pattern generates an error. | 
 | # RUN: echo '*.' > %t.symbols.regex | 
 | # RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols.regex=hidden --regex 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefix=SYMBOL | 
 | # RUN: not llvm-objcopy %t10.o --set-symbol-visibility='*.'=default --regex 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefix=SYMBOL | 
 | # SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid | 
 |  | 
 | ## Check passing an invalid filename generates an error. | 
 | # RUN: not llvm-objcopy %t10.o --set-symbols-visibility=no_file=hidden 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefix=NO_FILE -DMSG=%errc_ENOENT | 
 | # NO_FILE: error: 'no_file': [[MSG]] | 
 |  | 
 | --- | 
 | !ELF | 
 | FileHeader: | 
 |   Class:   ELFCLASS64 | 
 |   Data:    ELFDATA2LSB | 
 |   Type:    ET_REL | 
 |   Machine: EM_X86_64 | 
 | Sections: | 
 |   - Name:  .text | 
 |     Type:  SHT_PROGBITS | 
 | Symbols: | 
 |   - Name:    default_local | 
 |     Section: .text | 
 |     Binding:  STB_LOCAL | 
 |   - Name:    protected_local | 
 |     Section: .text | 
 |     Binding:  STB_LOCAL | 
 |     Other:    [ STV_PROTECTED ] | 
 |   - Name:    internal_local | 
 |     Section: .text | 
 |     Binding:  STB_LOCAL | 
 |     Other:    [ STV_INTERNAL ] | 
 |   - Name:    hidden_local | 
 |     Section: .text | 
 |     Binding:  STB_LOCAL | 
 |     Other:    [ STV_HIDDEN ] | 
 |   - Name:    default_weak | 
 |     Section: .text | 
 |     Binding:  STB_WEAK | 
 |   - Name:    internal_weak | 
 |     Section: .text | 
 |     Binding:  STB_WEAK | 
 |     Other:    [ STV_INTERNAL ] | 
 |   - Name:    hidden_weak | 
 |     Section: .text | 
 |     Binding:  STB_WEAK | 
 |     Other:    [ STV_HIDDEN ] | 
 |   - Name:    protected_weak | 
 |     Section: .text | 
 |     Binding:  STB_WEAK | 
 |     Other:    [ STV_PROTECTED ] | 
 |   - Name:    default_global | 
 |     Section: .text | 
 |     Binding:  STB_GLOBAL | 
 |   - Name:    internal_global | 
 |     Section: .text | 
 |     Binding:  STB_GLOBAL | 
 |     Other:    [ STV_INTERNAL ] | 
 |   - Name:    hidden_global | 
 |     Section: .text | 
 |     Binding:  STB_GLOBAL | 
 |     Other:    [ STV_HIDDEN ] | 
 |   - Name:    protected_global | 
 |     Section: .text | 
 |     Binding:  STB_GLOBAL | 
 |     Other:    [ STV_PROTECTED ] | 
 |   - Name:    ignored_name | 
 |     Section: .text | 
 |     Binding:  STB_GLOBAL | 
 |     Other:    [ STV_INTERNAL ] | 
 | ... | 
 |  | 
 | --- | 
 | !ELF | 
 | FileHeader: | 
 |   Class:   ELFCLASS64 | 
 |   Data:    ELFDATA2LSB | 
 |   Type:    ET_REL | 
 |   Machine: EM_X86_64 | 
 | Sections: | 
 |   - Name:  .text | 
 |     Type:  SHT_PROGBITS | 
 | Symbols: | 
 |   - Name:    f*o | 
 |     Section: .text | 
 |     Binding:  STB_LOCAL | 
 |   - Name:    foo | 
 |     Section: .text | 
 |     Binding:  STB_LOCAL | 
 | ... | 
 |  | 
 | --- | 
 | !ELF | 
 | FileHeader: | 
 |   Class:   ELFCLASS64 | 
 |   Data:    ELFDATA2LSB | 
 |   Type:    ET_REL | 
 |   Machine: EM_X86_64 | 
 | Symbols: | 
 |   - Name:     foo | 
 |     Binding:  STB_LOCAL | 
 | ... |