Files
swift-mirror/include/swift/SIL/SILBridging.h
Erik Eckstein 27dc5afb10 libswift: add a few utilities
* add the IntegerLiteralInst + the Builder function to create it
* add Value.nonDebugUses
* add a general utility Sequence.isEmpty
* add PassContext.replaceAllUses
* add a function to erase all `debug_value` uses in PassContext.erase
2021-11-29 09:41:05 +01:00

246 lines
8.0 KiB
C++

//===--- SILBridging.h - header for the swift SILBridging module ----------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SIL_SILBRIDGING_H
#define SWIFT_SIL_SILBRIDGING_H
#include "BridgedSwiftObject.h"
#include <stddef.h>
#include <string>
SWIFT_BEGIN_NULLABILITY_ANNOTATIONS
typedef struct {
const unsigned char * _Nullable data;
size_t length;
} BridgedStringRef;
typedef struct {
const unsigned char * _Nonnull data;
size_t numElements;
} BridgedArrayRef;
enum {
BridgedOperandSize = 4 * sizeof(uintptr_t),
BridgedSuccessorSize = 4 * sizeof(uintptr_t) + sizeof(uint64_t)
};
typedef struct {
void * _Nullable data;
} BridgedSlab;
enum {
BridgedSlabCapacity = 64 * sizeof(uintptr_t)
};
enum ChangeNotificationKind {
instructionsChanged,
callsChanged,
branchesChanged
};
typedef struct {
const void * _Nonnull opaqueCtxt;
} BridgedPassContext;
typedef struct {
void * _Nonnull streamAddr;
} BridgedOStream;
typedef struct {
void * _Null_unspecified word0;
void * _Null_unspecified word1;
void * _Null_unspecified word2;
} BridgedLocation;
typedef struct {
void * _Nullable typePtr;
} BridgedType;
typedef struct {
const void * _Nullable data;
size_t count;
} BridgedValueArray;
typedef struct {
const void * _Nonnull op;
} BridgedOperand;
typedef struct {
const void * _Nullable op;
} OptionalBridgedOperand;
typedef struct {
const void * _Nonnull succ;
} BridgedSuccessor;
typedef struct {
const void * _Nullable succ;
} OptionalBridgedSuccessor;
typedef struct {
SwiftObject obj;
} BridgedFunction;
typedef struct {
SwiftObject obj;
} BridgedGlobalVar;
typedef struct {
SwiftObject obj;
} BridgedBasicBlock;
typedef struct {
OptionalSwiftObject obj;
} OptionalBridgedBasicBlock;
typedef struct {
SwiftObject obj;
} BridgedArgument;
typedef struct {
OptionalSwiftObject obj;
} OptionalBridgedArgument;
typedef struct {
SwiftObject obj;
} BridgedNode;
typedef struct {
SwiftObject obj;
} BridgedValue;
typedef struct {
SwiftObject obj;
} BridgedInstruction;
typedef struct {
OptionalSwiftObject obj;
} OptionalBridgedInstruction;
typedef struct {
SwiftObject obj;
} BridgedMultiValueResult;
// Must be in sync with SILInstruction::MemoryBehavior
// TODO: do this less hacky.
typedef enum {
NoneBehavior,
MayReadBehavior,
MayWriteBehavior,
MayReadWriteBehavior,
MayHaveSideEffectsBehavior
} BridgedMemoryBehavior;
typedef intptr_t SwiftInt;
void registerBridgedClass(BridgedStringRef className, SwiftMetatype metatype);
void OStream_write(BridgedOStream os, BridgedStringRef str);
void freeBridgedStringRef(BridgedStringRef str);
void PassContext_notifyChanges(BridgedPassContext passContext,
enum ChangeNotificationKind changeKind);
void PassContext_eraseInstruction(BridgedPassContext passContext,
BridgedInstruction inst);
BridgedSlab PassContext_getNextSlab(BridgedSlab slab);
BridgedSlab PassContext_allocSlab(BridgedPassContext passContext,
BridgedSlab afterSlab);
BridgedSlab PassContext_freeSlab(BridgedPassContext passContext,
BridgedSlab slab);
BridgedStringRef SILFunction_getName(BridgedFunction function);
std::string SILFunction_debugDescription(BridgedFunction function);
OptionalBridgedBasicBlock SILFunction_firstBlock(BridgedFunction function);
OptionalBridgedBasicBlock SILFunction_lastBlock(BridgedFunction function);
SwiftInt SILFunction_numIndirectResultArguments(BridgedFunction function);
SwiftInt SILFunction_getSelfArgumentIndex(BridgedFunction function);
BridgedStringRef SILGlobalVariable_getName(BridgedGlobalVar global);
std::string SILGlobalVariable_debugDescription(BridgedGlobalVar global);
OptionalBridgedBasicBlock SILBasicBlock_next(BridgedBasicBlock block);
OptionalBridgedBasicBlock SILBasicBlock_previous(BridgedBasicBlock block);
BridgedFunction SILBasicBlock_getFunction(BridgedBasicBlock block);
std::string SILBasicBlock_debugDescription(BridgedBasicBlock block);
OptionalBridgedInstruction SILBasicBlock_firstInst(BridgedBasicBlock block);
OptionalBridgedInstruction SILBasicBlock_lastInst(BridgedBasicBlock block);
SwiftInt SILBasicBlock_getNumArguments(BridgedBasicBlock block);
BridgedArgument SILBasicBlock_getArgument(BridgedBasicBlock block, SwiftInt index);
OptionalBridgedSuccessor SILBasicBlock_getFirstPred(BridgedBasicBlock block);
OptionalBridgedSuccessor SILSuccessor_getNext(BridgedSuccessor succ);
BridgedBasicBlock SILSuccessor_getTargetBlock(BridgedSuccessor succ);
BridgedInstruction SILSuccessor_getContainingInst(BridgedSuccessor succ);
BridgedValue Operand_getValue(BridgedOperand);
OptionalBridgedOperand Operand_nextUse(BridgedOperand);
BridgedInstruction Operand_getUser(BridgedOperand);
SwiftInt Operand_isTypeDependent(BridgedOperand);
std::string SILNode_debugDescription(BridgedNode node);
OptionalBridgedOperand SILValue_firstUse(BridgedValue value);
BridgedType SILValue_getType(BridgedValue value);
SwiftInt SILType_isAddress(BridgedType);
SwiftInt SILType_isTrivial(BridgedType, BridgedFunction);
BridgedBasicBlock SILArgument_getParent(BridgedArgument argument);
OptionalBridgedInstruction SILInstruction_next(BridgedInstruction inst);
OptionalBridgedInstruction SILInstruction_previous(BridgedInstruction inst);
BridgedBasicBlock SILInstruction_getParent(BridgedInstruction inst);
BridgedArrayRef SILInstruction_getOperands(BridgedInstruction inst);
void SILInstruction_setOperand(BridgedInstruction inst, SwiftInt index,
BridgedValue value);
BridgedLocation SILInstruction_getLocation(BridgedInstruction inst);
BridgedMemoryBehavior SILInstruction_getMemBehavior(BridgedInstruction inst);
BridgedInstruction MultiValueInstResult_getParent(BridgedMultiValueResult result);
SwiftInt MultipleValueInstruction_getNumResults(BridgedInstruction inst);
BridgedMultiValueResult
MultipleValueInstruction_getResult(BridgedInstruction inst, SwiftInt index);
BridgedArrayRef TermInst_getSuccessors(BridgedInstruction term);
BridgedStringRef CondFailInst_getMessage(BridgedInstruction cfi);
BridgedGlobalVar GlobalAccessInst_getGlobal(BridgedInstruction globalInst);
SwiftInt TupleExtractInst_fieldIndex(BridgedInstruction tei);
SwiftInt TupleElementAddrInst_fieldIndex(BridgedInstruction teai);
SwiftInt StructExtractInst_fieldIndex(BridgedInstruction sei);
SwiftInt StructElementAddrInst_fieldIndex(BridgedInstruction seai);
SwiftInt EnumInst_caseIndex(BridgedInstruction ei);
SwiftInt UncheckedEnumDataInst_caseIndex(BridgedInstruction uedi);
SwiftInt RefElementAddrInst_fieldIndex(BridgedInstruction reai);
SwiftInt PartialApplyInst_numArguments(BridgedInstruction ai);
SwiftInt ApplyInst_numArguments(BridgedInstruction ai);
SwiftInt BeginApplyInst_numArguments(BridgedInstruction ai);
SwiftInt TryApplyInst_numArguments(BridgedInstruction ai);
BridgedBasicBlock BranchInst_getTargetBlock(BridgedInstruction bi);
SwiftInt SwitchEnumInst_getNumCases(BridgedInstruction se);
SwiftInt SwitchEnumInst_getCaseIndex(BridgedInstruction se, SwiftInt idx);
SwiftInt StoreInst_getStoreOwnership(BridgedInstruction store);
BridgedInstruction SILBuilder_createBuiltinBinaryFunction(
BridgedInstruction insertionPoint,
BridgedLocation loc, BridgedStringRef name,
BridgedType operandType, BridgedType resultType, BridgedValueArray arguments);
BridgedInstruction SILBuilder_createCondFail(BridgedInstruction insertionPoint,
BridgedLocation loc, BridgedValue condition, BridgedStringRef messge);
BridgedInstruction SILBuilder_createIntegerLiteral(BridgedInstruction insertionPoint,
BridgedLocation loc, BridgedType type, SwiftInt value);
SWIFT_END_NULLABILITY_ANNOTATIONS
#endif