1
2/* Compiler implementation of the D programming language
3 * Copyright (C) 2013-2019 by The D Language Foundation, All Rights Reserved
4 * written by Iain Buclaw
5 * http://www.digitalmars.com
6 * Distributed under the Boost Software License, Version 1.0.
7 * http://www.boost.org/LICENSE_1_0.txt
8 * https://github.com/dlang/dmd/blob/master/src/dmd/target.h
9 */
10
11#pragma once
12
13// This file contains a data structure that describes a back-end target.
14// At present it is incomplete, but in future it should grow to contain
15// most or all target machine and target O/S specific information.
16#include "globals.h"
17#include "tokens.h"
18
19class ClassDeclaration;
20class Dsymbol;
21class Expression;
22class Parameter;
23class Type;
24class TypeTuple;
25struct OutBuffer;
26
27struct Target
28{
29    static int ptrsize;
30    static int realsize;             // size a real consumes in memory
31    static int realpad;              // 'padding' added to the CPU real size to bring it up to realsize
32    static int realalignsize;        // alignment for reals
33    static bool reverseCppOverloads; // with dmc and cl, overloaded functions are grouped and in reverse order
34    static bool cppExceptions;       // set if catching C++ exceptions is supported
35    static int c_longsize;           // size of a C 'long' or 'unsigned long' type
36    static int c_long_doublesize;    // size of a C 'long double'
37    static int classinfosize;        // size of 'ClassInfo'
38    static unsigned long long maxStaticDataSize;  // maximum size of static data
39
40    template <typename T>
41    struct FPTypeProperties
42    {
43        static real_t max;
44        static real_t min_normal;
45        static real_t nan;
46        static real_t snan;
47        static real_t infinity;
48        static real_t epsilon;
49
50        static d_int64 dig;
51        static d_int64 mant_dig;
52        static d_int64 max_exp;
53        static d_int64 min_exp;
54        static d_int64 max_10_exp;
55        static d_int64 min_10_exp;
56    };
57
58    typedef FPTypeProperties<float> FloatProperties;
59    typedef FPTypeProperties<double> DoubleProperties;
60    typedef FPTypeProperties<real_t> RealProperties;
61
62    static void _init();
63    // Type sizes and support.
64    static unsigned alignsize(Type* type);
65    static unsigned fieldalign(Type* type);
66    static unsigned critsecsize();
67    static Type *va_listType();  // get type of va_list
68    static int isVectorTypeSupported(int sz, Type *type);
69    static bool isVectorOpSupported(Type *type, TOK op, Type *t2 = NULL);
70    // ABI and backend.
71    static const char *toCppMangle(Dsymbol *s);
72    static const char *cppTypeInfoMangle(ClassDeclaration *cd);
73    static const char *cppTypeMangle(Type *t);
74    static Type *cppParameterType(Parameter *p);
75    static bool cppFundamentalType(const Type *t, bool& isFundamental);
76    static LINK systemLinkage();
77    static TypeTuple *toArgTypes(Type *t);
78};
79