mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-21 18:22:53 +01:00
Add AutoUpgrade function to add new address space datalayout string to existing datalayouts.
Summary: Add function to AutoUpgrade to change the datalayout of old X86 datalayout strings. This adds "-p270:32:32-p271:32:32-p272:64:64" to X86 datalayouts that are otherwise valid and don't already contain it. This also removes the compatibility changes in https://reviews.llvm.org/D66843. Datalayout change in https://reviews.llvm.org/D64931. Reviewers: rnk, echristo Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67631 llvm-svn: 372267
This commit is contained in:
parent
f6173ffe7d
commit
29e7e13b1b
@ -87,6 +87,10 @@ namespace llvm {
|
||||
/// Upgrade the loop attachment metadata node.
|
||||
MDNode *upgradeInstructionLoopAttachment(MDNode &N);
|
||||
|
||||
/// Upgrade the datalayout string by adding a section for address space
|
||||
/// pointers.
|
||||
std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple);
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
@ -157,7 +157,7 @@ public:
|
||||
/// The LLVM Module owns a DataLayout that is used for the target independent
|
||||
/// optimizations and code generation. This hook provides a target specific
|
||||
/// check on the validity of this DataLayout.
|
||||
virtual bool isCompatibleDataLayout(const DataLayout &Candidate) const {
|
||||
bool isCompatibleDataLayout(const DataLayout &Candidate) const {
|
||||
return DL == Candidate;
|
||||
}
|
||||
|
||||
|
@ -3648,6 +3648,11 @@ Error BitcodeReader::parseModule(uint64_t ResumeBit,
|
||||
break;
|
||||
}
|
||||
Record.clear();
|
||||
|
||||
// Upgrade data layout string.
|
||||
std::string DL = llvm::UpgradeDataLayoutString(
|
||||
TheModule->getDataLayoutStr(), TheModule->getTargetTriple());
|
||||
TheModule->setDataLayout(DL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4113,3 +4113,23 @@ MDNode *llvm::upgradeInstructionLoopAttachment(MDNode &N) {
|
||||
|
||||
return MDTuple::get(T->getContext(), Ops);
|
||||
}
|
||||
|
||||
std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
|
||||
std::string AddrSpaces = "-p270:32:32-p271:32:32-p272:64:64";
|
||||
|
||||
// If X86, and the datalayout matches the expected format, add pointer size
|
||||
// address spaces to the datalayout.
|
||||
Triple::ArchType Arch = Triple(TT).getArch();
|
||||
if ((Arch != llvm::Triple::x86 && Arch != llvm::Triple::x86_64) ||
|
||||
DL.contains(AddrSpaces))
|
||||
return DL;
|
||||
|
||||
SmallVector<StringRef, 4> Groups;
|
||||
Regex R("(e-m:[a-z](-p:32:32)?)(-[if]64:.*$)");
|
||||
if (!R.match(DL, &Groups))
|
||||
return DL;
|
||||
|
||||
SmallString<1024> Buf;
|
||||
std::string Res = (Groups[1] + AddrSpaces + Groups[3]).toStringRef(Buf).str();
|
||||
return Res;
|
||||
}
|
||||
|
@ -106,8 +106,7 @@ static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
|
||||
llvm_unreachable("unknown subtarget type");
|
||||
}
|
||||
|
||||
static std::string computeDataLayout(const Triple &TT,
|
||||
bool AddressSpaces = true) {
|
||||
static std::string computeDataLayout(const Triple &TT) {
|
||||
// X86 is little endian
|
||||
std::string Ret = "e";
|
||||
|
||||
@ -119,8 +118,7 @@ static std::string computeDataLayout(const Triple &TT,
|
||||
Ret += "-p:32:32";
|
||||
|
||||
// Address spaces for 32 bit signed, 32 bit unsigned, and 64 bit pointers.
|
||||
if (AddressSpaces)
|
||||
Ret += "-p270:32:32-p271:32:32-p272:64:64";
|
||||
Ret += "-p270:32:32-p271:32:32-p272:64:64";
|
||||
|
||||
// Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.
|
||||
if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl())
|
||||
@ -223,8 +221,7 @@ X86TargetMachine::X86TargetMachine(const Target &T, const Triple &TT,
|
||||
getEffectiveRelocModel(TT, JIT, RM),
|
||||
getEffectiveX86CodeModel(CM, JIT, TT.getArch() == Triple::x86_64),
|
||||
OL),
|
||||
TLOF(createTLOF(getTargetTriple())),
|
||||
DLNoAddrSpaces(computeDataLayout(TT, /*AddressSpaces=*/false)) {
|
||||
TLOF(createTLOF(getTargetTriple())) {
|
||||
// On PS4, the "return address" of a 'noreturn' call must still be within
|
||||
// the calling function, and TrapUnreachable is an easy way to get that.
|
||||
if (TT.isPS4() || TT.isOSBinFormatMachO()) {
|
||||
@ -318,13 +315,6 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
return I.get();
|
||||
}
|
||||
|
||||
bool X86TargetMachine::isCompatibleDataLayout(
|
||||
const DataLayout &Candidate) const {
|
||||
// Maintain compatibility with datalayouts that don't have address space
|
||||
// pointer sizes.
|
||||
return DL == Candidate || DLNoAddrSpaces == Candidate;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Command line options for x86
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -30,7 +30,6 @@ class X86RegisterBankInfo;
|
||||
class X86TargetMachine final : public LLVMTargetMachine {
|
||||
std::unique_ptr<TargetLoweringObjectFile> TLOF;
|
||||
mutable StringMap<std::unique_ptr<X86Subtarget>> SubtargetMap;
|
||||
const DataLayout DLNoAddrSpaces;
|
||||
|
||||
public:
|
||||
X86TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
|
||||
@ -53,8 +52,6 @@ public:
|
||||
TargetLoweringObjectFile *getObjFileLowering() const override {
|
||||
return TLOF.get();
|
||||
}
|
||||
|
||||
bool isCompatibleDataLayout(const DataLayout &Candidate) const override;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
9
test/Bitcode/upgrade-datalayout.ll
Normal file
9
test/Bitcode/upgrade-datalayout.ll
Normal file
@ -0,0 +1,9 @@
|
||||
; Test to make sure datalayout is automatically upgraded.
|
||||
;
|
||||
; RUN: llvm-as %s -o - | llvm-dis - | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK: target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
10
test/Bitcode/upgrade-datalayout2.ll
Normal file
10
test/Bitcode/upgrade-datalayout2.ll
Normal file
@ -0,0 +1,10 @@
|
||||
; Test to make sure datalayout is not automatically upgraded if it does not
|
||||
; match a possible x86 datalayout.
|
||||
;
|
||||
; RUN: llvm-as %s -o - | llvm-dis - | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK: target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
||||
|
8
test/Bitcode/upgrade-datalayout3.ll
Normal file
8
test/Bitcode/upgrade-datalayout3.ll
Normal file
@ -0,0 +1,8 @@
|
||||
; Test to make sure datalayout is automatically upgraded.
|
||||
;
|
||||
; RUN: llvm-as %s -o - | llvm-dis - | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
|
||||
target triple = "i686-pc-windows-msvc"
|
||||
|
||||
; CHECK: target datalayout = "e-m:w-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-S32"
|
@ -8,4 +8,5 @@ set(LLVM_LINK_COMPONENTS
|
||||
|
||||
add_llvm_unittest(BitcodeTests
|
||||
BitReaderTest.cpp
|
||||
DataLayoutUpgradeTest.cpp
|
||||
)
|
||||
|
59
unittests/Bitcode/DataLayoutUpgradeTest.cpp
Normal file
59
unittests/Bitcode/DataLayoutUpgradeTest.cpp
Normal file
@ -0,0 +1,59 @@
|
||||
//===- DataLayoutUpgradeTest.cpp - Tests for DataLayout upgrades ----------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/IR/AutoUpgrade.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {
|
||||
std::string DL1 =
|
||||
UpgradeDataLayoutString("e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128",
|
||||
"x86_64-unknown-linux-gnu");
|
||||
std::string DL2 = UpgradeDataLayoutString(
|
||||
"e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32", "i686-pc-windows-msvc");
|
||||
std::string DL3 = UpgradeDataLayoutString("e-m:o-i64:64-i128:128-n32:64-S128",
|
||||
"x86_64-apple-macosx");
|
||||
EXPECT_EQ(DL1, "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64"
|
||||
"-f80:128-n8:16:32:64-S128");
|
||||
EXPECT_EQ(DL2, "e-m:w-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64"
|
||||
"-f80:32-n8:16:32-S32");
|
||||
EXPECT_EQ(DL3, "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128"
|
||||
"-n32:64-S128");
|
||||
}
|
||||
|
||||
TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) {
|
||||
std::string DL1 = UpgradeDataLayoutString(
|
||||
"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
|
||||
"-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
|
||||
"-n8:16:32:64-S128",
|
||||
"x86_64-unknown-linux-gnu");
|
||||
std::string DL2 = UpgradeDataLayoutString("e-p:32:32", "i686-apple-darwin9");
|
||||
std::string DL3 = UpgradeDataLayoutString("e-m:e-i64:64-n32:64",
|
||||
"powerpc64le-unknown-linux-gnu");
|
||||
std::string DL4 =
|
||||
UpgradeDataLayoutString("e-m:o-i64:64-i128:128-n32:64-S128", "aarch64--");
|
||||
EXPECT_EQ(DL1, "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
|
||||
"-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64"
|
||||
"-f80:128:128-n8:16:32:64-S128");
|
||||
EXPECT_EQ(DL2, "e-p:32:32");
|
||||
EXPECT_EQ(DL3, "e-m:e-i64:64-n32:64");
|
||||
EXPECT_EQ(DL4, "e-m:o-i64:64-i128:128-n32:64-S128");
|
||||
}
|
||||
|
||||
TEST(DataLayoutUpgradeTest, EmptyDataLayout) {
|
||||
std::string DL1 = UpgradeDataLayoutString("", "x86_64-unknown-linux-gnu");
|
||||
std::string DL2 = UpgradeDataLayoutString(
|
||||
"e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128", "");
|
||||
EXPECT_EQ(DL1, "");
|
||||
EXPECT_EQ(DL2, "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128");
|
||||
}
|
||||
|
||||
} // end namespace
|
Loading…
Reference in New Issue
Block a user