@@ -507,6 +507,19 @@ class CloneModule : public ::testing::Test {
507
507
DINode::FlagZero, false );
508
508
F->setSubprogram (Subprogram);
509
509
510
+ // Create and assign DIGlobalVariableExpression to gv
511
+ auto GVExpression = DBuilder.createGlobalVariableExpression (
512
+ Subprogram, " gv" , " gv" , File, 1 , DBuilder.createNullPtrType (), false );
513
+ GV->addDebugInfo (GVExpression);
514
+
515
+ // DIGlobalVariableExpression not attached to any global variable
516
+ auto Expr = DBuilder.createExpression (
517
+ ArrayRef<uint64_t >{dwarf::DW_OP_constu, 42U , dwarf::DW_OP_stack_value});
518
+
519
+ DBuilder.createGlobalVariableExpression (
520
+ Subprogram, " unattached" , " unattached" , File, 1 ,
521
+ DBuilder.createNullPtrType (), false , Expr);
522
+
510
523
auto *Entry = BasicBlock::Create (C, " " , F);
511
524
IBuilder.SetInsertPoint (Entry);
512
525
IBuilder.CreateRetVoid ();
@@ -546,6 +559,52 @@ TEST_F(CloneModule, GlobalMetadata) {
546
559
EXPECT_NE (nullptr , NewGV->getMetadata (LLVMContext::MD_type));
547
560
}
548
561
562
+ TEST_F (CloneModule, GlobalDebugInfo) {
563
+ GlobalVariable *NewGV = NewM->getGlobalVariable (" gv" );
564
+ EXPECT_TRUE (NewGV != nullptr );
565
+
566
+ // Find debug info expression assigned to global
567
+ SmallVector<DIGlobalVariableExpression *, 1 > GVs;
568
+ NewGV->getDebugInfo (GVs);
569
+ EXPECT_EQ (GVs.size (), 1U );
570
+
571
+ DIGlobalVariableExpression *GVExpr = GVs[0 ];
572
+ DIGlobalVariable *GV = GVExpr->getVariable ();
573
+ EXPECT_TRUE (GV != nullptr );
574
+
575
+ EXPECT_EQ (GV->getName (), " gv" );
576
+ EXPECT_EQ (GV->getLine (), 1U );
577
+
578
+ // Assert that the scope of the debug info attached to
579
+ // global variable matches the cloned function.
580
+ DISubprogram *SP = NewM->getFunction (" f" )->getSubprogram ();
581
+ EXPECT_TRUE (SP != nullptr );
582
+ EXPECT_EQ (GV->getScope (), SP);
583
+ }
584
+
585
+ TEST_F (CloneModule, CompileUnit) {
586
+ // Find DICompileUnit listed in llvm.dbg.cu
587
+ auto *NMD = NewM->getNamedMetadata (" llvm.dbg.cu" );
588
+ EXPECT_TRUE (NMD != nullptr );
589
+ EXPECT_EQ (NMD->getNumOperands (), 1U );
590
+
591
+ DICompileUnit *CU = dyn_cast<llvm::DICompileUnit>(NMD->getOperand (0 ));
592
+ EXPECT_TRUE (CU != nullptr );
593
+
594
+ // Assert this CU is consistent with the cloned function debug info
595
+ DISubprogram *SP = NewM->getFunction (" f" )->getSubprogram ();
596
+ EXPECT_TRUE (SP != nullptr );
597
+ EXPECT_EQ (SP->getUnit (), CU);
598
+
599
+ // Check globals listed in CU have the correct scope
600
+ DIGlobalVariableExpressionArray GlobalArray = CU->getGlobalVariables ();
601
+ EXPECT_EQ (GlobalArray.size (), 2U );
602
+ for (DIGlobalVariableExpression *GVExpr : GlobalArray) {
603
+ DIGlobalVariable *GV = GVExpr->getVariable ();
604
+ EXPECT_EQ (GV->getScope (), SP);
605
+ }
606
+ }
607
+
549
608
TEST_F (CloneModule, Comdat) {
550
609
GlobalVariable *NewGV = NewM->getGlobalVariable (" gv" );
551
610
auto *CD = NewGV->getComdat ();
0 commit comments