1 1.1 joerg //===--- Targets.cpp - Implement target feature support -------------------===// 2 1.1 joerg // 3 1.1 joerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 1.1 joerg // See https://llvm.org/LICENSE.txt for license information. 5 1.1 joerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 1.1 joerg // 7 1.1 joerg //===----------------------------------------------------------------------===// 8 1.1 joerg // 9 1.1 joerg // This file implements construction of a TargetInfo object from a 10 1.1 joerg // target triple. 11 1.1 joerg // 12 1.1 joerg //===----------------------------------------------------------------------===// 13 1.1 joerg 14 1.1 joerg #include "Targets.h" 15 1.1 joerg 16 1.1 joerg #include "Targets/AArch64.h" 17 1.1 joerg #include "Targets/AMDGPU.h" 18 1.1 joerg #include "Targets/ARC.h" 19 1.1 joerg #include "Targets/ARM.h" 20 1.1 joerg #include "Targets/AVR.h" 21 1.1 joerg #include "Targets/BPF.h" 22 1.1 joerg #include "Targets/Hexagon.h" 23 1.1 joerg #include "Targets/Lanai.h" 24 1.1 joerg #include "Targets/Le64.h" 25 1.1.1.2 joerg #include "Targets/M68k.h" 26 1.1 joerg #include "Targets/MSP430.h" 27 1.1 joerg #include "Targets/Mips.h" 28 1.1 joerg #include "Targets/NVPTX.h" 29 1.1 joerg #include "Targets/OSTargets.h" 30 1.1 joerg #include "Targets/PNaCl.h" 31 1.1 joerg #include "Targets/PPC.h" 32 1.1 joerg #include "Targets/RISCV.h" 33 1.1 joerg #include "Targets/SPIR.h" 34 1.1 joerg #include "Targets/Sparc.h" 35 1.1 joerg #include "Targets/SystemZ.h" 36 1.1 joerg #include "Targets/TCE.h" 37 1.1.1.2 joerg #include "Targets/VE.h" 38 1.1 joerg #include "Targets/WebAssembly.h" 39 1.1 joerg #include "Targets/X86.h" 40 1.1 joerg #include "Targets/XCore.h" 41 1.1 joerg #include "clang/Basic/Diagnostic.h" 42 1.1 joerg #include "llvm/ADT/StringExtras.h" 43 1.1 joerg #include "llvm/ADT/Triple.h" 44 1.1 joerg 45 1.1 joerg using namespace clang; 46 1.1 joerg 47 1.1 joerg namespace clang { 48 1.1 joerg namespace targets { 49 1.1 joerg //===----------------------------------------------------------------------===// 50 1.1 joerg // Common code shared among targets. 51 1.1 joerg //===----------------------------------------------------------------------===// 52 1.1 joerg 53 1.1 joerg /// DefineStd - Define a macro name and standard variants. For example if 54 1.1 joerg /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix" 55 1.1 joerg /// when in GNU mode. 56 1.1 joerg void DefineStd(MacroBuilder &Builder, StringRef MacroName, 57 1.1 joerg const LangOptions &Opts) { 58 1.1 joerg assert(MacroName[0] != '_' && "Identifier should be in the user's namespace"); 59 1.1 joerg 60 1.1 joerg // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier 61 1.1 joerg // in the user's namespace. 62 1.1 joerg if (Opts.GNUMode) 63 1.1 joerg Builder.defineMacro(MacroName); 64 1.1 joerg 65 1.1 joerg // Define __unix. 66 1.1 joerg Builder.defineMacro("__" + MacroName); 67 1.1 joerg 68 1.1 joerg // Define __unix__. 69 1.1 joerg Builder.defineMacro("__" + MacroName + "__"); 70 1.1 joerg } 71 1.1 joerg 72 1.1 joerg void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning) { 73 1.1 joerg Builder.defineMacro("__" + CPUName); 74 1.1 joerg Builder.defineMacro("__" + CPUName + "__"); 75 1.1 joerg if (Tuning) 76 1.1 joerg Builder.defineMacro("__tune_" + CPUName + "__"); 77 1.1 joerg } 78 1.1 joerg 79 1.1 joerg void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) { 80 1.1 joerg // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang 81 1.1 joerg // supports __declspec natively under -fms-extensions, but we define a no-op 82 1.1 joerg // __declspec macro anyway for pre-processor compatibility. 83 1.1 joerg if (Opts.MicrosoftExt) 84 1.1 joerg Builder.defineMacro("__declspec", "__declspec"); 85 1.1 joerg else 86 1.1 joerg Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 87 1.1 joerg 88 1.1 joerg if (!Opts.MicrosoftExt) { 89 1.1 joerg // Provide macros for all the calling convention keywords. Provide both 90 1.1 joerg // single and double underscore prefixed variants. These are available on 91 1.1 joerg // x64 as well as x86, even though they have no effect. 92 1.1 joerg const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"}; 93 1.1 joerg for (const char *CC : CCs) { 94 1.1 joerg std::string GCCSpelling = "__attribute__((__"; 95 1.1 joerg GCCSpelling += CC; 96 1.1 joerg GCCSpelling += "__))"; 97 1.1 joerg Builder.defineMacro(Twine("_") + CC, GCCSpelling); 98 1.1 joerg Builder.defineMacro(Twine("__") + CC, GCCSpelling); 99 1.1 joerg } 100 1.1 joerg } 101 1.1 joerg } 102 1.1 joerg 103 1.1 joerg //===----------------------------------------------------------------------===// 104 1.1 joerg // Driver code 105 1.1 joerg //===----------------------------------------------------------------------===// 106 1.1 joerg 107 1.1 joerg TargetInfo *AllocateTarget(const llvm::Triple &Triple, 108 1.1 joerg const TargetOptions &Opts) { 109 1.1 joerg llvm::Triple::OSType os = Triple.getOS(); 110 1.1 joerg 111 1.1 joerg switch (Triple.getArch()) { 112 1.1 joerg default: 113 1.1 joerg return nullptr; 114 1.1 joerg 115 1.1 joerg case llvm::Triple::arc: 116 1.1 joerg return new ARCTargetInfo(Triple, Opts); 117 1.1 joerg 118 1.1 joerg case llvm::Triple::xcore: 119 1.1 joerg return new XCoreTargetInfo(Triple, Opts); 120 1.1 joerg 121 1.1 joerg case llvm::Triple::hexagon: 122 1.1.1.2 joerg if (os == llvm::Triple::Linux && 123 1.1.1.2 joerg Triple.getEnvironment() == llvm::Triple::Musl) 124 1.1.1.2 joerg return new LinuxTargetInfo<HexagonTargetInfo>(Triple, Opts); 125 1.1 joerg return new HexagonTargetInfo(Triple, Opts); 126 1.1 joerg 127 1.1 joerg case llvm::Triple::lanai: 128 1.1 joerg return new LanaiTargetInfo(Triple, Opts); 129 1.1 joerg 130 1.1.1.2 joerg case llvm::Triple::aarch64_32: 131 1.1.1.2 joerg if (Triple.isOSDarwin()) 132 1.1.1.2 joerg return new DarwinAArch64TargetInfo(Triple, Opts); 133 1.1.1.2 joerg 134 1.1.1.2 joerg return nullptr; 135 1.1 joerg case llvm::Triple::aarch64: 136 1.1 joerg if (Triple.isOSDarwin()) 137 1.1 joerg return new DarwinAArch64TargetInfo(Triple, Opts); 138 1.1 joerg 139 1.1 joerg switch (os) { 140 1.1 joerg case llvm::Triple::CloudABI: 141 1.1 joerg return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts); 142 1.1 joerg case llvm::Triple::FreeBSD: 143 1.1 joerg return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts); 144 1.1 joerg case llvm::Triple::Fuchsia: 145 1.1 joerg return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts); 146 1.1 joerg case llvm::Triple::Linux: 147 1.1 joerg return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts); 148 1.1 joerg case llvm::Triple::NetBSD: 149 1.1 joerg return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts); 150 1.1 joerg case llvm::Triple::OpenBSD: 151 1.1 joerg return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts); 152 1.1 joerg case llvm::Triple::Win32: 153 1.1 joerg switch (Triple.getEnvironment()) { 154 1.1 joerg case llvm::Triple::GNU: 155 1.1 joerg return new MinGWARM64TargetInfo(Triple, Opts); 156 1.1 joerg case llvm::Triple::MSVC: 157 1.1 joerg default: // Assume MSVC for unknown environments 158 1.1 joerg return new MicrosoftARM64TargetInfo(Triple, Opts); 159 1.1 joerg } 160 1.1 joerg default: 161 1.1 joerg return new AArch64leTargetInfo(Triple, Opts); 162 1.1 joerg } 163 1.1 joerg 164 1.1 joerg case llvm::Triple::aarch64_be: 165 1.1 joerg switch (os) { 166 1.1 joerg case llvm::Triple::FreeBSD: 167 1.1 joerg return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts); 168 1.1 joerg case llvm::Triple::Fuchsia: 169 1.1 joerg return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts); 170 1.1 joerg case llvm::Triple::Linux: 171 1.1 joerg return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts); 172 1.1 joerg case llvm::Triple::NetBSD: 173 1.1 joerg return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts); 174 1.1 joerg default: 175 1.1 joerg return new AArch64beTargetInfo(Triple, Opts); 176 1.1 joerg } 177 1.1 joerg 178 1.1 joerg case llvm::Triple::arm: 179 1.1 joerg case llvm::Triple::thumb: 180 1.1 joerg if (Triple.isOSBinFormatMachO()) 181 1.1 joerg return new DarwinARMTargetInfo(Triple, Opts); 182 1.1 joerg 183 1.1 joerg switch (os) { 184 1.1 joerg case llvm::Triple::CloudABI: 185 1.1 joerg return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts); 186 1.1 joerg case llvm::Triple::Linux: 187 1.1 joerg return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts); 188 1.1 joerg case llvm::Triple::FreeBSD: 189 1.1 joerg return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts); 190 1.1 joerg case llvm::Triple::NetBSD: 191 1.1 joerg return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts); 192 1.1 joerg case llvm::Triple::OpenBSD: 193 1.1 joerg return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts); 194 1.1 joerg case llvm::Triple::RTEMS: 195 1.1 joerg return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts); 196 1.1 joerg case llvm::Triple::NaCl: 197 1.1 joerg return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts); 198 1.1 joerg case llvm::Triple::Win32: 199 1.1 joerg switch (Triple.getEnvironment()) { 200 1.1 joerg case llvm::Triple::Cygnus: 201 1.1 joerg return new CygwinARMTargetInfo(Triple, Opts); 202 1.1 joerg case llvm::Triple::GNU: 203 1.1 joerg return new MinGWARMTargetInfo(Triple, Opts); 204 1.1 joerg case llvm::Triple::Itanium: 205 1.1 joerg return new ItaniumWindowsARMleTargetInfo(Triple, Opts); 206 1.1 joerg case llvm::Triple::MSVC: 207 1.1 joerg default: // Assume MSVC for unknown environments 208 1.1 joerg return new MicrosoftARMleTargetInfo(Triple, Opts); 209 1.1 joerg } 210 1.1 joerg default: 211 1.1 joerg return new ARMleTargetInfo(Triple, Opts); 212 1.1 joerg } 213 1.1 joerg 214 1.1 joerg case llvm::Triple::armeb: 215 1.1 joerg case llvm::Triple::thumbeb: 216 1.1 joerg if (Triple.isOSDarwin()) 217 1.1 joerg return new DarwinARMTargetInfo(Triple, Opts); 218 1.1 joerg 219 1.1 joerg switch (os) { 220 1.1 joerg case llvm::Triple::Linux: 221 1.1 joerg return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts); 222 1.1 joerg case llvm::Triple::FreeBSD: 223 1.1 joerg return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts); 224 1.1 joerg case llvm::Triple::NetBSD: 225 1.1 joerg return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts); 226 1.1 joerg case llvm::Triple::OpenBSD: 227 1.1 joerg return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts); 228 1.1 joerg case llvm::Triple::RTEMS: 229 1.1 joerg return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts); 230 1.1 joerg case llvm::Triple::NaCl: 231 1.1 joerg return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts); 232 1.1 joerg default: 233 1.1 joerg return new ARMbeTargetInfo(Triple, Opts); 234 1.1 joerg } 235 1.1 joerg 236 1.1 joerg case llvm::Triple::avr: 237 1.1 joerg return new AVRTargetInfo(Triple, Opts); 238 1.1 joerg case llvm::Triple::bpfeb: 239 1.1 joerg case llvm::Triple::bpfel: 240 1.1 joerg return new BPFTargetInfo(Triple, Opts); 241 1.1 joerg 242 1.1 joerg case llvm::Triple::msp430: 243 1.1 joerg return new MSP430TargetInfo(Triple, Opts); 244 1.1 joerg 245 1.1 joerg case llvm::Triple::mips: 246 1.1 joerg switch (os) { 247 1.1 joerg case llvm::Triple::Linux: 248 1.1 joerg return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts); 249 1.1 joerg case llvm::Triple::RTEMS: 250 1.1 joerg return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts); 251 1.1 joerg case llvm::Triple::FreeBSD: 252 1.1 joerg return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 253 1.1 joerg case llvm::Triple::NetBSD: 254 1.1 joerg return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 255 1.1 joerg default: 256 1.1 joerg return new MipsTargetInfo(Triple, Opts); 257 1.1 joerg } 258 1.1 joerg 259 1.1 joerg case llvm::Triple::mipsel: 260 1.1 joerg switch (os) { 261 1.1 joerg case llvm::Triple::Linux: 262 1.1 joerg return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts); 263 1.1 joerg case llvm::Triple::RTEMS: 264 1.1 joerg return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts); 265 1.1 joerg case llvm::Triple::FreeBSD: 266 1.1 joerg return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 267 1.1 joerg case llvm::Triple::NetBSD: 268 1.1 joerg return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 269 1.1 joerg case llvm::Triple::NaCl: 270 1.1 joerg return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts); 271 1.1 joerg default: 272 1.1 joerg return new MipsTargetInfo(Triple, Opts); 273 1.1 joerg } 274 1.1 joerg 275 1.1 joerg case llvm::Triple::mips64: 276 1.1 joerg switch (os) { 277 1.1 joerg case llvm::Triple::Linux: 278 1.1 joerg return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts); 279 1.1 joerg case llvm::Triple::RTEMS: 280 1.1 joerg return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts); 281 1.1 joerg case llvm::Triple::FreeBSD: 282 1.1 joerg return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 283 1.1 joerg case llvm::Triple::NetBSD: 284 1.1 joerg return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 285 1.1 joerg case llvm::Triple::OpenBSD: 286 1.1 joerg return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 287 1.1 joerg default: 288 1.1 joerg return new MipsTargetInfo(Triple, Opts); 289 1.1 joerg } 290 1.1 joerg 291 1.1 joerg case llvm::Triple::mips64el: 292 1.1 joerg switch (os) { 293 1.1 joerg case llvm::Triple::Linux: 294 1.1 joerg return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts); 295 1.1 joerg case llvm::Triple::RTEMS: 296 1.1 joerg return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts); 297 1.1 joerg case llvm::Triple::FreeBSD: 298 1.1 joerg return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 299 1.1 joerg case llvm::Triple::NetBSD: 300 1.1 joerg return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 301 1.1 joerg case llvm::Triple::OpenBSD: 302 1.1 joerg return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 303 1.1 joerg default: 304 1.1 joerg return new MipsTargetInfo(Triple, Opts); 305 1.1 joerg } 306 1.1 joerg 307 1.1.1.2 joerg case llvm::Triple::m68k: 308 1.1.1.2 joerg switch (os) { 309 1.1.1.2 joerg case llvm::Triple::Linux: 310 1.1.1.2 joerg return new LinuxTargetInfo<M68kTargetInfo>(Triple, Opts); 311 1.1.1.2 joerg case llvm::Triple::NetBSD: 312 1.1.1.2 joerg return new NetBSDTargetInfo<M68kTargetInfo>(Triple, Opts); 313 1.1.1.2 joerg default: 314 1.1.1.2 joerg return new M68kTargetInfo(Triple, Opts); 315 1.1.1.2 joerg } 316 1.1.1.2 joerg 317 1.1 joerg case llvm::Triple::le32: 318 1.1 joerg switch (os) { 319 1.1 joerg case llvm::Triple::NaCl: 320 1.1 joerg return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts); 321 1.1 joerg default: 322 1.1 joerg return nullptr; 323 1.1 joerg } 324 1.1 joerg 325 1.1 joerg case llvm::Triple::le64: 326 1.1 joerg return new Le64TargetInfo(Triple, Opts); 327 1.1 joerg 328 1.1 joerg case llvm::Triple::ppc: 329 1.1 joerg if (Triple.isOSDarwin()) 330 1.1 joerg return new DarwinPPC32TargetInfo(Triple, Opts); 331 1.1 joerg switch (os) { 332 1.1 joerg case llvm::Triple::Linux: 333 1.1 joerg return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts); 334 1.1 joerg case llvm::Triple::FreeBSD: 335 1.1 joerg return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts); 336 1.1 joerg case llvm::Triple::NetBSD: 337 1.1 joerg return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts); 338 1.1 joerg case llvm::Triple::OpenBSD: 339 1.1 joerg return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts); 340 1.1 joerg case llvm::Triple::RTEMS: 341 1.1 joerg return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts); 342 1.1 joerg case llvm::Triple::AIX: 343 1.1 joerg return new AIXPPC32TargetInfo(Triple, Opts); 344 1.1 joerg default: 345 1.1 joerg return new PPC32TargetInfo(Triple, Opts); 346 1.1 joerg } 347 1.1 joerg 348 1.1.1.2 joerg case llvm::Triple::ppcle: 349 1.1.1.2 joerg switch (os) { 350 1.1.1.2 joerg case llvm::Triple::Linux: 351 1.1.1.2 joerg return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts); 352 1.1.1.2 joerg case llvm::Triple::FreeBSD: 353 1.1.1.2 joerg return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts); 354 1.1.1.2 joerg default: 355 1.1.1.2 joerg return new PPC32TargetInfo(Triple, Opts); 356 1.1.1.2 joerg } 357 1.1.1.2 joerg 358 1.1 joerg case llvm::Triple::ppc64: 359 1.1 joerg if (Triple.isOSDarwin()) 360 1.1 joerg return new DarwinPPC64TargetInfo(Triple, Opts); 361 1.1 joerg switch (os) { 362 1.1 joerg case llvm::Triple::Linux: 363 1.1 joerg return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts); 364 1.1 joerg case llvm::Triple::Lv2: 365 1.1 joerg return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts); 366 1.1 joerg case llvm::Triple::FreeBSD: 367 1.1 joerg return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 368 1.1 joerg case llvm::Triple::NetBSD: 369 1.1 joerg return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 370 1.1.1.2 joerg case llvm::Triple::OpenBSD: 371 1.1.1.2 joerg return new OpenBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 372 1.1 joerg case llvm::Triple::AIX: 373 1.1 joerg return new AIXPPC64TargetInfo(Triple, Opts); 374 1.1 joerg default: 375 1.1 joerg return new PPC64TargetInfo(Triple, Opts); 376 1.1 joerg } 377 1.1 joerg 378 1.1 joerg case llvm::Triple::ppc64le: 379 1.1 joerg switch (os) { 380 1.1 joerg case llvm::Triple::Linux: 381 1.1 joerg return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts); 382 1.1.1.2 joerg case llvm::Triple::FreeBSD: 383 1.1.1.2 joerg return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 384 1.1 joerg case llvm::Triple::NetBSD: 385 1.1 joerg return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 386 1.1.1.2 joerg case llvm::Triple::OpenBSD: 387 1.1.1.2 joerg return new OpenBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 388 1.1 joerg default: 389 1.1 joerg return new PPC64TargetInfo(Triple, Opts); 390 1.1 joerg } 391 1.1 joerg 392 1.1 joerg case llvm::Triple::nvptx: 393 1.1 joerg return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32); 394 1.1 joerg case llvm::Triple::nvptx64: 395 1.1 joerg return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64); 396 1.1 joerg 397 1.1 joerg case llvm::Triple::amdgcn: 398 1.1 joerg case llvm::Triple::r600: 399 1.1 joerg return new AMDGPUTargetInfo(Triple, Opts); 400 1.1 joerg 401 1.1 joerg case llvm::Triple::riscv32: 402 1.1 joerg // TODO: add cases for NetBSD, RTEMS once tested. 403 1.1 joerg switch (os) { 404 1.1 joerg case llvm::Triple::FreeBSD: 405 1.1 joerg return new FreeBSDTargetInfo<RISCV32TargetInfo>(Triple, Opts); 406 1.1 joerg case llvm::Triple::Linux: 407 1.1 joerg return new LinuxTargetInfo<RISCV32TargetInfo>(Triple, Opts); 408 1.1 joerg default: 409 1.1 joerg return new RISCV32TargetInfo(Triple, Opts); 410 1.1 joerg } 411 1.1 joerg 412 1.1 joerg case llvm::Triple::riscv64: 413 1.1 joerg // TODO: add cases for NetBSD, RTEMS once tested. 414 1.1 joerg switch (os) { 415 1.1 joerg case llvm::Triple::FreeBSD: 416 1.1 joerg return new FreeBSDTargetInfo<RISCV64TargetInfo>(Triple, Opts); 417 1.1.1.2 joerg case llvm::Triple::OpenBSD: 418 1.1.1.2 joerg return new OpenBSDTargetInfo<RISCV64TargetInfo>(Triple, Opts); 419 1.1.1.2 joerg case llvm::Triple::Fuchsia: 420 1.1.1.2 joerg return new FuchsiaTargetInfo<RISCV64TargetInfo>(Triple, Opts); 421 1.1 joerg case llvm::Triple::Linux: 422 1.1 joerg return new LinuxTargetInfo<RISCV64TargetInfo>(Triple, Opts); 423 1.1 joerg default: 424 1.1 joerg return new RISCV64TargetInfo(Triple, Opts); 425 1.1 joerg } 426 1.1 joerg 427 1.1 joerg case llvm::Triple::sparc: 428 1.1 joerg switch (os) { 429 1.1 joerg case llvm::Triple::Linux: 430 1.1 joerg return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts); 431 1.1 joerg case llvm::Triple::Solaris: 432 1.1 joerg return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts); 433 1.1 joerg case llvm::Triple::NetBSD: 434 1.1 joerg return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts); 435 1.1 joerg case llvm::Triple::RTEMS: 436 1.1 joerg return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts); 437 1.1 joerg default: 438 1.1 joerg return new SparcV8TargetInfo(Triple, Opts); 439 1.1 joerg } 440 1.1 joerg 441 1.1 joerg // The 'sparcel' architecture copies all the above cases except for Solaris. 442 1.1 joerg case llvm::Triple::sparcel: 443 1.1 joerg switch (os) { 444 1.1 joerg case llvm::Triple::Linux: 445 1.1 joerg return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts); 446 1.1 joerg case llvm::Triple::NetBSD: 447 1.1 joerg return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts); 448 1.1 joerg case llvm::Triple::RTEMS: 449 1.1 joerg return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts); 450 1.1 joerg default: 451 1.1 joerg return new SparcV8elTargetInfo(Triple, Opts); 452 1.1 joerg } 453 1.1 joerg 454 1.1 joerg case llvm::Triple::sparcv9: 455 1.1 joerg switch (os) { 456 1.1 joerg case llvm::Triple::Linux: 457 1.1 joerg return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts); 458 1.1 joerg case llvm::Triple::Solaris: 459 1.1 joerg return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts); 460 1.1 joerg case llvm::Triple::NetBSD: 461 1.1 joerg return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts); 462 1.1 joerg case llvm::Triple::OpenBSD: 463 1.1 joerg return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts); 464 1.1 joerg case llvm::Triple::FreeBSD: 465 1.1 joerg return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts); 466 1.1 joerg default: 467 1.1 joerg return new SparcV9TargetInfo(Triple, Opts); 468 1.1 joerg } 469 1.1 joerg 470 1.1 joerg case llvm::Triple::systemz: 471 1.1 joerg switch (os) { 472 1.1 joerg case llvm::Triple::Linux: 473 1.1 joerg return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts); 474 1.1.1.2 joerg case llvm::Triple::ZOS: 475 1.1.1.2 joerg return new ZOSTargetInfo<SystemZTargetInfo>(Triple, Opts); 476 1.1 joerg default: 477 1.1 joerg return new SystemZTargetInfo(Triple, Opts); 478 1.1 joerg } 479 1.1 joerg 480 1.1 joerg case llvm::Triple::tce: 481 1.1 joerg return new TCETargetInfo(Triple, Opts); 482 1.1 joerg 483 1.1 joerg case llvm::Triple::tcele: 484 1.1 joerg return new TCELETargetInfo(Triple, Opts); 485 1.1 joerg 486 1.1 joerg case llvm::Triple::x86: 487 1.1 joerg if (Triple.isOSDarwin()) 488 1.1 joerg return new DarwinI386TargetInfo(Triple, Opts); 489 1.1 joerg 490 1.1 joerg switch (os) { 491 1.1 joerg case llvm::Triple::Ananas: 492 1.1 joerg return new AnanasTargetInfo<X86_32TargetInfo>(Triple, Opts); 493 1.1 joerg case llvm::Triple::CloudABI: 494 1.1 joerg return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts); 495 1.1 joerg case llvm::Triple::Linux: { 496 1.1 joerg switch (Triple.getEnvironment()) { 497 1.1 joerg default: 498 1.1 joerg return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts); 499 1.1 joerg case llvm::Triple::Android: 500 1.1 joerg return new AndroidX86_32TargetInfo(Triple, Opts); 501 1.1 joerg } 502 1.1 joerg } 503 1.1 joerg case llvm::Triple::DragonFly: 504 1.1 joerg return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts); 505 1.1 joerg case llvm::Triple::NetBSD: 506 1.1 joerg return new NetBSDI386TargetInfo(Triple, Opts); 507 1.1 joerg case llvm::Triple::OpenBSD: 508 1.1 joerg return new OpenBSDI386TargetInfo(Triple, Opts); 509 1.1 joerg case llvm::Triple::FreeBSD: 510 1.1 joerg return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts); 511 1.1.1.2 joerg case llvm::Triple::Fuchsia: 512 1.1.1.2 joerg return new FuchsiaTargetInfo<X86_32TargetInfo>(Triple, Opts); 513 1.1 joerg case llvm::Triple::KFreeBSD: 514 1.1 joerg return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts); 515 1.1 joerg case llvm::Triple::Minix: 516 1.1 joerg return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts); 517 1.1 joerg case llvm::Triple::Solaris: 518 1.1 joerg return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts); 519 1.1 joerg case llvm::Triple::Win32: { 520 1.1 joerg switch (Triple.getEnvironment()) { 521 1.1 joerg case llvm::Triple::Cygnus: 522 1.1 joerg return new CygwinX86_32TargetInfo(Triple, Opts); 523 1.1 joerg case llvm::Triple::GNU: 524 1.1 joerg return new MinGWX86_32TargetInfo(Triple, Opts); 525 1.1 joerg case llvm::Triple::Itanium: 526 1.1 joerg case llvm::Triple::MSVC: 527 1.1 joerg default: // Assume MSVC for unknown environments 528 1.1 joerg return new MicrosoftX86_32TargetInfo(Triple, Opts); 529 1.1 joerg } 530 1.1 joerg } 531 1.1 joerg case llvm::Triple::Haiku: 532 1.1 joerg return new HaikuX86_32TargetInfo(Triple, Opts); 533 1.1 joerg case llvm::Triple::RTEMS: 534 1.1 joerg return new RTEMSX86_32TargetInfo(Triple, Opts); 535 1.1 joerg case llvm::Triple::NaCl: 536 1.1 joerg return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts); 537 1.1 joerg case llvm::Triple::ELFIAMCU: 538 1.1 joerg return new MCUX86_32TargetInfo(Triple, Opts); 539 1.1 joerg case llvm::Triple::Hurd: 540 1.1 joerg return new HurdTargetInfo<X86_32TargetInfo>(Triple, Opts); 541 1.1 joerg default: 542 1.1 joerg return new X86_32TargetInfo(Triple, Opts); 543 1.1 joerg } 544 1.1 joerg 545 1.1 joerg case llvm::Triple::x86_64: 546 1.1 joerg if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) 547 1.1 joerg return new DarwinX86_64TargetInfo(Triple, Opts); 548 1.1 joerg 549 1.1 joerg switch (os) { 550 1.1 joerg case llvm::Triple::Ananas: 551 1.1 joerg return new AnanasTargetInfo<X86_64TargetInfo>(Triple, Opts); 552 1.1 joerg case llvm::Triple::CloudABI: 553 1.1 joerg return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts); 554 1.1 joerg case llvm::Triple::Linux: { 555 1.1 joerg switch (Triple.getEnvironment()) { 556 1.1 joerg default: 557 1.1 joerg return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts); 558 1.1 joerg case llvm::Triple::Android: 559 1.1 joerg return new AndroidX86_64TargetInfo(Triple, Opts); 560 1.1 joerg } 561 1.1 joerg } 562 1.1 joerg case llvm::Triple::DragonFly: 563 1.1 joerg return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts); 564 1.1 joerg case llvm::Triple::NetBSD: 565 1.1 joerg return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts); 566 1.1 joerg case llvm::Triple::OpenBSD: 567 1.1 joerg return new OpenBSDX86_64TargetInfo(Triple, Opts); 568 1.1 joerg case llvm::Triple::FreeBSD: 569 1.1 joerg return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts); 570 1.1 joerg case llvm::Triple::Fuchsia: 571 1.1 joerg return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts); 572 1.1 joerg case llvm::Triple::KFreeBSD: 573 1.1 joerg return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts); 574 1.1 joerg case llvm::Triple::Solaris: 575 1.1 joerg return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts); 576 1.1 joerg case llvm::Triple::Win32: { 577 1.1 joerg switch (Triple.getEnvironment()) { 578 1.1 joerg case llvm::Triple::Cygnus: 579 1.1 joerg return new CygwinX86_64TargetInfo(Triple, Opts); 580 1.1 joerg case llvm::Triple::GNU: 581 1.1 joerg return new MinGWX86_64TargetInfo(Triple, Opts); 582 1.1 joerg case llvm::Triple::MSVC: 583 1.1 joerg default: // Assume MSVC for unknown environments 584 1.1 joerg return new MicrosoftX86_64TargetInfo(Triple, Opts); 585 1.1 joerg } 586 1.1 joerg } 587 1.1 joerg case llvm::Triple::Haiku: 588 1.1 joerg return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts); 589 1.1 joerg case llvm::Triple::NaCl: 590 1.1 joerg return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts); 591 1.1 joerg case llvm::Triple::PS4: 592 1.1 joerg return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts); 593 1.1 joerg default: 594 1.1 joerg return new X86_64TargetInfo(Triple, Opts); 595 1.1 joerg } 596 1.1 joerg 597 1.1 joerg case llvm::Triple::spir: { 598 1.1.1.2 joerg if (os != llvm::Triple::UnknownOS || 599 1.1 joerg Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 600 1.1 joerg return nullptr; 601 1.1 joerg return new SPIR32TargetInfo(Triple, Opts); 602 1.1 joerg } 603 1.1 joerg case llvm::Triple::spir64: { 604 1.1.1.2 joerg if (os != llvm::Triple::UnknownOS || 605 1.1 joerg Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 606 1.1 joerg return nullptr; 607 1.1 joerg return new SPIR64TargetInfo(Triple, Opts); 608 1.1 joerg } 609 1.1 joerg case llvm::Triple::wasm32: 610 1.1 joerg if (Triple.getSubArch() != llvm::Triple::NoSubArch || 611 1.1 joerg Triple.getVendor() != llvm::Triple::UnknownVendor || 612 1.1 joerg !Triple.isOSBinFormatWasm()) 613 1.1 joerg return nullptr; 614 1.1.1.2 joerg switch (os) { 615 1.1 joerg case llvm::Triple::WASI: 616 1.1 joerg return new WASITargetInfo<WebAssembly32TargetInfo>(Triple, Opts); 617 1.1 joerg case llvm::Triple::Emscripten: 618 1.1 joerg return new EmscriptenTargetInfo<WebAssembly32TargetInfo>(Triple, Opts); 619 1.1 joerg case llvm::Triple::UnknownOS: 620 1.1 joerg return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts); 621 1.1 joerg default: 622 1.1 joerg return nullptr; 623 1.1 joerg } 624 1.1 joerg case llvm::Triple::wasm64: 625 1.1 joerg if (Triple.getSubArch() != llvm::Triple::NoSubArch || 626 1.1 joerg Triple.getVendor() != llvm::Triple::UnknownVendor || 627 1.1 joerg !Triple.isOSBinFormatWasm()) 628 1.1 joerg return nullptr; 629 1.1.1.2 joerg switch (os) { 630 1.1 joerg case llvm::Triple::WASI: 631 1.1 joerg return new WASITargetInfo<WebAssembly64TargetInfo>(Triple, Opts); 632 1.1 joerg case llvm::Triple::Emscripten: 633 1.1 joerg return new EmscriptenTargetInfo<WebAssembly64TargetInfo>(Triple, Opts); 634 1.1 joerg case llvm::Triple::UnknownOS: 635 1.1 joerg return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts); 636 1.1 joerg default: 637 1.1 joerg return nullptr; 638 1.1 joerg } 639 1.1 joerg 640 1.1 joerg case llvm::Triple::renderscript32: 641 1.1 joerg return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts); 642 1.1 joerg case llvm::Triple::renderscript64: 643 1.1 joerg return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts); 644 1.1.1.2 joerg 645 1.1.1.2 joerg case llvm::Triple::ve: 646 1.1.1.2 joerg return new LinuxTargetInfo<VETargetInfo>(Triple, Opts); 647 1.1 joerg } 648 1.1 joerg } 649 1.1 joerg } // namespace targets 650 1.1 joerg } // namespace clang 651 1.1 joerg 652 1.1 joerg using namespace clang::targets; 653 1.1 joerg /// CreateTargetInfo - Return the target info object for the specified target 654 1.1 joerg /// options. 655 1.1 joerg TargetInfo * 656 1.1 joerg TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, 657 1.1 joerg const std::shared_ptr<TargetOptions> &Opts) { 658 1.1 joerg llvm::Triple Triple(Opts->Triple); 659 1.1 joerg 660 1.1 joerg // Construct the target 661 1.1 joerg std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts)); 662 1.1 joerg if (!Target) { 663 1.1 joerg Diags.Report(diag::err_target_unknown_triple) << Triple.str(); 664 1.1 joerg return nullptr; 665 1.1 joerg } 666 1.1 joerg Target->TargetOpts = Opts; 667 1.1 joerg 668 1.1 joerg // Set the target CPU if specified. 669 1.1 joerg if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) { 670 1.1 joerg Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU; 671 1.1 joerg SmallVector<StringRef, 32> ValidList; 672 1.1 joerg Target->fillValidCPUList(ValidList); 673 1.1 joerg if (!ValidList.empty()) 674 1.1 joerg Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", "); 675 1.1 joerg return nullptr; 676 1.1 joerg } 677 1.1 joerg 678 1.1.1.2 joerg // Check the TuneCPU name if specified. 679 1.1.1.2 joerg if (!Opts->TuneCPU.empty() && 680 1.1.1.2 joerg !Target->isValidTuneCPUName(Opts->TuneCPU)) { 681 1.1.1.2 joerg Diags.Report(diag::err_target_unknown_cpu) << Opts->TuneCPU; 682 1.1.1.2 joerg SmallVector<StringRef, 32> ValidList; 683 1.1.1.2 joerg Target->fillValidTuneCPUList(ValidList); 684 1.1.1.2 joerg if (!ValidList.empty()) 685 1.1.1.2 joerg Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", "); 686 1.1.1.2 joerg return nullptr; 687 1.1.1.2 joerg } 688 1.1.1.2 joerg 689 1.1 joerg // Set the target ABI if specified. 690 1.1 joerg if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) { 691 1.1 joerg Diags.Report(diag::err_target_unknown_abi) << Opts->ABI; 692 1.1 joerg return nullptr; 693 1.1 joerg } 694 1.1 joerg 695 1.1 joerg // Set the fp math unit. 696 1.1 joerg if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) { 697 1.1 joerg Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath; 698 1.1 joerg return nullptr; 699 1.1 joerg } 700 1.1 joerg 701 1.1 joerg // Compute the default target features, we need the target to handle this 702 1.1 joerg // because features may have dependencies on one another. 703 1.1.1.2 joerg if (!Target->initFeatureMap(Opts->FeatureMap, Diags, Opts->CPU, 704 1.1 joerg Opts->FeaturesAsWritten)) 705 1.1 joerg return nullptr; 706 1.1 joerg 707 1.1 joerg // Add the features to the compile options. 708 1.1 joerg Opts->Features.clear(); 709 1.1.1.2 joerg for (const auto &F : Opts->FeatureMap) 710 1.1 joerg Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str()); 711 1.1 joerg // Sort here, so we handle the features in a predictable order. (This matters 712 1.1 joerg // when we're dealing with features that overlap.) 713 1.1 joerg llvm::sort(Opts->Features); 714 1.1 joerg 715 1.1 joerg if (!Target->handleTargetFeatures(Opts->Features, Diags)) 716 1.1 joerg return nullptr; 717 1.1 joerg 718 1.1 joerg Target->setSupportedOpenCLOpts(); 719 1.1.1.2 joerg Target->setCommandLineOpenCLOpts(); 720 1.1 joerg Target->setMaxAtomicWidth(); 721 1.1 joerg 722 1.1 joerg if (!Target->validateTarget(Diags)) 723 1.1 joerg return nullptr; 724 1.1 joerg 725 1.1 joerg Target->CheckFixedPointBits(); 726 1.1 joerg 727 1.1 joerg return Target.release(); 728 1.1 joerg } 729 1.1.1.2 joerg /// validateOpenCLTarget - Check that OpenCL target has valid 730 1.1.1.2 joerg /// options setting based on OpenCL version. 731 1.1.1.2 joerg bool TargetInfo::validateOpenCLTarget(const LangOptions &Opts, 732 1.1.1.2 joerg DiagnosticsEngine &Diags) const { 733 1.1.1.2 joerg const llvm::StringMap<bool> &OpenCLFeaturesMap = getSupportedOpenCLOpts(); 734 1.1.1.2 joerg 735 1.1.1.2 joerg auto diagnoseNotSupportedCore = [&](llvm::StringRef Name, auto... OptArgs) { 736 1.1.1.2 joerg if (OpenCLOptions::isOpenCLOptionCoreIn(Opts, OptArgs...) && 737 1.1.1.2 joerg !hasFeatureEnabled(OpenCLFeaturesMap, Name)) 738 1.1.1.2 joerg Diags.Report(diag::warn_opencl_unsupported_core_feature) 739 1.1.1.2 joerg << Name << Opts.OpenCLCPlusPlus 740 1.1.1.2 joerg << Opts.getOpenCLVersionTuple().getAsString(); 741 1.1.1.2 joerg }; 742 1.1.1.2 joerg #define OPENCL_GENERIC_EXTENSION(Ext, ...) \ 743 1.1.1.2 joerg diagnoseNotSupportedCore(#Ext, __VA_ARGS__); 744 1.1.1.2 joerg #include "clang/Basic/OpenCLExtensions.def" 745 1.1.1.2 joerg 746 1.1.1.2 joerg // Validate that feature macros are set properly for OpenCL C 3.0. 747 1.1.1.2 joerg // In other cases assume that target is always valid. 748 1.1.1.2 joerg if (Opts.OpenCLCPlusPlus || Opts.OpenCLVersion < 300) 749 1.1.1.2 joerg return true; 750 1.1.1.2 joerg 751 1.1.1.2 joerg // Feature and corresponding equivalent extension must be set 752 1.1.1.2 joerg // simultaneously to the same value. 753 1.1.1.2 joerg for (auto &ExtAndFeat : {std::make_pair("cl_khr_fp64", "__opencl_c_fp64")}) 754 1.1.1.2 joerg if (hasFeatureEnabled(OpenCLFeaturesMap, ExtAndFeat.first) != 755 1.1.1.2 joerg hasFeatureEnabled(OpenCLFeaturesMap, ExtAndFeat.second)) { 756 1.1.1.2 joerg Diags.Report(diag::err_opencl_extension_and_feature_differs) 757 1.1.1.2 joerg << ExtAndFeat.first << ExtAndFeat.second; 758 1.1.1.2 joerg return false; 759 1.1.1.2 joerg } 760 1.1.1.2 joerg 761 1.1.1.2 joerg return true; 762 1.1.1.2 joerg } 763