clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
204 lines
7.3 KiB
C++
204 lines
7.3 KiB
C++
//===- llvm/TextAPI/RecordSlice.h - TAPI RecordSlice ------------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// \brief Implements the TAPI Record Collection Type.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TEXTAPI_RECORDSLICE_H
|
|
#define LLVM_TEXTAPI_RECORDSLICE_H
|
|
|
|
#include "llvm/Support/Allocator.h"
|
|
#include "llvm/TextAPI/FileTypes.h"
|
|
#include "llvm/TextAPI/PackedVersion.h"
|
|
#include "llvm/TextAPI/Record.h"
|
|
#include "llvm/TextAPI/RecordVisitor.h"
|
|
|
|
namespace llvm {
|
|
namespace MachO {
|
|
|
|
// Define collection of records for a library that are tied to a darwin target
|
|
// triple.
|
|
class RecordsSlice {
|
|
public:
|
|
RecordsSlice(const llvm::Triple &T) : TargetTriple(T), TAPITarget(T) {}
|
|
/// Get target triple.
|
|
const llvm::Triple &getTriple() const { return TargetTriple; }
|
|
/// Get TAPI converted target.
|
|
const Target &getTarget() const { return TAPITarget; }
|
|
|
|
/// Add unspecified record to slice.
|
|
///
|
|
/// Assign specific record type based on properties and symbol name.
|
|
///
|
|
/// \param Name The name of symbol.
|
|
/// \param Flags The flags that describe attributes of the symbol.
|
|
/// \param GV The kind of global, if this represents a non obj-c global
|
|
/// symbol.
|
|
/// \param Linkage The linkage of symbol.
|
|
/// \return The non-owning pointer to added record in slice.
|
|
Record *addRecord(StringRef Name, SymbolFlags Flags,
|
|
GlobalRecord::Kind GV = GlobalRecord::Kind::Unknown,
|
|
RecordLinkage Linkage = RecordLinkage::Unknown);
|
|
|
|
/// Add non-ObjC global record.
|
|
///
|
|
/// \param Name The name of symbol.
|
|
/// \param Linkage The linkage of symbol.
|
|
/// \param GV The kind of global.
|
|
/// \param Flags The flags that describe attributes of the symbol.
|
|
/// \param Inlined Whether declaration is inlined, only applicable to
|
|
/// functions.
|
|
/// \return The non-owning pointer to added record in slice.
|
|
GlobalRecord *addGlobal(StringRef Name, RecordLinkage Linkage,
|
|
GlobalRecord::Kind GV,
|
|
SymbolFlags Flags = SymbolFlags::None,
|
|
bool Inlined = false);
|
|
|
|
/// Add ObjC Class record.
|
|
///
|
|
/// \param Name The name of class, not symbol.
|
|
/// \param Linkage The linkage of symbol.
|
|
/// \param SymType The symbols this class represents.
|
|
/// \return The non-owning pointer to added record in slice.
|
|
ObjCInterfaceRecord *addObjCInterface(StringRef Name, RecordLinkage Linkage,
|
|
ObjCIFSymbolKind SymType);
|
|
|
|
/// Add ObjC IVar record.
|
|
///
|
|
/// \param Container Owning pointer for instance variable.
|
|
/// \param Name The name of ivar, not symbol.
|
|
/// \param Linkage The linkage of symbol.
|
|
/// \return The non-owning pointer to added record in slice.
|
|
ObjCIVarRecord *addObjCIVar(ObjCContainerRecord *Container, StringRef Name,
|
|
RecordLinkage Linkage);
|
|
|
|
/// Add ObjC Category record.
|
|
///
|
|
/// \param ClassToExtend The name of class that is being extended by the
|
|
/// category, not symbol.
|
|
/// \param Category The name of category.
|
|
/// \return The non-owning pointer to added record in slice.
|
|
ObjCCategoryRecord *addObjCCategory(StringRef ClassToExtend,
|
|
StringRef Category);
|
|
|
|
/// Find ObjC Class.
|
|
///
|
|
/// \param Name name of class, not full symbol name.
|
|
/// \return The non-owning pointer to record in slice.
|
|
ObjCInterfaceRecord *findObjCInterface(StringRef Name) const;
|
|
|
|
/// Find ObjC Category.
|
|
///
|
|
/// \param ClassToExtend The name of class, not full symbol name.
|
|
/// \param Category The name of category.
|
|
/// \return The non-owning pointer to record in slice.
|
|
ObjCCategoryRecord *findObjCCategory(StringRef ClassToExtend,
|
|
StringRef Category) const;
|
|
|
|
/// Find ObjC Container. This is commonly used for assigning for looking up
|
|
/// instance variables that are assigned to either a category or class.
|
|
///
|
|
/// \param IsIVar If true, the name is the name of the IVar, otherwise it will
|
|
/// be looked up as the name of the container.
|
|
/// \param Name Either the name of ivar or name of container.
|
|
/// \return The non-owning pointer to record in
|
|
/// slice.
|
|
ObjCContainerRecord *findContainer(bool IsIVar, StringRef Name) const;
|
|
|
|
/// Find ObjC instance variable.
|
|
///
|
|
/// \param IsScopedName This is used to determine how to parse the name.
|
|
/// \param Name Either the full name of the symbol or just the ivar.
|
|
/// \return The non-owning pointer to record in slice.
|
|
ObjCIVarRecord *findObjCIVar(bool IsScopedName, StringRef Name) const;
|
|
|
|
/// Find non-objc global.
|
|
///
|
|
/// \param Name The name of symbol.
|
|
/// \param GV The Kind of global to find.
|
|
/// \return The non-owning pointer to record in slice.
|
|
GlobalRecord *
|
|
findGlobal(StringRef Name,
|
|
GlobalRecord::Kind GV = GlobalRecord::Kind::Unknown) const;
|
|
|
|
// Determine if library attributes were assigned.
|
|
bool hasBinaryAttrs() const { return BA.get(); }
|
|
|
|
// Determine if record slice is unassigned.
|
|
bool empty() const {
|
|
return !hasBinaryAttrs() && Globals.empty() && Classes.empty() &&
|
|
Categories.empty();
|
|
}
|
|
|
|
// Visit all records known to RecordsSlice.
|
|
void visit(RecordVisitor &V) const;
|
|
|
|
struct BinaryAttrs {
|
|
std::vector<StringRef> AllowableClients;
|
|
std::vector<StringRef> RexportedLibraries;
|
|
std::vector<StringRef> RPaths;
|
|
StringRef ParentUmbrella;
|
|
StringRef InstallName;
|
|
StringRef UUID;
|
|
StringRef Path;
|
|
FileType File = FileType::Invalid;
|
|
llvm::MachO::PackedVersion CurrentVersion;
|
|
llvm::MachO::PackedVersion CompatVersion;
|
|
uint8_t SwiftABI = 0;
|
|
bool TwoLevelNamespace = false;
|
|
bool AppExtensionSafe = false;
|
|
bool OSLibNotForSharedCache = false;
|
|
};
|
|
|
|
/// Return reference to BinaryAttrs.
|
|
BinaryAttrs &getBinaryAttrs();
|
|
|
|
/// Store any strings owned by RecordSlice into allocator and return back
|
|
/// reference to that.
|
|
StringRef copyString(StringRef String);
|
|
|
|
private:
|
|
const llvm::Triple TargetTriple;
|
|
// Hold tapi converted triple to avoid unecessary casts.
|
|
const Target TAPITarget;
|
|
|
|
/// BumpPtrAllocator to store generated/copied strings.
|
|
llvm::BumpPtrAllocator StringAllocator;
|
|
|
|
/// Promote linkage of requested record. It is no-op if linkage type is lower
|
|
/// than the current assignment.
|
|
///
|
|
/// \param R The record to update.
|
|
/// \param L Linkage type to update to.
|
|
void updateLinkage(Record *R, RecordLinkage L) {
|
|
R->Linkage = std::max(R->Linkage, L);
|
|
}
|
|
|
|
/// Update set flags of requested record.
|
|
///
|
|
/// \param R The record to update.
|
|
/// \param F Flags to update to.
|
|
void updateFlags(Record *R, SymbolFlags F) { R->Flags |= F; }
|
|
|
|
RecordMap<GlobalRecord> Globals;
|
|
RecordMap<ObjCInterfaceRecord> Classes;
|
|
RecordMap<ObjCCategoryRecord, std::pair<StringRef, StringRef>> Categories;
|
|
|
|
std::unique_ptr<BinaryAttrs> BA{nullptr};
|
|
};
|
|
|
|
using Records = llvm::SmallVector<std::shared_ptr<RecordsSlice>, 4>;
|
|
class InterfaceFile;
|
|
std::unique_ptr<InterfaceFile> convertToInterfaceFile(const Records &Slices);
|
|
|
|
} // namespace MachO
|
|
} // namespace llvm
|
|
#endif // LLVM_TEXTAPI_RECORDSLICE_H
|