1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00

DI: Set DILexicalBlock columns >= 65536 to 0/unknown

This fixes PR24621 and matches what we do for `DILocation`.  Although
the limit seems somewhat artificial, there are places in the backend
that also assume 16-bit columns, so we may as well just be consistent
about the limits.

llvm-svn: 246349
This commit is contained in:
Duncan P. N. Exon Smith 2015-08-28 22:58:50 +00:00
parent 357daed02c
commit cb7b943e2e
3 changed files with 33 additions and 2 deletions

View File

@ -1430,12 +1430,14 @@ class DILexicalBlock : public DILexicalBlockBase {
friend class MDNode;
unsigned Line;
unsigned Column;
uint16_t Column;
DILexicalBlock(LLVMContext &C, StorageType Storage, unsigned Line,
unsigned Column, ArrayRef<Metadata *> Ops)
: DILexicalBlockBase(C, DILexicalBlockKind, Storage, Ops), Line(Line),
Column(Column) {}
Column(Column) {
assert(Column < (1u << 16) && "Expected 16-bit column");
}
~DILexicalBlock() = default;
static DILexicalBlock *getImpl(LLVMContext &Context, DILocalScope *Scope,

View File

@ -386,6 +386,9 @@ DILexicalBlock *DILexicalBlock::getImpl(LLVMContext &Context, Metadata *Scope,
Metadata *File, unsigned Line,
unsigned Column, StorageType Storage,
bool ShouldCreate) {
// Fixup column.
adjustColumn(Column);
assert(Scope && "Expected scope");
DEFINE_GETIMPL_LOOKUP(DILexicalBlock, (Scope, File, Line, Column));
Metadata *Ops[] = {File, Scope};

View File

@ -1591,6 +1591,32 @@ TEST_F(DILexicalBlockTest, get) {
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
}
TEST_F(DILexicalBlockTest, Overflow) {
DISubprogram *SP = getSubprogram();
DIFile *F = getFile();
{
auto *LB = DILexicalBlock::get(Context, SP, F, 2, 7);
EXPECT_EQ(2u, LB->getLine());
EXPECT_EQ(7u, LB->getColumn());
}
unsigned U16 = 1u << 16;
{
auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16 - 1);
EXPECT_EQ(UINT32_MAX, LB->getLine());
EXPECT_EQ(U16 - 1, LB->getColumn());
}
{
auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16);
EXPECT_EQ(UINT32_MAX, LB->getLine());
EXPECT_EQ(0u, LB->getColumn());
}
{
auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16 + 1);
EXPECT_EQ(UINT32_MAX, LB->getLine());
EXPECT_EQ(0u, LB->getColumn());
}
}
typedef MetadataTest DILexicalBlockFileTest;
TEST_F(DILexicalBlockFileTest, get) {