Author: echristo Date: Thu Feb 9 21:32:34 2017 New Revision: 294703 URL: http://llvm.org/viewvc/llvm-project?rev=294703&view=rev Log: For X86-64 linux and PPC64 linux align int128 to 16 bytes.
For other platforms we should find out what they need and likely make the same change, however, a smaller additional change is easier for platforms we know have it specified in the ABI. clang support for r294702 Modified: cfe/trunk/lib/Basic/Targets.cpp cfe/trunk/test/CodeGen/target-data.c cfe/trunk/test/CodeGen/thinlto-multi-module.ll cfe/trunk/test/CodeGen/thinlto_backend.ll Modified: cfe/trunk/lib/Basic/Targets.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=294703&r1=294702&r2=294703&view=diff ============================================================================== --- cfe/trunk/lib/Basic/Targets.cpp (original) +++ cfe/trunk/lib/Basic/Targets.cpp Thu Feb 9 21:32:34 2017 @@ -1673,15 +1673,35 @@ public: IntMaxType = SignedLong; Int64Type = SignedLong; - if ((Triple.getArch() == llvm::Triple::ppc64le)) { - resetDataLayout("e-m:e-i64:64-n32:64"); + std::string Layout; + + // PPC64LE is little endian. + if (Triple.getArch() == llvm::Triple::ppc64le) + Layout = "e"; + else + Layout = "E"; + + Layout += llvm::DataLayout::getManglingComponent(Triple); + + Layout += "-i64:64"; + + // 128 bit integers are always aligned to 128 bits, but only 64-bit matters, + // because __int128 is only supoprted on 64-bit targets. + // FIXME: See if this is valid on other 64-bit ppc oses. + if (Triple.isOSLinux()) + Layout += "-i128:128"; + + Layout += "-n32:64"; + + resetDataLayout(Layout); + + // PPC64LE started a new ABI. + if (Triple.getArch() == llvm::Triple::ppc64le) ABI = "elfv2"; - } else { - resetDataLayout("E-m:e-i64:64-n32:64"); + else ABI = "elfv1"; - } - switch (getTriple().getOS()) { + switch (Triple.getOS()) { case llvm::Triple::FreeBSD: LongDoubleWidth = LongDoubleAlign = 64; LongDoubleFormat = &llvm::APFloat::IEEEdouble(); @@ -4581,11 +4601,21 @@ public: Int64Type = IsX32 ? SignedLongLong : SignedLong; RegParmMax = 6; + // Use 128-bit alignment for 128-bit integers in linux. + // FIXME: Figure out if we should change this for other oses. // Pointers are 32-bit in x32. - resetDataLayout(IsX32 - ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128" - : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128" - : "e-m:e-i64:64-f80:128-n8:16:32:64-S128"); + if (IsX32) { + if (Triple.isOSLinux()) + resetDataLayout( + "e-m:e-p:32:32-i64:64-i128:128-f80:128-n8:16:32:64-S128"); + else + resetDataLayout("e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"); + } else if (IsWinCOFF) + resetDataLayout("e-m:w-i64:64-f80:128-n8:16:32:64-S128"); + else if (Triple.isOSLinux()) + resetDataLayout("e-m:e-i64:64-i128:128-f80:128-n8:16:32:64-S128"); + else + resetDataLayout("e-m:e-i64:64-f80:128-n8:16:32:64-S128"); // Use fpret only for long double. RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble); Modified: cfe/trunk/test/CodeGen/target-data.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/target-data.c?rev=294703&r1=294702&r2=294703&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/target-data.c (original) +++ cfe/trunk/test/CodeGen/target-data.c Thu Feb 9 21:32:34 2017 @@ -100,11 +100,11 @@ // RUN: %clang_cc1 -triple powerpc64-linux -o - -emit-llvm %s | \ // RUN: FileCheck %s -check-prefix=PPC64-LINUX -// PPC64-LINUX: target datalayout = "E-m:e-i64:64-n32:64" +// PPC64-LINUX: target datalayout = "E-m:e-i64:64-i128:128-n32:64" // RUN: %clang_cc1 -triple powerpc64le-linux -o - -emit-llvm %s | \ // RUN: FileCheck %s -check-prefix=PPC64LE-LINUX -// PPC64LE-LINUX: target datalayout = "e-m:e-i64:64-n32:64" +// PPC64LE-LINUX: target datalayout = "e-m:e-i64:64-i128:128-n32:64" // RUN: %clang_cc1 -triple powerpc-darwin -o - -emit-llvm %s | \ // RUN: FileCheck %s -check-prefix=PPC32-DARWIN Modified: cfe/trunk/test/CodeGen/thinlto-multi-module.ll URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/thinlto-multi-module.ll?rev=294703&r1=294702&r2=294703&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/thinlto-multi-module.ll (original) +++ cfe/trunk/test/CodeGen/thinlto-multi-module.ll Thu Feb 9 21:32:34 2017 @@ -11,7 +11,7 @@ ; CHECK-OBJ: T f1 ; CHECK-OBJ: U f2 -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target datalayout = "e-m:e-i64:64-i128:128-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" declare void @f2() Modified: cfe/trunk/test/CodeGen/thinlto_backend.ll URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/thinlto_backend.ll?rev=294703&r1=294702&r2=294703&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/thinlto_backend.ll (original) +++ cfe/trunk/test/CodeGen/thinlto_backend.ll Thu Feb 9 21:32:34 2017 @@ -31,7 +31,7 @@ ; RUN: %clang -target x86_64-unknown-linux-gnu -O2 -o %t3.o -x ir %t1.o -c -fthinlto-index=%t.thinlto.bc 2>&1 | FileCheck %s -check-prefix=CHECK-ERROR2 ; CHECK-ERROR2: Error loading imported file '{{.*}}': Could not find module summary -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target datalayout = "e-m:e-i64:64-i128:128-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" declare void @f2() _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits