diff --git a/lib/IR/DataLayout.cpp b/lib/IR/DataLayout.cpp index 8a057f552a5..394986e092d 100644 --- a/lib/IR/DataLayout.cpp +++ b/lib/IR/DataLayout.cpp @@ -247,8 +247,8 @@ void DataLayout::parseSpecifier(StringRef Desc) { case 'p': { // Address space. unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok); - assert(AddrSpace < 1 << 24 && - "Invalid address space, must be a 24bit integer"); + if (!isUInt<24>(AddrSpace)) + report_fatal_error("Invalid address space, must be a 24bit integer"); // Size. Split = split(Rest, ':'); @@ -285,8 +285,9 @@ void DataLayout::parseSpecifier(StringRef Desc) { // Bit size. unsigned Size = Tok.empty() ? 0 : getInt(Tok); - assert((AlignType != AGGREGATE_ALIGN || Size == 0) && - "These specifications don't have a size"); + if (AlignType == AGGREGATE_ALIGN && Size != 0) + report_fatal_error( + "Sized aggregate specification in datalayout string"); // ABI alignment. Split = split(Rest, ':'); @@ -306,7 +307,9 @@ void DataLayout::parseSpecifier(StringRef Desc) { case 'n': // Native integer types. for (;;) { unsigned Width = getInt(Tok); - assert(Width != 0 && "width must be non-zero"); + if (Width == 0) + report_fatal_error( + "Zero width native integer type in datalayout string"); LegalIntWidths.push_back(Width); if (Rest.empty()) break; @@ -322,7 +325,7 @@ void DataLayout::parseSpecifier(StringRef Desc) { assert(Rest.size() == 1); switch(Rest[0]) { default: - llvm_unreachable("Unknown mangling in datalayout string"); + report_fatal_error("Unknown mangling in datalayout string"); case 'e': ManglingMode = MM_ELF; break; @@ -338,7 +341,7 @@ void DataLayout::parseSpecifier(StringRef Desc) { } break; default: - llvm_unreachable("Unknown specifier in datalayout string"); + report_fatal_error("Unknown specifier in datalayout string"); break; } } diff --git a/test/Assembler/invalid-datalayout1.ll b/test/Assembler/invalid-datalayout1.ll new file mode 100644 index 00000000000..d1befdcdf29 --- /dev/null +++ b/test/Assembler/invalid-datalayout1.ll @@ -0,0 +1,3 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s +target datalayout = "^" +; CHECK: Unknown specifier in datalayout string diff --git a/test/Assembler/invalid-datalayout2.ll b/test/Assembler/invalid-datalayout2.ll new file mode 100644 index 00000000000..a435612bf85 --- /dev/null +++ b/test/Assembler/invalid-datalayout2.ll @@ -0,0 +1,3 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s +target datalayout = "m:v" +; CHECK: Unknown mangling in datalayout string diff --git a/test/Assembler/invalid-datalayout3.ll b/test/Assembler/invalid-datalayout3.ll new file mode 100644 index 00000000000..44535fd055b --- /dev/null +++ b/test/Assembler/invalid-datalayout3.ll @@ -0,0 +1,3 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s +target datalayout = "n0" +; CHECK: Zero width native integer type in datalayout string diff --git a/test/Assembler/invalid-datalayout4.ll b/test/Assembler/invalid-datalayout4.ll new file mode 100644 index 00000000000..2d946d32609 --- /dev/null +++ b/test/Assembler/invalid-datalayout4.ll @@ -0,0 +1,3 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s +target datalayout = "p16777216:64:64:64" +; CHECK: Invalid address space, must be a 24bit integer diff --git a/test/Assembler/invalid-datalayout5.bc b/test/Assembler/invalid-datalayout5.bc new file mode 100644 index 00000000000..736b21fac65 Binary files /dev/null and b/test/Assembler/invalid-datalayout5.bc differ diff --git a/test/Assembler/invalid-datalayout5.ll b/test/Assembler/invalid-datalayout5.ll new file mode 100644 index 00000000000..3ce8791c087 --- /dev/null +++ b/test/Assembler/invalid-datalayout5.ll @@ -0,0 +1,3 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s +target datalayout = "a1:64" +; CHECK: Sized aggregate specification in datalayout string