aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
diff options
context:
space:
mode:
authorIlia Kuklin <ikuklin@accesssoftek.com>2024-02-28 17:38:26 +0500
committerGitHub <noreply@github.com>2024-02-28 17:38:26 +0500
commit07d8a457ad8bb9a14974b9cb47072746c7f5e489 (patch)
treebb18a358d036f1d36b643a8293e23ad12c8b6b9c /llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
parent0a54b36d5e6d941e25c60520a7317d75355aeae5 (diff)
downloadllvm-07d8a457ad8bb9a14974b9cb47072746c7f5e489.zip
llvm-07d8a457ad8bb9a14974b9cb47072746c7f5e489.tar.gz
llvm-07d8a457ad8bb9a14974b9cb47072746c7f5e489.tar.bz2
[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.
Diffstat (limited to 'llvm/tools/llvm-objcopy/ObjcopyOptions.cpp')
-rw-r--r--llvm/tools/llvm-objcopy/ObjcopyOptions.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index ec9dc0a..6318578 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);