EXPECT_EQ(nullptr, N->getScope());
EXPECT_EQ(nullptr, N->getFile());
EXPECT_EQ("", N->getName());
- EXPECT_EQ(nullptr, N->getBaseType());
- EXPECT_EQ(nullptr, N->getVTableHolder());
- EXPECT_EQ(nullptr, N->getTemplateParams().get());
- EXPECT_EQ("", N->getIdentifier());
}
typedef MetadataTest DIFileTest;
MDTuple *GlobalVariables = getTuple();
MDTuple *ImportedEntities = getTuple();
uint64_t DWOId = 0xc0ffee;
- auto *N = DICompileUnit::get(
+ auto *N = DICompileUnit::getDistinct(
Context, SourceLanguage, File, Producer, IsOptimized, Flags,
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
RetainedTypes, Subprograms, GlobalVariables, ImportedEntities, DWOId);
EXPECT_EQ(GlobalVariables, N->getGlobalVariables().get());
EXPECT_EQ(ImportedEntities, N->getImportedEntities().get());
EXPECT_EQ(DWOId, N->getDWOId());
- EXPECT_EQ(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
-
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage + 1, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, getFile(), Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, "other",
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- !IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, "other", RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion + 1,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion, "other",
- EmissionKind, EnumTypes, RetainedTypes,
- Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind + 1,
- EnumTypes, RetainedTypes, Subprograms,
- GlobalVariables, ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, getTuple(),
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- getTuple(), Subprograms, GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, getTuple(), GlobalVariables,
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, getTuple(),
- ImportedEntities, DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- getTuple(), DWOId));
- EXPECT_NE(N, DICompileUnit::get(Context, SourceLanguage, File, Producer,
- IsOptimized, Flags, RuntimeVersion,
- SplitDebugFilename, EmissionKind, EnumTypes,
- RetainedTypes, Subprograms, GlobalVariables,
- ImportedEntities, DWOId + 1));
TempDICompileUnit Temp = N->clone();
- EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
+ EXPECT_EQ(dwarf::DW_TAG_compile_unit, Temp->getTag());
+ EXPECT_EQ(SourceLanguage, Temp->getSourceLanguage());
+ EXPECT_EQ(File, Temp->getFile());
+ EXPECT_EQ(Producer, Temp->getProducer());
+ EXPECT_EQ(IsOptimized, Temp->isOptimized());
+ EXPECT_EQ(Flags, Temp->getFlags());
+ EXPECT_EQ(RuntimeVersion, Temp->getRuntimeVersion());
+ EXPECT_EQ(SplitDebugFilename, Temp->getSplitDebugFilename());
+ EXPECT_EQ(EmissionKind, Temp->getEmissionKind());
+ EXPECT_EQ(EnumTypes, Temp->getEnumTypes().get());
+ EXPECT_EQ(RetainedTypes, Temp->getRetainedTypes().get());
+ EXPECT_EQ(Subprograms, Temp->getSubprograms().get());
+ EXPECT_EQ(GlobalVariables, Temp->getGlobalVariables().get());
+ EXPECT_EQ(ImportedEntities, Temp->getImportedEntities().get());
+ EXPECT_EQ(DWOId, Temp->getDWOId());
+
+ auto *TempAddress = Temp.get();
+ auto *Clone = MDNode::replaceWithPermanent(std::move(Temp));
+ EXPECT_TRUE(Clone->isDistinct());
+ EXPECT_EQ(TempAddress, Clone);
}
TEST_F(DICompileUnitTest, replaceArrays) {
MDTuple *RetainedTypes = MDTuple::getDistinct(Context, None);
MDTuple *ImportedEntities = MDTuple::getDistinct(Context, None);
uint64_t DWOId = 0xc0ffee;
- auto *N = DICompileUnit::get(
+ auto *N = DICompileUnit::getDistinct(
Context, SourceLanguage, File, Producer, IsOptimized, Flags,
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
RetainedTypes, nullptr, nullptr, ImportedEntities, DWOId);
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) {
typedef MetadataTest DILocalVariableTest;
TEST_F(DILocalVariableTest, get) {
- unsigned Tag = dwarf::DW_TAG_arg_variable;
DILocalScope *Scope = getSubprogram();
StringRef Name = "name";
DIFile *File = getFile();
unsigned Arg = 6;
unsigned Flags = 7;
- auto *N = DILocalVariable::get(Context, Tag, Scope, Name, File, Line, Type,
- Arg, Flags);
- EXPECT_EQ(Tag, N->getTag());
+ auto *N =
+ DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg, Flags);
+ EXPECT_TRUE(N->isParameter());
EXPECT_EQ(Scope, N->getScope());
EXPECT_EQ(Name, N->getName());
EXPECT_EQ(File, N->getFile());
EXPECT_EQ(Type, N->getType());
EXPECT_EQ(Arg, N->getArg());
EXPECT_EQ(Flags, N->getFlags());
- EXPECT_EQ(N, DILocalVariable::get(Context, Tag, Scope, Name, File, Line, Type,
- Arg, Flags));
+ EXPECT_EQ(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
+ Flags));
- EXPECT_NE(N, DILocalVariable::get(Context, dwarf::DW_TAG_auto_variable, Scope,
- Name, File, Line, Type, Arg, Flags));
- EXPECT_NE(N, DILocalVariable::get(Context, Tag, getSubprogram(), Name, File,
- Line, Type, Arg, Flags));
- EXPECT_NE(N, DILocalVariable::get(Context, Tag, Scope, "other", File, Line,
+ EXPECT_FALSE(
+ DILocalVariable::get(Context, Scope, Name, File, Line, Type, 0, Flags)
+ ->isParameter());
+ EXPECT_NE(N, DILocalVariable::get(Context, getSubprogram(), Name, File, Line,
Type, Arg, Flags));
- EXPECT_NE(N, DILocalVariable::get(Context, Tag, Scope, Name, getFile(), Line,
- Type, Arg, Flags));
- EXPECT_NE(N, DILocalVariable::get(Context, Tag, Scope, Name, File, Line + 1,
- Type, Arg, Flags));
- EXPECT_NE(N, DILocalVariable::get(Context, Tag, Scope, Name, File, Line,
+ EXPECT_NE(N, DILocalVariable::get(Context, Scope, "other", File, Line, Type,
+ Arg, Flags));
+ EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, getFile(), Line, Type,
+ Arg, Flags));
+ EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line + 1, Type,
+ Arg, Flags));
+ EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line,
getDerivedType(), Arg, Flags));
- EXPECT_NE(N, DILocalVariable::get(Context, Tag, Scope, Name, File, Line, Type,
+ EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type,
Arg + 1, Flags));
- EXPECT_NE(N, DILocalVariable::get(Context, Tag, Scope, Name, File, Line, Type,
- Arg, ~Flags));
+ EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
+ ~Flags));
TempDILocalVariable Temp = N->clone();
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
}
TEST_F(DILocalVariableTest, getArg256) {
- EXPECT_EQ(255u, DILocalVariable::get(Context, dwarf::DW_TAG_arg_variable,
- getSubprogram(), "", getFile(), 0,
- nullptr, 255, 0)
+ EXPECT_EQ(255u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
+ 0, nullptr, 255, 0)
->getArg());
- EXPECT_EQ(256u, DILocalVariable::get(Context, dwarf::DW_TAG_arg_variable,
- getSubprogram(), "", getFile(), 0,
- nullptr, 256, 0)
+ EXPECT_EQ(256u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
+ 0, nullptr, 256, 0)
->getArg());
- EXPECT_EQ(257u, DILocalVariable::get(Context, dwarf::DW_TAG_arg_variable,
- getSubprogram(), "", getFile(), 0,
- nullptr, 257, 0)
+ EXPECT_EQ(257u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
+ 0, nullptr, 257, 0)
->getArg());
unsigned Max = UINT16_MAX;
- EXPECT_EQ(Max, DILocalVariable::get(Context, dwarf::DW_TAG_arg_variable,
- getSubprogram(), "", getFile(), 0,
- nullptr, Max, 0)
+ EXPECT_EQ(Max, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
+ 0, nullptr, Max, 0)
->getArg());
}
EXPECT_EQ(12304u, *F->getEntryCount());
}
+TEST_F(FunctionAttachmentTest, SubprogramAttachment) {
+ Function *F = getFunction("foo");
+ DISubprogram *SP = getSubprogram();
+ F->setSubprogram(SP);
+
+ // Note that the static_cast confirms that F->getSubprogram() actually
+ // returns an DISubprogram.
+ EXPECT_EQ(SP, static_cast<DISubprogram *>(F->getSubprogram()));
+ EXPECT_EQ(SP, F->getMetadata("dbg"));
+ EXPECT_EQ(SP, F->getMetadata(LLVMContext::MD_dbg));
+}
+
}