diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 17:16:04 +0900 |
---|---|---|
committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 17:16:04 +0900 |
commit | 0aa930a41f2d1ebf1fa90ec42da8f96d15a4dcbb (patch) | |
tree | 6a77b463f700e090df586672c26b9fe765fd115b /llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp | |
parent | ec6892d1c979ce0b84c86918d5cdbb03037b409a (diff) | |
parent | 6d16b1c5c468a79ecf867293023c89ac518ecdda (diff) | |
download | llvm-users/chapuni/cov/single/nextcount-base.zip llvm-users/chapuni/cov/single/nextcount-base.tar.gz llvm-users/chapuni/cov/single/nextcount-base.tar.bz2 |
Merge branch 'users/chapuni/cov/single/pair' into users/chapuni/cov/single/nextcount-baseusers/chapuni/cov/single/nextcount-base
Diffstat (limited to 'llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp')
-rw-r--r-- | llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp b/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp index 91500c2..a188425 100644 --- a/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp +++ b/llvm/lib/ObjCopy/MachO/MachOObjcopy.cpp @@ -93,19 +93,38 @@ static void markSymbols(const CommonConfig &, Object &Obj) { static void updateAndRemoveSymbols(const CommonConfig &Config, const MachOConfig &MachOConfig, Object &Obj) { - for (SymbolEntry &Sym : Obj.SymTable) { - // Weaken symbols first to match ELFObjcopy behavior. - bool IsExportedAndDefined = - (Sym.n_type & llvm::MachO::N_EXT) && - (Sym.n_type & llvm::MachO::N_TYPE) != llvm::MachO::N_UNDF; - if (IsExportedAndDefined && + Obj.SymTable.updateSymbols([&](SymbolEntry &Sym) { + if (Config.SymbolsToSkip.matches(Sym.Name)) + return; + + if (!Sym.isUndefinedSymbol() && Config.SymbolsToLocalize.matches(Sym.Name)) + Sym.n_type &= ~MachO::N_EXT; + + // Note: these two globalize flags have very similar names but different + // meanings: + // + // --globalize-symbol: promote a symbol to global + // --keep-global-symbol: all symbols except for these should be made local + // + // If --globalize-symbol is specified for a given symbol, it will be + // global in the output file even if it is not included via + // --keep-global-symbol. Because of that, make sure to check + // --globalize-symbol second. + if (!Sym.isUndefinedSymbol() && !Config.SymbolsToKeepGlobal.empty() && + !Config.SymbolsToKeepGlobal.matches(Sym.Name)) + Sym.n_type &= ~MachO::N_EXT; + + if (!Sym.isUndefinedSymbol() && Config.SymbolsToGlobalize.matches(Sym.Name)) + Sym.n_type |= MachO::N_EXT; + + if (Sym.isExternalSymbol() && !Sym.isUndefinedSymbol() && (Config.Weaken || Config.SymbolsToWeaken.matches(Sym.Name))) - Sym.n_desc |= llvm::MachO::N_WEAK_DEF; + Sym.n_desc |= MachO::N_WEAK_DEF; auto I = Config.SymbolsToRename.find(Sym.Name); if (I != Config.SymbolsToRename.end()) Sym.Name = std::string(I->getValue()); - } + }); auto RemovePred = [&Config, &MachOConfig, &Obj](const std::unique_ptr<SymbolEntry> &N) { |