llvm-project/llvm/lib/TextAPI/SymbolSet.cpp
Cyndy Ishida 4460fa8814
[TextAPI] Introduce granularity for handling ObjC Interface symbols (#79928)
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
2024-01-29 18:36:48 -08:00

49 lines
1.9 KiB
C++

//===- lib/TextAPI/SymbolSet.cpp - TAPI Symbol Set ------------*- C++-*----===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "llvm/TextAPI/SymbolSet.h"
using namespace llvm;
using namespace llvm::MachO;
Symbol *SymbolSet::addGlobalImpl(EncodeKind Kind, StringRef Name,
SymbolFlags Flags) {
Name = copyString(Name);
auto Result = Symbols.try_emplace(SymbolsMapKey{Kind, Name}, nullptr);
if (Result.second)
Result.first->second =
new (Allocator) Symbol{Kind, Name, TargetList(), Flags};
return Result.first->second;
}
Symbol *SymbolSet::addGlobal(EncodeKind Kind, StringRef Name, SymbolFlags Flags,
const Target &Targ) {
auto *Sym = addGlobalImpl(Kind, Name, Flags);
Sym->addTarget(Targ);
return Sym;
}
const Symbol *SymbolSet::findSymbol(EncodeKind Kind, StringRef Name,
ObjCIFSymbolKind ObjCIF) const {
if (auto result = Symbols.lookup({Kind, Name}))
return result;
if ((ObjCIF == ObjCIFSymbolKind::None) || (ObjCIF > ObjCIFSymbolKind::EHType))
return nullptr;
assert(ObjCIF <= ObjCIFSymbolKind::EHType &&
"expected single ObjCIFSymbolKind enum value");
// Non-complete ObjC Interfaces are represented as global symbols.
if (ObjCIF == ObjCIFSymbolKind::Class)
return Symbols.lookup(
{EncodeKind::GlobalSymbol, (ObjC2ClassNamePrefix + Name).str()});
if (ObjCIF == ObjCIFSymbolKind::MetaClass)
return Symbols.lookup(
{EncodeKind::GlobalSymbol, (ObjC2MetaClassNamePrefix + Name).str()});
return Symbols.lookup(
{EncodeKind::GlobalSymbol, (ObjC2EHTypePrefix + Name).str()});
}