diff --git a/lld/test/COFF/libcall-archive.ll b/lld/test/COFF/libcall-archive.ll --- a/lld/test/COFF/libcall-archive.ll +++ b/lld/test/COFF/libcall-archive.ll @@ -10,7 +10,7 @@ ; CHECK: _start ; CHECK: _memcpy -target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32-a:0:32-S32" +target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-a:0:32-S32" target triple = "i686-unknown-windows" define void @start(i8* %a, i8* %b) { diff --git a/lld/test/COFF/lto-lazy-reference.ll b/lld/test/COFF/lto-lazy-reference.ll --- a/lld/test/COFF/lto-lazy-reference.ll +++ b/lld/test/COFF/lto-lazy-reference.ll @@ -6,7 +6,7 @@ ; RUN: llvm-as -o %t.obj %s ; RUN: lld-link /out:%t.exe /entry:main /subsystem:console %t.obj %t.lib -target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32-a:0:32-S32" +target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-a:0:32-S32" target triple = "i686-pc-windows-msvc18.0.0" ; Define fltused, since we don't link against the MS C runtime but are diff --git a/lld/test/COFF/lto-reloc-model.ll b/lld/test/COFF/lto-reloc-model.ll --- a/lld/test/COFF/lto-reloc-model.ll +++ b/lld/test/COFF/lto-reloc-model.ll @@ -3,7 +3,7 @@ ; RUN: lld-link /entry:main /subsystem:console /out:%t.exe %t ; RUN: llvm-objdump -d %t.exe | FileCheck %s -target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32-a:0:32-S32" +target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-a:0:32-S32" target triple = "i686-pc-windows-msvc" @foo = thread_local global i8 0 diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -4570,16 +4570,18 @@ } std::string Res = DL.str(); - 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. - if (!T.isX86() || DL.contains(AddrSpaces)) + if (!T.isX86()) return Res; - SmallVector Groups; - Regex R("(e-m:[a-z](-p:32:32)?)(-[if]64:.*$)"); - if (R.match(DL, &Groups)) - Res = (Groups[1] + AddrSpaces + Groups[3]).str(); + // If the datalayout matches the expected format, add pointer size address + // spaces to the datalayout. + std::string AddrSpaces = "-p270:32:32-p271:32:32-p272:64:64"; + if (!DL.contains(AddrSpaces)) { + SmallVector Groups; + Regex R("(e-m:[a-z](-p:32:32)?)(-[if]64:.*$)"); + if (R.match(DL, &Groups)) + Res = (Groups[1] + AddrSpaces + Groups[3]).str(); + } // For 32-bit MSVC targets, raise the alignment of f80 values to 16 bytes. // Raising the alignment is safe because Clang did not produce f80 values in diff --git a/llvm/test/Bitcode/upgrade-datalayout4.ll b/llvm/test/Bitcode/upgrade-datalayout4.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Bitcode/upgrade-datalayout4.ll @@ -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:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-a:0:32-S32" +target triple = "i686-pc-windows-msvc" + +; CHECK: target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32-a:0:32-S32"