mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-30 18:06:08 +00:00

ObjCInterfaceRecords roughly align to the objc-classes key in tbd-files. They condensely represent up to 3 symbols. The problem here is that when represented this way, we lose granularity when these symbols could have different linkages or outright don't exist. This can happen frequently in interoptable code generated by the swift compiler. This adds fields and utility functions to express unique properties for these symbols. If the record does represent the same properties across all of its symbols, it will be treated the same in the TBD. Otherwise it will be printed in global's section. Reviewed seperately before by Juergen Ributzka
96 lines
3.2 KiB
C++
96 lines
3.2 KiB
C++
//===- Symbol.cpp ---------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Implements the Symbol.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/TextAPI/Symbol.h"
|
|
#include <string>
|
|
|
|
namespace llvm {
|
|
namespace MachO {
|
|
|
|
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
|
LLVM_DUMP_METHOD void Symbol::dump(raw_ostream &OS) const {
|
|
std::string Result;
|
|
if (isUndefined())
|
|
Result += "(undef) ";
|
|
if (isWeakDefined())
|
|
Result += "(weak-def) ";
|
|
if (isWeakReferenced())
|
|
Result += "(weak-ref) ";
|
|
if (isThreadLocalValue())
|
|
Result += "(tlv) ";
|
|
switch (Kind) {
|
|
case EncodeKind::GlobalSymbol:
|
|
Result += Name.str();
|
|
break;
|
|
case EncodeKind::ObjectiveCClass:
|
|
Result += "(ObjC Class) " + Name.str();
|
|
break;
|
|
case EncodeKind::ObjectiveCClassEHType:
|
|
Result += "(ObjC Class EH) " + Name.str();
|
|
break;
|
|
case EncodeKind::ObjectiveCInstanceVariable:
|
|
Result += "(ObjC IVar) " + Name.str();
|
|
break;
|
|
}
|
|
OS << Result;
|
|
}
|
|
#endif
|
|
|
|
Symbol::const_filtered_target_range
|
|
Symbol::targets(ArchitectureSet Architectures) const {
|
|
std::function<bool(const Target &)> FN =
|
|
[Architectures](const Target &Target) {
|
|
return Architectures.has(Target.Arch);
|
|
};
|
|
return make_filter_range(Targets, FN);
|
|
}
|
|
|
|
bool Symbol::operator==(const Symbol &O) const {
|
|
// Older Tapi files do not express all these symbol flags. In those
|
|
// cases, ignore those differences.
|
|
auto RemoveFlag = [](const Symbol &Sym, SymbolFlags &Flag) {
|
|
if (Sym.isData())
|
|
Flag &= ~SymbolFlags::Data;
|
|
if (Sym.isText())
|
|
Flag &= ~SymbolFlags::Text;
|
|
};
|
|
SymbolFlags LHSFlags = Flags;
|
|
SymbolFlags RHSFlags = O.Flags;
|
|
// Ignore Text and Data for now.
|
|
RemoveFlag(*this, LHSFlags);
|
|
RemoveFlag(O, RHSFlags);
|
|
return std::tie(Name, Kind, Targets, LHSFlags) ==
|
|
std::tie(O.Name, O.Kind, O.Targets, RHSFlags);
|
|
}
|
|
|
|
SimpleSymbol parseSymbol(StringRef SymName) {
|
|
if (SymName.starts_with(ObjC1ClassNamePrefix))
|
|
return {SymName.drop_front(ObjC1ClassNamePrefix.size()),
|
|
EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::Class};
|
|
if (SymName.starts_with(ObjC2ClassNamePrefix))
|
|
return {SymName.drop_front(ObjC2ClassNamePrefix.size()),
|
|
EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::Class};
|
|
if (SymName.starts_with(ObjC2MetaClassNamePrefix))
|
|
return {SymName.drop_front(ObjC2MetaClassNamePrefix.size()),
|
|
EncodeKind::ObjectiveCClass, ObjCIFSymbolKind::MetaClass};
|
|
if (SymName.starts_with(ObjC2EHTypePrefix))
|
|
return {SymName.drop_front(ObjC2EHTypePrefix.size()),
|
|
EncodeKind::ObjectiveCClassEHType, ObjCIFSymbolKind::EHType};
|
|
if (SymName.starts_with(ObjC2IVarPrefix))
|
|
return {SymName.drop_front(ObjC2IVarPrefix.size()),
|
|
EncodeKind::ObjectiveCInstanceVariable, ObjCIFSymbolKind::None};
|
|
return {SymName, EncodeKind::GlobalSymbol, ObjCIFSymbolKind::None};
|
|
}
|
|
|
|
} // end namespace MachO.
|
|
} // end namespace llvm.
|