diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index d209a2087ddc..11a5983c8ad8 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -3002,7 +3002,7 @@ bool LLParser::ParseSpecializedMDNode(MDNode *&N, bool IsDistinct) { /// ::= !MDLocation(line: 43, column: 8, scope: !5, inlinedAt: !6) bool LLParser::ParseMDLocation(MDNode *&Result, bool IsDistinct) { MDUnsignedField line(0, ~0u >> 8); - MDUnsignedField column(0, ~0u >> 24); + MDUnsignedField column(0, ~0u >> 16); MDField scope; MDField inlinedAt; if (ParseMDFieldsImpl([&]() -> bool { diff --git a/llvm/lib/IR/Metadata.cpp b/llvm/lib/IR/Metadata.cpp index 2c6b332dc8ee..de204d58764c 100644 --- a/llvm/lib/IR/Metadata.cpp +++ b/llvm/lib/IR/Metadata.cpp @@ -653,7 +653,7 @@ MDLocation::MDLocation(LLVMContext &C, unsigned Line, unsigned Column, // Set line and column. assert(Line < (1u << 24) && "Expected 24-bit line"); - assert(Column < (1u << 8) && "Expected 8-bit column"); + assert(Column < (1u << 16) && "Expected 16-bit column"); MDNodeSubclassData = Line; SubclassData16 = Column; @@ -676,8 +676,8 @@ static void adjustLine(unsigned &Line) { } static void adjustColumn(unsigned &Column) { - // Set to unknown on overflow. Still use 8 bits for now. - if (Column >= (1u << 8)) + // Set to unknown on overflow. We only have 16 bits to play with here. + if (Column >= (1u << 16)) Column = 0; } diff --git a/llvm/test/Assembler/invalid-mdlocation-overflow-column.ll b/llvm/test/Assembler/invalid-mdlocation-overflow-column.ll index d1dbb27173dc..92ea661ed346 100644 --- a/llvm/test/Assembler/invalid-mdlocation-overflow-column.ll +++ b/llvm/test/Assembler/invalid-mdlocation-overflow-column.ll @@ -3,7 +3,7 @@ !0 = !{} ; CHECK-NOT: error -!1 = !MDLocation(column: 255, scope: !0) +!1 = !MDLocation(column: 65535, scope: !0) -; CHECK: :[[@LINE+1]]:26: error: value for 'column' too large, limit is 255 -!2 = !MDLocation(column: 256, scope: !0) +; CHECK: :[[@LINE+1]]:26: error: value for 'column' too large, limit is 65535 +!2 = !MDLocation(column: 65536, scope: !0) diff --git a/llvm/test/Assembler/mdlocation.ll b/llvm/test/Assembler/mdlocation.ll index c1815ff50e09..c0a7b24cc752 100644 --- a/llvm/test/Assembler/mdlocation.ll +++ b/llvm/test/Assembler/mdlocation.ll @@ -1,8 +1,8 @@ ; RUN: llvm-as < %s | llvm-dis | FileCheck %s ; RUN: verify-uselistorder %s -; CHECK: !named = !{!0, !1, !1, !2, !2, !3, !3} -!named = !{!0, !1, !2, !3, !4, !5, !6} +; CHECK: !named = !{!0, !1, !1, !2, !2, !3, !3, !4} +!named = !{!0, !1, !2, !3, !4, !5, !6, !7} ; CHECK: !0 = !{} !0 = !{} @@ -18,3 +18,6 @@ ; CHECK-NEXT: !3 = !MDLocation(line: 0, scope: !0) !5 = !MDLocation(scope: !0) !6 = !MDLocation(scope: !0, column: 0, line: 0) + +; CHECK-NEXT: !4 = !MDLocation(line: 16777215, column: 65535, scope: !0) +!7 = !MDLocation(line: 16777215, column: 65535, scope: !0) diff --git a/llvm/unittests/IR/MetadataTest.cpp b/llvm/unittests/IR/MetadataTest.cpp index f862f049fccc..83fd0c164f6a 100644 --- a/llvm/unittests/IR/MetadataTest.cpp +++ b/llvm/unittests/IR/MetadataTest.cpp @@ -397,19 +397,19 @@ TEST_F(MDLocationTest, Overflow) { EXPECT_EQ(7u, L->getColumn()); } unsigned U24 = 1u << 24; - unsigned U8 = 1u << 8; + unsigned U16 = 1u << 16; { - MDLocation *L = MDLocation::get(Context, U24 - 1, U8 - 1, N); + MDLocation *L = MDLocation::get(Context, U24 - 1, U16 - 1, N); EXPECT_EQ(U24 - 1, L->getLine()); - EXPECT_EQ(U8 - 1, L->getColumn()); + EXPECT_EQ(U16 - 1, L->getColumn()); } { - MDLocation *L = MDLocation::get(Context, U24, U8, N); + MDLocation *L = MDLocation::get(Context, U24, U16, N); EXPECT_EQ(0u, L->getLine()); EXPECT_EQ(0u, L->getColumn()); } { - MDLocation *L = MDLocation::get(Context, U24 + 1, U8 + 1, N); + MDLocation *L = MDLocation::get(Context, U24 + 1, U16 + 1, N); EXPECT_EQ(0u, L->getLine()); EXPECT_EQ(0u, L->getColumn()); }