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