mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +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:
parent
357daed02c
commit
cb7b943e2e
@ -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,
|
||||
|
@ -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};
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user