diff options
author | Paul Semel <semelpaul@gmail.com> | 2018-04-26 17:44:43 +0000 |
---|---|---|
committer | Paul Semel <semelpaul@gmail.com> | 2018-04-26 17:44:43 +0000 |
commit | b492494c0f1437e8fe7d9350a3ce4f7fad7072b7 (patch) | |
tree | 6219f06b8f480428d46ff1f89807c0053e469bb9 /llvm/tools/llvm-objcopy/llvm-objcopy.cpp | |
parent | 3b59a8aba0487819bf445928b7d04b4cf4c946b7 (diff) | |
download | bcm5719-llvm-b492494c0f1437e8fe7d9350a3ce4f7fad7072b7.tar.gz bcm5719-llvm-b492494c0f1437e8fe7d9350a3ce4f7fad7072b7.zip |
[llvm-objcopy] Add --localize-symbol option
llvm-svn: 330963
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index 1fa87622a3f..7158ceed53f 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -118,6 +118,7 @@ struct CopyConfig { std::vector<StringRef> Keep; std::vector<StringRef> OnlyKeep; std::vector<StringRef> AddSection; + std::vector<StringRef> LocalizeSymbol; bool StripAll; bool StripAllGNU; bool StripDebug; @@ -129,6 +130,7 @@ struct CopyConfig { }; using SectionPred = std::function<bool(const SectionBase &Sec)>; +using SymbolPred = std::function<bool(const Symbol &Sym)>; bool IsDWOSection(const SectionBase &Sec) { return Sec.Name.endswith(".dwo"); } @@ -188,14 +190,27 @@ void HandleArgs(const CopyConfig &Config, Object &Obj, const Reader &Reader, SplitDWOToFile(Config, Reader, Config.SplitDWO, OutputElfType); } + SymbolPred LocalizePred = [](const Symbol &) { return false; }; + // Localize: if (Config.LocalizeHidden) { - Obj.SymbolTable->localize([](const Symbol &Sym) { + LocalizePred = [](const Symbol &Sym) { return Sym.Visibility == STV_HIDDEN || Sym.Visibility == STV_INTERNAL; - }); + }; + } + + if (!Config.LocalizeSymbol.empty()) { + LocalizePred = [LocalizePred, &Config](const Symbol &Sym) { + return LocalizePred(Sym) || + std::find(std::begin(Config.LocalizeSymbol), + std::end(Config.LocalizeSymbol), + Sym.Name) != std::end(Config.LocalizeSymbol); + }; } + Obj.SymbolTable->localize(LocalizePred); + SectionPred RemovePred = [](const SectionBase &) { return false; }; // Removes: @@ -398,6 +413,8 @@ CopyConfig ParseObjcopyOptions(ArrayRef<const char *> ArgsArr) { Config.StripNonAlloc = InputArgs.hasArg(OBJCOPY_strip_non_alloc); Config.ExtractDWO = InputArgs.hasArg(OBJCOPY_extract_dwo); Config.LocalizeHidden = InputArgs.hasArg(OBJCOPY_localize_hidden); + for (auto Arg : InputArgs.filtered(OBJCOPY_localize_symbol)) + Config.LocalizeSymbol.push_back(Arg->getValue()); return Config; } |