Files
swift-mirror/include/swift/SIL/SILBridgingImpl.h
Erik Eckstein 65d69fe965 SIL/AST: add some APIs
* `GenericSignature.isEmpty`
* `Builder.emitDestroy`
* `Function.abi`
* `KeyPathInst.substitutionMap`
* `KeyPathInst.hasPattern`
2025-09-04 08:15:44 +02:00

3080 lines
119 KiB
C++

//===--- SILBridgingImpl.h ------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2025 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
//
//===----------------------------------------------------------------------===//
//
// This file contains the implementation of bridging functions, which are either
// - depending on if PURE_BRIDGING_MODE is set - included in the cpp file or
// in the header file.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SIL_SILBRIDGING_IMPL_H
#define SWIFT_SIL_SILBRIDGING_IMPL_H
#include "SILBridging.h"
#include "swift/AST/Builtins.h"
#include "swift/AST/Decl.h"
#include "swift/AST/SourceFile.h"
#include "swift/AST/StorageImpl.h"
#include "swift/AST/SubstitutionMap.h"
#include "swift/AST/Types.h"
#include "swift/Basic/BasicBridging.h"
#include "swift/SIL/ApplySite.h"
#include "swift/SIL/CalleeCache.h"
#include "swift/SIL/DynamicCasts.h"
#include "swift/SIL/InstWrappers.h"
#include "swift/SIL/SILContext.h"
#include "swift/SIL/SILBuilder.h"
#include "swift/SIL/SILDefaultWitnessTable.h"
#include "swift/SIL/SILFunctionConventions.h"
#include "swift/SIL/SILInstruction.h"
#include "swift/SIL/SILLocation.h"
#include "swift/SIL/SILModule.h"
#include "swift/SIL/SILVTable.h"
#include "swift/SIL/SILWitnessTable.h"
#include "swift/SILOptimizer/Utils/ConstExpr.h"
#include "swift/SIL/SILConstants.h"
#include <stdbool.h>
#include <stddef.h>
#include <string>
SWIFT_BEGIN_NULLABILITY_ANNOTATIONS
//===----------------------------------------------------------------------===//
// BridgedResultInfo
//===----------------------------------------------------------------------===//
BridgedResultConvention BridgedResultInfo::castToResultConvention(swift::ResultConvention convention) {
return static_cast<BridgedResultConvention>(convention);
}
BridgedResultInfo::BridgedResultInfo(swift::SILResultInfo resultInfo):
type(resultInfo.getInterfaceType().getPointer()),
convention(castToResultConvention(resultInfo.getConvention()))
{}
SwiftInt BridgedResultInfoArray::count() const {
return resultInfoArray.unbridged<swift::SILResultInfo>().size();
}
BridgedResultInfo BridgedResultInfoArray::at(SwiftInt resultIndex) const {
return BridgedResultInfo(resultInfoArray.unbridged<swift::SILResultInfo>()[resultIndex]);
}
//===----------------------------------------------------------------------===//
// BridgedYieldInfo
//===----------------------------------------------------------------------===//
SwiftInt BridgedYieldInfoArray::count() const {
return yieldInfoArray.unbridged<swift::SILYieldInfo>().size();
}
BridgedParameterInfo BridgedYieldInfoArray::at(SwiftInt resultIndex) const {
return BridgedParameterInfo(yieldInfoArray.unbridged<swift::SILYieldInfo>()[resultIndex]);
}
//===----------------------------------------------------------------------===//
// BridgedParameterInfo
//===----------------------------------------------------------------------===//
inline swift::ParameterConvention getParameterConvention(BridgedArgumentConvention convention) {
switch (convention) {
case BridgedArgumentConvention::Indirect_In: return swift::ParameterConvention::Indirect_In;
case BridgedArgumentConvention::Indirect_In_Guaranteed: return swift::ParameterConvention::Indirect_In_Guaranteed;
case BridgedArgumentConvention::Indirect_Inout: return swift::ParameterConvention::Indirect_Inout;
case BridgedArgumentConvention::Indirect_InoutAliasable: return swift::ParameterConvention::Indirect_InoutAliasable;
case BridgedArgumentConvention::Indirect_In_CXX: return swift::ParameterConvention::Indirect_In_CXX;
case BridgedArgumentConvention::Indirect_Out: break;
case BridgedArgumentConvention::Direct_Owned: return swift::ParameterConvention::Direct_Owned;
case BridgedArgumentConvention::Direct_Unowned: return swift::ParameterConvention::Direct_Unowned;
case BridgedArgumentConvention::Direct_Guaranteed: return swift::ParameterConvention::Direct_Guaranteed;
case BridgedArgumentConvention::Pack_Owned: return swift::ParameterConvention::Pack_Owned;
case BridgedArgumentConvention::Pack_Inout: return swift::ParameterConvention::Pack_Inout;
case BridgedArgumentConvention::Pack_Guaranteed: return swift::ParameterConvention::Pack_Guaranteed;
case BridgedArgumentConvention::Pack_Out: break;
}
llvm_unreachable("invalid parameter convention");
}
inline BridgedArgumentConvention getArgumentConvention(swift::ParameterConvention convention) {
switch (convention) {
case swift::ParameterConvention::Indirect_In: return BridgedArgumentConvention::Indirect_In;
case swift::ParameterConvention::Indirect_In_Guaranteed: return BridgedArgumentConvention::Indirect_In_Guaranteed;
case swift::ParameterConvention::Indirect_Inout: return BridgedArgumentConvention::Indirect_Inout;
case swift::ParameterConvention::Indirect_InoutAliasable: return BridgedArgumentConvention::Indirect_InoutAliasable;
case swift::ParameterConvention::Indirect_In_CXX: return BridgedArgumentConvention::Indirect_In_CXX;
case swift::ParameterConvention::Direct_Owned: return BridgedArgumentConvention::Direct_Owned;
case swift::ParameterConvention::Direct_Unowned: return BridgedArgumentConvention::Direct_Unowned;
case swift::ParameterConvention::Direct_Guaranteed: return BridgedArgumentConvention::Direct_Guaranteed;
case swift::ParameterConvention::Pack_Owned: return BridgedArgumentConvention::Pack_Owned;
case swift::ParameterConvention::Pack_Inout: return BridgedArgumentConvention::Pack_Inout;
case swift::ParameterConvention::Pack_Guaranteed: return BridgedArgumentConvention::Pack_Guaranteed;
}
llvm_unreachable("invalid parameter convention");
}
inline BridgedArgumentConvention castToArgumentConvention(swift::SILArgumentConvention convention) {
return static_cast<BridgedArgumentConvention>(convention.Value);
}
BridgedParameterInfo::BridgedParameterInfo(swift::SILParameterInfo parameterInfo):
type(parameterInfo.getInterfaceType()),
convention(getArgumentConvention(parameterInfo.getConvention())),
options(parameterInfo.getOptions().toRaw())
{}
swift::SILParameterInfo BridgedParameterInfo::unbridged() const {
return swift::SILParameterInfo(type.unbridged(), getParameterConvention(convention),
swift::SILParameterInfo::Options(options));
}
SwiftInt BridgedParameterInfoArray::count() const {
return parameterInfoArray.unbridged<swift::SILParameterInfo>().size();
}
BridgedParameterInfo BridgedParameterInfoArray::at(SwiftInt parameterIndex) const {
return BridgedParameterInfo(parameterInfoArray.unbridged<swift::SILParameterInfo>()[parameterIndex]);
}
//===----------------------------------------------------------------------===//
// BridgedLifetimeDependenceInfo
//===----------------------------------------------------------------------===//
BridgedLifetimeDependenceInfo::BridgedLifetimeDependenceInfo(swift::LifetimeDependenceInfo info)
: inheritLifetimeParamIndices(info.getInheritIndices()),
scopeLifetimeParamIndices(info.getScopeIndices()),
addressableParamIndices(info.getAddressableIndices()),
conditionallyAddressableParamIndices(
info.getConditionallyAddressableIndices()),
targetIndex(info.getTargetIndex()), immortal(info.isImmortal()) {}
SwiftInt BridgedLifetimeDependenceInfoArray::count() const {
return lifetimeDependenceInfoArray.unbridged<swift::LifetimeDependenceInfo>().size();
}
BridgedLifetimeDependenceInfo
BridgedLifetimeDependenceInfoArray::at(SwiftInt index) const {
return BridgedLifetimeDependenceInfo(lifetimeDependenceInfoArray.unbridged<swift::LifetimeDependenceInfo>()[index]);
}
bool BridgedLifetimeDependenceInfo::empty() const {
return !immortal && inheritLifetimeParamIndices == nullptr &&
scopeLifetimeParamIndices == nullptr;
}
bool BridgedLifetimeDependenceInfo::checkInherit(SwiftInt index) const {
return inheritLifetimeParamIndices &&
inheritLifetimeParamIndices->contains(index);
}
bool BridgedLifetimeDependenceInfo::checkScope(SwiftInt index) const {
return scopeLifetimeParamIndices &&
scopeLifetimeParamIndices->contains(index);
}
bool BridgedLifetimeDependenceInfo::checkAddressable(SwiftInt index) const {
return addressableParamIndices && addressableParamIndices->contains(index);
}
bool BridgedLifetimeDependenceInfo::
checkConditionallyAddressable(SwiftInt index) const {
return conditionallyAddressableParamIndices
&& conditionallyAddressableParamIndices->contains(index);
}
SwiftInt BridgedLifetimeDependenceInfo::getTargetIndex() const {
return targetIndex;
}
BridgedOwnedString BridgedLifetimeDependenceInfo::getDebugDescription() const {
std::string lifetimeDependenceString;
auto getOnIndices = [](swift::IndexSubset *bitvector) {
std::string result;
bool isFirstSetBit = true;
for (unsigned i = 0; i < bitvector->getCapacity(); i++) {
if (bitvector->contains(i)) {
if (!isFirstSetBit) {
result += ", ";
}
result += std::to_string(i);
isFirstSetBit = false;
}
}
return result;
};
if (inheritLifetimeParamIndices && !inheritLifetimeParamIndices->isEmpty()) {
lifetimeDependenceString =
"_inherit(" + getOnIndices(inheritLifetimeParamIndices) + ") ";
}
if (scopeLifetimeParamIndices && !scopeLifetimeParamIndices->isEmpty()) {
lifetimeDependenceString +=
"_scope(" + getOnIndices(scopeLifetimeParamIndices) + ") ";
}
return BridgedOwnedString(lifetimeDependenceString);
}
//===----------------------------------------------------------------------===//
// SILFunctionType
//===----------------------------------------------------------------------===//
BridgedResultInfoArray
SILFunctionType_getResultsWithError(BridgedCanType funcTy) {
return {funcTy.unbridged()->castTo<swift::SILFunctionType>()->getResultsWithError()};
}
SwiftInt SILFunctionType_getNumIndirectFormalResultsWithError(BridgedCanType funcTy) {
auto fnTy = funcTy.unbridged()->castTo<swift::SILFunctionType>();
return fnTy->getNumIndirectFormalResults()
+ (fnTy->hasIndirectErrorResult() ? 1 : 0);
}
SwiftInt SILFunctionType_getNumPackResults(BridgedCanType funcTy) {
return funcTy.unbridged()->castTo<swift::SILFunctionType>()
->getNumPackResults();
}
OptionalBridgedResultInfo SILFunctionType_getErrorResult(BridgedCanType funcTy) {
auto fnTy = funcTy.unbridged()->castTo<swift::SILFunctionType>();
auto resultInfo = fnTy->getOptionalErrorResult();
if (resultInfo) {
return {resultInfo->getInterfaceType().getPointer(),
BridgedResultInfo::castToResultConvention(resultInfo->getConvention())};
}
return {nullptr, BridgedResultConvention::Indirect};
}
BridgedParameterInfoArray SILFunctionType_getParameters(BridgedCanType funcTy) {
return {funcTy.unbridged()->castTo<swift::SILFunctionType>()->getParameters()};
}
bool SILFunctionType_hasSelfParam(BridgedCanType funcTy) {
return funcTy.unbridged()->castTo<swift::SILFunctionType>()->hasSelfParam();
}
bool SILFunctionType_isTrivialNoescape(BridgedCanType funcTy) {
return funcTy.unbridged()->castTo<swift::SILFunctionType>()->isTrivialNoEscape();
}
BridgedYieldInfoArray SILFunctionType_getYields(BridgedCanType funcTy) {
return {funcTy.unbridged()->castTo<swift::SILFunctionType>()->getYields()};
}
BridgedLifetimeDependenceInfoArray
SILFunctionType_getLifetimeDependencies(BridgedCanType funcTy) {
auto fnTy = funcTy.unbridged()->castTo<swift::SILFunctionType>();
return {fnTy->getLifetimeDependencies()};
}
//===----------------------------------------------------------------------===//
// BridgedType
//===----------------------------------------------------------------------===//
BridgedType::BridgedType() : opaqueValue(nullptr) {}
BridgedType::BridgedType(swift::SILType t) : opaqueValue(t.getOpaqueValue()) {}
swift::SILType BridgedType::unbridged() const {
return swift::SILType::getFromOpaqueValue(opaqueValue);
}
static_assert(sizeof(BridgedType::EnumElementIterator) >= sizeof(swift::EnumDecl::ElementRange::iterator));
static inline BridgedType::EnumElementIterator bridge(swift::EnumDecl::ElementRange::iterator i) {
BridgedType::EnumElementIterator bridgedIter;
*reinterpret_cast<swift::EnumDecl::ElementRange::iterator *>(&bridgedIter.storage) = i;
return bridgedIter;
}
static inline swift::EnumDecl::ElementRange::iterator unbridge(BridgedType::EnumElementIterator i) {
return *reinterpret_cast<const swift::EnumDecl::ElementRange::iterator *>(&i.storage);
}
BridgedType::EnumElementIterator BridgedType::EnumElementIterator::getNext() const {
return bridge(std::next(unbridge(*this)));
}
BridgedType BridgedType::createSILType(BridgedCanType canTy) {
auto ty = canTy.unbridged();
if (ty->isLegalSILType())
return swift::SILType::getPrimitiveObjectType(ty);
return swift::SILType();
}
BridgedOwnedString BridgedType::getDebugDescription() const {
return BridgedOwnedString(unbridged().getDebugDescription());
}
bool BridgedType::isNull() const {
return unbridged().isNull();
}
bool BridgedType::isAddress() const {
return unbridged().isAddress();
}
BridgedCanType BridgedType::getCanType() const {
return unbridged().getASTType();
}
BridgedType BridgedType::getAddressType() const {
return unbridged().getAddressType();
}
BridgedType BridgedType::getObjectType() const {
return unbridged().getObjectType();
}
bool BridgedType::isTrivial(BridgedFunction f) const {
return unbridged().isTrivial(f.getFunction());
}
bool BridgedType::isNonTrivialOrContainsRawPointer(BridgedFunction f) const {
return unbridged().isNonTrivialOrContainsRawPointer(f.getFunction());
}
bool BridgedType::isLoadable(BridgedFunction f) const {
return unbridged().isLoadable(f.getFunction());
}
bool BridgedType::isReferenceCounted(BridgedFunction f) const {
return unbridged().isReferenceCounted(f.getFunction());
}
bool BridgedType::containsNoEscapeFunction() const {
return unbridged().containsNoEscapeFunction();
}
bool BridgedType::isEmpty(BridgedFunction f) const {
return unbridged().isEmpty(*f.getFunction());
}
bool BridgedType::isMoveOnly() const {
return unbridged().isMoveOnly();
}
bool BridgedType::isEscapable(BridgedFunction f) const {
return unbridged().isEscapable(*f.getFunction());
}
bool BridgedType::isExactSuperclassOf(BridgedType t) const {
return unbridged().isExactSuperclassOf(t.unbridged());
}
bool BridgedType::isMarkedAsImmortal() const {
return unbridged().isMarkedAsImmortal();
}
bool BridgedType::isAddressableForDeps(BridgedFunction f) const {
return unbridged().isAddressableForDeps(*f.getFunction());
}
BridgedASTType BridgedType::getRawLayoutSubstitutedLikeType() const {
return {unbridged().getRawLayoutSubstitutedLikeType().getPointer()};
}
BridgedASTType BridgedType::getRawLayoutSubstitutedCountType() const {
return {unbridged().getRawLayoutSubstitutedCountType().getPointer()};
}
SwiftInt BridgedType::getCaseIdxOfEnumType(BridgedStringRef name) const {
return unbridged().getCaseIdxOfEnumType(name.unbridged());
}
SwiftInt BridgedType::getNumBoxFields(BridgedCanType boxTy) {
return boxTy.unbridged()->castTo<swift::SILBoxType>()->getLayout()->getFields().size();
}
BridgedType BridgedType::getBoxFieldType(BridgedCanType boxTy, SwiftInt idx, BridgedFunction f) {
auto *fn = f.getFunction();
return swift::getSILBoxFieldType(fn->getTypeExpansionContext(), boxTy.unbridged()->castTo<swift::SILBoxType>(),
fn->getModule().Types, idx);
}
bool BridgedType::getBoxFieldIsMutable(BridgedCanType boxTy, SwiftInt idx) {
return boxTy.unbridged()->castTo<swift::SILBoxType>()->getLayout()->getFields()[idx].isMutable();
}
SwiftInt BridgedType::getNumNominalFields() const {
return unbridged().getNumNominalFields();
}
BridgedType BridgedType::getFieldType(SwiftInt idx, BridgedFunction f) const {
return unbridged().getFieldType(idx, f.getFunction());
}
SwiftInt BridgedType::getFieldIdxOfNominalType(BridgedStringRef name) const {
return unbridged().getFieldIdxOfNominalType(name.unbridged());
}
BridgedStringRef BridgedType::getFieldName(SwiftInt idx) const {
return unbridged().getFieldName(idx);
}
BridgedType::EnumElementIterator BridgedType::getFirstEnumCaseIterator() const {
swift::EnumDecl *enumDecl = unbridged().getEnumOrBoundGenericEnum();
return bridge(enumDecl->getAllElements().begin());
}
bool BridgedType::isEndCaseIterator(EnumElementIterator i) const {
swift::EnumDecl *enumDecl = unbridged().getEnumOrBoundGenericEnum();
return unbridge(i) == enumDecl->getAllElements().end();
}
BridgedType BridgedType::getEnumCasePayload(EnumElementIterator i, BridgedFunction f) const {
swift::EnumElementDecl *elt = *unbridge(i);
if (elt->hasAssociatedValues())
return unbridged().getEnumElementType(elt, f.getFunction());
return swift::SILType();
}
SwiftInt BridgedType::getNumTupleElements() const {
return unbridged().getNumTupleElements();
}
BridgedType BridgedType::getTupleElementType(SwiftInt idx) const {
return unbridged().getTupleElementType(idx);
}
BridgedType BridgedType::getFunctionTypeWithNoEscape(bool withNoEscape) const {
auto fnType = unbridged().getAs<swift::SILFunctionType>();
auto newTy = fnType->getWithExtInfo(fnType->getExtInfo().withNoEscape(true));
return swift::SILType::getPrimitiveObjectType(newTy);
}
BridgedArgumentConvention BridgedType::getCalleeConvention() const {
auto fnType = unbridged().getAs<swift::SILFunctionType>();
return getArgumentConvention(fnType->getCalleeConvention());
}
//===----------------------------------------------------------------------===//
// BridgedValue
//===----------------------------------------------------------------------===//
static inline BridgedValue::Ownership bridge(swift::OwnershipKind ownership) {
switch (ownership) {
case swift::OwnershipKind::Any:
llvm_unreachable("Invalid ownership for value");
case swift::OwnershipKind::Unowned: return BridgedValue::Ownership::Unowned;
case swift::OwnershipKind::Owned: return BridgedValue::Ownership::Owned;
case swift::OwnershipKind::Guaranteed: return BridgedValue::Ownership::Guaranteed;
case swift::OwnershipKind::None: return BridgedValue::Ownership::None;
}
}
swift::ValueOwnershipKind BridgedValue::unbridge(Ownership ownership) {
switch (ownership) {
case BridgedValue::Ownership::Unowned: return swift::OwnershipKind::Unowned;
case BridgedValue::Ownership::Owned: return swift::OwnershipKind::Owned;
case BridgedValue::Ownership::Guaranteed: return swift::OwnershipKind::Guaranteed;
case BridgedValue::Ownership::None: return swift::OwnershipKind::None;
}
}
swift::ValueBase * _Nonnull BridgedValue::getSILValue() const {
return static_cast<swift::ValueBase *>(obj);
}
swift::ValueBase * _Nullable OptionalBridgedValue::getSILValue() const {
if (obj)
return static_cast<swift::ValueBase *>(obj);
return nullptr;
}
OptionalBridgedOperand BridgedValue::getFirstUse() const {
return {*getSILValue()->use_begin()};
}
BridgedType BridgedValue::getType() const {
return getSILValue()->getType();
}
BridgedValue::Ownership BridgedValue::getOwnership() const {
return bridge(getSILValue()->getOwnershipKind());
}
BridgedFunction BridgedValue::SILUndef_getParentFunction() const {
return {llvm::cast<swift::SILUndef>(getSILValue())->getParent()};
}
BridgedFunction BridgedValue::PlaceholderValue_getParentFunction() const {
return {llvm::cast<swift::PlaceholderValue>(getSILValue())->getParent()};
}
//===----------------------------------------------------------------------===//
// BridgedOperand
//===----------------------------------------------------------------------===//
bool BridgedOperand::isTypeDependent() const { return op->isTypeDependent(); }
bool BridgedOperand::isLifetimeEnding() const { return op->isLifetimeEnding(); }
bool BridgedOperand::canAcceptOwnership(BridgedValue::Ownership ownership) const {
return op->canAcceptKind(BridgedValue::unbridge(ownership));
}
bool BridgedOperand::isDeleted() const {
return op->getUser() == nullptr;
}
OptionalBridgedOperand BridgedOperand::getNextUse() const {
return {op->getNextUse()};
}
BridgedValue BridgedOperand::getValue() const { return {op->get()}; }
BridgedInstruction BridgedOperand::getUser() const {
return {op->getUser()->asSILNode()};
}
BridgedOperand::OperandOwnership BridgedOperand::getOperandOwnership() const {
switch (op->getOperandOwnership()) {
case swift::OperandOwnership::NonUse:
return OperandOwnership::NonUse;
case swift::OperandOwnership::TrivialUse:
return OperandOwnership::TrivialUse;
case swift::OperandOwnership::InstantaneousUse:
return OperandOwnership::InstantaneousUse;
case swift::OperandOwnership::UnownedInstantaneousUse:
return OperandOwnership::UnownedInstantaneousUse;
case swift::OperandOwnership::ForwardingUnowned:
return OperandOwnership::ForwardingUnowned;
case swift::OperandOwnership::PointerEscape:
return OperandOwnership::PointerEscape;
case swift::OperandOwnership::BitwiseEscape:
return OperandOwnership::BitwiseEscape;
case swift::OperandOwnership::Borrow:
return OperandOwnership::Borrow;
case swift::OperandOwnership::DestroyingConsume:
return OperandOwnership::DestroyingConsume;
case swift::OperandOwnership::ForwardingConsume:
return OperandOwnership::ForwardingConsume;
case swift::OperandOwnership::InteriorPointer:
return OperandOwnership::InteriorPointer;
case swift::OperandOwnership::AnyInteriorPointer:
return OperandOwnership::AnyInteriorPointer;
case swift::OperandOwnership::GuaranteedForwarding:
return OperandOwnership::GuaranteedForwarding;
case swift::OperandOwnership::EndBorrow:
return OperandOwnership::EndBorrow;
case swift::OperandOwnership::Reborrow:
return OperandOwnership::Reborrow;
}
}
BridgedOperand OptionalBridgedOperand::advancedBy(SwiftInt index) const { return {op + index}; }
// Assumes that `op` is not null.
SwiftInt OptionalBridgedOperand::distanceTo(BridgedOperand element) const { return element.op - op; }
//===----------------------------------------------------------------------===//
// BridgedArgument
//===----------------------------------------------------------------------===//
swift::SILArgument * _Nonnull BridgedArgument::getArgument() const {
return static_cast<swift::SILArgument *>(obj);
}
BridgedBasicBlock BridgedArgument::getParent() const {
return {getArgument()->getParent()};
}
bool BridgedArgument::isReborrow() const { return getArgument()->isReborrow(); }
void BridgedArgument::setReborrow(bool reborrow) const {
getArgument()->setReborrow(reborrow);
}
bool BridgedArgument::FunctionArgument_isLexical() const {
return llvm::cast<swift::SILFunctionArgument>(getArgument())->getLifetime().isLexical();
}
bool BridgedArgument::FunctionArgument_isClosureCapture() const {
return llvm::cast<swift::SILFunctionArgument>(
getArgument())->isClosureCapture();
}
OptionalBridgedDeclObj BridgedArgument::getDecl() const {
return {getArgument()->getDecl()};
}
void BridgedArgument::copyFlags(BridgedArgument fromArgument) const {
auto *fArg = static_cast<swift::SILFunctionArgument *>(getArgument());
fArg->copyFlags(static_cast<swift::SILFunctionArgument *>(fromArgument.getArgument()));
}
swift::SILArgument * _Nullable OptionalBridgedArgument::unbridged() const {
if (!obj)
return nullptr;
return static_cast<swift::SILArgument *>(obj);
}
//===----------------------------------------------------------------------===//
// BridgedLocation
//===----------------------------------------------------------------------===//
BridgedLocation::BridgedLocation(const swift::SILDebugLocation &loc) {
*reinterpret_cast<swift::SILDebugLocation *>(&storage) = loc;
}
const swift::SILDebugLocation &BridgedLocation::getLoc() const {
return *reinterpret_cast<const swift::SILDebugLocation *>(&storage);
}
BridgedLocation BridgedLocation::getAutogeneratedLocation() const {
return getLoc().getAutogeneratedLocation();
}
BridgedLocation BridgedLocation::getCleanupLocation() const {
return getLoc().getCleanupLocation();
}
BridgedLocation BridgedLocation::withScopeOf(BridgedLocation other) const {
return swift::SILDebugLocation(getLoc().getLocation(), other.getLoc().getScope());
}
bool BridgedLocation::hasValidLineNumber() const {
return getLoc().hasValidLineNumber();
}
bool BridgedLocation::isAutoGenerated() const {
return getLoc().isAutoGenerated();
}
bool BridgedLocation::isInlined() const {
return getLoc().getScope()->InlinedCallSite;
}
bool BridgedLocation::isEqualTo(BridgedLocation rhs) const {
return getLoc().isEqualTo(rhs.getLoc());
}
swift::SourceLoc BridgedLocation::getSourceLocation() const {
swift::SILDebugLocation debugLoc = getLoc();
swift::SILLocation silLoc = debugLoc.getLocation();
return silLoc.getSourceLoc();
}
bool BridgedLocation::isFilenameAndLocation() const {
return getLoc().getLocation().isFilenameAndLocation();
}
BridgedLocation::FilenameAndLocation BridgedLocation::getFilenameAndLocation() const {
auto fnal = getLoc().getLocation().getFilenameAndLocation();
return {BridgedStringRef(fnal->filename), (SwiftInt)fnal->line, (SwiftInt)fnal->column};
}
bool BridgedLocation::hasSameSourceLocation(BridgedLocation rhs) const {
return getLoc().hasSameSourceLocation(rhs.getLoc());
}
OptionalBridgedDeclObj BridgedLocation::getDecl() const {
return {getLoc().getLocation().getAsASTNode<swift::Decl>()};
}
BridgedLocation BridgedLocation::fromNominalTypeDecl(BridgedDeclObj decl) {
return swift::SILDebugLocation(decl.unbridged(), nullptr);
}
BridgedLocation BridgedLocation::getArtificialUnreachableLocation() {
return swift::SILDebugLocation::getArtificialUnreachableLocation();
}
//===----------------------------------------------------------------------===//
// BridgedFunction
//===----------------------------------------------------------------------===//
swift::SILFunction * _Nonnull BridgedFunction::getFunction() const {
return static_cast<swift::SILFunction *>(obj);
}
BridgedStringRef BridgedFunction::getName() const {
return getFunction()->getName();
}
BridgedLocation BridgedFunction::getLocation() const {
return {swift::SILDebugLocation(getFunction()->getLocation(), getFunction()->getDebugScope())};
}
bool BridgedFunction::isAccessor() const {
if (auto *valDecl = getFunction()->getDeclRef().getDecl()) {
return llvm::isa<swift::AccessorDecl>(valDecl);
}
return false;
}
BridgedStringRef BridgedFunction::getAccessorName() const {
auto *accessorDecl = llvm::cast<swift::AccessorDecl>(getFunction()->getDeclRef().getDecl());
return accessorKindName(accessorDecl->getAccessorKind());
}
bool BridgedFunction::hasOwnership() const { return getFunction()->hasOwnership(); }
bool BridgedFunction::hasLoweredAddresses() const { return getFunction()->getModule().useLoweredAddresses(); }
BridgedCanType BridgedFunction::getLoweredFunctionType() const {
return getFunction()->getLoweredFunctionType();
}
BridgedCanType BridgedFunction::getLoweredFunctionTypeInContext() const {
return getFunction()->getLoweredFunctionTypeInContext();
}
BridgedGenericSignature BridgedFunction::getGenericSignature() const {
return {getFunction()->getGenericSignature().getPointer()};
}
BridgedSubstitutionMap BridgedFunction::getForwardingSubstitutionMap() const {
return {getFunction()->getForwardingSubstitutionMap()};
}
BridgedASTType BridgedFunction::mapTypeIntoContext(BridgedASTType ty) const {
return {getFunction()->mapTypeIntoContext(ty.unbridged()).getPointer()};
}
OptionalBridgedBasicBlock BridgedFunction::getFirstBlock() const {
return {getFunction()->empty() ? nullptr : getFunction()->getEntryBlock()};
}
OptionalBridgedBasicBlock BridgedFunction::getLastBlock() const {
return {getFunction()->empty() ? nullptr : &*getFunction()->rbegin()};
}
SwiftInt BridgedFunction::getNumIndirectFormalResults() const {
return (SwiftInt)getFunction()->getLoweredFunctionType()->getNumIndirectFormalResults();
}
BridgedDeclRef BridgedFunction::getDeclRef() const {
return getFunction()->getDeclRef();
}
bool BridgedFunction::hasIndirectErrorResult() const {
return (SwiftInt)getFunction()->getLoweredFunctionType()->hasIndirectErrorResult();
}
SwiftInt BridgedFunction::getNumSILArguments() const {
return swift::SILFunctionConventions(getFunction()->getConventionsInContext()).getNumSILArguments();
}
BridgedType BridgedFunction::getSILArgumentType(SwiftInt idx) const {
swift::SILFunctionConventions conv(getFunction()->getConventionsInContext());
return conv.getSILArgumentType(idx, getFunction()->getTypeExpansionContext());
}
BridgedType BridgedFunction::getSILResultType() const {
swift::SILFunctionConventions conv(getFunction()->getConventionsInContext());
return conv.getSILResultType(getFunction()->getTypeExpansionContext());
}
bool BridgedFunction::isSwift51RuntimeAvailable() const {
if (getFunction()->getResilienceExpansion() != swift::ResilienceExpansion::Maximal)
return false;
swift::ASTContext &ctxt = getFunction()->getModule().getASTContext();
return swift::AvailabilityRange::forDeploymentTarget(ctxt).isContainedIn(
ctxt.getSwift51Availability());
}
bool BridgedFunction::isPossiblyUsedExternally() const {
return getFunction()->isPossiblyUsedExternally();
}
bool BridgedFunction::isTransparent() const {
return getFunction()->isTransparent() == swift::IsTransparent;
}
bool BridgedFunction::isAsync() const {
return getFunction()->isAsync();
}
bool BridgedFunction::isGlobalInitFunction() const {
return getFunction()->isGlobalInit();
}
bool BridgedFunction::isGlobalInitOnceFunction() const {
return getFunction()->isGlobalInitOnceFunction();
}
bool BridgedFunction::isDestructor() const {
if (auto *declCtxt = getFunction()->getDeclContext()) {
return llvm::isa<swift::DestructorDecl>(declCtxt);
}
return false;
}
bool BridgedFunction::isGeneric() const {
return getFunction()->isGeneric();
}
bool BridgedFunction::hasSemanticsAttr(BridgedStringRef attrName) const {
return getFunction()->hasSemanticsAttr(attrName.unbridged());
}
bool BridgedFunction::hasUnsafeNonEscapableResult() const {
return getFunction()->hasUnsafeNonEscapableResult();
}
bool BridgedFunction::hasDynamicSelfMetadata() const {
return getFunction()->hasDynamicSelfMetadata();
}
BridgedFunction::EffectsKind BridgedFunction::getEffectAttribute() const {
return (EffectsKind)getFunction()->getEffectsKind();
}
BridgedFunction::PerformanceConstraints BridgedFunction::getPerformanceConstraints() const {
return (PerformanceConstraints)getFunction()->getPerfConstraints();
}
BridgedFunction::InlineStrategy BridgedFunction::getInlineStrategy() const {
return (InlineStrategy)getFunction()->getInlineStrategy();
}
BridgedFunction::ABILanguage BridgedFunction::getSILFunctionLanguage() const {
auto rep = getFunction()->getLoweredFunctionType()->getRepresentation();
return (ABILanguage)swift::getSILFunctionLanguage(rep);
}
BridgedFunction::ThunkKind BridgedFunction::isThunk() const {
return (ThunkKind)getFunction()->isThunk();
}
void BridgedFunction::setThunk(ThunkKind kind) const {
getFunction()->setThunk((swift::IsThunk_t)kind);
}
BridgedFunction::SerializedKind BridgedFunction::getSerializedKind() const {
return (SerializedKind)getFunction()->getSerializedKind();
}
bool BridgedFunction::canBeInlinedIntoCaller(SerializedKind kind) const {
return getFunction()->canBeInlinedIntoCaller(swift::SerializedKind_t(kind));
}
bool BridgedFunction::hasValidLinkageForFragileRef(SerializedKind kind) const {
return getFunction()->hasValidLinkageForFragileRef(swift::SerializedKind_t(kind));
}
bool BridgedFunction::needsStackProtection() const {
return getFunction()->needsStackProtection();
}
bool BridgedFunction::shouldOptimize() const {
return getFunction()->shouldOptimize();
}
bool BridgedFunction::isReferencedInModule() const {
return getFunction()->getRefCount() != 0;
}
bool BridgedFunction::wasDeserializedCanonical() const {
return getFunction()->wasDeserializedCanonical();
}
void BridgedFunction::setNeedStackProtection(bool needSP) const {
getFunction()->setNeedStackProtection(needSP);
}
void BridgedFunction::setIsPerformanceConstraint(bool isPerfConstraint) const {
getFunction()->setIsPerformanceConstraint(isPerfConstraint);
}
BridgedLinkage BridgedFunction::getLinkage() const {
return (BridgedLinkage)getFunction()->getLinkage();
}
void BridgedFunction::setLinkage(BridgedLinkage linkage) const {
getFunction()->setLinkage((swift::SILLinkage)linkage);
}
void BridgedFunction::setIsSerialized(bool isSerialized) const {
getFunction()->setSerializedKind(isSerialized ? swift::IsSerialized : swift::IsNotSerialized);
}
bool BridgedFunction::conformanceMatchesActorIsolation(BridgedConformance conformance) const {
return swift::matchesActorIsolation(conformance.unbridged(), getFunction());
}
bool BridgedFunction::isSpecialization() const {
return getFunction()->isSpecialization();
}
bool BridgedFunction::isResilientNominalDecl(BridgedDeclObj decl) const {
return decl.getAs<swift::NominalTypeDecl>()->isResilient(getFunction()->getModule().getSwiftModule(),
getFunction()->getResilienceExpansion());
}
BridgedType BridgedFunction::getLoweredType(BridgedASTType type, bool maximallyAbstracted) const {
if (maximallyAbstracted) {
return BridgedType(getFunction()->getLoweredType(swift::Lowering::AbstractionPattern::getOpaque(), type.type));
}
return BridgedType(getFunction()->getLoweredType(type.type));
}
BridgedType BridgedFunction::getLoweredType(BridgedType type) const {
return BridgedType(getFunction()->getLoweredType(type.unbridged()));
}
swift::SILFunction * _Nullable OptionalBridgedFunction::getFunction() const {
return static_cast<swift::SILFunction *>(obj);
}
BridgedFunction::OptionalSourceFileKind BridgedFunction::getSourceFileKind() const {
if (auto *dc = getFunction()->getDeclContext()) {
if (auto *sourceFile = dc->getParentSourceFile())
return (OptionalSourceFileKind)sourceFile->Kind;
}
return OptionalSourceFileKind::None;
}
//===----------------------------------------------------------------------===//
// BridgedGlobalVar
//===----------------------------------------------------------------------===//
swift::SILGlobalVariable * _Nonnull BridgedGlobalVar::getGlobal() const {
return static_cast<swift::SILGlobalVariable *>(obj);
}
OptionalBridgedDeclObj BridgedGlobalVar::getDecl() const {
return {getGlobal()->getDecl()};
}
BridgedStringRef BridgedGlobalVar::getName() const {
return getGlobal()->getName();
}
bool BridgedGlobalVar::isLet() const { return getGlobal()->isLet(); }
void BridgedGlobalVar::setLet(bool value) const { getGlobal()->setLet(value); }
bool BridgedGlobalVar::markedAsUsed() const {
return getGlobal()->markedAsUsed();
}
void BridgedGlobalVar::setMarkedAsUsed(bool value) const {
getGlobal()->setMarkedAsUsed(value);
}
BridgedType BridgedGlobalVar::getType() const {
return getGlobal()->getLoweredType();
}
BridgedLinkage BridgedGlobalVar::getLinkage() const {
return (BridgedLinkage)getGlobal()->getLinkage();
}
swift::SourceLoc BridgedGlobalVar::getSourceLocation() const {
if (getGlobal()->hasLocation())
return getGlobal()->getLocation().getSourceLoc();
else
return swift::SourceLoc();
}
bool BridgedGlobalVar::isPossiblyUsedExternally() const {
return getGlobal()->isPossiblyUsedExternally();
}
OptionalBridgedInstruction BridgedGlobalVar::getFirstStaticInitInst() const {
if (getGlobal()->begin() == getGlobal()->end()) {
return {nullptr};
}
swift::SILInstruction *firstInst = &*getGlobal()->begin();
return {firstInst->asSILNode()};
}
//===----------------------------------------------------------------------===//
// BridgedMultiValueResult
//===----------------------------------------------------------------------===//
swift::MultipleValueInstructionResult * _Nonnull BridgedMultiValueResult::unbridged() const {
return static_cast<swift::MultipleValueInstructionResult *>(obj);
}
BridgedInstruction BridgedMultiValueResult::getParent() const {
return {unbridged()->getParent()};
}
SwiftInt BridgedMultiValueResult::getIndex() const {
return (SwiftInt)unbridged()->getIndex();
}
//===----------------------------------------------------------------------===//
// BridgedSILTypeArray
//===----------------------------------------------------------------------===//
BridgedType BridgedSILTypeArray::getAt(SwiftInt index) const {
return typeArray.unbridged<swift::SILType>()[index];
}
//===----------------------------------------------------------------------===//
// BridgedInstruction
//===----------------------------------------------------------------------===//
OptionalBridgedInstruction BridgedInstruction::getNext() const {
auto iter = std::next(unbridged()->getIterator());
if (iter == unbridged()->getParent()->end())
return {nullptr};
return {iter->asSILNode()};
}
OptionalBridgedInstruction BridgedInstruction::getPrevious() const {
auto iter = std::next(unbridged()->getReverseIterator());
if (iter == unbridged()->getParent()->rend())
return {nullptr};
return {iter->asSILNode()};
}
BridgedBasicBlock BridgedInstruction::getParent() const {
assert(!unbridged()->isStaticInitializerInst() &&
"cannot get the parent of a static initializer instruction");
return {unbridged()->getParent()};
}
BridgedInstruction BridgedInstruction::getLastInstOfParent() const {
return {unbridged()->getParent()->back().asSILNode()};
}
bool BridgedInstruction::isDeleted() const {
return unbridged()->isDeleted();
}
bool BridgedInstruction::isInStaticInitializer() const {
return unbridged()->isStaticInitializerInst();
}
BridgedOperandArray BridgedInstruction::getOperands() const {
auto operands = unbridged()->getAllOperands();
return {{operands.data()}, (SwiftInt)operands.size()};
}
BridgedOperandArray BridgedInstruction::getTypeDependentOperands() const {
auto typeOperands = unbridged()->getTypeDependentOperands();
return {{typeOperands.data()}, (SwiftInt)typeOperands.size()};
}
void BridgedInstruction::setOperand(SwiftInt index, BridgedValue value) const {
unbridged()->setOperand((unsigned)index, value.getSILValue());
}
BridgedLocation BridgedInstruction::getLocation() const {
return unbridged()->getDebugLocation();
}
BridgedMemoryBehavior BridgedInstruction::getMemBehavior() const {
return (BridgedMemoryBehavior)unbridged()->getMemoryBehavior();
}
bool BridgedInstruction::mayRelease() const {
return unbridged()->mayRelease();
}
bool BridgedInstruction::mayHaveSideEffects() const {
return unbridged()->mayHaveSideEffects();
}
bool BridgedInstruction::maySuspend() const {
return unbridged()->maySuspend();
}
bool BridgedInstruction::shouldBeForwarding() const {
return llvm::isa<swift::OwnershipForwardingSingleValueInstruction>(unbridged()) ||
llvm::isa<swift::OwnershipForwardingTermInst>(unbridged()) ||
llvm::isa<swift::OwnershipForwardingMultipleValueInstruction>(unbridged());
}
bool BridgedInstruction::isIdenticalTo(BridgedInstruction inst) const {
return unbridged()->isIdenticalTo(inst.unbridged());
}
SwiftInt BridgedInstruction::MultipleValueInstruction_getNumResults() const {
return getAs<swift::MultipleValueInstruction>()->getNumResults();
}
BridgedMultiValueResult BridgedInstruction::MultipleValueInstruction_getResult(SwiftInt index) const {
return {getAs<swift::MultipleValueInstruction>()->getResult(index)};
}
BridgedSuccessorArray BridgedInstruction::TermInst_getSuccessors() const {
auto successors = getAs<swift::TermInst>()->getSuccessors();
return {{successors.data()}, (SwiftInt)successors.size()};
}
swift::ForwardingInstruction * _Nonnull BridgedInstruction::getAsForwardingInstruction() const {
auto *forwardingInst = swift::ForwardingInstruction::get(unbridged());
assert(forwardingInst && "instruction is not defined as ForwardingInstruction");
return forwardingInst;
}
OptionalBridgedOperand BridgedInstruction::ForwardingInst_singleForwardedOperand() const {
return {swift::ForwardingOperation(unbridged()).getSingleForwardingOperand()};
}
BridgedOperandArray BridgedInstruction::ForwardingInst_forwardedOperands() const {
auto operands =
swift::ForwardingOperation(unbridged()).getForwardedOperands();
return {{operands.data()}, (SwiftInt)operands.size()};
}
BridgedValue::Ownership BridgedInstruction::ForwardingInst_forwardingOwnership() const {
return bridge(getAsForwardingInstruction()->getForwardingOwnershipKind());
}
void BridgedInstruction::ForwardingInst_setForwardingOwnership(BridgedValue::Ownership ownership) const {
return getAsForwardingInstruction()->setForwardingOwnershipKind(BridgedValue::unbridge(ownership));
}
bool BridgedInstruction::ForwardingInst_preservesOwnership() const {
return getAsForwardingInstruction()->preservesOwnership();
}
BridgedStringRef BridgedInstruction::CondFailInst_getMessage() const {
return getAs<swift::CondFailInst>()->getMessage();
}
SwiftInt BridgedInstruction::LoadInst_getLoadOwnership() const {
return (SwiftInt)getAs<swift::LoadInst>()->getOwnershipQualifier();
}
bool BridgedInstruction::LoadBorrowInst_isUnchecked() const {
return (SwiftInt)getAs<swift::LoadBorrowInst>()->isUnchecked();
}
BridgedInstruction::BuiltinValueKind BridgedInstruction::BuiltinInst_getID() const {
return (BuiltinValueKind)getAs<swift::BuiltinInst>()->getBuiltinInfo().ID;
}
BridgedInstruction::IntrinsicID BridgedInstruction::BuiltinInst_getIntrinsicID() const {
switch (getAs<swift::BuiltinInst>()->getIntrinsicInfo().ID) {
case llvm::Intrinsic::memcpy: return IntrinsicID::memcpy;
case llvm::Intrinsic::memmove: return IntrinsicID::memmove;
default: return IntrinsicID::unknown;
}
}
BridgedStringRef BridgedInstruction::BuiltinInst_getName() const {
return getAs<swift::BuiltinInst>()->getName().str();
}
BridgedSubstitutionMap BridgedInstruction::BuiltinInst_getSubstitutionMap() const {
return getAs<swift::BuiltinInst>()->getSubstitutions();
}
bool BridgedInstruction::PointerToAddressInst_isStrict() const {
return getAs<swift::PointerToAddressInst>()->isStrict();
}
bool BridgedInstruction::PointerToAddressInst_isInvariant() const {
return getAs<swift::PointerToAddressInst>()->isInvariant();
}
uint64_t BridgedInstruction::PointerToAddressInst_getAlignment() const {
auto maybeAlign = getAs<swift::PointerToAddressInst>()->alignment();
if (maybeAlign.has_value()) {
assert(maybeAlign->value() != 0);
return maybeAlign->value();
}
return 0;
}
void BridgedInstruction::PointerToAddressInst_setAlignment(uint64_t alignment) const {
getAs<swift::PointerToAddressInst>()->setAlignment(llvm::MaybeAlign(alignment));
}
bool BridgedInstruction::AddressToPointerInst_needsStackProtection() const {
return getAs<swift::AddressToPointerInst>()->needsStackProtection();
}
bool BridgedInstruction::IndexAddrInst_needsStackProtection() const {
return getAs<swift::IndexAddrInst>()->needsStackProtection();
}
BridgedConformanceArray BridgedInstruction::InitExistentialRefInst_getConformances() const {
return {getAs<swift::InitExistentialRefInst>()->getConformances()};
}
BridgedCanType BridgedInstruction::InitExistentialRefInst_getFormalConcreteType() const {
return getAs<swift::InitExistentialRefInst>()->getFormalConcreteType();
}
bool BridgedInstruction::OpenExistentialAddr_isImmutable() const {
switch (getAs<swift::OpenExistentialAddrInst>()->getAccessKind()) {
case swift::OpenedExistentialAccess::Immutable: return true;
case swift::OpenedExistentialAccess::Mutable: return false;
}
}
BridgedGlobalVar BridgedInstruction::GlobalAccessInst_getGlobal() const {
return {getAs<swift::GlobalAccessInst>()->getReferencedGlobal()};
}
BridgedGlobalVar BridgedInstruction::AllocGlobalInst_getGlobal() const {
return {getAs<swift::AllocGlobalInst>()->getReferencedGlobal()};
}
BridgedFunction BridgedInstruction::FunctionRefBaseInst_getReferencedFunction() const {
return {getAs<swift::FunctionRefBaseInst>()->getInitiallyReferencedFunction()};
}
BridgedOptionalInt BridgedInstruction::IntegerLiteralInst_getValue() const {
llvm::APInt result = getAs<swift::IntegerLiteralInst>()->getValue();
return getFromAPInt(result);
}
BridgedStringRef BridgedInstruction::StringLiteralInst_getValue() const {
return getAs<swift::StringLiteralInst>()->getValue();
}
int BridgedInstruction::StringLiteralInst_getEncoding() const {
return (int)getAs<swift::StringLiteralInst>()->getEncoding();
}
SwiftInt BridgedInstruction::TupleExtractInst_fieldIndex() const {
return getAs<swift::TupleExtractInst>()->getFieldIndex();
}
SwiftInt BridgedInstruction::TupleElementAddrInst_fieldIndex() const {
return getAs<swift::TupleElementAddrInst>()->getFieldIndex();
}
SwiftInt BridgedInstruction::StructExtractInst_fieldIndex() const {
return getAs<swift::StructExtractInst>()->getFieldIndex();
}
OptionalBridgedValue BridgedInstruction::StructInst_getUniqueNonTrivialFieldValue() const {
return {getAs<swift::StructInst>()->getUniqueNonTrivialFieldValue()};
}
SwiftInt BridgedInstruction::StructElementAddrInst_fieldIndex() const {
return getAs<swift::StructElementAddrInst>()->getFieldIndex();
}
bool BridgedInstruction::BeginBorrow_isLexical() const {
return getAs<swift::BeginBorrowInst>()->isLexical();
}
bool BridgedInstruction::BeginBorrow_hasPointerEscape() const {
return getAs<swift::BeginBorrowInst>()->hasPointerEscape();
}
bool BridgedInstruction::BeginBorrow_isFromVarDecl() const {
return getAs<swift::BeginBorrowInst>()->isFromVarDecl();
}
bool BridgedInstruction::MoveValue_isLexical() const {
return getAs<swift::MoveValueInst>()->isLexical();
}
bool BridgedInstruction::MoveValue_hasPointerEscape() const {
return getAs<swift::MoveValueInst>()->hasPointerEscape();
}
bool BridgedInstruction::MoveValue_isFromVarDecl() const {
return getAs<swift::MoveValueInst>()->isFromVarDecl();
}
SwiftInt BridgedInstruction::ProjectBoxInst_fieldIndex() const {
return getAs<swift::ProjectBoxInst>()->getFieldIndex();
}
bool BridgedInstruction::EndCOWMutationInst_doKeepUnique() const {
return getAs<swift::EndCOWMutationInst>()->doKeepUnique();
}
bool BridgedInstruction::DestroyValueInst_isDeadEnd() const {
return getAs<swift::DestroyValueInst>()->isDeadEnd();
}
SwiftInt BridgedInstruction::EnumInst_caseIndex() const {
return getAs<swift::EnumInst>()->getCaseIndex();
}
SwiftInt BridgedInstruction::UncheckedEnumDataInst_caseIndex() const {
return getAs<swift::UncheckedEnumDataInst>()->getCaseIndex();
}
SwiftInt BridgedInstruction::InitEnumDataAddrInst_caseIndex() const {
return getAs<swift::InitEnumDataAddrInst>()->getCaseIndex();
}
SwiftInt BridgedInstruction::UncheckedTakeEnumDataAddrInst_caseIndex() const {
return getAs<swift::UncheckedTakeEnumDataAddrInst>()->getCaseIndex();
}
SwiftInt BridgedInstruction::InjectEnumAddrInst_caseIndex() const {
return getAs<swift::InjectEnumAddrInst>()->getCaseIndex();
}
BridgedDeclObj BridgedInstruction::InjectEnumAddrInst_element() const {
return {getAs<swift::InjectEnumAddrInst>()->getElement()};
}
SwiftInt BridgedInstruction::RefElementAddrInst_fieldIndex() const {
return getAs<swift::RefElementAddrInst>()->getFieldIndex();
}
bool BridgedInstruction::RefElementAddrInst_fieldIsLet() const {
return getAs<swift::RefElementAddrInst>()->getField()->isLet();
}
bool BridgedInstruction::RefElementAddrInst_isImmutable() const {
return getAs<swift::RefElementAddrInst>()->isImmutable();
}
void BridgedInstruction::RefElementAddrInst_setImmutable(bool isImmutable) const {
getAs<swift::RefElementAddrInst>()->setImmutable(isImmutable);
}
bool BridgedInstruction::RefTailAddrInst_isImmutable() const {
return getAs<swift::RefTailAddrInst>()->isImmutable();
}
SwiftInt BridgedInstruction::PartialApplyInst_numArguments() const {
return getAs<swift::PartialApplyInst>()->getNumArguments();
}
SwiftInt BridgedInstruction::ApplyInst_numArguments() const {
return getAs<swift::ApplyInst>()->getNumArguments();
}
bool BridgedInstruction::ApplyInst_getNonThrowing() const {
return getAs<swift::ApplyInst>()->isNonThrowing();
}
bool BridgedInstruction::ApplyInst_getNonAsync() const {
return getAs<swift::ApplyInst>()->isNonAsync();
}
BridgedGenericSpecializationInformation BridgedInstruction::ApplyInst_getSpecializationInfo() const {
return {getAs<swift::ApplyInst>()->getSpecializationInfo()};
}
bool BridgedInstruction::TryApplyInst_getNonAsync() const {
return getAs<swift::TryApplyInst>()->isNonAsync();
}
BridgedGenericSpecializationInformation BridgedInstruction::TryApplyInst_getSpecializationInfo() const {
return {getAs<swift::TryApplyInst>()->getSpecializationInfo()};
}
BridgedDeclRef BridgedInstruction::ClassMethodInst_getMember() const {
return getAs<swift::ClassMethodInst>()->getMember();
}
BridgedDeclRef BridgedInstruction::WitnessMethodInst_getMember() const {
return getAs<swift::WitnessMethodInst>()->getMember();
}
BridgedCanType BridgedInstruction::WitnessMethodInst_getLookupType() const {
return getAs<swift::WitnessMethodInst>()->getLookupType();
}
BridgedDeclObj BridgedInstruction::WitnessMethodInst_getLookupProtocol() const {
return getAs<swift::WitnessMethodInst>()->getLookupProtocol();
}
BridgedConformance BridgedInstruction::WitnessMethodInst_getConformance() const {
return getAs<swift::WitnessMethodInst>()->getConformance();
}
SwiftInt BridgedInstruction::ObjectInst_getNumBaseElements() const {
return getAs<swift::ObjectInst>()->getNumBaseElements();
}
SwiftInt BridgedInstruction::PartialApply_getCalleeArgIndexOfFirstAppliedArg() const {
return swift::ApplySite(unbridged()).getCalleeArgIndexOfFirstAppliedArg();
}
bool BridgedInstruction::PartialApplyInst_isOnStack() const {
return getAs<swift::PartialApplyInst>()->isOnStack();
}
bool BridgedInstruction::PartialApplyInst_hasUnknownResultIsolation() const {
return getAs<swift::PartialApplyInst>()->getResultIsolation() ==
swift::SILFunctionTypeIsolation::forUnknown();
}
bool BridgedInstruction::AllocStackInst_hasDynamicLifetime() const {
return getAs<swift::AllocStackInst>()->hasDynamicLifetime();
}
bool BridgedInstruction::AllocStackInst_isFromVarDecl() const {
return getAs<swift::AllocStackInst>()->isFromVarDecl();
}
bool BridgedInstruction::AllocStackInst_usesMoveableValueDebugInfo() const {
return getAs<swift::AllocStackInst>()->usesMoveableValueDebugInfo();
}
bool BridgedInstruction::AllocStackInst_isLexical() const {
return getAs<swift::AllocStackInst>()->isLexical();
}
bool BridgedInstruction::AllocBoxInst_hasDynamicLifetime() const {
return getAs<swift::AllocBoxInst>()->hasDynamicLifetime();
}
bool BridgedInstruction::AllocRefInstBase_isObjc() const {
return getAs<swift::AllocRefInstBase>()->isObjC();
}
bool BridgedInstruction::AllocRefInstBase_canAllocOnStack() const {
return getAs<swift::AllocRefInstBase>()->canAllocOnStack();
}
SwiftInt BridgedInstruction::AllocRefInstBase_getNumTailTypes() const {
return getAs<swift::AllocRefInstBase>()->getNumTailTypes();
}
BridgedSILTypeArray BridgedInstruction::AllocRefInstBase_getTailAllocatedTypes() const {
return {getAs<const swift::AllocRefInstBase>()->getTailAllocatedTypes()};
}
bool BridgedInstruction::AllocRefDynamicInst_isDynamicTypeDeinitAndSizeKnownEquivalentToBaseType() const {
return getAs<swift::AllocRefDynamicInst>()->isDynamicTypeDeinitAndSizeKnownEquivalentToBaseType();
}
SwiftInt BridgedInstruction::BeginApplyInst_numArguments() const {
return getAs<swift::BeginApplyInst>()->getNumArguments();
}
bool BridgedInstruction::BeginApplyInst_isCalleeAllocated() const {
return getAs<swift::BeginApplyInst>()->isCalleeAllocated();
}
SwiftInt BridgedInstruction::TryApplyInst_numArguments() const {
return getAs<swift::TryApplyInst>()->getNumArguments();
}
BridgedArgumentConvention BridgedInstruction::YieldInst_getConvention(BridgedOperand forOperand) const {
return castToArgumentConvention(getAs<swift::YieldInst>()->getArgumentConventionForOperand(*forOperand.op));
}
BridgedBasicBlock BridgedInstruction::BranchInst_getTargetBlock() const {
return {getAs<swift::BranchInst>()->getDestBB()};
}
SwiftInt BridgedInstruction::SwitchEnumInst_getNumCases() const {
return getAs<swift::SwitchEnumInst>()->getNumCases();
}
SwiftInt BridgedInstruction::SwitchEnumInst_getCaseIndex(SwiftInt idx) const {
auto *seInst = getAs<swift::SwitchEnumInst>();
return seInst->getModule().getCaseIndex(seInst->getCase(idx).first);
}
SwiftInt BridgedInstruction::StoreInst_getStoreOwnership() const {
return (SwiftInt)getAs<swift::StoreInst>()->getOwnershipQualifier();
}
SwiftInt BridgedInstruction::AssignInst_getAssignOwnership() const {
return (SwiftInt)getAs<swift::AssignInst>()->getOwnershipQualifier();
}
BridgedInstruction::MarkDependenceKind BridgedInstruction::MarkDependenceInst_dependenceKind() const {
return (MarkDependenceKind)getAs<swift::MarkDependenceInst>()->dependenceKind();
}
void BridgedInstruction::MarkDependenceInstruction_resolveToNonEscaping() const {
if (auto *mdi = llvm::dyn_cast<swift::MarkDependenceInst>(unbridged())) {
mdi->resolveToNonEscaping();
} else {
getAs<swift::MarkDependenceAddrInst>()->resolveToNonEscaping();
}
}
void BridgedInstruction::MarkDependenceInstruction_settleToEscaping() const {
if (auto *mdi = llvm::dyn_cast<swift::MarkDependenceInst>(unbridged())) {
mdi->settleToEscaping();
} else {
getAs<swift::MarkDependenceAddrInst>()->settleToEscaping();
}
}
BridgedInstruction::MarkDependenceKind BridgedInstruction::MarkDependenceAddrInst_dependenceKind() const {
return (MarkDependenceKind)getAs<swift::MarkDependenceAddrInst>()->dependenceKind();
}
SwiftInt BridgedInstruction::BeginAccessInst_getAccessKind() const {
return (SwiftInt)getAs<swift::BeginAccessInst>()->getAccessKind();
}
bool BridgedInstruction::BeginAccessInst_isStatic() const {
return getAs<swift::BeginAccessInst>()->getEnforcement() == swift::SILAccessEnforcement::Static;
}
bool BridgedInstruction::BeginAccessInst_isUnsafe() const {
return getAs<swift::BeginAccessInst>()->getEnforcement() == swift::SILAccessEnforcement::Unsafe;
}
void BridgedInstruction::BeginAccess_setAccessKind(SwiftInt accessKind) const {
getAs<swift::BeginAccessInst>()->setAccessKind((swift::SILAccessKind)accessKind);
}
SwiftInt BridgedInstruction::BeginAccessInst_getEnforcement() const {
return (SwiftInt)getAs<swift::BeginAccessInst>()->getEnforcement();
}
void BridgedInstruction::BeginAccess_setEnforcement(SwiftInt accessKind) const {
getAs<swift::BeginAccessInst>()->setEnforcement((swift::SILAccessEnforcement)accessKind);
}
bool BridgedInstruction::CopyAddrInst_isTakeOfSrc() const {
return getAs<swift::CopyAddrInst>()->isTakeOfSrc();
}
bool BridgedInstruction::CopyAddrInst_isInitializationOfDest() const {
return getAs<swift::CopyAddrInst>()->isInitializationOfDest();
}
void BridgedInstruction::CopyAddrInst_setIsTakeOfSrc(bool isTakeOfSrc) const {
return getAs<swift::CopyAddrInst>()->setIsTakeOfSrc(isTakeOfSrc ? swift::IsTake : swift::IsNotTake);
}
void BridgedInstruction::CopyAddrInst_setIsInitializationOfDest(bool isInitializationOfDest) const {
return getAs<swift::CopyAddrInst>()->setIsInitializationOfDest(
isInitializationOfDest ? swift::IsInitialization : swift::IsNotInitialization);
}
bool BridgedInstruction::DeallocBoxInst_isDeadEnd() const {
return getAs<swift::DeallocBoxInst>()->isDeadEnd();
}
bool BridgedInstruction::ExplicitCopyAddrInst_isTakeOfSrc() const {
return getAs<swift::ExplicitCopyAddrInst>()->isTakeOfSrc();
}
bool BridgedInstruction::ExplicitCopyAddrInst_isInitializationOfDest() const {
return getAs<swift::ExplicitCopyAddrInst>()->isInitializationOfDest();
}
SwiftInt BridgedInstruction::MarkUninitializedInst_getKind() const {
return (SwiftInt)getAs<swift::MarkUninitializedInst>()->getMarkUninitializedKind();
}
SwiftInt BridgedInstruction::MarkUnresolvedNonCopyableValue_getCheckKind() const {
return (SwiftInt)getAs<swift::MarkUnresolvedNonCopyableValueInst>()->getCheckKind();
}
bool BridgedInstruction::MarkUnresolvedNonCopyableValue_isStrict() const {
return getAs<swift::MarkUnresolvedNonCopyableValueInst>()->isStrict();
}
void BridgedInstruction::RefCountingInst_setIsAtomic(bool isAtomic) const {
getAs<swift::RefCountingInst>()->setAtomicity(
isAtomic ? swift::RefCountingInst::Atomicity::Atomic
: swift::RefCountingInst::Atomicity::NonAtomic);
}
bool BridgedInstruction::RefCountingInst_getIsAtomic() const {
return getAs<swift::RefCountingInst>()->getAtomicity() == swift::RefCountingInst::Atomicity::Atomic;
}
SwiftInt BridgedInstruction::CondBranchInst_getNumTrueArgs() const {
return getAs<swift::CondBranchInst>()->getNumTrueArgs();
}
void BridgedInstruction::AllocRefInstBase_setIsStackAllocatable() const {
getAs<swift::AllocRefInstBase>()->setStackAllocatable();
}
bool BridgedInstruction::AllocRefInst_isBare() const {
return getAs<swift::AllocRefInst>()->isBare();
}
void BridgedInstruction::AllocRefInst_setIsBare() const {
getAs<swift::AllocRefInst>()->setBare(true);
}
void BridgedInstruction::TermInst_replaceBranchTarget(BridgedBasicBlock from, BridgedBasicBlock to) const {
getAs<swift::TermInst>()->replaceBranchTarget(from.unbridged(),
to.unbridged());
}
BridgedSubstitutionMap BridgedInstruction::KeyPathInst_getSubstitutionMap() const {
return getAs<swift::KeyPathInst>()->getSubstitutions();
}
bool BridgedInstruction::KeyPathInst_hasPattern() const {
return getAs<swift::KeyPathInst>()->hasPattern();
}
SwiftInt BridgedInstruction::KeyPathInst_getNumComponents() const {
if (swift::KeyPathPattern *pattern = getAs<swift::KeyPathInst>()->getPattern()) {
return (SwiftInt)pattern->getComponents().size();
}
return 0;
}
void BridgedInstruction::KeyPathInst_getReferencedFunctions(SwiftInt componentIdx,
KeyPathFunctionResults * _Nonnull results) const {
swift::KeyPathPattern *pattern = getAs<swift::KeyPathInst>()->getPattern();
const swift::KeyPathPatternComponent &comp = pattern->getComponents()[componentIdx];
results->numFunctions = 0;
comp.visitReferencedFunctionsAndMethods([results](swift::SILFunction *func) {
assert(results->numFunctions < KeyPathFunctionResults::maxFunctions);
results->functions[results->numFunctions++] = {func};
}, [](swift::SILDeclRef) {});
}
void BridgedInstruction::GlobalAddrInst_clearToken() const {
getAs<swift::GlobalAddrInst>()->clearToken();
}
bool BridgedInstruction::GlobalValueInst_isBare() const {
return getAs<swift::GlobalValueInst>()->isBare();
}
void BridgedInstruction::GlobalValueInst_setIsBare() const {
getAs<swift::GlobalValueInst>()->setBare(true);
}
void BridgedInstruction::LoadInst_setOwnership(SwiftInt ownership) const {
getAs<swift::LoadInst>()->setOwnershipQualifier((swift::LoadOwnershipQualifier)ownership);
}
void BridgedInstruction::CheckedCastBranch_updateSourceFormalTypeFromOperandLoweredType() const {
getAs<swift::CheckedCastBranchInst>()->updateSourceFormalTypeFromOperandLoweredType();
}
BridgedCanType BridgedInstruction::UnconditionalCheckedCast_getSourceFormalType() const {
return {getAs<swift::UnconditionalCheckedCastInst>()->getSourceFormalType()};
}
BridgedCanType BridgedInstruction::UnconditionalCheckedCast_getTargetFormalType() const {
return {getAs<swift::UnconditionalCheckedCastInst>()->getTargetFormalType()};
}
BridgedInstruction::CheckedCastInstOptions
BridgedInstruction::UnconditionalCheckedCast_getCheckedCastOptions() const {
return BridgedInstruction::CheckedCastInstOptions{
getAs<swift::UnconditionalCheckedCastInst>()->getCheckedCastOptions()
.getStorage()};
}
BridgedCanType BridgedInstruction::UnconditionalCheckedCastAddr_getSourceFormalType() const {
return {getAs<swift::UnconditionalCheckedCastAddrInst>()->getSourceFormalType()};
}
BridgedCanType BridgedInstruction::UnconditionalCheckedCastAddr_getTargetFormalType() const {
return {getAs<swift::UnconditionalCheckedCastAddrInst>()->getTargetFormalType()};
}
BridgedInstruction::CheckedCastInstOptions
BridgedInstruction::UnconditionalCheckedCastAddr_getCheckedCastOptions() const {
return BridgedInstruction::CheckedCastInstOptions{
getAs<swift::UnconditionalCheckedCastAddrInst>()->getCheckedCastOptions()
.getStorage()};
}
BridgedBasicBlock BridgedInstruction::CheckedCastBranch_getSuccessBlock() const {
return {getAs<swift::CheckedCastBranchInst>()->getSuccessBB()};
}
BridgedBasicBlock BridgedInstruction::CheckedCastBranch_getFailureBlock() const {
return {getAs<swift::CheckedCastBranchInst>()->getFailureBB()};
}
BridgedInstruction::CheckedCastInstOptions
BridgedInstruction::CheckedCastBranch_getCheckedCastOptions() const {
return BridgedInstruction::CheckedCastInstOptions{
getAs<swift::CheckedCastBranchInst>()->getCheckedCastOptions()
.getStorage()};
}
BridgedCanType BridgedInstruction::CheckedCastAddrBranch_getSourceFormalType() const {
return {getAs<swift::CheckedCastAddrBranchInst>()->getSourceFormalType()};
}
BridgedCanType BridgedInstruction::CheckedCastAddrBranch_getTargetFormalType() const {
return {getAs<swift::CheckedCastAddrBranchInst>()->getTargetFormalType()};
}
BridgedBasicBlock BridgedInstruction::CheckedCastAddrBranch_getSuccessBlock() const {
return {getAs<swift::CheckedCastAddrBranchInst>()->getSuccessBB()};
}
BridgedBasicBlock BridgedInstruction::CheckedCastAddrBranch_getFailureBlock() const {
return {getAs<swift::CheckedCastAddrBranchInst>()->getFailureBB()};
}
BridgedInstruction::CastConsumptionKind BridgedInstruction::CheckedCastAddrBranch_getConsumptionKind() const {
static_assert((int)BridgedInstruction::CastConsumptionKind::TakeAlways ==
(int)swift::CastConsumptionKind::TakeAlways);
static_assert((int)BridgedInstruction::CastConsumptionKind::TakeOnSuccess ==
(int)swift::CastConsumptionKind::TakeOnSuccess);
static_assert((int)BridgedInstruction::CastConsumptionKind::CopyOnSuccess ==
(int)swift::CastConsumptionKind::CopyOnSuccess);
return static_cast<BridgedInstruction::CastConsumptionKind>(
getAs<swift::CheckedCastAddrBranchInst>()->getConsumptionKind());
}
BridgedInstruction::CheckedCastInstOptions
BridgedInstruction::CheckedCastAddrBranch_getCheckedCastOptions() const {
return BridgedInstruction::CheckedCastInstOptions{
getAs<swift::CheckedCastAddrBranchInst>()->getCheckedCastOptions()
.getStorage()};
}
BridgedSubstitutionMap BridgedInstruction::ApplySite_getSubstitutionMap() const {
auto as = swift::ApplySite(unbridged());
return as.getSubstitutionMap();
}
BridgedCanType BridgedInstruction::ApplySite_getSubstitutedCalleeType() const {
auto as = swift::ApplySite(unbridged());
return as.getSubstCalleeType();
}
SwiftInt BridgedInstruction::ApplySite_getNumArguments() const {
return swift::ApplySite(unbridged()).getNumArguments();
}
bool BridgedInstruction::ApplySite_isCalleeNoReturn() const {
return swift::ApplySite(unbridged()).isCalleeNoReturn();
}
SwiftInt BridgedInstruction::FullApplySite_numIndirectResultArguments() const {
auto fas = swift::FullApplySite(unbridged());
return fas.getNumIndirectSILResults();
}
bool BridgedInstruction::ConvertFunctionInst_withoutActuallyEscaping() const {
return getAs<swift::ConvertFunctionInst>()->withoutActuallyEscaping();
}
BridgedCanType BridgedInstruction::TypeValueInst_getParamType() const {
return getAs<swift::TypeValueInst>()->getParamType();
}
//===----------------------------------------------------------------------===//
// VarDeclInst and DebugVariableInst
//===----------------------------------------------------------------------===//
static_assert(sizeof(swift::SILDebugVariable) <= sizeof(BridgedSILDebugVariable));
BridgedSILDebugVariable::BridgedSILDebugVariable(const swift::SILDebugVariable &var) {
new (&storage) swift::SILDebugVariable(var);
}
BridgedSILDebugVariable::BridgedSILDebugVariable(const BridgedSILDebugVariable &rhs) {
new (&storage) swift::SILDebugVariable(rhs.unbridge());
}
BridgedSILDebugVariable::~BridgedSILDebugVariable() {
reinterpret_cast<swift::SILDebugVariable *>(&storage)->~SILDebugVariable();
}
BridgedSILDebugVariable &BridgedSILDebugVariable::operator=(const BridgedSILDebugVariable &rhs) {
*reinterpret_cast<swift::SILDebugVariable *>(&storage) = rhs.unbridge();
return *this;
}
swift::SILDebugVariable BridgedSILDebugVariable::unbridge() const {
return *reinterpret_cast<const swift::SILDebugVariable *>(&storage);
}
OptionalBridgedDeclObj BridgedInstruction::DebugValue_getDecl() const {
return {getAs<swift::DebugValueInst>()->getDecl()};
}
OptionalBridgedDeclObj BridgedInstruction::AllocStack_getDecl() const {
return {getAs<swift::AllocStackInst>()->getDecl()};
}
OptionalBridgedDeclObj BridgedInstruction::AllocBox_getDecl() const {
return {getAs<swift::AllocBoxInst>()->getDecl()};
}
OptionalBridgedDeclObj BridgedInstruction::GlobalAddr_getDecl() const {
return {getAs<swift::GlobalAddrInst>()->getReferencedGlobal()->getDecl()};
}
OptionalBridgedDeclObj BridgedInstruction::RefElementAddr_getDecl() const {
return {getAs<swift::RefElementAddrInst>()->getField()};
}
bool BridgedInstruction::DebugValue_hasVarInfo() const {
return getAs<swift::DebugValueInst>()->getVarInfo().has_value();
}
BridgedSILDebugVariable BridgedInstruction::DebugValue_getVarInfo() const {
return BridgedSILDebugVariable(getAs<swift::DebugValueInst>()->getVarInfo().value());
}
bool BridgedInstruction::AllocStack_hasVarInfo() const {
return getAs<swift::AllocStackInst>()->getVarInfo().has_value();
}
BridgedSILDebugVariable BridgedInstruction::AllocStack_getVarInfo() const {
return BridgedSILDebugVariable(getAs<swift::AllocStackInst>()->getVarInfo().value());
}
bool BridgedInstruction::AllocBox_hasVarInfo() const {
return getAs<swift::AllocBoxInst>()->getVarInfo().has_value();
}
BridgedSILDebugVariable BridgedInstruction::AllocBox_getVarInfo() const {
return BridgedSILDebugVariable(getAs<swift::AllocBoxInst>()->getVarInfo().value());
}
//===----------------------------------------------------------------------===//
// OptionalBridgedInstruction
//===----------------------------------------------------------------------===//
swift::SILInstruction * _Nullable OptionalBridgedInstruction::unbridged() const {
if (!obj)
return nullptr;
return llvm::cast<swift::SILInstruction>(static_cast<swift::SILNode *>(obj)->castToInstruction());
}
//===----------------------------------------------------------------------===//
// BridgedBasicBlock
//===----------------------------------------------------------------------===//
BridgedBasicBlock::BridgedBasicBlock(swift::SILBasicBlock * _Nonnull block)
: obj(block) {}
swift::SILBasicBlock * _Nonnull BridgedBasicBlock::unbridged() const {
return static_cast<swift::SILBasicBlock *>(obj);
}
OptionalBridgedBasicBlock BridgedBasicBlock::getNext() const {
auto iter = std::next(unbridged()->getIterator());
if (iter == unbridged()->getParent()->end())
return {nullptr};
return {&*iter};
}
OptionalBridgedBasicBlock BridgedBasicBlock::getPrevious() const {
auto iter = std::next(unbridged()->getReverseIterator());
if (iter == unbridged()->getParent()->rend())
return {nullptr};
return {&*iter};
}
BridgedFunction BridgedBasicBlock::getFunction() const {
return {unbridged()->getParent()};
}
OptionalBridgedInstruction BridgedBasicBlock::getFirstInst() const {
if (unbridged()->empty())
return {nullptr};
return {unbridged()->front().asSILNode()};
}
OptionalBridgedInstruction BridgedBasicBlock::getLastInst() const {
if (unbridged()->empty())
return {nullptr};
return {unbridged()->back().asSILNode()};
}
SwiftInt BridgedBasicBlock::getNumArguments() const {
return unbridged()->getNumArguments();
}
BridgedArgument BridgedBasicBlock::getArgument(SwiftInt index) const {
return {unbridged()->getArgument(index)};
}
BridgedArgument BridgedBasicBlock::addBlockArgument(BridgedType type, BridgedValue::Ownership ownership) const {
return {unbridged()->createPhiArgument(
type.unbridged(), BridgedValue::unbridge(ownership))};
}
BridgedArgument BridgedBasicBlock::addFunctionArgument(BridgedType type) const {
return {unbridged()->createFunctionArgument(type.unbridged())};
}
BridgedArgument BridgedBasicBlock::insertFunctionArgument(SwiftInt atPosition, BridgedType type,
BridgedValue::Ownership ownership,
OptionalBridgedDeclObj decl) const {
return {unbridged()->insertFunctionArgument((unsigned)atPosition, type.unbridged(),
BridgedValue::unbridge(ownership),
decl.getAs<swift::ValueDecl>())};
}
void BridgedBasicBlock::eraseArgument(SwiftInt index) const {
unbridged()->eraseArgument(index);
}
void BridgedBasicBlock::moveAllInstructionsToBegin(BridgedBasicBlock dest) const {
dest.unbridged()->spliceAtBegin(unbridged());
}
void BridgedBasicBlock::moveAllInstructionsToEnd(BridgedBasicBlock dest) const {
dest.unbridged()->spliceAtEnd(unbridged());
}
void BridgedBasicBlock::moveArgumentsTo(BridgedBasicBlock dest) const {
dest.unbridged()->moveArgumentList(unbridged());
}
OptionalBridgedSuccessor BridgedBasicBlock::getFirstPred() const {
return {unbridged()->pred_begin().getSuccessorRef()};
}
swift::SILBasicBlock * _Nullable OptionalBridgedBasicBlock::unbridged() const {
return obj ? static_cast<swift::SILBasicBlock *>(obj) : nullptr;
}
//===----------------------------------------------------------------------===//
// BridgedSuccessor
//===----------------------------------------------------------------------===//
OptionalBridgedSuccessor BridgedSuccessor::getNext() const {
return {succ->getNext()};
}
BridgedBasicBlock BridgedSuccessor::getTargetBlock() const {
return succ->getBB();
}
BridgedInstruction BridgedSuccessor::getContainingInst() const {
return {succ->getContainingInst()};
}
BridgedSuccessor OptionalBridgedSuccessor::advancedBy(SwiftInt index) const {
return {succ + index};
}
//===----------------------------------------------------------------------===//
// BridgedDeclRef
//===----------------------------------------------------------------------===//
static_assert(sizeof(BridgedDeclRef) >= sizeof(swift::SILDeclRef),
"BridgedDeclRef has wrong size");
BridgedDeclRef::BridgedDeclRef(swift::SILDeclRef declRef) {
*reinterpret_cast<swift::SILDeclRef *>(&storage) = declRef;
}
swift::SILDeclRef BridgedDeclRef::unbridged() const {
return *reinterpret_cast<const swift::SILDeclRef *>(&storage);
}
bool BridgedDeclRef::isEqualTo(BridgedDeclRef rhs) const {
return unbridged() == rhs.unbridged();
}
BridgedLocation BridgedDeclRef::getLocation() const {
return swift::SILDebugLocation(unbridged().getDecl(), nullptr);
}
BridgedDeclObj BridgedDeclRef::getDecl() const {
return {unbridged().getDecl()};
}
BridgedDiagnosticArgument BridgedDeclRef::asDiagnosticArgument() const {
return swift::DiagnosticArgument(unbridged().getDecl()->getName());
}
//===----------------------------------------------------------------------===//
// BridgedVTable
//===----------------------------------------------------------------------===//
BridgedVTableEntry::BridgedVTableEntry(const swift::SILVTableEntry &entry) {
*reinterpret_cast<swift::SILVTableEntry *>(&storage) = entry;
}
const swift::SILVTableEntry &BridgedVTableEntry::unbridged() const {
return *reinterpret_cast<const swift::SILVTableEntry *>(&storage);
}
BridgedVTableEntry::Kind BridgedVTableEntry::getKind() const {
return (Kind)unbridged().getKind();
}
BRIDGED_INLINE bool BridgedVTableEntry::isNonOverridden() const {
return unbridged().isNonOverridden();
}
BridgedDeclRef BridgedVTableEntry::getMethodDecl() const {
return unbridged().getMethod();
}
BridgedFunction BridgedVTableEntry::getImplementation() const {
return {unbridged().getImplementation()};
}
BridgedVTableEntry BridgedVTableEntry::create(Kind kind, bool nonOverridden,
BridgedDeclRef methodDecl, BridgedFunction implementation) {
return swift::SILVTableEntry(methodDecl.unbridged(), implementation.getFunction(),
(swift::SILVTableEntry::Kind)kind, nonOverridden);
}
SwiftInt BridgedVTable::getNumEntries() const {
return SwiftInt(vTable->getEntries().size());
}
BridgedVTableEntry BridgedVTable::getEntry(SwiftInt index) const {
return BridgedVTableEntry(vTable->getEntries()[index]);
}
BridgedDeclObj BridgedVTable::getClass() const {
return vTable->getClass();
}
OptionalBridgedVTableEntry BridgedVTable::lookupMethod(BridgedDeclRef member) const {
if (vTable->getEntries().empty()) {
return OptionalBridgedVTableEntry();
}
swift::SILModule &mod = vTable->getEntries()[0].getImplementation()->getModule();
if (auto entry = vTable->getEntry(mod, member.unbridged()))
return BridgedVTableEntry(entry.value());
return OptionalBridgedVTableEntry();
}
BridgedType BridgedVTable::getSpecializedClassType() const {
return {vTable->getClassType()};
}
void BridgedVTable::replaceEntries(BridgedArrayRef bridgedEntries) const {
llvm::SmallVector<swift::SILVTableEntry, 8> entries;
for (const BridgedVTableEntry &e : bridgedEntries.unbridged<BridgedVTableEntry>()) {
entries.push_back(e.unbridged());
}
vTable->replaceEntries(entries);
}
//===----------------------------------------------------------------------===//
// BridgedWitnessTable, BridgedDefaultWitnessTable
//===----------------------------------------------------------------------===//
BridgedWitnessTableEntry::Kind BridgedWitnessTableEntry::getKind() const {
return (Kind)unbridged().getKind();
}
BridgedDeclRef BridgedWitnessTableEntry::getMethodRequirement() const {
return unbridged().getMethodWitness().Requirement;
}
OptionalBridgedFunction BridgedWitnessTableEntry::getMethodWitness() const {
return {unbridged().getMethodWitness().Witness};
}
BridgedDeclObj BridgedWitnessTableEntry::getAssociatedTypeRequirement() const {
return {unbridged().getAssociatedTypeWitness().Requirement};
}
BridgedCanType BridgedWitnessTableEntry::getAssociatedTypeWitness() const {
return unbridged().getAssociatedTypeWitness().Witness;
}
BridgedCanType BridgedWitnessTableEntry::getAssociatedConformanceRequirement() const {
return unbridged().getAssociatedConformanceWitness().Requirement;
}
BridgedConformance BridgedWitnessTableEntry::getAssociatedConformanceWitness() const {
return {unbridged().getAssociatedConformanceWitness().Witness};
}
BridgedDeclObj BridgedWitnessTableEntry::getBaseProtocolRequirement() const {
return {unbridged().getBaseProtocolWitness().Requirement};
}
BridgedConformance BridgedWitnessTableEntry::getBaseProtocolWitness() const {
return swift::ProtocolConformanceRef(unbridged().getBaseProtocolWitness().Witness);
}
BridgedWitnessTableEntry BridgedWitnessTableEntry::createInvalid() {
return bridge(swift::SILWitnessTable::Entry());
}
BridgedWitnessTableEntry BridgedWitnessTableEntry::createMethod(BridgedDeclRef requirement,
OptionalBridgedFunction witness) {
return bridge(swift::SILWitnessTable::Entry(
swift::SILWitnessTable::MethodWitness{requirement.unbridged(), witness.getFunction()}));
}
BridgedWitnessTableEntry BridgedWitnessTableEntry::createAssociatedType(BridgedDeclObj requirement,
BridgedCanType witness) {
return bridge(swift::SILWitnessTable::Entry(
swift::SILWitnessTable::AssociatedTypeWitness{requirement.getAs<swift::AssociatedTypeDecl>(),
witness.unbridged()}));
}
BridgedWitnessTableEntry BridgedWitnessTableEntry::createAssociatedConformance(BridgedCanType requirement,
BridgedConformance witness) {
return bridge(swift::SILWitnessTable::Entry(
swift::SILWitnessTable::AssociatedConformanceWitness{requirement.unbridged(),
witness.unbridged()}));
}
BridgedWitnessTableEntry BridgedWitnessTableEntry::createBaseProtocol(BridgedDeclObj requirement,
BridgedConformance witness) {
return bridge(swift::SILWitnessTable::Entry(
swift::SILWitnessTable::BaseProtocolWitness{requirement.getAs<swift::ProtocolDecl>(),
witness.unbridged().getConcrete()}));
}
SwiftInt BridgedWitnessTable::getNumEntries() const {
return SwiftInt(table->getEntries().size());
}
BridgedWitnessTableEntry BridgedWitnessTable::getEntry(SwiftInt index) const {
return BridgedWitnessTableEntry::bridge(table->getEntries()[index]);
}
bool BridgedWitnessTable::isDeclaration() const {
return table->isDeclaration();
}
bool BridgedWitnessTable::isSpecialized() const {
return table->isSpecialized();
}
SwiftInt BridgedDefaultWitnessTable::getNumEntries() const {
return SwiftInt(table->getEntries().size());
}
BridgedWitnessTableEntry BridgedDefaultWitnessTable::getEntry(SwiftInt index) const {
return BridgedWitnessTableEntry::bridge(table->getEntries()[index]);
}
//===----------------------------------------------------------------------===//
// ConstExprFunctionState
//===----------------------------------------------------------------------===//
BridgedConstExprFunctionState BridgedConstExprFunctionState::create() {
auto allocator = new swift::SymbolicValueBumpAllocator();
auto evaluator = new swift::ConstExprEvaluator(*allocator, 0);
auto numEvaluatedSILInstructions = new unsigned int(0);
auto state = new swift::ConstExprFunctionState(*evaluator, nullptr, {},
*numEvaluatedSILInstructions, true);
return {state, allocator, evaluator, numEvaluatedSILInstructions};
}
bool BridgedConstExprFunctionState::isConstantValue(BridgedValue bridgedValue) {
auto value = bridgedValue.getSILValue();
auto symbolicValue = state->getConstantValue(value);
return symbolicValue.isConstant();
}
void BridgedConstExprFunctionState::deinitialize() {
delete state;
delete numEvaluatedSILInstructions;
delete constantEvaluator;
delete allocator;
}
//===----------------------------------------------------------------------===//
// BridgedBuilder
//===----------------------------------------------------------------------===//
swift::SILBuilder BridgedBuilder::unbridged() const {
switch (insertAt) {
case BridgedBuilder::InsertAt::beforeInst:
return swift::SILBuilder(BridgedInstruction(insertionObj).unbridged(),
loc.getLoc().getScope());
case BridgedBuilder::InsertAt::endOfBlock:
return swift::SILBuilder(BridgedBasicBlock(insertionObj).unbridged(),
loc.getLoc().getScope());
case BridgedBuilder::InsertAt::startOfFunction:
return swift::SILBuilder(BridgedFunction(insertionObj).getFunction()->getEntryBlock(),
loc.getLoc().getScope());
case BridgedBuilder::InsertAt::intoGlobal:
return swift::SILBuilder(BridgedGlobalVar(insertionObj).getGlobal());
}
}
swift::SILLocation BridgedBuilder::regularLoc() const {
auto l = loc.getLoc().getLocation();
switch (l.getKind()) {
case swift::SILLocation::ReturnKind:
case swift::SILLocation::ImplicitReturnKind:
case swift::SILLocation::ArtificialUnreachableKind:
return swift::RegularLocation(l);
default:
return l;
}
}
swift::SILLocation BridgedBuilder::returnLoc() const {
auto l = loc.getLoc().getLocation();
switch (l.getKind()) {
case swift::SILLocation::ArtificialUnreachableKind:
return swift::RegularLocation(l);
default:
return l;
}
}
BridgedInstruction BridgedBuilder::createBuiltin(BridgedStringRef name, BridgedType type,
BridgedSubstitutionMap subs,
BridgedValueArray arguments) const {
llvm::SmallVector<swift::SILValue, 16> argValues;
auto builder = unbridged();
auto ident = builder.getASTContext().getIdentifier(name.unbridged());
return {builder.createBuiltin(
regularLoc(), ident, type.unbridged(),
subs.unbridged(), arguments.getValues(argValues))};
}
BridgedInstruction BridgedBuilder::createBuiltinBinaryFunction(BridgedStringRef name,
BridgedType operandType, BridgedType resultType,
BridgedValueArray arguments) const {
llvm::SmallVector<swift::SILValue, 16> argValues;
return {unbridged().createBuiltinBinaryFunction(
regularLoc(), name.unbridged(), operandType.unbridged(),
resultType.unbridged(), arguments.getValues(argValues))};
}
BridgedInstruction BridgedBuilder::createCondFail(BridgedValue condition, BridgedStringRef message) const {
return {unbridged().createCondFail(regularLoc(), condition.getSILValue(),
message.unbridged())};
}
BridgedInstruction BridgedBuilder::createIntegerLiteral(BridgedType type, SwiftInt value) const {
return {
unbridged().createIntegerLiteral(regularLoc(), type.unbridged(), value)};
}
BridgedInstruction BridgedBuilder::createAllocRef(BridgedType type,
bool objc, bool canAllocOnStack, bool isBare,
BridgedSILTypeArray elementTypes, BridgedValueArray elementCountOperands) const {
llvm::SmallVector<swift::SILValue, 16> elementCountOperandsValues;
return {unbridged().createAllocRef(
regularLoc(), type.unbridged(), objc, canAllocOnStack, isBare,
elementTypes.typeArray.unbridged<swift::SILType>(),
elementCountOperands.getValues(elementCountOperandsValues)
)};
}
BridgedInstruction BridgedBuilder::createAllocStack(BridgedType type,
BridgedSILDebugVariable debugVar,
bool hasDynamicLifetime,
bool isLexical,
bool isFromVarDecl,
bool wasMoved) const {
return {unbridged().createAllocStack(
regularLoc(), type.unbridged(), debugVar.unbridge(),
swift::HasDynamicLifetime_t(hasDynamicLifetime),
swift::IsLexical_t(isLexical), swift::IsFromVarDecl_t(isFromVarDecl),
swift::UsesMoveableValueDebugInfo_t(wasMoved), /*skipVarDeclAssert=*/ true)};
}
BridgedInstruction BridgedBuilder::createAllocStack(BridgedType type,
bool hasDynamicLifetime,
bool isLexical,
bool isFromVarDecl,
bool wasMoved) const {
return {unbridged().createAllocStack(
regularLoc(), type.unbridged(), std::nullopt,
swift::HasDynamicLifetime_t(hasDynamicLifetime),
swift::IsLexical_t(isLexical), swift::IsFromVarDecl_t(isFromVarDecl),
swift::UsesMoveableValueDebugInfo_t(wasMoved), /*skipVarDeclAssert=*/ true)};
}
BridgedInstruction BridgedBuilder::createDeallocStack(BridgedValue operand) const {
return {unbridged().createDeallocStack(regularLoc(), operand.getSILValue())};
}
BridgedInstruction BridgedBuilder::createDeallocStackRef(BridgedValue operand) const {
return {
unbridged().createDeallocStackRef(regularLoc(), operand.getSILValue())};
}
BridgedInstruction BridgedBuilder::createAddressToPointer(BridgedValue address, BridgedType pointerTy,
bool needsStackProtection) const {
return {unbridged().createAddressToPointer(regularLoc(), address.getSILValue(), pointerTy.unbridged(),
needsStackProtection)};
}
BridgedInstruction BridgedBuilder::createPointerToAddress(BridgedValue pointer, BridgedType addressTy,
bool isStrict, bool isInvariant,
uint64_t alignment) const {
return {unbridged().createPointerToAddress(regularLoc(), pointer.getSILValue(), addressTy.unbridged(),
isStrict, isInvariant,
alignment == 0 ? llvm::MaybeAlign() : llvm::Align(alignment))};
}
BridgedInstruction BridgedBuilder::createIndexAddr(BridgedValue base, BridgedValue index,
bool needsStackProtection) const {
return {unbridged().createIndexAddr(regularLoc(), base.getSILValue(), index.getSILValue(),
needsStackProtection)};
}
BridgedInstruction BridgedBuilder::createUncheckedRefCast(BridgedValue op, BridgedType type) const {
return {unbridged().createUncheckedRefCast(regularLoc(), op.getSILValue(),
type.unbridged())};
}
BridgedInstruction BridgedBuilder::createUncheckedAddrCast(BridgedValue op, BridgedType type) const {
return {unbridged().createUncheckedAddrCast(regularLoc(), op.getSILValue(),
type.unbridged())};
}
BridgedInstruction BridgedBuilder::createUpcast(BridgedValue op, BridgedType type) const {
return {unbridged().createUpcast(regularLoc(), op.getSILValue(),
type.unbridged())};
}
BridgedInstruction BridgedBuilder::createCheckedCastAddrBranch(
BridgedValue source, BridgedCanType sourceFormalType,
BridgedValue destination, BridgedCanType targetFormalType,
BridgedInstruction::CheckedCastInstOptions options,
BridgedInstruction::CastConsumptionKind consumptionKind,
BridgedBasicBlock successBlock, BridgedBasicBlock failureBlock) const
{
return {unbridged().createCheckedCastAddrBranch(
regularLoc(),
swift::CheckedCastInstOptions(options.storage),
(swift::CastConsumptionKind)consumptionKind,
source.getSILValue(), sourceFormalType.unbridged(),
destination.getSILValue(), targetFormalType.unbridged(),
successBlock.unbridged(), failureBlock.unbridged())};
}
BridgedInstruction BridgedBuilder::createUnconditionalCheckedCastAddr(
BridgedInstruction::CheckedCastInstOptions options,
BridgedValue source, BridgedCanType sourceFormalType,
BridgedValue destination, BridgedCanType targetFormalType) const
{
return {unbridged().createUnconditionalCheckedCastAddr(
regularLoc(),
swift::CheckedCastInstOptions(options.storage),
source.getSILValue(), sourceFormalType.unbridged(),
destination.getSILValue(), targetFormalType.unbridged())};
}
BridgedInstruction BridgedBuilder::createLoad(BridgedValue op, SwiftInt ownership) const {
return {unbridged().createLoad(regularLoc(), op.getSILValue(),
(swift::LoadOwnershipQualifier)ownership)};
}
BridgedInstruction BridgedBuilder::createUncheckedOwnershipConversion(BridgedValue op,
BridgedValue::Ownership ownership) const {
return {unbridged().createUncheckedOwnershipConversion(regularLoc(), op.getSILValue(),
BridgedValue::unbridge(ownership))};
}
BridgedInstruction BridgedBuilder::createLoadBorrow(BridgedValue op) const {
return {unbridged().createLoadBorrow(regularLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createBeginDeallocRef(BridgedValue reference, BridgedValue allocation) const {
return {unbridged().createBeginDeallocRef(
regularLoc(), reference.getSILValue(), allocation.getSILValue())};
}
BridgedInstruction BridgedBuilder::createEndInitLetRef(BridgedValue op) const {
return {unbridged().createEndInitLetRef(regularLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createRetainValue(BridgedValue op) const {
auto b = unbridged();
return {b.createRetainValue(regularLoc(), op.getSILValue(),
b.getDefaultAtomicity())};
}
BridgedInstruction BridgedBuilder::createReleaseValue(BridgedValue op) const {
auto b = unbridged();
return {b.createReleaseValue(regularLoc(), op.getSILValue(),
b.getDefaultAtomicity())};
}
BridgedInstruction BridgedBuilder::createStrongRetain(BridgedValue op) const {
auto b = unbridged();
return {b.createStrongRetain(regularLoc(), op.getSILValue(), b.getDefaultAtomicity())};
}
BridgedInstruction BridgedBuilder::createStrongRelease(BridgedValue op) const {
auto b = unbridged();
return {b.createStrongRelease(regularLoc(), op.getSILValue(), b.getDefaultAtomicity())};
}
BridgedInstruction BridgedBuilder::createUnownedRetain(BridgedValue op) const {
auto b = unbridged();
return {b.createUnownedRetain(regularLoc(), op.getSILValue(), b.getDefaultAtomicity())};
}
BridgedInstruction BridgedBuilder::createUnownedRelease(BridgedValue op) const {
auto b = unbridged();
return {b.createUnownedRelease(regularLoc(), op.getSILValue(), b.getDefaultAtomicity())};
}
BridgedInstruction BridgedBuilder::createFunctionRef(BridgedFunction function) const {
return {unbridged().createFunctionRef(regularLoc(), function.getFunction())};
}
BridgedInstruction BridgedBuilder::createCopyValue(BridgedValue op) const {
return {unbridged().createCopyValue(regularLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createBeginBorrow(BridgedValue op,
bool isLexical,
bool hasPointerEscape,
bool isFromVarDecl) const {
return {unbridged().createBeginBorrow(regularLoc(), op.getSILValue(),
swift::IsLexical_t(isLexical),
swift::HasPointerEscape_t(hasPointerEscape),
swift::IsFromVarDecl_t(isFromVarDecl))};
}
BridgedInstruction BridgedBuilder::createBorrowedFrom(BridgedValue borrowedValue,
BridgedValueArray enclosingValues) const {
llvm::SmallVector<swift::SILValue, 16> evs;
return {unbridged().createBorrowedFrom(regularLoc(), borrowedValue.getSILValue(),
enclosingValues.getValues(evs))};
}
BridgedInstruction BridgedBuilder::createEndBorrow(BridgedValue op) const {
return {unbridged().createEndBorrow(regularLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createCopyAddr(BridgedValue from, BridgedValue to,
bool takeSource, bool initializeDest) const {
return {unbridged().createCopyAddr(
regularLoc(), from.getSILValue(), to.getSILValue(),
swift::IsTake_t(takeSource), swift::IsInitialization_t(initializeDest))};
}
BridgedInstruction BridgedBuilder::createDestroyValue(BridgedValue op) const {
return {unbridged().createDestroyValue(regularLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createDestroyAddr(BridgedValue op) const {
return {unbridged().createDestroyAddr(regularLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createEndLifetime(BridgedValue op) const {
return {unbridged().createEndLifetime(regularLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createDebugValue(BridgedValue op,
BridgedSILDebugVariable var) const {
return {unbridged().createDebugValue(regularLoc(), op.getSILValue(), var.unbridge())};
}
BridgedInstruction BridgedBuilder::createDebugStep() const {
return {unbridged().createDebugStep(regularLoc())};
}
BridgedInstruction BridgedBuilder::createApply(BridgedValue function, BridgedSubstitutionMap subMap,
BridgedValueArray arguments, bool isNonThrowing, bool isNonAsync,
BridgedGenericSpecializationInformation specInfo) const {
llvm::SmallVector<swift::SILValue, 16> argValues;
swift::ApplyOptions applyOpts;
if (isNonThrowing) { applyOpts |= swift::ApplyFlags::DoesNotThrow; }
if (isNonAsync) { applyOpts |= swift::ApplyFlags::DoesNotAwait; }
return {unbridged().createApply(
regularLoc(), function.getSILValue(), subMap.unbridged(),
arguments.getValues(argValues), applyOpts, specInfo.data)};
}
BridgedInstruction BridgedBuilder::createTryApply(BridgedValue function, BridgedSubstitutionMap subMap,
BridgedValueArray arguments,
BridgedBasicBlock normalBB, BridgedBasicBlock errorBB,
bool isNonAsync,
BridgedGenericSpecializationInformation specInfo) const {
llvm::SmallVector<swift::SILValue, 16> argValues;
swift::ApplyOptions applyOpts;
if (isNonAsync) { applyOpts |= swift::ApplyFlags::DoesNotAwait; }
return {unbridged().createTryApply(
regularLoc(), function.getSILValue(), subMap.unbridged(),
arguments.getValues(argValues), normalBB.unbridged(), errorBB.unbridged(), applyOpts, specInfo.data)};
}
BridgedInstruction BridgedBuilder::createBeginApply(BridgedValue function, BridgedSubstitutionMap subMap,
BridgedValueArray arguments, bool isNonThrowing, bool isNonAsync,
BridgedGenericSpecializationInformation specInfo) const {
llvm::SmallVector<swift::SILValue, 16> argValues;
swift::ApplyOptions applyOpts;
if (isNonThrowing) { applyOpts |= swift::ApplyFlags::DoesNotThrow; }
if (isNonAsync) { applyOpts |= swift::ApplyFlags::DoesNotAwait; }
return {unbridged().createBeginApply(
regularLoc(), function.getSILValue(), subMap.unbridged(),
arguments.getValues(argValues), applyOpts, specInfo.data)};
}
BridgedInstruction BridgedBuilder::createWitnessMethod(BridgedCanType lookupType,
BridgedConformance conformance,
BridgedDeclRef member, BridgedType methodType) const {
return {unbridged().createWitnessMethod(regularLoc(), lookupType.unbridged(), conformance.unbridged(),
member.unbridged(), methodType.unbridged())};
}
BridgedInstruction BridgedBuilder::createReturn(BridgedValue op) const {
return {unbridged().createReturn(returnLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createThrow(BridgedValue op) const {
return {unbridged().createThrow(regularLoc(), op.getSILValue())};
}
BridgedInstruction BridgedBuilder::createUncheckedEnumData(BridgedValue enumVal, SwiftInt caseIdx,
BridgedType resultType) const {
swift::SILValue en = enumVal.getSILValue();
return {unbridged().createUncheckedEnumData(
regularLoc(), enumVal.getSILValue(),
en->getType().getEnumElement(caseIdx), resultType.unbridged())};
}
BridgedInstruction BridgedBuilder::createUncheckedTakeEnumDataAddr(BridgedValue enumAddr, SwiftInt caseIdx) const {
swift::SILValue en = enumAddr.getSILValue();
return {unbridged().createUncheckedTakeEnumDataAddr(regularLoc(), en, en->getType().getEnumElement(caseIdx))};
}
BridgedInstruction BridgedBuilder::createInitEnumDataAddr(BridgedValue enumAddr,
SwiftInt caseIdx,
BridgedType type) const {
swift::SILValue en = enumAddr.getSILValue();
return {unbridged().createInitEnumDataAddr(regularLoc(), en, en->getType().getEnumElement(caseIdx),
type.unbridged())};
}
BridgedInstruction BridgedBuilder::createEnum(SwiftInt caseIdx, OptionalBridgedValue payload,
BridgedType resultType) const {
swift::EnumElementDecl *caseDecl =
resultType.unbridged().getEnumElement(caseIdx);
swift::SILValue pl = payload.getSILValue();
return {unbridged().createEnum(regularLoc(), pl, caseDecl,
resultType.unbridged())};
}
BridgedInstruction BridgedBuilder::createThinToThickFunction(BridgedValue fn, BridgedType resultType) const {
return {unbridged().createThinToThickFunction(regularLoc(), fn.getSILValue(),
resultType.unbridged())};
}
BridgedInstruction BridgedBuilder::createPartialApply(BridgedValue funcRef,
BridgedValueArray bridgedCapturedArgs,
BridgedArgumentConvention calleeConvention,
BridgedSubstitutionMap bridgedSubstitutionMap,
bool hasUnknownIsolation,
bool isOnStack) const {
llvm::SmallVector<swift::SILValue, 8> capturedArgs;
return {unbridged().createPartialApply(
regularLoc(), funcRef.getSILValue(), bridgedSubstitutionMap.unbridged(),
bridgedCapturedArgs.getValues(capturedArgs),
getParameterConvention(calleeConvention),
hasUnknownIsolation ? swift::SILFunctionTypeIsolation::forUnknown()
: swift::SILFunctionTypeIsolation::forErased(),
isOnStack ? swift::PartialApplyInst::OnStack
: swift::PartialApplyInst::NotOnStack)};
}
BridgedInstruction BridgedBuilder::createBranch(BridgedBasicBlock destBlock, BridgedValueArray arguments) const {
llvm::SmallVector<swift::SILValue, 16> argValues;
return {unbridged().createBranch(regularLoc(), destBlock.unbridged(),
arguments.getValues(argValues))};
}
BridgedInstruction BridgedBuilder::createCondBranch(BridgedValue condition,
BridgedBasicBlock trueBlock,
BridgedBasicBlock falseBlock) const {
return {unbridged().createCondBranch(regularLoc(), condition.getSILValue(), trueBlock.unbridged(),
falseBlock.unbridged())};
}
BridgedInstruction BridgedBuilder::createUnreachable() const {
return {unbridged().createUnreachable(loc.getLoc().getLocation())};
}
BridgedInstruction BridgedBuilder::createObject(BridgedType type,
BridgedValueArray arguments,
SwiftInt numBaseElements) const {
llvm::SmallVector<swift::SILValue, 16> argValues;
return {unbridged().createObject(
swift::ArtificialUnreachableLocation(), type.unbridged(),
arguments.getValues(argValues), numBaseElements)};
}
BridgedInstruction BridgedBuilder::createVector(BridgedValueArray arguments) const {
llvm::SmallVector<swift::SILValue, 16> argValues;
return {unbridged().createVector(swift::ArtificialUnreachableLocation(), arguments.getValues(argValues))};
}
BridgedInstruction BridgedBuilder::createVectorBaseAddr(BridgedValue vector) const {
return {unbridged().createVectorBaseAddr(regularLoc(), vector.getSILValue())};
}
BridgedInstruction BridgedBuilder::createGlobalAddr(BridgedGlobalVar global,
OptionalBridgedValue dependencyToken) const {
return {unbridged().createGlobalAddr(regularLoc(), global.getGlobal(), dependencyToken.getSILValue())};
}
BridgedInstruction BridgedBuilder::createGlobalValue(BridgedGlobalVar global, bool isBare) const {
return {
unbridged().createGlobalValue(regularLoc(), global.getGlobal(), isBare)};
}
BridgedInstruction BridgedBuilder::createStruct(BridgedType type, BridgedValueArray elements) const {
llvm::SmallVector<swift::SILValue, 16> elementValues;
return {unbridged().createStruct(regularLoc(), type.unbridged(),
elements.getValues(elementValues))};
}
BridgedInstruction BridgedBuilder::createStructExtract(BridgedValue str, SwiftInt fieldIndex) const {
swift::SILValue v = str.getSILValue();
return {unbridged().createStructExtract(
regularLoc(), v, v->getType().getFieldDecl(fieldIndex))};
}
BridgedInstruction BridgedBuilder::createStructElementAddr(BridgedValue addr, SwiftInt fieldIndex) const {
swift::SILValue v = addr.getSILValue();
return {unbridged().createStructElementAddr(
regularLoc(), v, v->getType().getFieldDecl(fieldIndex))};
}
BridgedInstruction BridgedBuilder::createDestructureStruct(BridgedValue str) const {
return {unbridged().createDestructureStruct(regularLoc(), str.getSILValue())};
}
BridgedInstruction BridgedBuilder::createTuple(BridgedType type, BridgedValueArray elements) const {
llvm::SmallVector<swift::SILValue, 16> elementValues;
return {unbridged().createTuple(regularLoc(), type.unbridged(),
elements.getValues(elementValues))};
}
BridgedInstruction BridgedBuilder::createTupleExtract(BridgedValue str, SwiftInt elementIndex) const {
swift::SILValue v = str.getSILValue();
return {unbridged().createTupleExtract(regularLoc(), v, elementIndex)};
}
BridgedInstruction BridgedBuilder::createTupleElementAddr(BridgedValue addr, SwiftInt elementIndex) const {
swift::SILValue v = addr.getSILValue();
return {unbridged().createTupleElementAddr(regularLoc(), v, elementIndex)};
}
BridgedInstruction BridgedBuilder::createDestructureTuple(BridgedValue str) const {
return {unbridged().createDestructureTuple(regularLoc(), str.getSILValue())};
}
BridgedInstruction BridgedBuilder::createProjectBox(BridgedValue box, SwiftInt fieldIdx) const {
return {unbridged().createProjectBox(regularLoc(), box.getSILValue(), (unsigned)fieldIdx)};
}
BridgedInstruction BridgedBuilder::createStore(BridgedValue src, BridgedValue dst,
SwiftInt ownership) const {
return {unbridged().createStore(regularLoc(), src.getSILValue(),
dst.getSILValue(),
(swift::StoreOwnershipQualifier)ownership)};
}
BridgedInstruction BridgedBuilder::createInitExistentialRef(BridgedValue instance,
BridgedType type,
BridgedCanType formalConcreteType,
BridgedConformanceArray conformances) const {
return {unbridged().createInitExistentialRef(
regularLoc(), type.unbridged(), formalConcreteType.unbridged(),
instance.getSILValue(), conformances.pcArray.unbridged<swift::ProtocolConformanceRef>())};
}
BridgedInstruction BridgedBuilder::createInitExistentialMetatype(BridgedValue metatype,
BridgedType existentialType,
BridgedConformanceArray conformances) const {
return {unbridged().createInitExistentialMetatype(
regularLoc(), metatype.getSILValue(), existentialType.unbridged(),
conformances.pcArray.unbridged<swift::ProtocolConformanceRef>())};
}
BridgedInstruction BridgedBuilder::createMetatype(BridgedCanType instanceType,
BridgedASTType::MetatypeRepresentation representation) const {
auto *mt =
swift::MetatypeType::get(instanceType.unbridged(),
(swift::MetatypeRepresentation)representation);
auto t = swift::SILType::getPrimitiveObjectType(swift::CanType(mt));
return {unbridged().createMetatype(regularLoc(), t)};
}
BridgedInstruction BridgedBuilder::createEndCOWMutation(BridgedValue instance, bool keepUnique) const {
return {unbridged().createEndCOWMutation(regularLoc(), instance.getSILValue(),
keepUnique)};
}
BridgedInstruction
BridgedBuilder::createEndCOWMutationAddr(BridgedValue instance) const {
return {unbridged().createEndCOWMutationAddr(regularLoc(),
instance.getSILValue())};
}
BridgedInstruction BridgedBuilder::createMarkDependence(BridgedValue value, BridgedValue base, BridgedInstruction::MarkDependenceKind kind) const {
return {unbridged().createMarkDependence(regularLoc(), value.getSILValue(), base.getSILValue(), swift::MarkDependenceKind(kind))};
}
BridgedInstruction BridgedBuilder::createMarkDependenceAddr(BridgedValue value, BridgedValue base, BridgedInstruction::MarkDependenceKind kind) const {
return {unbridged().createMarkDependenceAddr(
regularLoc(), value.getSILValue(), base.getSILValue(),
swift::MarkDependenceKind(kind))};
}
BridgedInstruction BridgedBuilder::createMarkUninitialized(BridgedValue value, SwiftInt kind) const {
return {unbridged().createMarkUninitialized(
regularLoc(), value.getSILValue(), (swift::MarkUninitializedInst::Kind)kind)};
}
BridgedInstruction BridgedBuilder::createMarkUnresolvedNonCopyableValue(BridgedValue value,
SwiftInt checkKind, bool isStrict) const {
return {unbridged().createMarkUnresolvedNonCopyableValueInst(
regularLoc(), value.getSILValue(), (swift::MarkUnresolvedNonCopyableValueInst::CheckKind)checkKind,
(swift::MarkUnresolvedNonCopyableValueInst::IsStrict_t)isStrict)};
}
BridgedInstruction BridgedBuilder::createEndAccess(BridgedValue value) const {
return {unbridged().createEndAccess(regularLoc(), value.getSILValue(), false)};
}
BridgedInstruction BridgedBuilder::createEndApply(BridgedValue value) const {
swift::ASTContext &ctxt = unbridged().getASTContext();
return {unbridged().createEndApply(regularLoc(), value.getSILValue(),
swift::SILType::getEmptyTupleType(ctxt))};
}
BridgedInstruction BridgedBuilder::createAbortApply(BridgedValue value) const {
return {unbridged().createAbortApply(regularLoc(), value.getSILValue())};
}
BridgedInstruction BridgedBuilder::createConvertFunction(BridgedValue originalFunction, BridgedType resultType, bool withoutActuallyEscaping) const {
return {unbridged().createConvertFunction(regularLoc(), originalFunction.getSILValue(), resultType.unbridged(), withoutActuallyEscaping)};
}
BridgedInstruction BridgedBuilder::createConvertEscapeToNoEscape(BridgedValue originalFunction, BridgedType resultType, bool isLifetimeGuaranteed) const {
return {unbridged().createConvertEscapeToNoEscape(regularLoc(), originalFunction.getSILValue(), resultType.unbridged(), isLifetimeGuaranteed)};
}
//===----------------------------------------------------------------------===//
// BridgedBasicBlockSet
//===----------------------------------------------------------------------===//
bool BridgedBasicBlockSet::contains(BridgedBasicBlock block) const {
return set->contains(block.unbridged());
}
bool BridgedBasicBlockSet::insert(BridgedBasicBlock block) const {
return set->insert(block.unbridged());
}
void BridgedBasicBlockSet::erase(BridgedBasicBlock block) const {
set->erase(block.unbridged());
}
BridgedFunction BridgedBasicBlockSet::getFunction() const {
return {set->getFunction()};
}
//===----------------------------------------------------------------------===//
// BridgedNodeSet
//===----------------------------------------------------------------------===//
bool BridgedNodeSet::containsValue(BridgedValue value) const {
return set->contains(value.getSILValue());
}
bool BridgedNodeSet::insertValue(BridgedValue value) const {
return set->insert(value.getSILValue());
}
void BridgedNodeSet::eraseValue(BridgedValue value) const {
set->erase(value.getSILValue());
}
bool BridgedNodeSet::containsInstruction(BridgedInstruction inst) const {
return set->contains(inst.unbridged()->asSILNode());
}
bool BridgedNodeSet::insertInstruction(BridgedInstruction inst) const {
return set->insert(inst.unbridged()->asSILNode());
}
void BridgedNodeSet::eraseInstruction(BridgedInstruction inst) const {
set->erase(inst.unbridged()->asSILNode());
}
BridgedFunction BridgedNodeSet::getFunction() const {
return {set->getFunction()};
}
//===----------------------------------------------------------------------===//
// BridgedOperandSet
//===----------------------------------------------------------------------===//
bool BridgedOperandSet::contains(BridgedOperand operand) const {
return set->contains(operand.op);
}
bool BridgedOperandSet::insert(BridgedOperand operand) const {
return set->insert(operand.op);
}
void BridgedOperandSet::erase(BridgedOperand operand) const {
set->erase(operand.op);
}
BridgedFunction BridgedOperandSet::getFunction() const {
return {set->getFunction()};
}
//===----------------------------------------------------------------------===//
// BridgedContext
//===----------------------------------------------------------------------===//
static_assert((int)BridgedContext::NotificationKind::Instructions ==
(int)swift::SILContext::NotificationKind::Instructions);
static_assert((int)BridgedContext::NotificationKind::Calls ==
(int)swift::SILContext::NotificationKind::Calls);
static_assert((int)BridgedContext::NotificationKind::Branches ==
(int)swift::SILContext::NotificationKind::Branches);
static_assert((int)BridgedContext::NotificationKind::Effects ==
(int)swift::SILContext::NotificationKind::Effects);
static_assert((int)BridgedContext::NotificationKind::FunctionTables ==
(int)swift::SILContext::NotificationKind::FunctionTables);
static_assert((int)BridgedContext::SILStage::Raw == (int)swift::SILStage::Raw);
static_assert((int)BridgedContext::SILStage::Canonical == (int)swift::SILStage::Canonical);
static_assert((int)BridgedContext::SILStage::Lowered == (int)swift::SILStage::Lowered);
bool BridgedContext::isTransforming(BridgedFunction function) const {
return context->getFunction() == function.getFunction();
}
void BridgedContext::notifyChanges(NotificationKind changeKind) const {
context->notifyChanges((swift::SILContext::NotificationKind)changeKind);
}
BridgedContext::SILStage BridgedContext::getSILStage() const {
return (SILStage)context->getModule()->getStage();
}
bool BridgedContext::moduleIsSerialized() const {
return context->getModule()->isSerialized();
}
bool BridgedContext::moduleHasLoweredAddresses() const {
return context->getModule()->useLoweredAddresses();
}
BridgedDeclObj BridgedContext::getCurrentModuleContext() const {
return {context->getModule()->getSwiftModule()};
}
OptionalBridgedFunction BridgedContext::lookupFunction(BridgedStringRef name) const {
return {context->getModule()->lookUpFunction(name.unbridged())};
}
OptionalBridgedVTable BridgedContext::lookupVTable(BridgedDeclObj classDecl) const {
return {context->getModule()->lookUpVTable(classDecl.getAs<swift::ClassDecl>())};
}
OptionalBridgedVTable BridgedContext::lookupSpecializedVTable(BridgedType classType) const {
return {context->getModule()->lookUpSpecializedVTable(classType.unbridged())};
}
OptionalBridgedFunction BridgedContext::loadFunction(BridgedStringRef name, bool loadCalleesRecursively) const {
return {context->getModule()->loadFunction(name.unbridged(),
loadCalleesRecursively
? swift::SILModule::LinkingMode::LinkAll
: swift::SILModule::LinkingMode::LinkNormal)};
}
void BridgedContext::loadFunction(BridgedFunction function, bool loadCalleesRecursively) const {
context->getModule()->loadFunction(function.getFunction(),
loadCalleesRecursively ? swift::SILModule::LinkingMode::LinkAll
: swift::SILModule::LinkingMode::LinkNormal);
}
BridgedSubstitutionMap BridgedContext::getContextSubstitutionMap(BridgedType type) const {
swift::SILType ty = type.unbridged();
return ty.getASTType()->getContextSubstitutionMap();
}
BridgedType BridgedContext::getBuiltinIntegerType(SwiftInt bitWidth) const {
return swift::SILType::getBuiltinIntegerType(bitWidth, context->getModule()->getASTContext());
}
BridgedASTType BridgedContext::getTupleType(BridgedArrayRef elementTypes) const {
llvm::SmallVector<swift::TupleTypeElt, 8> elements;
for (auto bridgedElmtTy : elementTypes.unbridged<BridgedASTType>()) {
elements.push_back(bridgedElmtTy.unbridged());
}
return {swift::TupleType::get(elements, context->getModule()->getASTContext())};
}
BridgedDeclObj BridgedContext::getSwiftArrayDecl() const {
return {context->getModule()->getASTContext().getArrayDecl()};
}
BridgedDeclObj BridgedContext::getSwiftMutableSpanDecl() const {
return {context->getModule()->getASTContext().getMutableSpanDecl()};
}
BridgedValue BridgedContext::getSILUndef(BridgedType type) const {
return {swift::SILUndef::get(context->getFunction(), type.unbridged())};
}
BridgedConformance BridgedContext::getSpecializedConformance(
BridgedConformance genericConformance,
BridgedASTType type,
BridgedSubstitutionMap substitutions) const {
auto &ctxt = context->getModule()->getASTContext();
auto *genConf = llvm::cast<swift::NormalProtocolConformance>(genericConformance.unbridged().getConcrete());
auto *c = ctxt.getSpecializedConformance(type.unbridged(), genConf, substitutions.unbridged());
return swift::ProtocolConformanceRef(c);
}
OptionalBridgedWitnessTable BridgedContext::lookupWitnessTable(BridgedConformance conformance) const {
swift::ProtocolConformanceRef ref = conformance.unbridged();
if (!ref.isConcrete()) {
return {nullptr};
}
return {context->getModule()->lookUpWitnessTable(ref.getConcrete())};
}
bool BridgedContext::calleesAreStaticallyKnowable(BridgedDeclRef method) const {
return swift::calleesAreStaticallyKnowable(*context->getModule(), method.unbridged());
}
BridgedWitnessTable BridgedContext::createSpecializedWitnessTable(BridgedLinkage linkage,
bool serialized,
BridgedConformance conformance,
BridgedArrayRef bridgedEntries) const {
llvm::SmallVector<swift::SILWitnessTable::Entry, 8> entries;
for (const BridgedWitnessTableEntry &e : bridgedEntries.unbridged<BridgedWitnessTableEntry>()) {
entries.push_back(e.unbridged());
}
return {swift::SILWitnessTable::create(*context->getModule(), (swift::SILLinkage)linkage,
serialized ? swift::IsSerialized : swift::IsNotSerialized,
conformance.unbridged().getConcrete(),
entries, {}, /*specialized=*/true)};
}
BridgedVTable BridgedContext::createSpecializedVTable(BridgedType classType,
bool serialized,
BridgedArrayRef bridgedEntries) const {
llvm::SmallVector<swift::SILVTableEntry, 8> entries;
for (const BridgedVTableEntry &e : bridgedEntries.unbridged<BridgedVTableEntry>()) {
entries.push_back(e.unbridged());
}
swift::SILType classTy = classType.unbridged();
return {swift::SILVTable::create(*context->getModule(),
classTy.getClassOrBoundGenericClass(), classTy,
serialized ? swift::IsSerialized : swift::IsNotSerialized,
entries)};
}
BridgedBasicBlock BridgedContext::splitBlockBefore(BridgedInstruction bridgedInst) const {
auto *block = bridgedInst.unbridged()->getParent();
return {block->split(bridgedInst.unbridged()->getIterator())};
}
BridgedBasicBlock BridgedContext::splitBlockAfter(BridgedInstruction bridgedInst) const {
auto *block = bridgedInst.unbridged()->getParent();
return {block->split(std::next(bridgedInst.unbridged()->getIterator()))};
}
BridgedBasicBlock BridgedContext::createBlockAfter(BridgedBasicBlock bridgedBlock) const {
swift::SILBasicBlock *block = bridgedBlock.unbridged();
return {block->getParent()->createBasicBlockAfter(block)};
}
BridgedBasicBlock BridgedContext::appendBlock(BridgedFunction bridgedFunction) const {
return {bridgedFunction.getFunction()->createBasicBlock()};
}
void BridgedContext::eraseInstruction(BridgedInstruction inst, bool salvageDebugInfo) const {
context->eraseInstruction(inst.unbridged(), salvageDebugInfo);
}
void BridgedContext::eraseBlock(BridgedBasicBlock block) const {
block.unbridged()->eraseFromParent();
}
void BridgedContext::moveInstructionBefore(BridgedInstruction inst, BridgedInstruction beforeInst) {
swift::SILBasicBlock::moveInstruction(inst.unbridged(), beforeInst.unbridged());
}
void BridgedContext::copyInstructionBefore(BridgedInstruction inst, BridgedInstruction beforeInst) {
inst.unbridged()->clone(beforeInst.unbridged());
}
OptionalBridgedFunction BridgedContext::lookupStdlibFunction(BridgedStringRef name) const {
return {context->lookupStdlibFunction(name.unbridged())};
}
void BridgedContext::SSAUpdater_initialize(BridgedFunction function, BridgedType type,
BridgedValue::Ownership ownership) const {
context->initializeSSAUpdater(function.getFunction(), type.unbridged(), BridgedValue::unbridge(ownership));
}
void BridgedContext::SSAUpdater_addAvailableValue(BridgedBasicBlock block, BridgedValue value) const {
context->SSAUpdater_addAvailableValue(block.unbridged(), value.getSILValue());
}
BridgedValue BridgedContext::SSAUpdater_getValueAtEndOfBlock(BridgedBasicBlock block) const {
return {context->SSAUpdater_getValueAtEndOfBlock(block.unbridged())};
}
BridgedValue BridgedContext::SSAUpdater_getValueInMiddleOfBlock(BridgedBasicBlock block) const {
return {context->SSAUpdater_getValueInMiddleOfBlock(block.unbridged())};
}
SwiftInt BridgedContext::SSAUpdater_getNumInsertedPhis() const {
return (SwiftInt)context->SSAUpdater_getInsertedPhis().size();
}
BridgedValue BridgedContext::SSAUpdater_getInsertedPhi(SwiftInt idx) const {
return {context->SSAUpdater_getInsertedPhis()[idx]};
}
BridgedBasicBlockSet BridgedContext::allocBasicBlockSet() const {
return {context->allocBlockSet()};
}
void BridgedContext::freeBasicBlockSet(BridgedBasicBlockSet set) const {
context->freeBlockSet(set.set);
}
BridgedNodeSet BridgedContext::allocNodeSet() const {
return {context->allocNodeSet()};
}
void BridgedContext::freeNodeSet(BridgedNodeSet set) const {
context->freeNodeSet(set.set);
}
BridgedOperandSet BridgedContext::allocOperandSet() const {
return {context->allocOperandSet()};
}
void BridgedContext::freeOperandSet(BridgedOperandSet set) const {
context->freeOperandSet(set.set);
}
SwiftInt BridgedContext::Slab::getCapacity() {
return (SwiftInt)swift::FixedSizeSlabPayload::capacity;
}
BridgedContext::Slab::Slab(swift::FixedSizeSlab * _Nullable slab) {
if (slab) {
data = slab;
assert((void *)data == slab->dataFor<void>());
}
}
swift::FixedSizeSlab * _Nullable BridgedContext::Slab::getSlab() const {
if (data)
return static_cast<swift::FixedSizeSlab *>(data);
return nullptr;
}
BridgedContext::Slab BridgedContext::Slab::getNext() const {
return &*std::next(getSlab()->getIterator());
}
BridgedContext::Slab BridgedContext::Slab::getPrevious() const {
return &*std::prev(getSlab()->getIterator());
}
BridgedContext::Slab BridgedContext::allocSlab(Slab afterSlab) const {
return context->allocSlab(afterSlab.getSlab());
}
BridgedContext::Slab BridgedContext::freeSlab(Slab slab) const {
return context->freeSlab(slab.getSlab());
}
SWIFT_END_NULLABILITY_ANNOTATIONS
#endif