1 //===-- include/flang/Common/default-kinds.h --------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef FORTRAN_COMMON_DEFAULT_KINDS_H_ 10 #define FORTRAN_COMMON_DEFAULT_KINDS_H_ 11 12 #include "flang/Common/Fortran.h" 13 #include <cstdint> 14 15 namespace Fortran::common { 16 17 // All address calculations in generated code are 64-bit safe. 18 // Compile-time folding of bounds, subscripts, and lengths 19 // consequently uses 64-bit signed integers. The name reflects 20 // this usage as a subscript into a constant array. 21 using ConstantSubscript = std::int64_t; 22 23 // Represent the default values of the kind parameters of the 24 // various intrinsic types. Most of these can be configured by 25 // means of the compiler command line. 26 class IntrinsicTypeDefaultKinds { 27 public: 28 IntrinsicTypeDefaultKinds(); subscriptIntegerKind()29 int subscriptIntegerKind() const { return subscriptIntegerKind_; } sizeIntegerKind()30 int sizeIntegerKind() const { return sizeIntegerKind_; } doublePrecisionKind()31 int doublePrecisionKind() const { return doublePrecisionKind_; } quadPrecisionKind()32 int quadPrecisionKind() const { return quadPrecisionKind_; } 33 34 IntrinsicTypeDefaultKinds &set_defaultIntegerKind(int); 35 IntrinsicTypeDefaultKinds &set_subscriptIntegerKind(int); 36 IntrinsicTypeDefaultKinds &set_sizeIntegerKind(int); 37 IntrinsicTypeDefaultKinds &set_defaultRealKind(int); 38 IntrinsicTypeDefaultKinds &set_doublePrecisionKind(int); 39 IntrinsicTypeDefaultKinds &set_quadPrecisionKind(int); 40 IntrinsicTypeDefaultKinds &set_defaultCharacterKind(int); 41 IntrinsicTypeDefaultKinds &set_defaultLogicalKind(int); 42 43 int GetDefaultKind(TypeCategory) const; 44 45 private: 46 // Default REAL just simply has to be IEEE-754 single precision today. 47 // It occupies one numeric storage unit by definition. The default INTEGER 48 // and default LOGICAL intrinsic types also have to occupy one numeric 49 // storage unit, so their kinds are also forced. Default COMPLEX must always 50 // comprise two default REAL components. 51 int defaultIntegerKind_{4}; 52 int subscriptIntegerKind_{8}; 53 int sizeIntegerKind_{4}; // SIZE(), UBOUND(), &c. default KIND= 54 int defaultRealKind_{defaultIntegerKind_}; 55 int doublePrecisionKind_{2 * defaultRealKind_}; 56 int quadPrecisionKind_{2 * doublePrecisionKind_}; 57 int defaultCharacterKind_{1}; 58 int defaultLogicalKind_{defaultIntegerKind_}; 59 }; 60 } // namespace Fortran::common 61 #endif // FORTRAN_COMMON_DEFAULT_KINDS_H_ 62