//===--- ExtraInhabitants.h - Extra inhabitant routines ---------*- 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 routines for working with extra inhabitants. // //===----------------------------------------------------------------------===// #ifndef SWIFT_IRGEN_EXTRAINHABITANTS_H #define SWIFT_IRGEN_EXTRAINHABITANTS_H namespace llvm { class APInt; 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::APInt 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::APInt 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