From fb7514fccb49f5a1a20a3aadbf7083eae90cbdf7 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Fri, 16 Jan 2015 17:33:08 +0000 Subject: [PATCH] IR: Allow 16-bits for column info Raise the limit for column information from 8 bits to 16 bits. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226291 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AsmParser/LLParser.cpp | 2 +- lib/IR/Metadata.cpp | 6 +++--- test/Assembler/invalid-mdlocation-overflow-column.ll | 6 +++--- test/Assembler/mdlocation.ll | 7 +++++-- unittests/IR/MetadataTest.cpp | 10 +++++----- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index d209a2087dd..11a5983c8ad 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/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/lib/IR/Metadata.cpp b/lib/IR/Metadata.cpp index 2c6b332dc8e..de204d58764 100644 --- a/lib/IR/Metadata.cpp +++ b/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/test/Assembler/invalid-mdlocation-overflow-column.ll b/test/Assembler/invalid-mdlocation-overflow-column.ll index d1dbb27173d..92ea661ed34 100644 --- a/test/Assembler/invalid-mdlocation-overflow-column.ll +++ b/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/test/Assembler/mdlocation.ll b/test/Assembler/mdlocation.ll index c1815ff50e0..c0a7b24cc75 100644 --- a/test/Assembler/mdlocation.ll +++ b/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/unittests/IR/MetadataTest.cpp b/unittests/IR/MetadataTest.cpp index f862f049fcc..83fd0c164f6 100644 --- a/unittests/IR/MetadataTest.cpp +++ b/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()); } -- 2.11.0