target.h revision 1.1.1.3 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