xref: /llvm-project/llvm/lib/TextAPI/Symbol.cpp (revision 4460fa8814d4c86e1d22f830078d7bad69bc0ecc)
10116d04dSCyndy Ishida //===- Symbol.cpp ---------------------------------------------------------===//
20116d04dSCyndy Ishida //
30116d04dSCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40116d04dSCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
50116d04dSCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60116d04dSCyndy Ishida //
70116d04dSCyndy Ishida //===----------------------------------------------------------------------===//
80116d04dSCyndy Ishida //
90116d04dSCyndy Ishida // Implements the Symbol.
100116d04dSCyndy Ishida //
110116d04dSCyndy Ishida //===----------------------------------------------------------------------===//
120116d04dSCyndy Ishida 
130116d04dSCyndy Ishida #include "llvm/TextAPI/Symbol.h"
140116d04dSCyndy Ishida #include <string>
150116d04dSCyndy Ishida 
160116d04dSCyndy Ishida namespace llvm {
170116d04dSCyndy Ishida namespace MachO {
180116d04dSCyndy Ishida 
190116d04dSCyndy Ishida #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump(raw_ostream & OS) const200116d04dSCyndy Ishida LLVM_DUMP_METHOD void Symbol::dump(raw_ostream &OS) const {
210116d04dSCyndy Ishida   std::string Result;
220116d04dSCyndy Ishida   if (isUndefined())
230116d04dSCyndy Ishida     Result += "(undef) ";
240116d04dSCyndy Ishida   if (isWeakDefined())
250116d04dSCyndy Ishida     Result += "(weak-def) ";
260116d04dSCyndy Ishida   if (isWeakReferenced())
270116d04dSCyndy Ishida     Result += "(weak-ref) ";
280116d04dSCyndy Ishida   if (isThreadLocalValue())
290116d04dSCyndy Ishida     Result += "(tlv) ";
300116d04dSCyndy Ishida   switch (Kind) {
31d9a9872eSCyndy Ishida   case EncodeKind::GlobalSymbol:
320116d04dSCyndy Ishida     Result += Name.str();
330116d04dSCyndy Ishida     break;
34d9a9872eSCyndy Ishida   case EncodeKind::ObjectiveCClass:
350116d04dSCyndy Ishida     Result += "(ObjC Class) " + Name.str();
360116d04dSCyndy Ishida     break;
37d9a9872eSCyndy Ishida   case EncodeKind::ObjectiveCClassEHType:
380116d04dSCyndy Ishida     Result += "(ObjC Class EH) " + Name.str();
390116d04dSCyndy Ishida     break;
40d9a9872eSCyndy Ishida   case EncodeKind::ObjectiveCInstanceVariable:
410116d04dSCyndy Ishida     Result += "(ObjC IVar) " + Name.str();
420116d04dSCyndy Ishida     break;
430116d04dSCyndy Ishida   }
440116d04dSCyndy Ishida   OS << Result;
450116d04dSCyndy Ishida }
460116d04dSCyndy Ishida #endif
470116d04dSCyndy Ishida 
480116d04dSCyndy Ishida Symbol::const_filtered_target_range
targets(ArchitectureSet Architectures) const490116d04dSCyndy Ishida Symbol::targets(ArchitectureSet Architectures) const {
500116d04dSCyndy Ishida   std::function<bool(const Target &)> FN =
510116d04dSCyndy Ishida       [Architectures](const Target &Target) {
520116d04dSCyndy Ishida         return Architectures.has(Target.Arch);
530116d04dSCyndy Ishida       };
540116d04dSCyndy Ishida   return make_filter_range(Targets, FN);
550116d04dSCyndy Ishida }
560116d04dSCyndy Ishida 
operator ==(const Symbol & O) const57bc85cf16SCyndy Ishida bool Symbol::operator==(const Symbol &O) const {
58bc85cf16SCyndy Ishida   // Older Tapi files do not express all these symbol flags. In those
59bc85cf16SCyndy Ishida   // cases, ignore those differences.
60bc85cf16SCyndy Ishida   auto RemoveFlag = [](const Symbol &Sym, SymbolFlags &Flag) {
61bc85cf16SCyndy Ishida     if (Sym.isData())
62bc85cf16SCyndy Ishida       Flag &= ~SymbolFlags::Data;
63bc85cf16SCyndy Ishida     if (Sym.isText())
64bc85cf16SCyndy Ishida       Flag &= ~SymbolFlags::Text;
65bc85cf16SCyndy Ishida   };
66bc85cf16SCyndy Ishida   SymbolFlags LHSFlags = Flags;
67bc85cf16SCyndy Ishida   SymbolFlags RHSFlags = O.Flags;
680882c70dSCyndy Ishida   // Ignore Text and Data for now.
69bc85cf16SCyndy Ishida   RemoveFlag(*this, LHSFlags);
70bc85cf16SCyndy Ishida   RemoveFlag(O, RHSFlags);
71bc85cf16SCyndy Ishida   return std::tie(Name, Kind, Targets, LHSFlags) ==
72bc85cf16SCyndy Ishida          std::tie(O.Name, O.Kind, O.Targets, RHSFlags);
73bc85cf16SCyndy Ishida }
74bc85cf16SCyndy Ishida 
parseSymbol(StringRef SymName)75*4460fa88SCyndy Ishida SimpleSymbol parseSymbol(StringRef SymName) {
76586ecdf2SKazu Hirata   if (SymName.starts_with(ObjC1ClassNamePrefix))
77b04b8975SCyndy Ishida     return {SymName.drop_front(ObjC1ClassNamePrefix.size()),
78*4460fa88SCyndy Ishida             EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::Class};
79586ecdf2SKazu Hirata   if (SymName.starts_with(ObjC2ClassNamePrefix))
80b04b8975SCyndy Ishida     return {SymName.drop_front(ObjC2ClassNamePrefix.size()),
81*4460fa88SCyndy Ishida             EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::Class};
82586ecdf2SKazu Hirata   if (SymName.starts_with(ObjC2MetaClassNamePrefix))
83b04b8975SCyndy Ishida     return {SymName.drop_front(ObjC2MetaClassNamePrefix.size()),
84*4460fa88SCyndy Ishida             EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::MetaClass};
85*4460fa88SCyndy Ishida   if (SymName.starts_with(ObjC2EHTypePrefix))
86b04b8975SCyndy Ishida     return {SymName.drop_front(ObjC2EHTypePrefix.size()),
87*4460fa88SCyndy Ishida             EncodeKind::ObjectiveCClassEHType, ObjCIFSymbolKind::EHType};
88586ecdf2SKazu Hirata   if (SymName.starts_with(ObjC2IVarPrefix))
89b04b8975SCyndy Ishida     return {SymName.drop_front(ObjC2IVarPrefix.size()),
90*4460fa88SCyndy Ishida             EncodeKind::ObjectiveCInstanceVariable, ObjCIFSymbolKind::None};
91*4460fa88SCyndy Ishida   return {SymName, EncodeKind::GlobalSymbol, ObjCIFSymbolKind::None};
92b04b8975SCyndy Ishida }
93b04b8975SCyndy Ishida 
940116d04dSCyndy Ishida } // end namespace MachO.
950116d04dSCyndy Ishida } // end namespace llvm.
96