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 
19 class ClassDeclaration;
20 class Dsymbol;
21 class Expression;
22 class Parameter;
23 class Type;
24 class TypeTuple;
25 struct OutBuffer;
26 
27 struct 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