diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/TextAPI/Symbol.cpp | 26 |
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. |
