IR: Allow 16-bits for column info
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 16 Jan 2015 17:33:08 +0000 (17:33 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 16 Jan 2015 17:33:08 +0000 (17:33 +0000)
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
lib/IR/Metadata.cpp
test/Assembler/invalid-mdlocation-overflow-column.ll
test/Assembler/mdlocation.ll
unittests/IR/MetadataTest.cpp

index d209a2087ddcaed1831ca33c4073280fb4be21a2..11a5983c8ad8faa9e9c4ac3bd8afa9c8416e59d0 100644 (file)
@@ -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<uint32_t> line(0, ~0u >> 8);
-  MDUnsignedField<uint32_t> column(0, ~0u >> 24);
+  MDUnsignedField<uint32_t> column(0, ~0u >> 16);
   MDField scope;
   MDField inlinedAt;
   if (ParseMDFieldsImpl([&]() -> bool {
index 2c6b332dc8ee902f951565f5e2eec8f29f784445..de204d58764c9d860926a27c08860396ee694f9d 100644 (file)
@@ -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;
 }
 
index d1dbb27173dce57a20baba145108f5bacc5f5e45..92ea661ed34655d74d3fe56d69b2c126117e952b 100644 (file)
@@ -3,7 +3,7 @@
 !0 = !{}
 
 ; CHECK-NOT: error
-!1 = !MDLocation(column: 255, scope: !0)
+!1 = !MDLocation(column: 65535, scope: !0)
 
-; CHECK: <stdin>:[[@LINE+1]]:26: error: value for 'column' too large, limit is 255
-!2 = !MDLocation(column: 256, scope: !0)
+; CHECK: <stdin>:[[@LINE+1]]:26: error: value for 'column' too large, limit is 65535
+!2 = !MDLocation(column: 65536, scope: !0)
index c1815ff50e09082e9c351a39c6e3bd901982838b..c0a7b24cc7525264616f757aa05b9b68809c5738 100644 (file)
@@ -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)
index f862f049fccc35f2256d17107e26de5d05606b74..83fd0c164f6a8ed274e4dec1a8d213d34ea125a5 100644 (file)
@@ -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());
   }