summaryrefslogtreecommitdiff
path: root/unittests/Transforms/Utils/Cloning.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/Transforms/Utils/Cloning.cpp')
-rw-r--r--unittests/Transforms/Utils/Cloning.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/unittests/Transforms/Utils/Cloning.cpp b/unittests/Transforms/Utils/Cloning.cpp
index 72a91d1441748..beb50455f012b 100644
--- a/unittests/Transforms/Utils/Cloning.cpp
+++ b/unittests/Transforms/Utils/Cloning.cpp
@@ -507,6 +507,19 @@ protected:
DINode::FlagZero, false);
F->setSubprogram(Subprogram);
+ // Create and assign DIGlobalVariableExpression to gv
+ auto GVExpression = DBuilder.createGlobalVariableExpression(
+ Subprogram, "gv", "gv", File, 1, DBuilder.createNullPtrType(), false);
+ GV->addDebugInfo(GVExpression);
+
+ // DIGlobalVariableExpression not attached to any global variable
+ auto Expr = DBuilder.createExpression(
+ ArrayRef<uint64_t>{dwarf::DW_OP_constu, 42U, dwarf::DW_OP_stack_value});
+
+ DBuilder.createGlobalVariableExpression(
+ Subprogram, "unattached", "unattached", File, 1,
+ DBuilder.createNullPtrType(), false, Expr);
+
auto *Entry = BasicBlock::Create(C, "", F);
IBuilder.SetInsertPoint(Entry);
IBuilder.CreateRetVoid();
@@ -546,6 +559,52 @@ TEST_F(CloneModule, GlobalMetadata) {
EXPECT_NE(nullptr, NewGV->getMetadata(LLVMContext::MD_type));
}
+TEST_F(CloneModule, GlobalDebugInfo) {
+ GlobalVariable *NewGV = NewM->getGlobalVariable("gv");
+ EXPECT_TRUE(NewGV != nullptr);
+
+ // Find debug info expression assigned to global
+ SmallVector<DIGlobalVariableExpression *, 1> GVs;
+ NewGV->getDebugInfo(GVs);
+ EXPECT_EQ(GVs.size(), 1U);
+
+ DIGlobalVariableExpression *GVExpr = GVs[0];
+ DIGlobalVariable *GV = GVExpr->getVariable();
+ EXPECT_TRUE(GV != nullptr);
+
+ EXPECT_EQ(GV->getName(), "gv");
+ EXPECT_EQ(GV->getLine(), 1U);
+
+ // Assert that the scope of the debug info attached to
+ // global variable matches the cloned function.
+ DISubprogram *SP = NewM->getFunction("f")->getSubprogram();
+ EXPECT_TRUE(SP != nullptr);
+ EXPECT_EQ(GV->getScope(), SP);
+}
+
+TEST_F(CloneModule, CompileUnit) {
+ // Find DICompileUnit listed in llvm.dbg.cu
+ auto *NMD = NewM->getNamedMetadata("llvm.dbg.cu");
+ EXPECT_TRUE(NMD != nullptr);
+ EXPECT_EQ(NMD->getNumOperands(), 1U);
+
+ DICompileUnit *CU = dyn_cast<llvm::DICompileUnit>(NMD->getOperand(0));
+ EXPECT_TRUE(CU != nullptr);
+
+ // Assert this CU is consistent with the cloned function debug info
+ DISubprogram *SP = NewM->getFunction("f")->getSubprogram();
+ EXPECT_TRUE(SP != nullptr);
+ EXPECT_EQ(SP->getUnit(), CU);
+
+ // Check globals listed in CU have the correct scope
+ DIGlobalVariableExpressionArray GlobalArray = CU->getGlobalVariables();
+ EXPECT_EQ(GlobalArray.size(), 2U);
+ for (DIGlobalVariableExpression *GVExpr : GlobalArray) {
+ DIGlobalVariable *GV = GVExpr->getVariable();
+ EXPECT_EQ(GV->getScope(), SP);
+ }
+}
+
TEST_F(CloneModule, Comdat) {
GlobalVariable *NewGV = NewM->getGlobalVariable("gv");
auto *CD = NewGV->getComdat();