[llvm] 07d8a45 - [llvm-objcopy] Add --set-symbol-visibility and --set-symbols-visibility options (#80872)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 28 04:38:29 PST 2024
Author: Ilia Kuklin
Date: 2024-02-28T17:38:26+05:00
New Revision: 07d8a457ad8bb9a14974b9cb47072746c7f5e489
URL: https://github.com/llvm/llvm-project/commit/07d8a457ad8bb9a14974b9cb47072746c7f5e489
DIFF: https://github.com/llvm/llvm-project/commit/07d8a457ad8bb9a14974b9cb47072746c7f5e489.diff
LOG: [llvm-objcopy] Add --set-symbol-visibility and --set-symbols-visibility options (#80872)
Add options --set-symbol-visibility and --set-symbols-visibility to
manually change the visibility of symbols.
There is already an option to set the visibility of newly added symbols
via --add-symbol and --new-symbol-visibility. This option will allow to
change the visibility of already existing symbols.
Added:
llvm/test/tools/llvm-objcopy/ELF/set-symbol-visibility.test
Modified:
llvm/docs/CommandGuide/llvm-objcopy.rst
llvm/docs/ReleaseNotes.rst
llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
llvm/tools/llvm-objcopy/ObjcopyOpts.td
Removed:
################################################################################
diff --git a/llvm/docs/CommandGuide/llvm-objcopy.rst b/llvm/docs/CommandGuide/llvm-objcopy.rst
index 755291676abf6a..9d0cb7ad119589 100644
--- a/llvm/docs/CommandGuide/llvm-objcopy.rst
+++ b/llvm/docs/CommandGuide/llvm-objcopy.rst
@@ -455,6 +455,15 @@ them.
Set the start address of the output to ``<addr>``. Overrides any previously
specified :option:`--change-start` or :option:`--adjust-start` options.
+.. option:: --set-symbol-visibility <symbol>=<visibility>
+
+ Change the visibility of a symbol to the specified value.
+
+.. option:: --set-symbols-visibility <filename>=<visibility>
+
+ Read a list of symbols from <filename> and change their visibility to the
+ specified value. Visibility values: default, internal, hidden, protected.
+
.. option:: --split-dwo <dwo-file>
Equivalent to running :program:`llvm-objcopy` with :option:`--extract-dwo` and
diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 8a3a0ec66ed874..51b6527f65bb04 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -147,6 +147,10 @@ Changes to the LLVM tools
if it's not specified with the ``--format`` argument and cannot be inferred from
input files.
+* llvm-objcopy now supports ``--set-symbol-visibility`` and
+ ``--set-symbols-visibility`` options for ELF input to change the
+ visibility of symbols.
+
Changes to LLDB
---------------------------------
diff --git a/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
index d77cb69b159db6..eafed92516c7df 100644
--- a/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
+++ b/llvm/include/llvm/ObjCopy/ELF/ELFConfig.h
@@ -9,6 +9,7 @@
#ifndef LLVM_OBJCOPY_ELF_ELFCONFIG_H
#define LLVM_OBJCOPY_ELF_ELFCONFIG_H
+#include "llvm/ObjCopy/CommonConfig.h"
#include "llvm/Object/ELFTypes.h"
namespace llvm {
@@ -18,6 +19,8 @@ namespace objcopy {
struct ELFConfig {
uint8_t NewSymbolVisibility = (uint8_t)ELF::STV_DEFAULT;
+ std::vector<std::pair<NameMatcher, uint8_t>> SymbolsToSetVisibility;
+
// ELF entry point address expression. The input parameter is an entry point
// address in the input ELF file. The entry address in the output file is
// calculated with EntryExpr(input_address), when either --set-start or
diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
index 1b3a58298ec08a..f52bcb74938d15 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp
@@ -300,6 +300,10 @@ static Error updateAndRemoveSymbols(const CommonConfig &Config,
Config.SymbolsToLocalize.matches(Sym.Name)))
Sym.Binding = STB_LOCAL;
+ for (auto &[Matcher, Visibility] : ELFConfig.SymbolsToSetVisibility)
+ if (Matcher.matches(Sym.Name))
+ Sym.Visibility = Visibility;
+
// Note: these two globalize flags have very similar names but
diff erent
// meanings:
//
diff --git a/llvm/test/tools/llvm-objcopy/ELF/set-symbol-visibility.test b/llvm/test/tools/llvm-objcopy/ELF/set-symbol-visibility.test
new file mode 100644
index 00000000000000..de30ee09bfda53
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/set-symbol-visibility.test
@@ -0,0 +1,311 @@
+# 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
+...
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index ec9dc0a2a814d4..6318578b110048 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -254,6 +254,21 @@ parseSetSectionFlagValue(StringRef FlagValue) {
return SFU;
}
+static Expected<uint8_t> parseVisibilityType(StringRef VisType) {
+ const uint8_t Invalid = 0xff;
+ uint8_t type = StringSwitch<uint8_t>(VisType)
+ .Case("default", ELF::STV_DEFAULT)
+ .Case("hidden", ELF::STV_HIDDEN)
+ .Case("internal", ELF::STV_INTERNAL)
+ .Case("protected", ELF::STV_PROTECTED)
+ .Default(Invalid);
+ if (type == Invalid)
+ return createStringError(errc::invalid_argument,
+ "'%s' is not a valid symbol visibility",
+ VisType.str().c_str());
+ return type;
+}
+
namespace {
struct TargetInfo {
FileFormat Format;
@@ -969,6 +984,33 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr,
Config.SymbolsToAdd.push_back(*SymInfo);
}
+ for (auto *Arg : InputArgs.filtered(OBJCOPY_set_symbol_visibility)) {
+ if (!StringRef(Arg->getValue()).contains('='))
+ return createStringError(errc::invalid_argument,
+ "bad format for --set-symbol-visibility");
+ auto [Sym, Visibility] = StringRef(Arg->getValue()).split('=');
+ Expected<uint8_t> Type = parseVisibilityType(Visibility);
+ if (!Type)
+ return Type.takeError();
+ ELFConfig.SymbolsToSetVisibility.emplace_back(NameMatcher(), *Type);
+ if (Error E = ELFConfig.SymbolsToSetVisibility.back().first.addMatcher(
+ NameOrPattern::create(Sym, SymbolMatchStyle, ErrorCallback)))
+ return std::move(E);
+ }
+ for (auto *Arg : InputArgs.filtered(OBJCOPY_set_symbols_visibility)) {
+ if (!StringRef(Arg->getValue()).contains('='))
+ return createStringError(errc::invalid_argument,
+ "bad format for --set-symbols-visibility");
+ auto [File, Visibility] = StringRef(Arg->getValue()).split('=');
+ Expected<uint8_t> Type = parseVisibilityType(Visibility);
+ if (!Type)
+ return Type.takeError();
+ ELFConfig.SymbolsToSetVisibility.emplace_back(NameMatcher(), *Type);
+ if (Error E =
+ addSymbolsFromFile(ELFConfig.SymbolsToSetVisibility.back().first,
+ DC.Alloc, File, SymbolMatchStyle, ErrorCallback))
+ return std::move(E);
+ }
ELFConfig.AllowBrokenLinks = InputArgs.hasArg(OBJCOPY_allow_broken_links);
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOpts.td b/llvm/tools/llvm-objcopy/ObjcopyOpts.td
index 86774c889ab860..3c0e5cd475a36b 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOpts.td
+++ b/llvm/tools/llvm-objcopy/ObjcopyOpts.td
@@ -88,6 +88,17 @@ defm set_section_type
"Set the type of section <section> to the integer <type>">,
MetaVarName<"section=type">;
+defm set_symbol_visibility
+ : Eq<"set-symbol-visibility",
+ "Change the visibility of a symbol to the specified value">,
+ MetaVarName<"symbol=visibility">;
+defm set_symbols_visibility
+ : Eq<"set-symbols-visibility",
+ "Read a list of symbols from <filename> and change their "
+ "visibility to the specified value. Visibility values: default, "
+ "internal, hidden, protected">,
+ MetaVarName<"filename=visibility">;
+
def S : Flag<["-"], "S">,
Alias<strip_all>,
HelpText<"Alias for --strip-all">;
More information about the llvm-commits
mailing list