EXPECT_FALSE(L->isResolved());
}
+TEST_F(DILocationTest, cloneTemporary) {
+ MDNode *N = MDNode::get(Context, None);
+ auto L = DILocation::getTemporary(Context, 2, 7, N);
+ EXPECT_TRUE(L->isTemporary());
+ auto L2 = L->clone();
+ EXPECT_TRUE(L2->isTemporary());
+}
+
typedef MetadataTest GenericDINodeTest;
TEST_F(GenericDINodeTest, get) {
MDTuple *Subprograms = getTuple();
MDTuple *GlobalVariables = getTuple();
MDTuple *ImportedEntities = getTuple();
- uint64_t DWOId = 0xc0ffee;
+ uint64_t DWOId = 0x10000000c0ffee;
auto *N = DICompileUnit::getDistinct(
Context, SourceLanguage, File, Producer, IsOptimized, Flags,
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
unsigned VirtualIndex = 5;
unsigned Flags = 6;
bool IsOptimized = false;
- llvm::Function *Function = getFunction("foo");
MDTuple *TemplateParams = getTuple();
DISubprogram *Declaration = getSubprogram();
MDTuple *Variables = getTuple();
auto *N = DISubprogram::get(
Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
IsDefinition, ScopeLine, ContainingType, Virtuality, VirtualIndex, Flags,
- IsOptimized, Function, TemplateParams, Declaration, Variables);
+ IsOptimized, TemplateParams, Declaration, Variables);
EXPECT_EQ(dwarf::DW_TAG_subprogram, N->getTag());
EXPECT_EQ(Scope, N->getScope());
EXPECT_EQ(VirtualIndex, N->getVirtualIndex());
EXPECT_EQ(Flags, N->getFlags());
EXPECT_EQ(IsOptimized, N->isOptimized());
- EXPECT_EQ(Function, N->getFunction());
EXPECT_EQ(TemplateParams, N->getTemplateParams().get());
EXPECT_EQ(Declaration, N->getDeclaration());
EXPECT_EQ(Variables, N->getVariables().get());
EXPECT_EQ(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, getCompositeType(), Name, LinkageName,
File, Line, Type, IsLocalToUnit, IsDefinition,
ScopeLine, ContainingType, Virtuality,
- VirtualIndex, Flags, IsOptimized, Function,
+ VirtualIndex, Flags, IsOptimized,
TemplateParams, Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, "other", LinkageName, File,
Line, Type, IsLocalToUnit, IsDefinition,
ScopeLine, ContainingType, Virtuality,
- VirtualIndex, Flags, IsOptimized, Function,
+ VirtualIndex, Flags, IsOptimized,
TemplateParams, Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, "other", File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, getFile(),
Line, Type, IsLocalToUnit, IsDefinition,
ScopeLine, ContainingType, Virtuality,
- VirtualIndex, Flags, IsOptimized, Function,
+ VirtualIndex, Flags, IsOptimized,
TemplateParams, Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File,
Line + 1, Type, IsLocalToUnit, IsDefinition,
ScopeLine, ContainingType, Virtuality,
- VirtualIndex, Flags, IsOptimized, Function,
+ VirtualIndex, Flags, IsOptimized,
+ TemplateParams, Declaration, Variables));
+ EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
+ getSubroutineType(), IsLocalToUnit,
+ IsDefinition, ScopeLine, ContainingType,
+ Virtuality, VirtualIndex, Flags, IsOptimized,
TemplateParams, Declaration, Variables));
- EXPECT_NE(N, DISubprogram::get(
- Context, Scope, Name, LinkageName, File, Line,
- getSubroutineType(), IsLocalToUnit, IsDefinition, ScopeLine,
- ContainingType, Virtuality, VirtualIndex, Flags, IsOptimized,
- Function, TemplateParams, Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, !IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, !IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition,
ScopeLine + 1, ContainingType, Virtuality,
- VirtualIndex, Flags, IsOptimized, Function,
+ VirtualIndex, Flags, IsOptimized,
TemplateParams, Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
getCompositeType(), Virtuality, VirtualIndex,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality + 1, VirtualIndex,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex + 1,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex,
- ~Flags, IsOptimized, Function, TemplateParams,
+ ~Flags, IsOptimized, TemplateParams,
Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex,
- Flags, !IsOptimized, Function, TemplateParams,
- Declaration, Variables));
- EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
- Type, IsLocalToUnit, IsDefinition, ScopeLine,
- ContainingType, Virtuality, VirtualIndex,
- Flags, IsOptimized, getFunction("bar"),
- TemplateParams, Declaration, Variables));
- EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
- Type, IsLocalToUnit, IsDefinition, ScopeLine,
- ContainingType, Virtuality, VirtualIndex,
- Flags, IsOptimized, Function, getTuple(),
+ Flags, !IsOptimized, TemplateParams,
Declaration, Variables));
+ EXPECT_NE(N,
+ DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
+ Type, IsLocalToUnit, IsDefinition, ScopeLine,
+ ContainingType, Virtuality, VirtualIndex, Flags,
+ IsOptimized, getTuple(), Declaration, Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
getSubprogram(), Variables));
EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
Type, IsLocalToUnit, IsDefinition, ScopeLine,
ContainingType, Virtuality, VirtualIndex,
- Flags, IsOptimized, Function, TemplateParams,
+ Flags, IsOptimized, TemplateParams,
Declaration, getTuple()));
TempDISubprogram Temp = N->clone();
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
}
-TEST_F(DISubprogramTest, replaceFunction) {
- DIScopeRef Scope = getCompositeType();
- StringRef Name = "name";
- StringRef LinkageName = "linkage";
- DIFile *File = getFile();
- unsigned Line = 2;
- DISubroutineType *Type = getSubroutineType();
- bool IsLocalToUnit = false;
- bool IsDefinition = true;
- unsigned ScopeLine = 3;
- DITypeRef ContainingType = getCompositeType();
- unsigned Virtuality = 4;
- unsigned VirtualIndex = 5;
- unsigned Flags = 6;
- bool IsOptimized = false;
- MDTuple *TemplateParams = getTuple();
- DISubprogram *Declaration = getSubprogram();
- MDTuple *Variables = getTuple();
-
- auto *N = DISubprogram::get(
- Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit,
- IsDefinition, ScopeLine, ContainingType, Virtuality, VirtualIndex, Flags,
- IsOptimized, nullptr, TemplateParams, Declaration, Variables);
-
- EXPECT_EQ(nullptr, N->getFunction());
-
- std::unique_ptr<Function> F(
- Function::Create(FunctionType::get(Type::getVoidTy(Context), false),
- GlobalValue::ExternalLinkage));
- N->replaceFunction(F.get());
- EXPECT_EQ(F.get(), N->getFunction());
-
- N->replaceFunction(nullptr);
- EXPECT_EQ(nullptr, N->getFunction());
-}
-
typedef MetadataTest DILexicalBlockTest;
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) {
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));
+}
+
}