xref: /netbsd-src/external/gpl3/gcc/dist/gcc/d/dmd/target.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 
2 /* Compiler implementation of the D programming language
3  * Copyright (C) 2013-2022 by The D Language Foundation, All Rights Reserved
4  * written by Iain Buclaw
5  * https://www.digitalmars.com
6  * Distributed under the Boost Software License, Version 1.0.
7  * https://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 FuncDeclaration;
23 class Statement;
24 class Type;
25 class TypeTuple;
26 class TypeFunction;
27 
28 enum class CPU : unsigned char
29 {
30     x87,
31     mmx,
32     sse,
33     sse2,
34     sse3,
35     ssse3,
36     sse4_1,
37     sse4_2,
38     avx,                // AVX1 instruction set
39     avx2,               // AVX2 instruction set
40     avx512,             // AVX-512 instruction set
41 
42     // Special values that don't survive past the command line processing
43     baseline,           // (default) the minimum capability CPU
44     native              // the machine the compiler is being run on
45 };
46 
47 struct TargetC
48 {
49     enum class Runtime : unsigned char
50     {
51         Unspecified,
52         Bionic,
53         DigitalMars,
54         Glibc,
55         Microsoft,
56         Musl,
57         Newlib,
58         UClibc,
59         WASI,
60     };
61 
62     enum class BitFieldStyle : unsigned char
63     {
64         Unspecified,
65         DM,                   // Digital Mars 32 bit C compiler
66         MS,                   // Microsoft 32 and 64 bit C compilers
67                               // https://docs.microsoft.com/en-us/cpp/c-language/c-bit-fields?view=msvc-160
68                               // https://docs.microsoft.com/en-us/cpp/cpp/cpp-bit-fields?view=msvc-160
69         Gcc_Clang,            // gcc and clang
70     };
71 
72     uint8_t crtDestructorsSupported; // Not all platforms support crt_destructor
73     uint8_t boolsize;            // size of a C '_Bool' type
74     uint8_t shortsize;           // size of a C 'short' or 'unsigned short' type
75     uint8_t intsize;             // size of a C 'int' or 'unsigned int' type
76     uint8_t longsize;            // size of a C 'long' or 'unsigned long' type
77     uint8_t long_longsize;       // size of a C 'long long' or 'unsigned long long' type
78     uint8_t long_doublesize;     // size of a C 'long double'
79     uint8_t wchar_tsize;         // size of a C 'wchar_t' type
80     Runtime runtime;
81     BitFieldStyle bitFieldStyle; // different C compilers do it differently
82 };
83 
84 struct TargetCPP
85 {
86     enum class Runtime : unsigned char
87     {
88         Unspecified,
89         Clang,
90         DigitalMars,
91         Gcc,
92         Microsoft,
93         Sun
94     };
95     bool reverseOverloads;    // with dmc and cl, overloaded functions are grouped and in reverse order
96     bool exceptions;          // set if catching C++ exceptions is supported
97     bool twoDtorInVtable;     // target C++ ABI puts deleting and non-deleting destructor into vtable
98     bool splitVBasetable;     // set if C++ ABI uses separate tables for virtual functions and virtual bases
99     bool wrapDtorInExternD;   // set if C++ dtors require a D wrapper to be callable from runtime
100     Runtime runtime;
101 
102     const char *toMangle(Dsymbol *s);
103     const char *typeInfoMangle(ClassDeclaration *cd);
104     const char *thunkMangle(FuncDeclaration *fd, int offset);
105     const char *typeMangle(Type *t);
106     Type *parameterType(Type *p);
107     bool fundamentalType(const Type *t, bool& isFundamental);
108     unsigned derivedClassOffset(ClassDeclaration *baseClass);
109 };
110 
111 struct TargetObjC
112 {
113     bool supported;     // set if compiler can interface with Objective-C
114 };
115 
116 struct Target
117 {
118     typedef unsigned char OS;
119     enum
120     {
121         /* These are mutually exclusive; one and only one is set.
122          * Match spelling and casing of corresponding version identifiers
123          */
124         OS_Freestanding = 0,
125         OS_linux        = 1,
126         OS_Windows      = 2,
127         OS_OSX          = 4,
128         OS_OpenBSD      = 8,
129         OS_FreeBSD      = 0x10,
130         OS_Solaris      = 0x20,
131         OS_DragonFlyBSD = 0x40,
132 
133         // Combination masks
134         all = OS_linux | OS_Windows | OS_OSX | OS_OpenBSD | OS_FreeBSD | OS_Solaris | OS_DragonFlyBSD,
135         Posix = OS_linux | OS_OSX | OS_OpenBSD | OS_FreeBSD | OS_Solaris | OS_DragonFlyBSD,
136     };
137 
138     OS os;
139     uint8_t osMajor;
140     // D ABI
141     uint8_t ptrsize;
142     uint8_t realsize;           // size a real consumes in memory
143     uint8_t realpad;            // 'padding' added to the CPU real size to bring it up to realsize
144     uint8_t realalignsize;      // alignment for reals
145     uint8_t classinfosize;      // size of 'ClassInfo'
146     uint64_t maxStaticDataSize; // maximum size of static data
147 
148     // C ABI
149     TargetC c;
150 
151     // C++ ABI
152     TargetCPP cpp;
153 
154     // Objective-C ABI
155     TargetObjC objc;
156 
157     DString architectureName;    // name of the platform architecture (e.g. X86_64)
158     CPU cpu;                // CPU instruction set to target
159     bool is64bit;           // generate 64 bit code for x86_64; true by default for 64 bit dmd
160     bool isLP64;            // pointers are 64 bits
161 
162     // Environmental
163     DString obj_ext;    /// extension for object files
164     DString lib_ext;    /// extension for static library files
165     DString dll_ext;    /// extension for dynamic library files
166     bool run_noext;     /// allow -run sources without extensions
167     bool omfobj;        /// for Win32: write OMF object files instead of COFF
168 
169     template <typename T>
170     struct FPTypeProperties
171     {
172         real_t max;
173         real_t min_normal;
174         real_t nan;
175         real_t infinity;
176         real_t epsilon;
177 
178         int64_t dig;
179         int64_t mant_dig;
180         int64_t max_exp;
181         int64_t min_exp;
182         int64_t max_10_exp;
183         int64_t min_10_exp;
184     };
185 
186     FPTypeProperties<float> FloatProperties;
187     FPTypeProperties<double> DoubleProperties;
188     FPTypeProperties<real_t> RealProperties;
189 
190 private:
191     Type *tvalist;
192     const Param *params;
193 
194 public:
195     void _init(const Param& params);
196     // Type sizes and support.
197     unsigned alignsize(Type *type);
198     unsigned fieldalign(Type *type);
199     Type *va_listType(const Loc &loc, Scope *sc);  // get type of va_list
200     int isVectorTypeSupported(int sz, Type *type);
201     bool isVectorOpSupported(Type *type, EXP op, Type *t2 = NULL);
202     // ABI and backend.
203     LINK systemLinkage();
204     TypeTuple *toArgTypes(Type *t);
205     bool isReturnOnStack(TypeFunction *tf, bool needsThis);
206     bool preferPassByRef(Type *t);
207     Expression *getTargetInfo(const char* name, const Loc& loc);
208     bool isCalleeDestroyingArgs(TypeFunction* tf);
209     bool libraryObjectMonitors(FuncDeclaration *fd, Statement *fbody);
210     bool supportsLinkerDirective() const;
211     void addPredefinedGlobalIdentifiers() const;
212 };
213 
214 extern Target target;
215