@@ -2164,6 +2164,206 @@ VersionTuple Triple::getCanonicalVersionForOS(OSType OSKind,
2164
2164
}
2165
2165
}
2166
2166
2167
+ Triple::CLayouts Triple::getCLayouts () const {
2168
+ Triple::CLayouts Layouts;
2169
+
2170
+ // Default to a 32-bit RISC platform
2171
+ Layouts.LongDoubleWidth = 64 ;
2172
+ Layouts.LongDoubleAlign = 64 ;
2173
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2174
+
2175
+ enum ArchType arch = getArch ();
2176
+
2177
+ // Keep this in sync with clang Targets.cpp AllocateTargetImpl
2178
+ if (arch == arc) {
2179
+ Layouts.LongDoubleAlign = 32 ;
2180
+ } else if (arch == xcore) {
2181
+ Layouts.LongDoubleAlign = 32 ;
2182
+ } else if (arch == hexagon) {
2183
+ // default configuration
2184
+ } else if (arch == lanai) {
2185
+ // default configuration
2186
+ } else if (arch == aarch64_32 || arch == aarch64) {
2187
+ Layouts.LongDoubleWidth = 128 ;
2188
+ Layouts.LongDoubleAlign = 128 ;
2189
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2190
+
2191
+ if (isOSWindows ()) {
2192
+ Layouts.LongDoubleWidth = 64 ;
2193
+ Layouts.LongDoubleAlign = 64 ;
2194
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2195
+ } else if (isOSDarwin ()) {
2196
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 64 ;
2197
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2198
+ }
2199
+ } else if (arch == arm || arch == thumb || arch == armeb || arch == thumbeb) {
2200
+ if (isOSNaCl ()) {
2201
+ Layouts.LongDoubleWidth = 64 ;
2202
+ Layouts.LongDoubleAlign = 64 ;
2203
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2204
+ } else if (isOSWindows ()) {
2205
+ Layouts.LongDoubleWidth = 64 ;
2206
+ Layouts.LongDoubleAlign = 64 ;
2207
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2208
+ }
2209
+ } else if (arch == avr) {
2210
+ Layouts.LongDoubleWidth = 32 ;
2211
+ Layouts.LongDoubleAlign = 8 ;
2212
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEsingle ();
2213
+ } else if (arch == bpfeb || arch == bpfel) {
2214
+ // default configuration
2215
+ } else if (arch == msp430) {
2216
+ Layouts.LongDoubleWidth = 64 ;
2217
+ Layouts.LongDoubleAlign = 16 ;
2218
+ } else if (arch == mips || arch == mipsel || arch == mips64 ||
2219
+ arch == mips64el) {
2220
+ if (isMIPS32 ()) {
2221
+ // o32
2222
+ Layouts.LongDoubleWidth = 64 ;
2223
+ Layouts.LongDoubleAlign = 64 ;
2224
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2225
+ } else {
2226
+ // n32 & n64
2227
+ Layouts.LongDoubleWidth = 128 ;
2228
+ Layouts.LongDoubleAlign = 128 ;
2229
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2230
+ if (isOSFreeBSD ()) {
2231
+ Layouts.LongDoubleWidth = 64 ;
2232
+ Layouts.LongDoubleAlign = 64 ;
2233
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2234
+ }
2235
+ }
2236
+ } else if (arch == m68k) {
2237
+ // default configuration
2238
+ } else if (arch == le32 || arch == le64) {
2239
+ // default configuration
2240
+ } else if (arch == ppc || arch == ppcle || arch == ppc64 || arch == ppc64le) {
2241
+ Layouts.LongDoubleWidth = 128 ;
2242
+ Layouts.LongDoubleAlign = 128 ;
2243
+ Layouts.LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble ();
2244
+
2245
+ if (arch == ppc || arch == ppcle) {
2246
+ if (isOSAIX ()) {
2247
+ Layouts.LongDoubleWidth = 64 ;
2248
+ Layouts.LongDoubleAlign = 32 ;
2249
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2250
+ } else if (isOSFreeBSD () || isOSNetBSD () || isOSOpenBSD () || isMusl ()) {
2251
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 64 ;
2252
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2253
+ }
2254
+ }
2255
+ } else if (arch == nvptx || arch == nvptx) {
2256
+ // nvcc does not copy set long double layouts
2257
+ } else if (arch == amdgcn || arch == r600) {
2258
+ // default configuration
2259
+ } else if (arch == riscv32 || arch == riscv64) {
2260
+ Layouts.LongDoubleWidth = 128 ;
2261
+ Layouts.LongDoubleAlign = 128 ;
2262
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2263
+ } else if (arch == sparc || arch == sparcel) {
2264
+ // default configuration
2265
+ } else if (arch == sparcv9) {
2266
+ Layouts.LongDoubleWidth = 128 ;
2267
+ Layouts.LongDoubleAlign = 128 ;
2268
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2269
+ } else if (arch == systemz) {
2270
+ Layouts.LongDoubleWidth = 128 ;
2271
+ Layouts.LongDoubleAlign = 64 ;
2272
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2273
+ } else if (arch == tce || arch == tcele) {
2274
+ Layouts.LongDoubleWidth = 32 ;
2275
+ Layouts.LongDoubleAlign = 32 ;
2276
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEsingle ();
2277
+ } else if (arch == x86) {
2278
+ Layouts.LongDoubleWidth = 96 ;
2279
+ Layouts.LongDoubleAlign = 32 ;
2280
+ Layouts.LongDoubleFormat = &llvm::APFloat::x87DoubleExtended ();
2281
+
2282
+ if (isOSDarwin ()) {
2283
+ Layouts.LongDoubleWidth = 128 ;
2284
+ Layouts.LongDoubleAlign = 128 ;
2285
+ } else if (isAndroid ()) {
2286
+ Layouts.LongDoubleWidth = 64 ;
2287
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2288
+ } else if (isOHOSFamily ()) {
2289
+ Layouts.LongDoubleWidth = 64 ;
2290
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2291
+ } else if (isOSWindows ()) {
2292
+ Layouts.LongDoubleWidth = 64 ;
2293
+ Layouts.LongDoubleAlign = 64 ;
2294
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2295
+
2296
+ if (isWindowsCygwinEnvironment ()) {
2297
+ Layouts.LongDoubleWidth = 64 ;
2298
+ Layouts.LongDoubleAlign = 64 ;
2299
+ }
2300
+ } else if (isOSNaCl ()) {
2301
+ Layouts.LongDoubleWidth = 64 ;
2302
+ Layouts.LongDoubleAlign = 64 ;
2303
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2304
+ } else if (isOSIAMCU ()) {
2305
+ Layouts.LongDoubleWidth = 64 ;
2306
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2307
+ }
2308
+ } else if (arch == x86_64) {
2309
+ Layouts.LongDoubleWidth = 128 ;
2310
+ Layouts.LongDoubleAlign = 128 ;
2311
+ Layouts.LongDoubleFormat = &llvm::APFloat::x87DoubleExtended ();
2312
+
2313
+ if (isOSDarwin ()) {
2314
+ Layouts.LongDoubleWidth = 128 ;
2315
+ Layouts.LongDoubleAlign = 128 ;
2316
+ } else if (isOSLinux () && isAndroid ()) {
2317
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2318
+ } else if (isOSLinux () && isOHOSFamily ()) {
2319
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2320
+ } else if (isOSWindows ()) {
2321
+ Layouts.LongDoubleWidth = 64 ;
2322
+ Layouts.LongDoubleAlign = 64 ;
2323
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2324
+
2325
+ if (isWindowsGNUEnvironment ()) {
2326
+ Layouts.LongDoubleWidth = 128 ;
2327
+ Layouts.LongDoubleAlign = 128 ;
2328
+ }
2329
+ } else if (isOSNaCl ()) {
2330
+ Layouts.LongDoubleWidth = 64 ;
2331
+ Layouts.LongDoubleAlign = 64 ;
2332
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2333
+ }
2334
+ } else if (arch == spir || arch == spir64 || arch == spirv ||
2335
+ arch == spirv32 || arch == spirv64) {
2336
+ // default configuration
2337
+ } else if (arch == wasm32 || arch == wasm64) {
2338
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 128 ;
2339
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2340
+
2341
+ if (isOSEmscripten ()) {
2342
+ Layouts.LongDoubleAlign = 64 ;
2343
+ }
2344
+ } else if (arch == dxil) {
2345
+ // default configuration
2346
+ } else if (arch == renderscript32) {
2347
+ // default configuration
2348
+ } else if (arch == renderscript64) {
2349
+ // same as aarch64 on linux
2350
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 128 ;
2351
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2352
+ } else if (arch == ve) {
2353
+ Layouts.LongDoubleWidth = 128 ;
2354
+ Layouts.LongDoubleAlign = 128 ;
2355
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2356
+ } else if (arch == csky) {
2357
+ Layouts.LongDoubleAlign = 32 ;
2358
+ } else if (arch == loongarch32 || arch == loongarch64) {
2359
+ Layouts.LongDoubleWidth = 128 ;
2360
+ Layouts.LongDoubleAlign = 128 ;
2361
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2362
+ }
2363
+
2364
+ return Layouts;
2365
+ }
2366
+
2167
2367
// HLSL triple environment orders are relied on in the front end
2168
2368
static_assert (Triple::Vertex - Triple::Pixel == 1 ,
2169
2369
" incorrect HLSL stage order" );
0 commit comments