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