aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-12-18 20:30:12 +0000
committerDimitry Andric <dim@FreeBSD.org>2024-04-19 21:12:03 +0000
commitc9157d925c489f07ba9c0b2ce47e5149b75969a5 (patch)
tree08bc4a3d9cad3f9ebffa558ddf140b9d9257b219 /contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp
parent2a66844f606a35d68ad8a8061f4bea204274b3bc (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp b/contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp
index 20fa6362716a..fd395436051d 100644
--- a/contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp
+++ b/contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp
@@ -72,5 +72,31 @@ bool Symbol::operator==(const Symbol &O) const {
std::tie(O.Name, O.Kind, O.Targets, RHSFlags);
}
+SimpleSymbol parseSymbol(StringRef SymName, const SymbolFlags Flags) {
+ if (SymName.starts_with(ObjC1ClassNamePrefix))
+ return {SymName.drop_front(ObjC1ClassNamePrefix.size()),
+ SymbolKind::ObjectiveCClass};
+ if (SymName.starts_with(ObjC2ClassNamePrefix))
+ return {SymName.drop_front(ObjC2ClassNamePrefix.size()),
+ SymbolKind::ObjectiveCClass};
+ if (SymName.starts_with(ObjC2MetaClassNamePrefix))
+ return {SymName.drop_front(ObjC2MetaClassNamePrefix.size()),
+ SymbolKind::ObjectiveCClass};
+ if (SymName.starts_with(ObjC2EHTypePrefix)) {
+ // When classes without ehtype are used in try/catch blocks
+ // a weak-defined symbol is exported. In those cases, treat these as a
+ // global instead.
+ if ((Flags & SymbolFlags::WeakDefined) == SymbolFlags::WeakDefined)
+ return {SymName, SymbolKind::GlobalSymbol};
+ return {SymName.drop_front(ObjC2EHTypePrefix.size()),
+ SymbolKind::ObjectiveCClassEHType};
+ }
+
+ if (SymName.starts_with(ObjC2IVarPrefix))
+ return {SymName.drop_front(ObjC2IVarPrefix.size()),
+ SymbolKind::ObjectiveCInstanceVariable};
+ return {SymName, SymbolKind::GlobalSymbol};
+}
+
} // end namespace MachO.
} // end namespace llvm.