1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00

DebugInfo: Support up to 2^16 arguments in a subprogram

Support up to 2^16 arguments to a function.  If we do hit the limit,
assert out rather than restarting at 0 as we've done historically.

This fixes PR23332.  A clang test will follow.

llvm-svn: 235955
This commit is contained in:
Duncan P. N. Exon Smith 2015-04-28 01:07:33 +00:00
parent 381ec865bc
commit 8c5315ef84
2 changed files with 22 additions and 5 deletions

View File

@ -456,11 +456,8 @@ MDLocalVariable *MDLocalVariable::getImpl(LLVMContext &Context, unsigned Tag,
Metadata *Type, unsigned Arg,
unsigned Flags, StorageType Storage,
bool ShouldCreate) {
// Truncate Arg to 8 bits.
//
// FIXME: This is gross (and should be changed to an assert or removed), but
// it matches historical behaviour for now.
Arg &= (1u << 8) - 1;
// 64K ought to be enough for any frontend.
assert(Arg <= UINT16_MAX && "Expected argument number to fit in 16-bits");
assert(Scope && "Expected scope");
assert(isCanonical(Name) && "Expected canonical MDString");

View File

@ -1849,6 +1849,26 @@ TEST_F(MDLocalVariableTest, get) {
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
}
TEST_F(MDLocalVariableTest, getArg256) {
EXPECT_EQ(255u, MDLocalVariable::get(Context, dwarf::DW_TAG_arg_variable,
getSubprogram(), "", getFile(), 0,
nullptr, 255, 0)
->getArg());
EXPECT_EQ(256u, MDLocalVariable::get(Context, dwarf::DW_TAG_arg_variable,
getSubprogram(), "", getFile(), 0,
nullptr, 256, 0)
->getArg());
EXPECT_EQ(257u, MDLocalVariable::get(Context, dwarf::DW_TAG_arg_variable,
getSubprogram(), "", getFile(), 0,
nullptr, 257, 0)
->getArg());
unsigned Max = UINT16_MAX;
EXPECT_EQ(Max, MDLocalVariable::get(Context, dwarf::DW_TAG_arg_variable,
getSubprogram(), "", getFile(), 0,
nullptr, Max, 0)
->getArg());
}
typedef MetadataTest MDExpressionTest;
TEST_F(MDExpressionTest, get) {