15 if (
T.isOSBinFormatGOFF())
17 if (
T.isOSBinFormatMachO())
19 if (
T.isOSWindowsOrUEFI() &&
T.isOSBinFormatCOFF())
21 if (
T.isOSBinFormatXCOFF())
31 Ret += TT.isLittleEndian() ?
'e' :
'E';
37 Ret +=
"-p:32:32-Fi8";
47 Ret +=
"-f64:32:64-v64:32:64-v128:32:128";
51 Ret +=
"-i64:64-v128:64:128";
69 if (TT.isOSBinFormatMachO()) {
71 return "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-"
73 return "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-"
76 if (TT.isOSBinFormatCOFF())
77 return "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-"
78 "i128:128-n32:64-S128-Fn32";
80 std::string Ret = TT.isLittleEndian() ?
"e-m:e" :
"E-m:e";
83 Ret +=
"-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-"
90 return "E-m:e-p:64:64-i64:64-i128:128-n32:64-S128";
91 return "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128";
99 return "e-m:e-S32-p:32:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:32"
100 "-v128:32:32-a:0:32-Fi32-n32";
104 if (TT.isLoongArch64())
105 return "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128";
106 assert(TT.isLoongArch32() &&
"only LA32 and LA64 are currently supported");
107 return "e-m:e-p:32:32-i64:64-n32-S128";
124 if (TT.isOSNetBSD()) {
132 return "E-m:e-p:32:32:32-i8:8:8-i16:16:16-i32:32:32-n8:16:32-a:0:32-S32";
142 return "E-m:e-p:32:16:32-i8:8:8-i16:16:16-i32:16:32-n8:16:32-a:0:16-S16";
146enum class MipsABI { O32, N32, N64 };
162 assert(ABIName.
empty() &&
"Unknown ABI option for MIPS");
170 std::string Ret = TT.isLittleEndian() ?
"e" :
"E";
182 Ret +=
"-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
185 Ret +=
"-m:e-p:32:32-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128";
188 Ret +=
"-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128";
200 Ret +=
T.isLittleEndian() ?
'e' :
'E';
212 (!
T.isPPC64ELFv2ABI() && ABIName !=
"elfv2"))) {
214 }
else if (
T.isOSAIX()) {
215 Ret +=
is64Bit ?
"-Fi64" :
"-Fi32";
223 Ret +=
is64Bit ?
"-i64:64-i128:128-n32:64" :
"-i64:64-n32";
232 if (
is64Bit && (
T.isOSAIX() ||
T.isOSLinux()))
233 Ret +=
"-S128-v256:256:256-v512:512:512";
240 return "e-m:e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
241 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1";
249 return "e-m:e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32"
250 "-p7:160:256:256:32-p8:128:128:128:48-p9:192:256:256:32-p10:32:32"
251 "-p11:32:32-p12:32:32-p13:32:32-p14:32:32-p15:32:32"
252 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256"
253 "-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9";
257 if (TT.isOSBinFormatMachO()) {
258 assert(TT.isLittleEndian() &&
"Invalid endianness");
259 assert(TT.isArch32Bit() &&
"Invalid triple");
260 assert((ABIName !=
"ilp32e") &&
"Invalid ABI.");
261 return "e-m:o-p:32:32-i64:64-n32-S128";
266 Ret += TT.isLittleEndian() ?
"e-m:e" :
"E-m:e";
270 bool IsPureCapABI = ABIName.
starts_with(
"il32pc64") ||
274 if (TT.isRISCV64()) {
277 Ret +=
"-pe200:128:128:128:64";
278 Ret +=
"-i64:64-i128:128-n32:64";
280 assert(TT.isRISCV32() &&
"only RV32 and RV64 are currently supported");
283 Ret +=
"-pe200:64:64:64:32";
284 Ret +=
"-i64:64-n32";
287 if (ABIName ==
"ilp32e")
289 else if (ABIName ==
"lp64e")
296 Ret +=
"-A200-P200-G200";
309 return "E-m:e-i64:64-i128:128-n32:64-S128";
311 return "e-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64";
312 return "E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64";
317 std::string Ret =
"E-S64";
340 Ret +=
"-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64";
346 bool Is64Bit = TT.isX86_64();
355 if (!Is64Bit || TT.isX32())
359 Ret +=
"-p270:32:32-p271:32:32-p272:64:64";
364 if (Is64Bit || TT.isOSWindows())
365 Ret +=
"-i64:64-i128:128";
366 else if (TT.isOSIAMCU())
367 Ret +=
"-i64:32-f64:32";
369 Ret +=
"-i128:128-f64:32:64";
374 else if (Is64Bit || TT.isOSDarwin() || TT.isWindowsMSVCEnvironment())
380 Ret += Is64Bit ?
"-n8:16:32:64" :
"-n8:16:32";
383 if ((!Is64Bit && TT.isOSWindows()) || TT.isOSIAMCU())
384 Ret +=
"-a:0:32-S32";
393 return "e-p:32:32-i64:64-i128:128-i256:256-v16:16-v32:32-n16:32:64";
405 if (ABIName ==
"shortptr")
406 return "e-p3:32:32-p4:32:32-p5:32:32-p6:32:32-p7:32:32-p101:32:32-i64:64-"
407 "i128:128-i256:256-v16:16-v32:32-n16:32:64";
408 return "e-p6:32:32-i64:64-i128:128-i256:256-v16:16-v32:32-n16:32:64";
412 const auto Arch = TT.getArch();
419 return "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-"
420 "v256:256-v512:512-v1024:1024-n8:16:32:64-G1";
422 return "e-ve-i64:64-n8:16:32:64-G10";
425 return "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-"
426 "v512:512-v1024:1024-n32:64-S32-G1-P4-A0";
428 return "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-"
429 "v512:512-v1024:1024-n8:16:32:64-G1-P9-A0";
430 return "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-"
431 "v512:512-v1024:1024-n8:16:32:64-G1";
447 ? (TT.isOSEmscripten() ?
"e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-"
448 "i128:128-f128:64-n32:64-S128-ni:1:10:20"
449 :
"e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-"
450 "i128:128-n32:64-S128-ni:1:10:20")
451 : (TT.isOSEmscripten() ?
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-"
452 "i128:128-f128:64-n32:64-S128-ni:1:10:20"
453 :
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-"
454 "i128:128-n32:64-S128-ni:1:10:20");
465 return "e-m:e-i64:64-n32:64-S128-v64:64:64-v128:64:64-v256:64:64-v512:64:64-"
466 "v1024:64:64-v2048:64:64-v4096:64:64-v8192:64:64-v16384:64:64";
481 return "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
482 "f32:32:32-i64:32-f64:32-a:0:32-n32";
484 return "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8:16-a:8";
491 return "e-m:e-ve-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-"
492 "f32:32-f64:64-n8:16:32:64";
494 return "e-m:e-p:32:32:32-a:0-n16:32-"
495 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
496 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048";
508 return "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16";
529 return "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:32:32-"
530 "f16:16:16-f32:32:32-f64:32:32-v64:64:64-i128:128-v128:128:128-"
531 "v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048-"
532 "v4096:4096:4096-a0:0:32-n32";
534 return "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:32:32-"
535 "f16:16:16-f32:32:32-f64:32:32-v64:64:64-i128:128-v128:128:128-"
536 "v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048-"
537 "v4096:4096:4096-a0:0:32-n32";
539 return "e-p:64:64:64-i1:8:64-i8:8:64-i16:16:64-i32:32:64-i64:64:64-"
540 "f16:16:64-f32:32:64-f64:64:64-v64:64:64-i128:128-v128:128:128-"
541 "v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048-"
542 "v4096:4096:4096-a0:0:64-n64";
547 return "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32-f64:32-a:0:32-n32";
549 return "e-m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32";
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static std::string computeX86DataLayout(const Triple &TT)
static std::string computeNVPTXDataLayout(const Triple &T, StringRef ABIName)
static std::string computePowerDataLayout(const Triple &T, StringRef ABIName)
static std::string computeSystemZDataLayout(const Triple &TT)
static std::string computeAMDDataLayout(const Triple &TT)
static std::string computeMipsDataLayout(const Triple &TT, StringRef ABIName)
static std::string computeBPFDataLayout(const Triple &TT)
static std::string computeSPIRVDataLayout(const Triple &TT)
static std::string computeWebAssemblyDataLayout(const Triple &TT)
static StringRef getManglingComponent(const Triple &T)
static std::string computeCSKYDataLayout(const Triple &TT)
static std::string computeLanaiDataLayout()
static std::string computeM68kDataLayout(const Triple &TT)
static std::string computeARMDataLayout(const Triple &TT, StringRef ABIName)
static MipsABI getMipsABI(const Triple &TT, StringRef ABIName)
static std::string computeLoongArchDataLayout(const Triple &TT)
static std::string computeVEDataLayout(const Triple &T)
static std::string computeSparcDataLayout(const Triple &T)
static std::string computeRISCVDataLayout(const Triple &TT, StringRef ABIName)
static std::string computeAArch64DataLayout(const Triple &TT)
static bool is64Bit(const char *name)
Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
Check if the string is empty.
Triple - Helper class for working with autoconf configuration names.
LLVM_ABI std::string computeDataLayout(StringRef ABIName="") const
Compute the LLVM IR data layout string based on the triple.
ArchType getArch() const
Get the parsed architecture type of this triple.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI LLVM_READONLY ARMABI computeTargetABI(const Triple &TT, StringRef ABIName="")
This is an optimization pass for GlobalISel generic memory operations.