diff options
author | Ilia Kuklin <ikuklin@accesssoftek.com> | 2024-02-28 17:38:26 +0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-28 17:38:26 +0500 |
commit | 07d8a457ad8bb9a14974b9cb47072746c7f5e489 (patch) | |
tree | bb18a358d036f1d36b643a8293e23ad12c8b6b9c /llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | |
parent | 0a54b36d5e6d941e25c60520a7317d75355aeae5 (diff) | |
download | llvm-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.cpp | 42 |
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); |