Files
swift-mirror/lib/IRGen/ExtraInhabitants.h
John McCall 6a91f7a172 Various improvements to the function-type ABI.
Teach IRGen and the runtime about the extra inhabitants
of function pointers, and take advantage of that in
thin and thick function types.

Also add runtime entrypoints for thin function type
metadata.

Swift SVN r24346
2015-01-10 01:45:37 +00:00

96 lines
3.8 KiB
C++

//===--- ExtraInhabitants.h - Extra inhabitant routines ---------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file defines routines for working with extra inhabitants.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_IRGEN_EXTRAINHABITANTS_H
#define SWIFT_IRGEN_EXTRAINHABITANTS_H
namespace llvm {
class ConstantInt;
class Value;
}
namespace swift {
namespace irgen {
class Address;
class IRGenFunction;
class IRGenModule;
/*****************************************************************************/
/// \group Extra inhabitants of heap object pointers.
/// Return the number of extra inhabitant representations for heap objects,
/// that is, the number of invalid heap object pointer values that can be used
/// to represent enum tags for enums involving a reference type as a payload.
unsigned getHeapObjectExtraInhabitantCount(IRGenModule &IGM);
/// Return an indexed extra inhabitant constant for a heap object pointer.
///
/// If the pointer appears within a larger aggregate, the 'bits' and 'offset'
/// arguments can be used to position the inhabitant within the larger integer
/// constant.
llvm::ConstantInt *getHeapObjectFixedExtraInhabitantValue(IRGenModule &IGM,
unsigned bits,
unsigned index,
unsigned offset);
/// Calculate the index of a heap object extra inhabitant representation stored
/// in memory.
llvm::Value *getHeapObjectExtraInhabitantIndex(IRGenFunction &IGF,
Address src);
/// Calculate an extra inhabitant representation from an index and store it to
/// memory.
void storeHeapObjectExtraInhabitant(IRGenFunction &IGF,
llvm::Value *index,
Address dest);
/*****************************************************************************/
/// \group Extra inhabitants of function pointers.
/// Return the number of extra inhabitant representations for function pointers,
/// that is, the number of invalid function pointer values that can be used
/// to represent enum tags for enums involving a reference type as a payload.
unsigned getFunctionPointerExtraInhabitantCount(IRGenModule &IGM);
/// Return an indexed extra inhabitant constant for a function pointer.
///
/// If the pointer appears within a larger aggregate, the 'bits' and 'offset'
/// arguments can be used to position the inhabitant within the larger integer
/// constant.
llvm::ConstantInt *getFunctionPointerFixedExtraInhabitantValue(IRGenModule &IGM,
unsigned bits,
unsigned index,
unsigned offset);
/// Calculate the index of a function pointer extra inhabitant
/// representation stored in memory.
llvm::Value *getFunctionPointerExtraInhabitantIndex(IRGenFunction &IGF,
Address src);
/// Calculate an extra inhabitant representation from an index and
/// store it to memory.
void storeFunctionPointerExtraInhabitant(IRGenFunction &IGF,
llvm::Value *index,
Address dest);
} // end namespace irgen
} // end namespace swift
#endif