Files
swift-mirror/include/swift/IRGen/IRSymbolVisitor.h
Allan Shortlidge 38779f32c1 SILGen/IRGen: Delegate decision to skip @_silgen_name functions to TBDGenVisitor.
This allows SILGen for `#_hasSymbol` conditions to visit them and emit a declaration of the function appropriately.
2022-11-02 21:38:33 -07:00

81 lines
3.1 KiB
C++

//===--- IRSymbolVisitor.h - Symbol Visitor for IR --------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2022 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_IRGEN_IRSYMBOLVISITOR_H
#define SWIFT_IRGEN_IRSYMBOLVISITOR_H
#include "swift/IRGen/Linking.h"
namespace swift {
class SILSymbolVisitorContext;
namespace irgen {
/// Context for symbol enumeration using `IRSymbolVisitor`.
class IRSymbolVisitorContext {
const UniversalLinkageInfo &LinkInfo;
const SILSymbolVisitorContext &SILCtx;
public:
IRSymbolVisitorContext(const UniversalLinkageInfo &LinkInfo,
const SILSymbolVisitorContext &SILCtx)
: LinkInfo{LinkInfo}, SILCtx{SILCtx} {}
const UniversalLinkageInfo &getLinkInfo() const { return LinkInfo; }
const SILSymbolVisitorContext &getSILCtx() const { return SILCtx; }
};
/// A visitor class which may be used to enumerate the entities representing
/// linker symbols associated with a Swift declaration, file, or module. This
/// class is a refinement of `SILSymbolVisitor` for the IRGen layer. Most of the
/// enumerated linker symbols can be represented as either a `SILDeclRef` or a
/// `LinkEntity`, but a few aren't supported by those abstractions and are
/// handled ad-hoc. Additionally, there are some Obj-C entities (like methods)
/// that don't actually have associated linker symbols but are enumerated for
/// the convenience of clients using this utility for API surface discovery.
class IRSymbolVisitor {
public:
virtual ~IRSymbolVisitor() {}
/// Enumerate the symbols associated with the given decl.
void visit(Decl *D, const IRSymbolVisitorContext &ctx);
/// Enumerate the symbols associated with the given file.
void visitFile(FileUnit *file, const IRSymbolVisitorContext &ctx);
/// Enumerate the symbols associated with the given modules.
void visitModules(llvm::SmallVector<ModuleDecl *, 4> &modules,
const IRSymbolVisitorContext &ctx);
/// Override to prepare for enumeration of the symbols for a specific decl.
/// Return \c true to proceed with visiting the decl or \c false to skip it.
virtual bool willVisitDecl(Decl *D) { return true; }
/// Override to clean up after enumeration of the symbols for a specific decl.
virtual void didVisitDecl(Decl *D) {}
virtual void addFunction(SILDeclRef declRef) {}
virtual void addFunction(StringRef name, SILDeclRef declRef) {}
virtual void addGlobalVar(VarDecl *VD) {}
virtual void addLinkEntity(LinkEntity entity) {}
virtual void addObjCInterface(ClassDecl *CD) {}
virtual void addObjCMethod(AbstractFunctionDecl *AFD) {}
virtual void addProtocolWitnessThunk(RootProtocolConformance *C,
ValueDecl *requirementDecl) {}
};
} // end namespace irgen
} // end namespace swift
#endif