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