https://github.com/nikic created https://github.com/llvm/llvm-project/pull/171135
This switches clang to use the data layouts from TargetParser, instead of maintaining its own copy of data layouts, which are required to match the backend data layouts. For now I've kept explicit calls to resetDataLayout(), just with the argument implied by the triple and ABI. Ideally this would happen automatically, but the way these classes are initialized currently doesn't offer a great place to do this. Previously resetDataLayout() also set the UserLabelPrefix. I've separated this out, with a reasonable default so that most targets don't need to worry about it. I've kept the explicit data layouts for TCE and SPIR (without the V). These seem to not correspond to real LLVM targets. I've also fixed the XCore data layout in TargetParser, which was incorrectly set to the same one as Xtensa. It was previously unused. >From 79f317ce6770a9a7dcdb65f6ec9ec195baf3d0d0 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 8 Dec 2025 14:44:20 +0100 Subject: [PATCH] [Clang] Use DataLayout from TargetParser This switches clang to use the data layouts from TargetParser, instead of maintaining its own copy of data layouts, which are required to match the backend data layouts. For now I've kept explicit calls to resetDataLayout(), just with the argument implied by the triple and ABI. Ideally this would happen automatically, but the way these classes are initialized currently doesn't offer a great place to do this. Previously resetDataLayout() also set the UserLabelPrefix. I've separated this out, with a reasonable default so that most targets don't need to worry about it. I've kept the explicit data layouts for TCE and SPIR (without the V). These seem to not correspond to real LLVM targets. I've also fixed the XCore data layout in TargetParser, which was incorrectly set to the same one as Xtensa. It was previously unused. --- clang/include/clang/Basic/TargetInfo.h | 8 ++-- clang/lib/Basic/TargetInfo.cpp | 9 ++-- clang/lib/Basic/Targets/AArch64.cpp | 32 +-------------- clang/lib/Basic/Targets/AArch64.h | 10 +---- clang/lib/Basic/Targets/AMDGPU.cpp | 13 +----- clang/lib/Basic/Targets/ARC.h | 3 +- clang/lib/Basic/Targets/ARM.cpp | 43 ++------------------ clang/lib/Basic/Targets/AVR.h | 2 +- clang/lib/Basic/Targets/BPF.h | 6 +-- clang/lib/Basic/Targets/CSKY.h | 4 +- clang/lib/Basic/Targets/DirectX.h | 6 +-- clang/lib/Basic/Targets/Hexagon.h | 8 +--- clang/lib/Basic/Targets/Lanai.h | 10 +---- clang/lib/Basic/Targets/LoongArch.h | 4 +- clang/lib/Basic/Targets/M68k.cpp | 26 +----------- clang/lib/Basic/Targets/MSP430.h | 2 +- clang/lib/Basic/Targets/Mips.h | 20 +-------- clang/lib/Basic/Targets/NVPTX.cpp | 13 ++---- clang/lib/Basic/Targets/OSTargets.h | 2 +- clang/lib/Basic/Targets/PPC.h | 33 ++------------- clang/lib/Basic/Targets/RISCV.h | 8 ++-- clang/lib/Basic/Targets/SPIR.h | 15 +++---- clang/lib/Basic/Targets/Sparc.h | 6 +-- clang/lib/Basic/Targets/SystemZ.h | 8 +--- clang/lib/Basic/Targets/VE.h | 4 +- clang/lib/Basic/Targets/WebAssembly.h | 16 +------- clang/lib/Basic/Targets/X86.h | 40 +++++------------- clang/lib/Basic/Targets/XCore.h | 3 +- clang/lib/Basic/Targets/Xtensa.h | 2 +- llvm/lib/Target/XCore/XCoreTargetMachine.cpp | 7 ++-- llvm/lib/TargetParser/TargetDataLayout.cpp | 4 ++ 31 files changed, 71 insertions(+), 296 deletions(-) diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 1f5932225d31e..885325c3379e3 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -296,9 +296,11 @@ class TargetInfo : public TransferrableTargetInfo, // TargetInfo Constructor. Default initializes all fields. TargetInfo(const llvm::Triple &T); - // UserLabelPrefix must match DL's getGlobalPrefix() when interpreted - // as a DataLayout object. - void resetDataLayout(StringRef DL, const char *UserLabelPrefix = ""); + /// Set the data layout to the given string. + void resetDataLayout(StringRef DL); + + /// Set the data layout based on current triple and ABI. + void resetDataLayout(); // Target features that are read-only and should not be disabled/enabled // by command line options. Such features are for emitting predefined diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index c0ed900ebd45c..7e82213be4479 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -156,7 +156,7 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) { Float128Format = &llvm::APFloat::IEEEquad(); Ibm128Format = &llvm::APFloat::PPCDoubleDouble(); MCountName = "mcount"; - UserLabelPrefix = "_"; + UserLabelPrefix = Triple.isOSBinFormatMachO() ? "_" : ""; RegParmMax = 0; SSERegParmMax = 0; HasAlignMac68kSupport = false; @@ -196,9 +196,10 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) { // Out of line virtual dtor for TargetInfo. TargetInfo::~TargetInfo() {} -void TargetInfo::resetDataLayout(StringRef DL, const char *ULP) { - DataLayoutString = DL.str(); - UserLabelPrefix = ULP; +void TargetInfo::resetDataLayout(StringRef DL) { DataLayoutString = DL.str(); } + +void TargetInfo::resetDataLayout() { + DataLayoutString = Triple.computeDataLayout(getABI()); } bool diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index d7f36c0f9b79a..476fa829bef61 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1212,7 +1212,7 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, HasD128 = false; } - setDataLayout(); + resetDataLayout(); if (HasNoFP) { FPU &= ~FPUMode; @@ -1628,21 +1628,6 @@ AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : AArch64TargetInfo(Triple, Opts) {} -void AArch64leTargetInfo::setDataLayout() { - if (getTriple().isOSBinFormatMachO()) { - if(getTriple().isArch32Bit()) - resetDataLayout("e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-" - "i128:128-n32:64-S128-Fn32", - "_"); - else - resetDataLayout("e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-" - "n32:64-S128-Fn32", - "_"); - } else - resetDataLayout("e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-" - "i64:64-i128:128-n32:64-S128-Fn32"); -} - void AArch64leTargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__AARCH64EL__"); @@ -1661,12 +1646,6 @@ void AArch64beTargetInfo::getTargetDefines(const LangOptions &Opts, AArch64TargetInfo::getTargetDefines(Opts, Builder); } -void AArch64beTargetInfo::setDataLayout() { - assert(!getTriple().isOSBinFormatMachO()); - resetDataLayout("E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-" - "i64:64-i128:128-n32:64-S128-Fn32"); -} - WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : WindowsTargetInfo<AArch64leTargetInfo>(Triple, Opts), Triple(Triple) { @@ -1685,15 +1664,6 @@ WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple, IntPtrType = SignedLongLong; } -void WindowsARM64TargetInfo::setDataLayout() { - resetDataLayout(Triple.isOSBinFormatMachO() - ? "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:" - "128-n32:64-S128-Fn32" - : "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-" - "i64:64-i128:128-n32:64-S128-Fn32", - Triple.isOSBinFormatMachO() ? "_" : ""); -} - TargetInfo::BuiltinVaListKind WindowsARM64TargetInfo::getBuiltinVaListKind() const { return TargetInfo::CharPtrBuiltinVaList; diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 1a7aa658e9d87..d44b66d1b124e 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -54,7 +54,6 @@ static const unsigned ARM64AddrSpaceMap[] = { }; class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { - virtual void setDataLayout() = 0; static const TargetInfo::GCCRegAlias GCCRegAliases[]; static const char *const GCCRegNames[]; @@ -274,9 +273,7 @@ class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); void getTargetDefines(const LangOptions &Opts, - MacroBuilder &Builder) const override; -private: - void setDataLayout() override; + MacroBuilder &Builder) const override; }; template <> @@ -297,8 +294,6 @@ class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo WindowsARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); - void setDataLayout() override; - BuiltinVaListKind getBuiltinVaListKind() const override; CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; @@ -332,9 +327,6 @@ class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo { AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override; - -private: - void setDataLayout() override; }; void getAppleMachOAArch64Defines(MacroBuilder &Builder, const LangOptions &Opts, diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index d4d696b8456b6..08f8370033a84 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -26,16 +26,6 @@ namespace targets { // If you edit the description strings, make sure you update // getPointerWidthV(). -static const char *const DataLayoutStringR600 = - "e-m:e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" - "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1"; - -static const char *const DataLayoutStringAMDGCN = - "e-m:e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32" - "-p7:160:256:256:32-p8:128:128:128:48-p9:192:256:256:32-i64:64-" - "v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-" - "v2048:2048-n32:64-S32-A5-G1-ni:7:8:9"; - const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = { llvm::AMDGPUAS::FLAT_ADDRESS, // Default llvm::AMDGPUAS::GLOBAL_ADDRESS, // opencl_global @@ -237,8 +227,7 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple, GPUFeatures(isAMDGCN(Triple) ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) : llvm::AMDGPU::getArchAttrR600(GPUKind)) { - resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN - : DataLayoutStringR600); + resetDataLayout(); setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D || !isAMDGCN(Triple)); diff --git a/clang/lib/Basic/Targets/ARC.h b/clang/lib/Basic/Targets/ARC.h index 2b69f95591fa1..ff605def1f617 100644 --- a/clang/lib/Basic/Targets/ARC.h +++ b/clang/lib/Basic/Targets/ARC.h @@ -33,8 +33,7 @@ class LLVM_LIBRARY_VISIBILITY ARCTargetInfo : public TargetInfo { PtrDiffType = SignedInt; IntPtrType = SignedInt; UseZeroLengthBitfieldAlignment = true; - resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-" - "i32:32:32-f32:32:32-i64:32-f64:32-a:0:32-n32"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 394b50b9ee222..f21e9ebbc903a 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -39,36 +39,12 @@ void ARMTargetInfo::setABIAAPCS() { ZeroLengthBitfieldBoundary = 0; - // Thumb1 add sp, #imm requires the immediate value be multiple of 4, - // so set preferred for small types to 32. - if (T.isOSBinFormatMachO()) { - resetDataLayout(BigEndian - ? "E-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" - : "e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", - "_"); - } else if (T.isOSWindows()) { - assert(!BigEndian && "Windows on ARM does not support big endian"); - resetDataLayout("e" - "-m:w" - "-p:32:32" - "-Fi8" - "-i64:64" - "-v128:64:128" - "-a:0:32" - "-n32" - "-S64"); - } else { - resetDataLayout(BigEndian - ? "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" - : "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"); - } + resetDataLayout(); // FIXME: Enumerated types are variable width in straight AAPCS. } void ARMTargetInfo::setABIAPCS(bool IsAAPCS16) { - const llvm::Triple &T = getTriple(); - IsAAPCS = false; if (IsAAPCS16) @@ -89,20 +65,7 @@ void ARMTargetInfo::setABIAPCS(bool IsAAPCS16) { /// gcc. ZeroLengthBitfieldBoundary = 32; - if (T.isOSBinFormatMachO() && IsAAPCS16) { - assert(!BigEndian && "AAPCS16 does not support big-endian"); - resetDataLayout("e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128", "_"); - } else if (T.isOSBinFormatMachO()) - resetDataLayout( - BigEndian - ? "E-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" - : "e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32", - "_"); - else - resetDataLayout( - BigEndian - ? "E-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" - : "e-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"); + resetDataLayout(); // FIXME: Override "preferred align" for double and long long. } @@ -1545,7 +1508,7 @@ CygwinARMTargetInfo::CygwinARMTargetInfo(const llvm::Triple &Triple, this->WCharType = TargetInfo::UnsignedShort; TLSSupported = false; DoubleAlign = LongLongAlign = 64; - resetDataLayout("e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"); + resetDataLayout(); } void CygwinARMTargetInfo::getTargetDefines(const LangOptions &Opts, diff --git a/clang/lib/Basic/Targets/AVR.h b/clang/lib/Basic/Targets/AVR.h index b666778659603..927a63d052d5d 100644 --- a/clang/lib/Basic/Targets/AVR.h +++ b/clang/lib/Basic/Targets/AVR.h @@ -57,7 +57,7 @@ class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo { Int16Type = SignedInt; Char32Type = UnsignedLong; SigAtomicType = SignedChar; - resetDataLayout("e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8:16-a:8"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, diff --git a/clang/lib/Basic/Targets/BPF.h b/clang/lib/Basic/Targets/BPF.h index d9e5cf4d8a92f..47bf1f94177d1 100644 --- a/clang/lib/Basic/Targets/BPF.h +++ b/clang/lib/Basic/Targets/BPF.h @@ -34,11 +34,7 @@ class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo { IntMaxType = SignedLong; Int64Type = SignedLong; RegParmMax = 5; - if (Triple.getArch() == llvm::Triple::bpfeb) { - resetDataLayout("E-m:e-p:64:64-i64:64-i128:128-n32:64-S128"); - } else { - resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"); - } + resetDataLayout(); MaxAtomicPromoteWidth = 64; MaxAtomicInlineWidth = 64; TLSSupported = false; diff --git a/clang/lib/Basic/Targets/CSKY.h b/clang/lib/Basic/Targets/CSKY.h index ddfbe4794daad..fbdec1ea6d92d 100644 --- a/clang/lib/Basic/Targets/CSKY.h +++ b/clang/lib/Basic/Targets/CSKY.h @@ -52,10 +52,8 @@ class LLVM_LIBRARY_VISIBILITY CSKYTargetInfo : public TargetInfo { UseZeroLengthBitfieldAlignment = true; MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; - resetDataLayout("e-m:e-S32-p:32:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-" - "v64:32:32-v128:32:32-a:0:32-Fi32-n32"); - setABI("abiv2"); + resetDataLayout(); } StringRef getABI() const override { return ABI; } diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h index a21a593365773..1f77e4fc2a982 100644 --- a/clang/lib/Basic/Targets/DirectX.h +++ b/clang/lib/Basic/Targets/DirectX.h @@ -64,11 +64,7 @@ class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo { NoAsmVariants = true; PlatformMinVersion = Triple.getOSVersion(); PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); - // TODO: We need to align vectors on the element size generally, but for now - // we hard code this for 3-element 32- and 64-bit vectors as a workaround. - // See https://github.com/llvm/llvm-project/issues/123968 - resetDataLayout("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:" - "32-f64:64-n8:16:32:64-v48:16:16-v96:32:32-v192:64:64"); + resetDataLayout(); TheCXXABI.set(TargetCXXABI::GenericItanium); } bool useFP16ConversionIntrinsics() const override { return false; } diff --git a/clang/lib/Basic/Targets/Hexagon.h b/clang/lib/Basic/Targets/Hexagon.h index 53c348a3246f9..21da0fc4cbdd0 100644 --- a/clang/lib/Basic/Targets/Hexagon.h +++ b/clang/lib/Basic/Targets/Hexagon.h @@ -38,13 +38,7 @@ class LLVM_LIBRARY_VISIBILITY HexagonTargetInfo : public TargetInfo { public: HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &) : TargetInfo(Triple) { - // Specify the vector alignment explicitly. For v512x1, the calculated - // alignment would be 512*alignment(i1), which is 512 bytes, instead of - // the required minimum of 64 bytes. - resetDataLayout( - "e-m:e-p:32:32:32-a:0-n16:32-" - "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-" - "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"); + resetDataLayout(); SizeType = UnsignedInt; PtrDiffType = SignedInt; IntPtrType = SignedInt; diff --git a/clang/lib/Basic/Targets/Lanai.h b/clang/lib/Basic/Targets/Lanai.h index e32ef9d7d40da..a49c425965445 100644 --- a/clang/lib/Basic/Targets/Lanai.h +++ b/clang/lib/Basic/Targets/Lanai.h @@ -35,15 +35,7 @@ class LLVM_LIBRARY_VISIBILITY LanaiTargetInfo : public TargetInfo { public: LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &) : TargetInfo(Triple) { - // Description string has to be kept in sync with backend. - resetDataLayout("E" // Big endian - "-m:e" // ELF name manging - "-p:32:32" // 32 bit pointers, 32 bit aligned - "-i64:64" // 64 bit integers, 64 bit aligned - "-a:0:32" // 32 bit alignment of objects of aggregate type - "-n32" // 32 bit native integer width - "-S64" // 64 bit natural stack alignment - ); + resetDataLayout(); // Setting RegParmMax equal to what mregparm was set to in the old // toolchain diff --git a/clang/lib/Basic/Targets/LoongArch.h b/clang/lib/Basic/Targets/LoongArch.h index 88dc433924d6c..31afd3eed96f9 100644 --- a/clang/lib/Basic/Targets/LoongArch.h +++ b/clang/lib/Basic/Targets/LoongArch.h @@ -133,9 +133,9 @@ class LLVM_LIBRARY_VISIBILITY LoongArch32TargetInfo IntPtrType = SignedInt; PtrDiffType = SignedInt; SizeType = UnsignedInt; - resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128"); // TODO: select appropriate ABI. setABI("ilp32d"); + resetDataLayout(); } bool setABI(const std::string &Name) override { @@ -158,9 +158,9 @@ class LLVM_LIBRARY_VISIBILITY LoongArch64TargetInfo LongWidth = LongAlign = PointerWidth = PointerAlign = 64; IntMaxType = Int64Type = SignedLong; HasUnalignedAccess = true; - resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"); // TODO: select appropriate ABI. setABI("lp64d"); + resetDataLayout(); } bool setABI(const std::string &Name) override { diff --git a/clang/lib/Basic/Targets/M68k.cpp b/clang/lib/Basic/Targets/M68k.cpp index 3988cb5294560..293cbe5ce9272 100644 --- a/clang/lib/Basic/Targets/M68k.cpp +++ b/clang/lib/Basic/Targets/M68k.cpp @@ -27,31 +27,7 @@ namespace targets { M68kTargetInfo::M68kTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : TargetInfo(Triple), TargetOpts(Opts) { - - std::string Layout; - - // M68k is Big Endian - Layout += "E"; - - // FIXME how to wire it with the used object format? - Layout += "-m:e"; - - // M68k pointers are always 32 bit wide even for 16-bit CPUs - Layout += "-p:32:16:32"; - - // M68k integer data types - Layout += "-i8:8:8-i16:16:16-i32:16:32"; - - // FIXME no floats at the moment - - // The registers can hold 8, 16, 32 bits - Layout += "-n8:16:32"; - - // 16 bit alignment for both stack and aggregate - // in order to conform to ABI used by GCC - Layout += "-a:0:16-S16"; - - resetDataLayout(Layout); + resetDataLayout(); SizeType = UnsignedInt; PtrDiffType = SignedInt; diff --git a/clang/lib/Basic/Targets/MSP430.h b/clang/lib/Basic/Targets/MSP430.h index d7d05f992f4f6..96a243ef70fae 100644 --- a/clang/lib/Basic/Targets/MSP430.h +++ b/clang/lib/Basic/Targets/MSP430.h @@ -45,7 +45,7 @@ class LLVM_LIBRARY_VISIBILITY MSP430TargetInfo : public TargetInfo { IntPtrType = SignedInt; PtrDiffType = SignedInt; SigAtomicType = SignedLong; - resetDataLayout("e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override; diff --git a/clang/lib/Basic/Targets/Mips.h b/clang/lib/Basic/Targets/Mips.h index 930271cee73ff..4c09390c3c6d5 100644 --- a/clang/lib/Basic/Targets/Mips.h +++ b/clang/lib/Basic/Targets/Mips.h @@ -23,24 +23,6 @@ namespace clang { namespace targets { class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo { - void setDataLayout() { - StringRef Layout; - - if (ABI == "o32") - Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"; - else if (ABI == "n32") - Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"; - else if (ABI == "n64") - Layout = "m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"; - else - llvm_unreachable("Invalid ABI"); - - if (BigEndian) - resetDataLayout(("E-" + Layout).str()); - else - resetDataLayout(("e-" + Layout).str()); - } - std::string CPU; bool IsMips16; bool IsMicromips; @@ -392,7 +374,7 @@ class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo { Features.push_back("+fp64"); } - setDataLayout(); + resetDataLayout(); return true; } diff --git a/clang/lib/Basic/Targets/NVPTX.cpp b/clang/lib/Basic/Targets/NVPTX.cpp index ec4e40b0db6eb..cf95b07758d95 100644 --- a/clang/lib/Basic/Targets/NVPTX.cpp +++ b/clang/lib/Basic/Targets/NVPTX.cpp @@ -68,16 +68,9 @@ NVPTXTargetInfo::NVPTXTargetInfo(const llvm::Triple &Triple, HasFastHalfType = true; HasFloat16 = true; - if (TargetPointerWidth == 32) - resetDataLayout("e-p:32:32-p6:32:32-p7:32:32-i64:64-i128:128-i256:256-v16:" - "16-v32:32-n16:32:64"); - else if (Opts.NVPTXUseShortPointers) - resetDataLayout("e-p3:32:32-p4:32:32-p5:32:32-p6:32:32-p7:32:32-i64:64-" - "i128:128-i256:256-v16:" - "16-v32:32-n16:32:64"); - else - resetDataLayout( - "e-p6:32:32-i64:64-i128:128-i256:256-v16:16-v32:32-n16:32:64"); + // TODO: Make shortptr a proper ABI? + DataLayoutString = + Triple.computeDataLayout(Opts.NVPTXUseShortPointers ? "shortptr" : ""); // If possible, get a TargetInfo for our host triple, so we can match its // types. diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h index 4d81c9a83714d..34e6b2a465092 100644 --- a/clang/lib/Basic/Targets/OSTargets.h +++ b/clang/lib/Basic/Targets/OSTargets.h @@ -546,7 +546,7 @@ class LLVM_LIBRARY_VISIBILITY PS3PPUTargetInfo : public OSTargetInfo<Target> { this->IntMaxType = TargetInfo::SignedLongLong; this->Int64Type = TargetInfo::SignedLongLong; this->SizeType = TargetInfo::UnsignedInt; - this->resetDataLayout("E-m:e-p:32:32-Fi64-i64:64-i128:128-n32:64"); + this->resetDataLayout(); } }; diff --git a/clang/lib/Basic/Targets/PPC.h b/clang/lib/Basic/Targets/PPC.h index d4ada2a0e0c38..8313826d88500 100644 --- a/clang/lib/Basic/Targets/PPC.h +++ b/clang/lib/Basic/Targets/PPC.h @@ -388,12 +388,7 @@ class LLVM_LIBRARY_VISIBILITY PPC32TargetInfo : public PPCTargetInfo { public: PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : PPCTargetInfo(Triple, Opts) { - if (Triple.isOSAIX()) - resetDataLayout("E-m:a-p:32:32-Fi32-i64:64-n32"); - else if (Triple.getArch() == llvm::Triple::ppcle) - resetDataLayout("e-m:e-p:32:32-Fn32-i64:64-n32"); - else - resetDataLayout("E-m:e-p:32:32-Fn32-i64:64-n32"); + resetDataLayout(); switch (getTriple().getOS()) { case llvm::Triple::Linux: @@ -467,7 +462,7 @@ class LLVM_LIBRARY_VISIBILITY PPC64TargetInfo : public PPCTargetInfo { // Baseline PPC64 supports inlining atomics up to 8 bytes. MaxAtomicInlineWidth = 64; - calculateDataLayout(); + resetDataLayout(); } void setMaxAtomicWidth() override { @@ -482,33 +477,11 @@ class LLVM_LIBRARY_VISIBILITY PPC64TargetInfo : public PPCTargetInfo { return TargetInfo::CharPtrBuiltinVaList; } - void calculateDataLayout() { - std::string DataLayout; - - if (getTriple().isOSAIX()) { - DataLayout = "E-m:a-Fi64-i64:64-i128:128-n32:64"; - } else if ((getTriple().getArch() == llvm::Triple::ppc64le)) { - DataLayout = "e-m:e-Fn32-i64:64-i128:128-n32:64"; - } else { - DataLayout = "E-m:e"; - if (ABI == "elfv2") { - DataLayout += "-Fn32"; - } else { - DataLayout += "-Fi64"; - } - DataLayout += "-i64:64-i128:128-n32:64"; - } - - if (getTriple().isOSAIX() || getTriple().isOSLinux()) - DataLayout += "-S128-v256:256:256-v512:512:512"; - resetDataLayout(DataLayout); - } - // PPC64 Linux-specific ABI options. bool setABI(const std::string &Name) override { if (Name == "elfv1" || Name == "elfv2") { ABI = Name; - calculateDataLayout(); + resetDataLayout(); return true; } return false; diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h index 21555b94fe65d..685735b54a45b 100644 --- a/clang/lib/Basic/Targets/RISCV.h +++ b/clang/lib/Basic/Targets/RISCV.h @@ -175,13 +175,13 @@ class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo { IntPtrType = SignedInt; PtrDiffType = SignedInt; SizeType = UnsignedInt; - resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128"); + resetDataLayout(); } bool setABI(const std::string &Name) override { if (Name == "ilp32e") { ABI = Name; - resetDataLayout("e-m:e-p:32:32-i64:64-n32-S32"); + resetDataLayout(); return true; } @@ -206,13 +206,13 @@ class LLVM_LIBRARY_VISIBILITY RISCV64TargetInfo : public RISCVTargetInfo { : RISCVTargetInfo(Triple, Opts) { LongWidth = LongAlign = PointerWidth = PointerAlign = 64; IntMaxType = Int64Type = SignedLong; - resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"); + resetDataLayout(); } bool setABI(const std::string &Name) override { if (Name == "lp64e") { ABI = Name; - resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S64"); + resetDataLayout(); return true; } diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index 332bf79e2babd..a9fc62812b1e3 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -335,8 +335,7 @@ class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo { // SPIR-V IDs are represented with a single 32-bit word. SizeType = TargetInfo::UnsignedInt; - resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-" - "v256:256-v512:512-v1024:1024-n8:16:32:64-G10"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, @@ -359,8 +358,7 @@ class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo { // SPIR-V has core support for atomic ops, and Int32 is always available; // we take the maximum because it's possible the Host supports wider types. MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 32); - resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-" - "v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64-G1"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, @@ -383,8 +381,7 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo { // SPIR-V has core support for atomic ops, and Int64 is always available; // we take the maximum because it's possible the Host supports wider types. MaxAtomicInlineWidth = std::max<unsigned char>(MaxAtomicInlineWidth, 64); - resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-" - "v256:256-v512:512-v1024:1024-n8:16:32:64-G1"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, @@ -428,8 +425,7 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64AMDGCNTargetInfo final PtrDiffType = IntPtrType = TargetInfo::SignedLong; AddrSpaceMap = &SPIRDefIsGenMap; - resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-" - "v256:256-v512:512-v1024:1024-n32:64-S32-G1-P4-A0"); + resetDataLayout(); HasFastHalfType = true; HasFloat16 = true; @@ -475,8 +471,7 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64IntelTargetInfo final : SPIRV64TargetInfo(Triple, Opts) { assert(Triple.getVendor() == llvm::Triple::VendorType::Intel && "64-bit Intel SPIR-V target must use Intel vendor"); - resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-" - "v256:256-v512:512-v1024:1024-n8:16:32:64-G1-P9-A0"); + resetDataLayout(); } }; } // namespace targets diff --git a/clang/lib/Basic/Targets/Sparc.h b/clang/lib/Basic/Targets/Sparc.h index acc27194c38ea..d9a879ca4d5b3 100644 --- a/clang/lib/Basic/Targets/Sparc.h +++ b/clang/lib/Basic/Targets/Sparc.h @@ -151,7 +151,7 @@ class LLVM_LIBRARY_VISIBILITY SparcV8TargetInfo : public SparcTargetInfo { public: SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : SparcTargetInfo(Triple, Opts) { - resetDataLayout("E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64"); + resetDataLayout(); // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int. switch (getTriple().getOS()) { default: @@ -195,7 +195,7 @@ class LLVM_LIBRARY_VISIBILITY SparcV8elTargetInfo : public SparcV8TargetInfo { public: SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : SparcV8TargetInfo(Triple, Opts) { - resetDataLayout("e-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64"); + resetDataLayout(); } }; @@ -205,7 +205,7 @@ class LLVM_LIBRARY_VISIBILITY SparcV9TargetInfo : public SparcTargetInfo { SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : SparcTargetInfo(Triple, Opts) { // FIXME: Support Sparc quad-precision long double? - resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128"); + resetDataLayout(); // This is an LP64 platform. LongWidth = LongAlign = PointerWidth = PointerAlign = 64; diff --git a/clang/lib/Basic/Targets/SystemZ.h b/clang/lib/Basic/Targets/SystemZ.h index 4e15d5af1cde6..b45cbc68efb5c 100644 --- a/clang/lib/Basic/Targets/SystemZ.h +++ b/clang/lib/Basic/Targets/SystemZ.h @@ -84,18 +84,12 @@ class LLVM_LIBRARY_VISIBILITY SystemZTargetInfo : public TargetInfo { // All vector types are default aligned on an 8-byte boundary, even if the // vector facility is not available. That is different from Linux. MaxVectorAlign = 64; - // Compared to Linux/ELF, the data layout differs only in some details: - // - name mangling is GOFF. - // - 32 bit pointers, either as default or special address space - resetDataLayout("E-m:l-p1:32:32-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-" - "a:8:16-n32:64"); } else { // Support _Float16. HasFloat16 = true; TLSSupported = true; - resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64" - "-v128:64-a:8:16-n32:64"); } + resetDataLayout(); MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 128; // True if the backend supports operations on the half LLVM IR type. diff --git a/clang/lib/Basic/Targets/VE.h b/clang/lib/Basic/Targets/VE.h index e9b7e92f3f850..b518407d34438 100644 --- a/clang/lib/Basic/Targets/VE.h +++ b/clang/lib/Basic/Targets/VE.h @@ -45,9 +45,7 @@ class LLVM_LIBRARY_VISIBILITY VETargetInfo : public TargetInfo { WCharType = UnsignedInt; WIntType = UnsignedInt; UseZeroLengthBitfieldAlignment = true; - resetDataLayout( - "e-m:e-i64:64-n32:64-S128-v64:64:64-v128:64:64-v256:64:64-v512:64:64-" - "v1024:64:64-v2048:64:64-v4096:64:64-v8192:64:64-v16384:64:64"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index 4de6ce6bb5a21..592a9f55db884 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -198,13 +198,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo explicit WebAssembly32TargetInfo(const llvm::Triple &T, const TargetOptions &Opts) : WebAssemblyTargetInfo(T, Opts) { - if (T.isOSEmscripten()) - resetDataLayout( - "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-f128:64-n32:64-" - "S128-ni:1:10:20"); - else - resetDataLayout("e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-" - "S128-ni:1:10:20"); + resetDataLayout(); } protected: @@ -223,13 +217,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly64TargetInfo SizeType = UnsignedLong; PtrDiffType = SignedLong; IntPtrType = SignedLong; - if (T.isOSEmscripten()) - resetDataLayout( - "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-f128:64-n32:64-" - "S128-ni:1:10:20"); - else - resetDataLayout("e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-" - "S128-ni:1:10:20"); + resetDataLayout(); } protected: diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index e7da2622e78b5..1806709b1070c 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -456,12 +456,7 @@ class LLVM_LIBRARY_VISIBILITY X86_32TargetInfo : public X86TargetInfo { LongDoubleWidth = 96; LongDoubleAlign = 32; SuitableAlign = 128; - resetDataLayout(Triple.isOSBinFormatMachO() - ? "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:" - "128-f64:32:64-f80:32-n8:16:32-S128" - : "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:" - "128-f64:32:64-f80:32-n8:16:32-S128", - Triple.isOSBinFormatMachO() ? "_" : ""); + resetDataLayout(); SizeType = UnsignedInt; PtrDiffType = SignedInt; IntPtrType = SignedInt; @@ -565,9 +560,7 @@ class LLVM_LIBRARY_VISIBILITY DarwinI386TargetInfo UseSignedCharForObjCBool = false; SizeType = UnsignedLong; IntPtrType = SignedLong; - resetDataLayout("e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-" - "f64:32:64-f80:128-n8:16:32-S128", - "_"); + resetDataLayout(); HasAlignMac68kSupport = true; } @@ -597,7 +590,9 @@ class LLVM_LIBRARY_VISIBILITY WindowsX86_32TargetInfo Layout += "-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-"; Layout += IsMSVC ? "f80:128" : "f80:32"; Layout += "-n8:16:32-a:0:32-S32"; - resetDataLayout(Layout, IsWinCOFF ? "_" : ""); + if (IsWinCOFF) + UserLabelPrefix = "_"; + resetDataLayout(); } }; @@ -647,9 +642,8 @@ class LLVM_LIBRARY_VISIBILITY CygwinX86_32TargetInfo : public X86_32TargetInfo { this->WIntType = TargetInfo::UnsignedInt; this->UseMicrosoftManglingForC = true; DoubleAlign = LongLongAlign = 64; - resetDataLayout("e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-" - "i128:128-f80:32-n8:16:32-a:0:32-S32", - "_"); + UserLabelPrefix = "_"; + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, @@ -687,8 +681,7 @@ class LLVM_LIBRARY_VISIBILITY MCUX86_32TargetInfo : public X86_32TargetInfo { LongDoubleWidth = 64; DefaultAlignForAttributeAligned = 32; LongDoubleFormat = &llvm::APFloat::IEEEdouble(); - resetDataLayout("e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:32-" - "f64:32-f128:32-n8:16:32-a:0:32-S32"); + resetDataLayout(); WIntType = UnsignedInt; } @@ -731,8 +724,6 @@ class LLVM_LIBRARY_VISIBILITY X86_64TargetInfo : public X86TargetInfo { X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : X86TargetInfo(Triple, Opts) { const bool IsX32 = getTriple().isX32(); - bool IsWinCOFF = - getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF(); LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64; LongDoubleWidth = 128; LongDoubleAlign = 128; @@ -746,13 +737,7 @@ class LLVM_LIBRARY_VISIBILITY X86_64TargetInfo : public X86TargetInfo { Int64Type = IsX32 ? SignedLongLong : SignedLong; RegParmMax = 6; - // Pointers are 32-bit in x32. - resetDataLayout(IsX32 ? "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-" - "i64:64-i128:128-f80:128-n8:16:32:64-S128" - : IsWinCOFF ? "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:" - "64-i128:128-f80:128-n8:16:32:64-S128" - : "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:" - "64-i128:128-f80:128-n8:16:32:64-S128"); + resetDataLayout(); // Use fpret only for long double. RealTypeUsesObjCFPRetMask = (unsigned)FloatModeKind::LongDouble; @@ -870,8 +855,7 @@ class LLVM_LIBRARY_VISIBILITY UEFIX86_64TargetInfo IntPtrType = SignedLongLong; WCharType = UnsignedShort; WIntType = UnsignedShort; - this->resetDataLayout("e-m:w-p270:32:32-p271:32:32-p272:64:64-" - "i64:64-i128:128-f80:128-n8:16:32:64-S128"); + this->resetDataLayout(); } BuiltinVaListKind getBuiltinVaListKind() const override { @@ -1036,9 +1020,7 @@ class LLVM_LIBRARY_VISIBILITY DarwinX86_64TargetInfo llvm::Triple T = llvm::Triple(Triple); if (T.isiOS()) UseSignedCharForObjCBool = false; - resetDataLayout("e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-" - "f80:128-n8:16:32:64-S128", - "_"); + resetDataLayout(); } bool handleTargetFeatures(std::vector<std::string> &Features, diff --git a/clang/lib/Basic/Targets/XCore.h b/clang/lib/Basic/Targets/XCore.h index 9af9e0658f629..55a182c38cedf 100644 --- a/clang/lib/Basic/Targets/XCore.h +++ b/clang/lib/Basic/Targets/XCore.h @@ -36,8 +36,7 @@ class LLVM_LIBRARY_VISIBILITY XCoreTargetInfo : public TargetInfo { WCharType = UnsignedChar; WIntType = UnsignedInt; UseZeroLengthBitfieldAlignment = true; - resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32" - "-f64:32-a:0:32-n32"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, diff --git a/clang/lib/Basic/Targets/Xtensa.h b/clang/lib/Basic/Targets/Xtensa.h index f3558ac247bec..79783dddd4b64 100644 --- a/clang/lib/Basic/Targets/Xtensa.h +++ b/clang/lib/Basic/Targets/Xtensa.h @@ -50,7 +50,7 @@ class LLVM_LIBRARY_VISIBILITY XtensaTargetInfo : public TargetInfo { WIntType = UnsignedInt; UseZeroLengthBitfieldAlignment = true; MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; - resetDataLayout("e-m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32"); + resetDataLayout(); } void getTargetDefines(const LangOptions &Opts, diff --git a/llvm/lib/Target/XCore/XCoreTargetMachine.cpp b/llvm/lib/Target/XCore/XCoreTargetMachine.cpp index 88f46c38b2f9a..e21ddd583a16a 100644 --- a/llvm/lib/Target/XCore/XCoreTargetMachine.cpp +++ b/llvm/lib/Target/XCore/XCoreTargetMachine.cpp @@ -47,10 +47,9 @@ XCoreTargetMachine::XCoreTargetMachine(const Target &T, const Triple &TT, std::optional<Reloc::Model> RM, std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, bool JIT) - : CodeGenTargetMachineImpl( - T, "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32-f64:32-a:0:32-n32", - TT, CPU, FS, Options, getEffectiveRelocModel(RM), - getEffectiveXCoreCodeModel(CM), OL), + : CodeGenTargetMachineImpl(T, TT.computeDataLayout(), TT, CPU, FS, Options, + getEffectiveRelocModel(RM), + getEffectiveXCoreCodeModel(CM), OL), TLOF(std::make_unique<XCoreTargetObjectFile>()), Subtarget(TT, std::string(CPU), std::string(FS), *this) { initAsmInfo(); diff --git a/llvm/lib/TargetParser/TargetDataLayout.cpp b/llvm/lib/TargetParser/TargetDataLayout.cpp index d7359234b02f7..b52e9f2879758 100644 --- a/llvm/lib/TargetParser/TargetDataLayout.cpp +++ b/llvm/lib/TargetParser/TargetDataLayout.cpp @@ -555,6 +555,9 @@ std::string Triple::computeDataLayout(StringRef ABIName) const { return "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-" "f32:32-f64:64-n8:16:32:64-v48:16:16-v96:32:32-v192:64:64"; case Triple::hexagon: + // Specify the vector alignment explicitly. For v512x1, the calculated + // alignment would be 512*alignment(i1), which is 512 bytes, instead of + // the required minimum of 64 bytes. return "e-m:e-p:32:32:32-a:0-n16:32-" "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-" "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"; @@ -595,6 +598,7 @@ std::string Triple::computeDataLayout(StringRef ABIName) const { case Triple::x86_64: return computeX86DataLayout(*this); case Triple::xcore: + return "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32-f64:32-a:0:32-n32"; case Triple::xtensa: return "e-m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32"; case Triple::nvptx: _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
