@@ -1900,6 +1900,148 @@ VersionTuple Triple::getCanonicalVersionForOS(OSType OSKind,
1900
1900
}
1901
1901
}
1902
1902
1903
+ Triple::CLayouts Triple::getCLayouts () const {
1904
+ Triple::CLayouts Layouts;
1905
+
1906
+ // Default to a 32-bit RISC platform
1907
+ Layouts.LongDoubleWidth = 64 ;
1908
+ Layouts.LongDoubleAlign = 64 ;
1909
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1910
+
1911
+ enum ArchType arch = getArch ();
1912
+
1913
+ if (arch == aarch64 || arch == aarch64_be || arch == aarch64_32) {
1914
+ Layouts.LongDoubleWidth = 128 ;
1915
+ Layouts.LongDoubleAlign = 128 ;
1916
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
1917
+
1918
+ // TODO: verify this logic matches when WindowsARM64TargetInfo /
1919
+ // DarwinAArch64TargetInfo is called
1920
+ if (isOSWindows ()) {
1921
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 64 ;
1922
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1923
+ } else if (isMacOSX ()) {
1924
+ // TODO: should this just be isMacOSX or check specifically for darwin?
1925
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 64 ;
1926
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1927
+ }
1928
+ } else if (arch == avr) {
1929
+ Layouts.LongDoubleWidth = 32 ;
1930
+ Layouts.LongDoubleAlign = 8 ;
1931
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEsingle ();
1932
+ } else if (arch == arc) {
1933
+ Layouts.LongDoubleAlign = 32 ;
1934
+ } else if (arch == arm) {
1935
+ // TODO: port the logic
1936
+ } else if (arch == csky) {
1937
+ Layouts.LongDoubleAlign = 32 ;
1938
+ } else if (arch == loongarch32 || arch == loongarch64) {
1939
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 128 ;
1940
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
1941
+ } else if (arch == mips || arch == mipsel || arch == mips64 ||
1942
+ arch == mips64el) {
1943
+ if (isMIPS32 ()) {
1944
+ // o32
1945
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 64 ;
1946
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1947
+ } else {
1948
+ // n32 & n64
1949
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 128 ;
1950
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
1951
+ if (isOSFreeBSD ()) {
1952
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 64 ;
1953
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1954
+ }
1955
+ }
1956
+ } else if (arch == msp430) {
1957
+ Layouts.LongDoubleWidth = 64 ;
1958
+ Layouts.LongDoubleAlign = 16 ;
1959
+ } else if (arch == ppc || arch == ppcle || arch == ppc64 || arch == ppc64le) {
1960
+ // TODO: figure out how to get features
1961
+
1962
+ if (getOS () == AIX) {
1963
+ Layouts.LongDoubleWidth = 64 ;
1964
+ Layouts.LongDoubleAlign = 32 ;
1965
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1966
+ } else if (isOSFreeBSD () || isOSNetBSD () || isOSOpenBSD () || isMusl ()) {
1967
+ Layouts.LongDoubleWidth = 64 ;
1968
+ Layouts.LongDoubleAlign = 64 ;
1969
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
1970
+ } else {
1971
+ Layouts.LongDoubleWidth = 128 ;
1972
+ Layouts.LongDoubleAlign = 128 ;
1973
+ Layouts.LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble ();
1974
+ }
1975
+ } else if (arch == riscv32 || arch == riscv64) {
1976
+ Layouts.LongDoubleWidth = 128 ;
1977
+ Layouts.LongDoubleAlign = 128 ;
1978
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
1979
+ } else if (arch == sparcv9) {
1980
+ // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
1981
+ // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
1982
+ Layouts.LongDoubleWidth = 128 ;
1983
+ Layouts.LongDoubleAlign = 128 ;
1984
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
1985
+ } else if (arch == systemz) {
1986
+ Layouts.LongDoubleWidth = 128 ;
1987
+ Layouts.LongDoubleAlign = 64 ;
1988
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
1989
+ } else if (arch == tce || arch == tcele) {
1990
+ Layouts.LongDoubleWidth = 32 ;
1991
+ Layouts.LongDoubleAlign = 32 ;
1992
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEsingle ();
1993
+ } else if (arch == ve) {
1994
+ Layouts.LongDoubleWidth = 128 ;
1995
+ Layouts.LongDoubleAlign = 128 ;
1996
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
1997
+ } else if (arch == wasm32 || arch == wasm64) {
1998
+ Layouts.LongDoubleWidth = Layouts.LongDoubleAlign = 128 ;
1999
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEquad ();
2000
+ } else if (arch == x86 || arch == x86_64) {
2001
+ if (arch == x86_64) {
2002
+ Layouts.LongDoubleWidth = 128 ;
2003
+ Layouts.LongDoubleAlign = 128 ;
2004
+ }
2005
+ if (isOSDarwin ()) {
2006
+ Layouts.LongDoubleWidth = 128 ;
2007
+ Layouts.LongDoubleAlign = 128 ;
2008
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2009
+ } else if (isAndroid ()) {
2010
+ Layouts.LongDoubleWidth = 64 ;
2011
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2012
+ } else if (isOSLinux ()) {
2013
+ Layouts.LongDoubleWidth = 96 ;
2014
+ Layouts.LongDoubleAlign = 32 ;
2015
+ Layouts.LongDoubleFormat = &llvm::APFloat::x87DoubleExtended ();
2016
+ } else if (isOSWindows ()) {
2017
+ if (isWindowsCygwinEnvironment ()) {
2018
+ Layouts.LongDoubleWidth = 64 ;
2019
+ Layouts.LongDoubleAlign = 64 ;
2020
+ } else if (isWindowsGNUEnvironment ()) {
2021
+ // Mingw64 rounds long double size and alignment up to 16 bytes, but
2022
+ // sticks with x86 FP ops. Weird.
2023
+ Layouts.LongDoubleWidth = 128 ;
2024
+ Layouts.LongDoubleAlign = 128 ;
2025
+ Layouts.LongDoubleFormat = &llvm::APFloat::x87DoubleExtended ();
2026
+ } else {
2027
+ Layouts.LongDoubleWidth = 64 ;
2028
+ Layouts.LongDoubleAlign = 64 ;
2029
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2030
+ }
2031
+ } else if (isOSIAMCU ()) {
2032
+ Layouts.LongDoubleWidth = 64 ;
2033
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2034
+ } else if (isOHOSFamily ()) {
2035
+ Layouts.LongDoubleWidth = 64 ;
2036
+ Layouts.LongDoubleFormat = &llvm::APFloat::IEEEdouble ();
2037
+ }
2038
+ } else if (arch == xcore) {
2039
+ Layouts.LongDoubleAlign = 32 ;
2040
+ }
2041
+
2042
+ return Layouts;
2043
+ }
2044
+
1903
2045
// HLSL triple environment orders are relied on in the front end
1904
2046
static_assert (Triple::Vertex - Triple::Pixel == 1 ,
1905
2047
" incorrect HLSL stage order" );
0 commit comments