Compare DataLayout by Value, not by pointer.

This fixes spurious warnings in llvm-link about the datalayout not matching.

Thanks to Zalman Stern for reporting the bug!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202276 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-02-26 17:02:08 +00:00
parent e3561972d4
commit c4bdb93d6a
6 changed files with 30 additions and 1 deletions

View File

@ -193,6 +193,9 @@ public:
return *this;
}
bool operator==(const DataLayout &Other) const;
bool operator!=(const DataLayout &Other) const { return !(*this == Other); }
~DataLayout(); // Not virtual, do not subclass this class
/// Parse a data layout string (with fallback to default values).

View File

@ -354,6 +354,16 @@ DataLayout::DataLayout(const Module *M) : LayoutMap(0) {
reset("");
}
bool DataLayout::operator==(const DataLayout &Other) const {
bool Ret = LittleEndian == Other.LittleEndian &&
StackNaturalAlign == Other.StackNaturalAlign &&
ManglingMode == Other.ManglingMode &&
LegalIntWidths == Other.LegalIntWidths &&
Alignments == Other.Alignments && Pointers == Pointers;
assert(Ret == (getStringRepresentation() == Other.getStringRepresentation()));
return Ret;
}
void
DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
unsigned pref_align, uint32_t bit_width) {

View File

@ -1208,7 +1208,7 @@ bool ModuleLinker::run() {
DstM->setTargetTriple(SrcM->getTargetTriple());
if (SrcM->getDataLayout() && DstM->getDataLayout() &&
SrcM->getDataLayout() != DstM->getDataLayout()) {
*SrcM->getDataLayout() != *DstM->getDataLayout()) {
if (!SuppressWarnings) {
errs() << "WARNING: Linking two modules of different data layouts!\n";
}

View File

@ -0,0 +1 @@
target datalayout = "e"

View File

@ -0,0 +1 @@
target datalayout = "E"

14
test/Linker/datalayout.ll Normal file
View File

@ -0,0 +1,14 @@
; RUN: llvm-link %s %S/Inputs/datalayout-a.ll -S -o - 2>%t.a.err | FileCheck %s
; RUN: cat %t.a.err | not FileCheck %s 2>&1 | FileCheck --check-prefix=WARN-A %s
; RUN: llvm-link %s %S/Inputs/datalayout-b.ll -S -o - 2>%t.b.err | FileCheck %s
; RUN: cat %t.b.err | FileCheck --check-prefix=WARN-B %s
target datalayout = "e"
; CHECK: target datalayout = "e"
; this is a hack to check that llvm-link printed no warnings.
; WARN-A: FileCheck error: '-' is empty.
; WARN-B: WARNING: Linking two modules of different data layouts!