blob: 0595b8565022394e07ff984b56886009fdf1b63a [file] [log] [blame]
//===--- ReferenceTypeInfo.h - Supplement for reference types ---*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 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 defines ReferenceTypeInfo, which supplements the
// FixedTypeInfo interface for types with reference semantics.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_IRGEN_REFERENCETYPEINFO_H
#define SWIFT_IRGEN_REFERENCETYPEINFO_H
#include "LoadableTypeInfo.h"
namespace swift {
namespace irgen {
class TypeConverter;
/// An abstract class designed for use when implementing a type
/// that has reference semantics.
class ReferenceTypeInfo : public LoadableTypeInfo {
protected:
// FIXME: Get spare bits for pointers from a TargetInfo-like structure.
ReferenceTypeInfo(llvm::Type *type, Size size, SpareBitVector spareBits,
Alignment align, IsPOD_t pod = IsNotPOD)
: LoadableTypeInfo(type, size, spareBits, align, pod,
IsFixedSize, SpecialTypeInfoKind::Reference)
{}
public:
/// Strongly retains a value.
virtual void strongRetain(IRGenFunction &IGF, Explosion &in,
Atomicity atomicity) const = 0;
/// Strongly releases a value.
virtual void strongRelease(IRGenFunction &IGF, Explosion &in,
Atomicity atomicity) const = 0;
#define REF_STORAGE_HELPER(Name) \
virtual const TypeInfo *create##Name##StorageType(TypeConverter &TC, \
bool isOptional) const = 0;
#define NEVER_LOADABLE_CHECKED_REF_STORAGE_HELPER(Name, name) \
virtual void name##TakeStrong(IRGenFunction &IGF, Address addr, \
Explosion &out, bool isOptional) const = 0; \
virtual void name##LoadStrong(IRGenFunction &IGF, Address addr, \
Explosion &out, bool isOptional) const = 0; \
virtual void name##Init(IRGenFunction &IGF, Explosion &in, \
Address dest, bool isOptional) const = 0; \
virtual void name##Assign(IRGenFunction &IGF, Explosion &in, \
Address dest, bool isOptional) const = 0;
#define ALWAYS_LOADABLE_CHECKED_REF_STORAGE_HELPER(Name, name) \
virtual void strongRetain##Name(IRGenFunction &IGF, Explosion &in, \
Atomicity atomicity) const = 0; \
virtual void strongRetain##Name##Release(IRGenFunction &IGF, \
Explosion &in, \
Atomicity atomicity) const = 0; \
virtual void name##Retain(IRGenFunction &IGF, Explosion &in, \
Atomicity atomicity) const = 0; \
virtual void name##Release(IRGenFunction &IGF, Explosion &in, \
Atomicity atomicity) const = 0;
#define NEVER_LOADABLE_CHECKED_REF_STORAGE(Name, name, ...) \
NEVER_LOADABLE_CHECKED_REF_STORAGE_HELPER(Name, name) \
REF_STORAGE_HELPER(Name)
#define ALWAYS_LOADABLE_CHECKED_REF_STORAGE(Name, name, ...) \
ALWAYS_LOADABLE_CHECKED_REF_STORAGE_HELPER(Name, name) \
REF_STORAGE_HELPER(Name)
#define SOMETIMES_LOADABLE_CHECKED_REF_STORAGE(Name, name, ...) \
NEVER_LOADABLE_CHECKED_REF_STORAGE_HELPER(Name, name) \
ALWAYS_LOADABLE_CHECKED_REF_STORAGE_HELPER(Name, name) \
REF_STORAGE_HELPER(Name)
#define UNCHECKED_REF_STORAGE(Name, name, ...) \
REF_STORAGE_HELPER(Name)
#include "swift/AST/ReferenceStorage.def"
#undef REF_STORAGE_HELPER
#undef NEVER_LOADABLE_CHECKED_REF_STORAGE_HELPER
#undef ALWAYS_LOADABLE_CHECKED_REF_STORAGE_HELPER
static bool classof(const ReferenceTypeInfo *type) { return true; }
static bool classof(const TypeInfo *type) {
return type->getSpecialTypeInfoKind() == SpecialTypeInfoKind::Reference;
}
};
}
}
#endif