diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-12-09 13:28:42 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2023-12-09 13:28:42 +0000 |
| commit | b1c73532ee8997fe5dfbeb7d223027bdf99758a0 (patch) | |
| tree | 7d6e51c294ab6719475d660217aa0c0ad0526292 /llvm/lib/TextAPI/Symbol.cpp | |
| parent | 7fa27ce4a07f19b07799a767fc29416f3b625afb (diff) | |
Diffstat (limited to 'llvm/lib/TextAPI/Symbol.cpp')
| -rw-r--r-- | llvm/lib/TextAPI/Symbol.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/TextAPI/Symbol.cpp b/llvm/lib/TextAPI/Symbol.cpp index 20fa6362716a..c3756fcb8435 100644 --- a/llvm/lib/TextAPI/Symbol.cpp +++ b/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.startswith(ObjC1ClassNamePrefix)) + return {SymName.drop_front(ObjC1ClassNamePrefix.size()), + SymbolKind::ObjectiveCClass}; + if (SymName.startswith(ObjC2ClassNamePrefix)) + return {SymName.drop_front(ObjC2ClassNamePrefix.size()), + SymbolKind::ObjectiveCClass}; + if (SymName.startswith(ObjC2MetaClassNamePrefix)) + return {SymName.drop_front(ObjC2MetaClassNamePrefix.size()), + SymbolKind::ObjectiveCClass}; + if (SymName.startswith(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.startswith(ObjC2IVarPrefix)) + return {SymName.drop_front(ObjC2IVarPrefix.size()), + SymbolKind::ObjectiveCInstanceVariable}; + return {SymName, SymbolKind::GlobalSymbol}; +} + } // end namespace MachO. } // end namespace llvm. |
