@@ -1942,6 +1942,206 @@ VersionTuple Triple::getCanonicalVersionForOS(OSType OSKind,
1942
1942
}
1943
1943
}
1944
1944
1945
+ Triple::CLayouts Triple::getCLayouts () const {
1946
+ Triple::CLayouts Layouts;
1947
+
1948
+ // Default to a 32-bit RISC platform
1949
+ Layouts.LongDoubleWidth = 64 ;
1950
+ Layouts.LongDoubleAlign = 64 ;
1951
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1952
+
1953
+ enum ArchType arch = getArch ();
1954
+
1955
+ // Keep this in sync with clang Targets.cpp AllocateTargetImpl
1956
+ if (arch == arc) {
1957
+ Layouts.LongDoubleAlign = 32 ;
1958
+ } else if (arch == xcore) {
1959
+ Layouts.LongDoubleAlign = 32 ;
1960
+ } else if (arch == hexagon) {
1961
+ // default configuration
1962
+ } else if (arch == lanai) {
1963
+ // default configuration
1964
+ } else if (arch == aarch64_32 || arch == aarch64) {
1965
+ Layouts.LongDoubleWidth = 128 ;
1966
+ Layouts.LongDoubleAlign = 128 ;
1967
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
1968
+
1969
+ if (isOSWindows ()) {
1970
+ Layouts.LongDoubleWidth = 64 ;
1971
+ Layouts.LongDoubleAlign = 64 ;
1972
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1973
+ } else if (isOSDarwin ()) {
1974
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 64 ;
1975
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1976
+ }
1977
+ } else if (arch == arm || arch == thumb || arch == armeb || arch == thumbeb) {
1978
+ if (isOSNaCl ()) {
1979
+ Layouts.LongDoubleWidth = 64 ;
1980
+ Layouts.LongDoubleAlign = 64 ;
1981
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1982
+ } else if (isOSWindows ()) {
1983
+ Layouts.LongDoubleWidth = 64 ;
1984
+ Layouts.LongDoubleAlign = 64 ;
1985
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1986
+ }
1987
+ } else if (arch == avr) {
1988
+ Layouts.LongDoubleWidth = 32 ;
1989
+ Layouts.LongDoubleAlign = 8 ;
1990
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEsingle ();
1991
+ } else if (arch == bpfeb || arch == bpfel) {
1992
+ // default configuration
1993
+ } else if (arch == msp430) {
1994
+ Layouts.LongDoubleWidth = 64 ;
1995
+ Layouts.LongDoubleAlign = 16 ;
1996
+ } else if (arch == mips || arch == mipsel || arch == mips64 ||
1997
+ arch == mips64el) {
1998
+ if (isMIPS32 ()) {
1999
+ // o32
2000
+ Layouts.LongDoubleWidth = 64 ;
2001
+ Layouts.LongDoubleAlign = 64 ;
2002
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2003
+ } else {
2004
+ // n32 & n64
2005
+ Layouts.LongDoubleWidth = 128 ;
2006
+ Layouts.LongDoubleAlign = 128 ;
2007
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2008
+ if (isOSFreeBSD ()) {
2009
+ Layouts.LongDoubleWidth = 64 ;
2010
+ Layouts.LongDoubleAlign = 64 ;
2011
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2012
+ }
2013
+ }
2014
+ } else if (arch == m68k) {
2015
+ // default configuration
2016
+ } else if (arch == le32 || arch == le64) {
2017
+ // default configuration
2018
+ } else if (arch == ppc || arch == ppcle || arch == ppc64 || arch == ppc64le) {
2019
+ Layouts.LongDoubleWidth = 128 ;
2020
+ Layouts.LongDoubleAlign = 128 ;
2021
+ Layouts.LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble ();
2022
+
2023
+ if (arch == ppc || arch == ppcle) {
2024
+ if (isOSAIX ()) {
2025
+ Layouts.LongDoubleWidth = 64 ;
2026
+ Layouts.LongDoubleAlign = 32 ;
2027
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2028
+ } else if (isOSFreeBSD () || isOSNetBSD () || isOSOpenBSD () || isMusl ()) {
2029
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 64 ;
2030
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2031
+ }
2032
+ }
2033
+ } else if (arch == nvptx || arch == nvptx) {
2034
+ // nvcc does not copy set long double layouts
2035
+ } else if (arch == amdgcn || arch == r600) {
2036
+ // default configuration
2037
+ } else if (arch == riscv32 || arch == riscv64) {
2038
+ Layouts.LongDoubleWidth = 128 ;
2039
+ Layouts.LongDoubleAlign = 128 ;
2040
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2041
+ } else if (arch == sparc || arch == sparcel) {
2042
+ // default configuration
2043
+ } else if (arch == sparcv9) {
2044
+ Layouts.LongDoubleWidth = 128 ;
2045
+ Layouts.LongDoubleAlign = 128 ;
2046
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2047
+ } else if (arch == systemz) {
2048
+ Layouts.LongDoubleWidth = 128 ;
2049
+ Layouts.LongDoubleAlign = 64 ;
2050
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2051
+ } else if (arch == tce || arch == tcele) {
2052
+ Layouts.LongDoubleWidth = 32 ;
2053
+ Layouts.LongDoubleAlign = 32 ;
2054
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEsingle ();
2055
+ } else if (arch == x86) {
2056
+ Layouts.LongDoubleWidth = 96 ;
2057
+ Layouts.LongDoubleAlign = 32 ;
2058
+ Layouts.LongDoubleFormat = &llvm::APFloat::x87DoubleExtended ();
2059
+
2060
+ if (isOSDarwin ()) {
2061
+ Layouts.LongDoubleWidth = 128 ;
2062
+ Layouts.LongDoubleAlign = 128 ;
2063
+ } else if (isAndroid ()) {
2064
+ Layouts.LongDoubleWidth = 64 ;
2065
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2066
+ } else if (isOHOSFamily ()) {
2067
+ Layouts.LongDoubleWidth = 64 ;
2068
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2069
+ } else if (isOSWindows ()) {
2070
+ Layouts.LongDoubleWidth = 64 ;
2071
+ Layouts.LongDoubleAlign = 64 ;
2072
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2073
+
2074
+ if (isWindowsCygwinEnvironment ()) {
2075
+ Layouts.LongDoubleWidth = 64 ;
2076
+ Layouts.LongDoubleAlign = 64 ;
2077
+ }
2078
+ } else if (isOSNaCl ()) {
2079
+ Layouts.LongDoubleWidth = 64 ;
2080
+ Layouts.LongDoubleAlign = 64 ;
2081
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2082
+ } else if (isOSIAMCU ()) {
2083
+ Layouts.LongDoubleWidth = 64 ;
2084
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2085
+ }
2086
+ } else if (arch == x86_64) {
2087
+ Layouts.LongDoubleWidth = 128 ;
2088
+ Layouts.LongDoubleAlign = 128 ;
2089
+ Layouts.LongDoubleFormat = &llvm::APFloat::x87DoubleExtended ();
2090
+
2091
+ if (isOSDarwin ()) {
2092
+ Layouts.LongDoubleWidth = 128 ;
2093
+ Layouts.LongDoubleAlign = 128 ;
2094
+ } else if (isOSLinux () && isAndroid ()) {
2095
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2096
+ } else if (isOSLinux () && isOHOSFamily ()) {
2097
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2098
+ } else if (isOSWindows ()) {
2099
+ Layouts.LongDoubleWidth = 64 ;
2100
+ Layouts.LongDoubleAlign = 64 ;
2101
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2102
+
2103
+ if (isWindowsGNUEnvironment ()) {
2104
+ Layouts.LongDoubleWidth = 128 ;
2105
+ Layouts.LongDoubleAlign = 128 ;
2106
+ }
2107
+ } else if (isOSNaCl ()) {
2108
+ Layouts.LongDoubleWidth = 64 ;
2109
+ Layouts.LongDoubleAlign = 64 ;
2110
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2111
+ }
2112
+ } else if (arch == spir || arch == spir64 || arch == spirv ||
2113
+ arch == spirv32 || arch == spirv64) {
2114
+ // default configuration
2115
+ } else if (arch == wasm32 || arch == wasm64) {
2116
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 128 ;
2117
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2118
+
2119
+ if (isOSEmscripten ()) {
2120
+ Layouts.LongDoubleAlign = 64 ;
2121
+ }
2122
+ } else if (arch == dxil) {
2123
+ // default configuration
2124
+ } else if (arch == renderscript32) {
2125
+ // default configuration
2126
+ } else if (arch == renderscript64) {
2127
+ // same as aarch64 on linux
2128
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 128 ;
2129
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2130
+ } else if (arch == ve) {
2131
+ Layouts.LongDoubleWidth = 128 ;
2132
+ Layouts.LongDoubleAlign = 128 ;
2133
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2134
+ } else if (arch == csky) {
2135
+ Layouts.LongDoubleAlign = 32 ;
2136
+ } else if (arch == loongarch32 || arch == loongarch64) {
2137
+ Layouts.LongDoubleWidth = 128 ;
2138
+ Layouts.LongDoubleAlign = 128 ;
2139
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2140
+ }
2141
+
2142
+ return Layouts;
2143
+ }
2144
+
1945
2145
// HLSL triple environment orders are relied on in the front end
1946
2146
static_assert (Triple::Vertex - Triple::Pixel == 1 ,
1947
2147
" incorrect HLSL stage order" );
0 commit comments