xref: /src/contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1e6d15924SDimitry Andric //===- Symbol.cpp ---------------------------------------------------------===//
2e6d15924SDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e6d15924SDimitry Andric //
7e6d15924SDimitry Andric //===----------------------------------------------------------------------===//
8e6d15924SDimitry Andric //
9e6d15924SDimitry Andric // Implements the Symbol.
10e6d15924SDimitry Andric //
11e6d15924SDimitry Andric //===----------------------------------------------------------------------===//
12e6d15924SDimitry Andric 
13344a3780SDimitry Andric #include "llvm/TextAPI/Symbol.h"
14e6d15924SDimitry Andric #include <string>
15e6d15924SDimitry Andric 
16e6d15924SDimitry Andric namespace llvm {
17e6d15924SDimitry Andric namespace MachO {
18e6d15924SDimitry Andric 
19e6d15924SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump(raw_ostream & OS) const20e6d15924SDimitry Andric LLVM_DUMP_METHOD void Symbol::dump(raw_ostream &OS) const {
21e6d15924SDimitry Andric   std::string Result;
22e6d15924SDimitry Andric   if (isUndefined())
23e6d15924SDimitry Andric     Result += "(undef) ";
24e6d15924SDimitry Andric   if (isWeakDefined())
25e6d15924SDimitry Andric     Result += "(weak-def) ";
26e6d15924SDimitry Andric   if (isWeakReferenced())
27e6d15924SDimitry Andric     Result += "(weak-ref) ";
28e6d15924SDimitry Andric   if (isThreadLocalValue())
29e6d15924SDimitry Andric     Result += "(tlv) ";
30e6d15924SDimitry Andric   switch (Kind) {
31ac9a064cSDimitry Andric   case EncodeKind::GlobalSymbol:
32e6d15924SDimitry Andric     Result += Name.str();
33e6d15924SDimitry Andric     break;
34ac9a064cSDimitry Andric   case EncodeKind::ObjectiveCClass:
35e6d15924SDimitry Andric     Result += "(ObjC Class) " + Name.str();
36e6d15924SDimitry Andric     break;
37ac9a064cSDimitry Andric   case EncodeKind::ObjectiveCClassEHType:
38e6d15924SDimitry Andric     Result += "(ObjC Class EH) " + Name.str();
39e6d15924SDimitry Andric     break;
40ac9a064cSDimitry Andric   case EncodeKind::ObjectiveCInstanceVariable:
41e6d15924SDimitry Andric     Result += "(ObjC IVar) " + Name.str();
42e6d15924SDimitry Andric     break;
43e6d15924SDimitry Andric   }
44e6d15924SDimitry Andric   OS << Result;
45e6d15924SDimitry Andric }
46e6d15924SDimitry Andric #endif
47e6d15924SDimitry Andric 
481d5ae102SDimitry Andric Symbol::const_filtered_target_range
targets(ArchitectureSet Architectures) const491d5ae102SDimitry Andric Symbol::targets(ArchitectureSet Architectures) const {
501d5ae102SDimitry Andric   std::function<bool(const Target &)> FN =
511d5ae102SDimitry Andric       [Architectures](const Target &Target) {
521d5ae102SDimitry Andric         return Architectures.has(Target.Arch);
531d5ae102SDimitry Andric       };
541d5ae102SDimitry Andric   return make_filter_range(Targets, FN);
551d5ae102SDimitry Andric }
561d5ae102SDimitry Andric 
operator ==(const Symbol & O) const577fa27ce4SDimitry Andric bool Symbol::operator==(const Symbol &O) const {
587fa27ce4SDimitry Andric   // Older Tapi files do not express all these symbol flags. In those
597fa27ce4SDimitry Andric   // cases, ignore those differences.
607fa27ce4SDimitry Andric   auto RemoveFlag = [](const Symbol &Sym, SymbolFlags &Flag) {
617fa27ce4SDimitry Andric     if (Sym.isData())
627fa27ce4SDimitry Andric       Flag &= ~SymbolFlags::Data;
637fa27ce4SDimitry Andric     if (Sym.isText())
647fa27ce4SDimitry Andric       Flag &= ~SymbolFlags::Text;
657fa27ce4SDimitry Andric   };
667fa27ce4SDimitry Andric   SymbolFlags LHSFlags = Flags;
677fa27ce4SDimitry Andric   SymbolFlags RHSFlags = O.Flags;
687fa27ce4SDimitry Andric   // Ignore Text and Data for now.
697fa27ce4SDimitry Andric   RemoveFlag(*this, LHSFlags);
707fa27ce4SDimitry Andric   RemoveFlag(O, RHSFlags);
717fa27ce4SDimitry Andric   return std::tie(Name, Kind, Targets, LHSFlags) ==
727fa27ce4SDimitry Andric          std::tie(O.Name, O.Kind, O.Targets, RHSFlags);
737fa27ce4SDimitry Andric }
747fa27ce4SDimitry Andric 
parseSymbol(StringRef SymName)75ac9a064cSDimitry Andric SimpleSymbol parseSymbol(StringRef SymName) {
76312c0ed1SDimitry Andric   if (SymName.starts_with(ObjC1ClassNamePrefix))
77b1c73532SDimitry Andric     return {SymName.drop_front(ObjC1ClassNamePrefix.size()),
78ac9a064cSDimitry Andric             EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::Class};
79312c0ed1SDimitry Andric   if (SymName.starts_with(ObjC2ClassNamePrefix))
80b1c73532SDimitry Andric     return {SymName.drop_front(ObjC2ClassNamePrefix.size()),
81ac9a064cSDimitry Andric             EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::Class};
82312c0ed1SDimitry Andric   if (SymName.starts_with(ObjC2MetaClassNamePrefix))
83b1c73532SDimitry Andric     return {SymName.drop_front(ObjC2MetaClassNamePrefix.size()),
84ac9a064cSDimitry Andric             EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::MetaClass};
85ac9a064cSDimitry Andric   if (SymName.starts_with(ObjC2EHTypePrefix))
86b1c73532SDimitry Andric     return {SymName.drop_front(ObjC2EHTypePrefix.size()),
87ac9a064cSDimitry Andric             EncodeKind::ObjectiveCClassEHType, ObjCIFSymbolKind::EHType};
88312c0ed1SDimitry Andric   if (SymName.starts_with(ObjC2IVarPrefix))
89b1c73532SDimitry Andric     return {SymName.drop_front(ObjC2IVarPrefix.size()),
90ac9a064cSDimitry Andric             EncodeKind::ObjectiveCInstanceVariable, ObjCIFSymbolKind::None};
91ac9a064cSDimitry Andric   return {SymName, EncodeKind::GlobalSymbol, ObjCIFSymbolKind::None};
92b1c73532SDimitry Andric }
93b1c73532SDimitry Andric 
94e6d15924SDimitry Andric } // end namespace MachO.
95e6d15924SDimitry Andric } // end namespace llvm.
96