1 //===- unittests/IR/MetadataTest.cpp - Metadata unit tests ----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/IR/Metadata.h" 10 #include "llvm/ADT/DenseMap.h" 11 #include "llvm/ADT/STLExtras.h" 12 #include "llvm/IR/Constants.h" 13 #include "llvm/IR/DIBuilder.h" 14 #include "llvm/IR/DebugInfo.h" 15 #include "llvm/IR/DebugInfoMetadata.h" 16 #include "llvm/IR/Function.h" 17 #include "llvm/IR/Instructions.h" 18 #include "llvm/IR/LLVMContext.h" 19 #include "llvm/IR/Module.h" 20 #include "llvm/IR/ModuleSlotTracker.h" 21 #include "llvm/IR/Type.h" 22 #include "llvm/IR/Verifier.h" 23 #include "llvm/Support/raw_ostream.h" 24 #include "gtest/gtest.h" 25 using namespace llvm; 26 27 namespace { 28 29 TEST(ContextAndReplaceableUsesTest, FromContext) { 30 LLVMContext Context; 31 ContextAndReplaceableUses CRU(Context); 32 EXPECT_EQ(&Context, &CRU.getContext()); 33 EXPECT_FALSE(CRU.hasReplaceableUses()); 34 EXPECT_FALSE(CRU.getReplaceableUses()); 35 } 36 37 TEST(ContextAndReplaceableUsesTest, FromReplaceableUses) { 38 LLVMContext Context; 39 ContextAndReplaceableUses CRU(std::make_unique<ReplaceableMetadataImpl>(Context)); 40 EXPECT_EQ(&Context, &CRU.getContext()); 41 EXPECT_TRUE(CRU.hasReplaceableUses()); 42 EXPECT_TRUE(CRU.getReplaceableUses()); 43 } 44 45 TEST(ContextAndReplaceableUsesTest, makeReplaceable) { 46 LLVMContext Context; 47 ContextAndReplaceableUses CRU(Context); 48 CRU.makeReplaceable(std::make_unique<ReplaceableMetadataImpl>(Context)); 49 EXPECT_EQ(&Context, &CRU.getContext()); 50 EXPECT_TRUE(CRU.hasReplaceableUses()); 51 EXPECT_TRUE(CRU.getReplaceableUses()); 52 } 53 54 TEST(ContextAndReplaceableUsesTest, takeReplaceableUses) { 55 LLVMContext Context; 56 auto ReplaceableUses = std::make_unique<ReplaceableMetadataImpl>(Context); 57 auto *Ptr = ReplaceableUses.get(); 58 ContextAndReplaceableUses CRU(std::move(ReplaceableUses)); 59 ReplaceableUses = CRU.takeReplaceableUses(); 60 EXPECT_EQ(&Context, &CRU.getContext()); 61 EXPECT_FALSE(CRU.hasReplaceableUses()); 62 EXPECT_FALSE(CRU.getReplaceableUses()); 63 EXPECT_EQ(Ptr, ReplaceableUses.get()); 64 } 65 66 class MetadataTest : public testing::Test { 67 public: 68 MetadataTest() : M("test", Context), Counter(0) {} 69 70 protected: 71 LLVMContext Context; 72 Module M; 73 int Counter; 74 75 MDNode *getNode() { return MDNode::get(Context, None); } 76 MDNode *getNode(Metadata *MD) { return MDNode::get(Context, MD); } 77 MDNode *getNode(Metadata *MD1, Metadata *MD2) { 78 Metadata *MDs[] = {MD1, MD2}; 79 return MDNode::get(Context, MDs); 80 } 81 82 MDTuple *getTuple() { return MDTuple::getDistinct(Context, None); } 83 DISubroutineType *getSubroutineType() { 84 return DISubroutineType::getDistinct(Context, DINode::FlagZero, 0, 85 getNode(nullptr)); 86 } 87 DISubprogram *getSubprogram() { 88 return DISubprogram::getDistinct( 89 Context, nullptr, "", "", nullptr, 0, nullptr, 0, nullptr, 0, 0, 90 DINode::FlagZero, DISubprogram::SPFlagZero, nullptr); 91 } 92 DIFile *getFile() { 93 return DIFile::getDistinct(Context, "file.c", "/path/to/dir"); 94 } 95 DICompileUnit *getUnit() { 96 return DICompileUnit::getDistinct( 97 Context, 1, getFile(), "clang", false, "-g", 2, "", 98 DICompileUnit::FullDebug, getTuple(), getTuple(), getTuple(), 99 getTuple(), getTuple(), 0, true, false, 100 DICompileUnit::DebugNameTableKind::Default, false, "/", ""); 101 } 102 DIType *getBasicType(StringRef Name) { 103 return DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, Name); 104 } 105 DIType *getDerivedType() { 106 return DIDerivedType::getDistinct( 107 Context, dwarf::DW_TAG_pointer_type, "", nullptr, 0, nullptr, 108 getBasicType("basictype"), 1, 2, 0, None, DINode::FlagZero); 109 } 110 Constant *getConstant() { 111 return ConstantInt::get(Type::getInt32Ty(Context), Counter++); 112 } 113 ConstantAsMetadata *getConstantAsMetadata() { 114 return ConstantAsMetadata::get(getConstant()); 115 } 116 DIType *getCompositeType() { 117 return DICompositeType::getDistinct( 118 Context, dwarf::DW_TAG_structure_type, "", nullptr, 0, nullptr, nullptr, 119 32, 32, 0, DINode::FlagZero, nullptr, 0, nullptr, nullptr, ""); 120 } 121 Function *getFunction(StringRef Name) { 122 return Function::Create( 123 FunctionType::get(Type::getVoidTy(Context), None, false), 124 Function::ExternalLinkage, Name, M); 125 } 126 }; 127 typedef MetadataTest MDStringTest; 128 129 // Test that construction of MDString with different value produces different 130 // MDString objects, even with the same string pointer and nulls in the string. 131 TEST_F(MDStringTest, CreateDifferent) { 132 char x[3] = { 'f', 0, 'A' }; 133 MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); 134 x[2] = 'B'; 135 MDString *s2 = MDString::get(Context, StringRef(&x[0], 3)); 136 EXPECT_NE(s1, s2); 137 } 138 139 // Test that creation of MDStrings with the same string contents produces the 140 // same MDString object, even with different pointers. 141 TEST_F(MDStringTest, CreateSame) { 142 char x[4] = { 'a', 'b', 'c', 'X' }; 143 char y[4] = { 'a', 'b', 'c', 'Y' }; 144 145 MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); 146 MDString *s2 = MDString::get(Context, StringRef(&y[0], 3)); 147 EXPECT_EQ(s1, s2); 148 } 149 150 // Test that MDString prints out the string we fed it. 151 TEST_F(MDStringTest, PrintingSimple) { 152 char str[14] = "testing 1 2 3"; 153 MDString *s = MDString::get(Context, StringRef(&str[0], 13)); 154 strncpy(str, "aaaaaaaaaaaaa", 14); 155 156 std::string Str; 157 raw_string_ostream oss(Str); 158 s->print(oss); 159 EXPECT_STREQ("!\"testing 1 2 3\"", oss.str().c_str()); 160 } 161 162 // Test printing of MDString with non-printable characters. 163 TEST_F(MDStringTest, PrintingComplex) { 164 char str[5] = {0, '\n', '"', '\\', (char)-1}; 165 MDString *s = MDString::get(Context, StringRef(str+0, 5)); 166 std::string Str; 167 raw_string_ostream oss(Str); 168 s->print(oss); 169 EXPECT_STREQ("!\"\\00\\0A\\22\\\\\\FF\"", oss.str().c_str()); 170 } 171 172 typedef MetadataTest MDNodeTest; 173 174 // Test the two constructors, and containing other Constants. 175 TEST_F(MDNodeTest, Simple) { 176 char x[3] = { 'a', 'b', 'c' }; 177 char y[3] = { '1', '2', '3' }; 178 179 MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); 180 MDString *s2 = MDString::get(Context, StringRef(&y[0], 3)); 181 ConstantAsMetadata *CI = 182 ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0))); 183 184 std::vector<Metadata *> V; 185 V.push_back(s1); 186 V.push_back(CI); 187 V.push_back(s2); 188 189 MDNode *n1 = MDNode::get(Context, V); 190 Metadata *const c1 = n1; 191 MDNode *n2 = MDNode::get(Context, c1); 192 Metadata *const c2 = n2; 193 MDNode *n3 = MDNode::get(Context, V); 194 MDNode *n4 = MDNode::getIfExists(Context, V); 195 MDNode *n5 = MDNode::getIfExists(Context, c1); 196 MDNode *n6 = MDNode::getIfExists(Context, c2); 197 EXPECT_NE(n1, n2); 198 EXPECT_EQ(n1, n3); 199 EXPECT_EQ(n4, n1); 200 EXPECT_EQ(n5, n2); 201 EXPECT_EQ(n6, (Metadata *)nullptr); 202 203 EXPECT_EQ(3u, n1->getNumOperands()); 204 EXPECT_EQ(s1, n1->getOperand(0)); 205 EXPECT_EQ(CI, n1->getOperand(1)); 206 EXPECT_EQ(s2, n1->getOperand(2)); 207 208 EXPECT_EQ(1u, n2->getNumOperands()); 209 EXPECT_EQ(n1, n2->getOperand(0)); 210 } 211 212 TEST_F(MDNodeTest, Delete) { 213 Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 1); 214 Instruction *I = new BitCastInst(C, Type::getInt32Ty(Context)); 215 216 Metadata *const V = LocalAsMetadata::get(I); 217 MDNode *n = MDNode::get(Context, V); 218 TrackingMDRef wvh(n); 219 220 EXPECT_EQ(n, wvh); 221 222 I->deleteValue(); 223 } 224 225 TEST_F(MDNodeTest, SelfReference) { 226 // !0 = !{!0} 227 // !1 = !{!0} 228 { 229 auto Temp = MDNode::getTemporary(Context, None); 230 Metadata *Args[] = {Temp.get()}; 231 MDNode *Self = MDNode::get(Context, Args); 232 Self->replaceOperandWith(0, Self); 233 ASSERT_EQ(Self, Self->getOperand(0)); 234 235 // Self-references should be distinct, so MDNode::get() should grab a 236 // uniqued node that references Self, not Self. 237 Args[0] = Self; 238 MDNode *Ref1 = MDNode::get(Context, Args); 239 MDNode *Ref2 = MDNode::get(Context, Args); 240 EXPECT_NE(Self, Ref1); 241 EXPECT_EQ(Ref1, Ref2); 242 } 243 244 // !0 = !{!0, !{}} 245 // !1 = !{!0, !{}} 246 { 247 auto Temp = MDNode::getTemporary(Context, None); 248 Metadata *Args[] = {Temp.get(), MDNode::get(Context, None)}; 249 MDNode *Self = MDNode::get(Context, Args); 250 Self->replaceOperandWith(0, Self); 251 ASSERT_EQ(Self, Self->getOperand(0)); 252 253 // Self-references should be distinct, so MDNode::get() should grab a 254 // uniqued node that references Self, not Self itself. 255 Args[0] = Self; 256 MDNode *Ref1 = MDNode::get(Context, Args); 257 MDNode *Ref2 = MDNode::get(Context, Args); 258 EXPECT_NE(Self, Ref1); 259 EXPECT_EQ(Ref1, Ref2); 260 } 261 } 262 263 TEST_F(MDNodeTest, Print) { 264 Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 7); 265 MDString *S = MDString::get(Context, "foo"); 266 MDNode *N0 = getNode(); 267 MDNode *N1 = getNode(N0); 268 MDNode *N2 = getNode(N0, N1); 269 270 Metadata *Args[] = {ConstantAsMetadata::get(C), S, nullptr, N0, N1, N2}; 271 MDNode *N = MDNode::get(Context, Args); 272 273 std::string Expected; 274 { 275 raw_string_ostream OS(Expected); 276 OS << "<" << (void *)N << "> = !{"; 277 C->printAsOperand(OS); 278 OS << ", "; 279 S->printAsOperand(OS); 280 OS << ", null"; 281 MDNode *Nodes[] = {N0, N1, N2}; 282 for (auto *Node : Nodes) 283 OS << ", <" << (void *)Node << ">"; 284 OS << "}"; 285 } 286 287 std::string Actual; 288 { 289 raw_string_ostream OS(Actual); 290 N->print(OS); 291 } 292 293 EXPECT_EQ(Expected, Actual); 294 } 295 296 #define EXPECT_PRINTER_EQ(EXPECTED, PRINT) \ 297 do { \ 298 std::string Actual_; \ 299 raw_string_ostream OS(Actual_); \ 300 PRINT; \ 301 OS.flush(); \ 302 std::string Expected_(EXPECTED); \ 303 EXPECT_EQ(Expected_, Actual_); \ 304 } while (false) 305 306 TEST_F(MDNodeTest, PrintTemporary) { 307 MDNode *Arg = getNode(); 308 TempMDNode Temp = MDNode::getTemporary(Context, Arg); 309 MDNode *N = getNode(Temp.get()); 310 Module M("test", Context); 311 NamedMDNode *NMD = M.getOrInsertNamedMetadata("named"); 312 NMD->addOperand(N); 313 314 EXPECT_PRINTER_EQ("!0 = !{!1}", N->print(OS, &M)); 315 EXPECT_PRINTER_EQ("!1 = <temporary!> !{!2}", Temp->print(OS, &M)); 316 EXPECT_PRINTER_EQ("!2 = !{}", Arg->print(OS, &M)); 317 318 // Cleanup. 319 Temp->replaceAllUsesWith(Arg); 320 } 321 322 TEST_F(MDNodeTest, PrintFromModule) { 323 Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 7); 324 MDString *S = MDString::get(Context, "foo"); 325 MDNode *N0 = getNode(); 326 MDNode *N1 = getNode(N0); 327 MDNode *N2 = getNode(N0, N1); 328 329 Metadata *Args[] = {ConstantAsMetadata::get(C), S, nullptr, N0, N1, N2}; 330 MDNode *N = MDNode::get(Context, Args); 331 Module M("test", Context); 332 NamedMDNode *NMD = M.getOrInsertNamedMetadata("named"); 333 NMD->addOperand(N); 334 335 std::string Expected; 336 { 337 raw_string_ostream OS(Expected); 338 OS << "!0 = !{"; 339 C->printAsOperand(OS); 340 OS << ", "; 341 S->printAsOperand(OS); 342 OS << ", null, !1, !2, !3}"; 343 } 344 345 EXPECT_PRINTER_EQ(Expected, N->print(OS, &M)); 346 } 347 348 TEST_F(MDNodeTest, PrintFromFunction) { 349 Module M("test", Context); 350 auto *FTy = FunctionType::get(Type::getVoidTy(Context), false); 351 auto *F0 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F0", &M); 352 auto *F1 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F1", &M); 353 auto *BB0 = BasicBlock::Create(Context, "entry", F0); 354 auto *BB1 = BasicBlock::Create(Context, "entry", F1); 355 auto *R0 = ReturnInst::Create(Context, BB0); 356 auto *R1 = ReturnInst::Create(Context, BB1); 357 auto *N0 = MDNode::getDistinct(Context, None); 358 auto *N1 = MDNode::getDistinct(Context, None); 359 R0->setMetadata("md", N0); 360 R1->setMetadata("md", N1); 361 362 EXPECT_PRINTER_EQ("!0 = distinct !{}", N0->print(OS, &M)); 363 EXPECT_PRINTER_EQ("!1 = distinct !{}", N1->print(OS, &M)); 364 365 ModuleSlotTracker MST(&M); 366 EXPECT_PRINTER_EQ("!0 = distinct !{}", N0->print(OS, MST)); 367 EXPECT_PRINTER_EQ("!1 = distinct !{}", N1->print(OS, MST)); 368 } 369 370 TEST_F(MDNodeTest, PrintFromMetadataAsValue) { 371 Module M("test", Context); 372 373 auto *Intrinsic = 374 Function::Create(FunctionType::get(Type::getVoidTy(Context), 375 Type::getMetadataTy(Context), false), 376 GlobalValue::ExternalLinkage, "llvm.intrinsic", &M); 377 378 auto *FTy = FunctionType::get(Type::getVoidTy(Context), false); 379 auto *F0 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F0", &M); 380 auto *F1 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F1", &M); 381 auto *BB0 = BasicBlock::Create(Context, "entry", F0); 382 auto *BB1 = BasicBlock::Create(Context, "entry", F1); 383 auto *N0 = MDNode::getDistinct(Context, None); 384 auto *N1 = MDNode::getDistinct(Context, None); 385 auto *MAV0 = MetadataAsValue::get(Context, N0); 386 auto *MAV1 = MetadataAsValue::get(Context, N1); 387 CallInst::Create(Intrinsic, MAV0, "", BB0); 388 CallInst::Create(Intrinsic, MAV1, "", BB1); 389 390 EXPECT_PRINTER_EQ("!0 = distinct !{}", MAV0->print(OS)); 391 EXPECT_PRINTER_EQ("!1 = distinct !{}", MAV1->print(OS)); 392 EXPECT_PRINTER_EQ("!0", MAV0->printAsOperand(OS, false)); 393 EXPECT_PRINTER_EQ("!1", MAV1->printAsOperand(OS, false)); 394 EXPECT_PRINTER_EQ("metadata !0", MAV0->printAsOperand(OS, true)); 395 EXPECT_PRINTER_EQ("metadata !1", MAV1->printAsOperand(OS, true)); 396 397 ModuleSlotTracker MST(&M); 398 EXPECT_PRINTER_EQ("!0 = distinct !{}", MAV0->print(OS, MST)); 399 EXPECT_PRINTER_EQ("!1 = distinct !{}", MAV1->print(OS, MST)); 400 EXPECT_PRINTER_EQ("!0", MAV0->printAsOperand(OS, false, MST)); 401 EXPECT_PRINTER_EQ("!1", MAV1->printAsOperand(OS, false, MST)); 402 EXPECT_PRINTER_EQ("metadata !0", MAV0->printAsOperand(OS, true, MST)); 403 EXPECT_PRINTER_EQ("metadata !1", MAV1->printAsOperand(OS, true, MST)); 404 } 405 406 TEST_F(MDNodeTest, PrintWithDroppedCallOperand) { 407 Module M("test", Context); 408 409 auto *FTy = FunctionType::get(Type::getVoidTy(Context), false); 410 auto *F0 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F0", &M); 411 auto *F1 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F1", &M); 412 auto *BB0 = BasicBlock::Create(Context, "entry", F0); 413 414 CallInst *CI0 = CallInst::Create(F1, "", BB0); 415 CI0->dropAllReferences(); 416 417 auto *R0 = ReturnInst::Create(Context, BB0); 418 auto *N0 = MDNode::getDistinct(Context, None); 419 R0->setMetadata("md", N0); 420 421 // Printing the metadata node would previously result in a failed assertion 422 // due to the call instruction's dropped function operand. 423 ModuleSlotTracker MST(&M); 424 EXPECT_PRINTER_EQ("!0 = distinct !{}", N0->print(OS, MST)); 425 } 426 #undef EXPECT_PRINTER_EQ 427 428 TEST_F(MDNodeTest, NullOperand) { 429 // metadata !{} 430 MDNode *Empty = MDNode::get(Context, None); 431 432 // metadata !{metadata !{}} 433 Metadata *Ops[] = {Empty}; 434 MDNode *N = MDNode::get(Context, Ops); 435 ASSERT_EQ(Empty, N->getOperand(0)); 436 437 // metadata !{metadata !{}} => metadata !{null} 438 N->replaceOperandWith(0, nullptr); 439 ASSERT_EQ(nullptr, N->getOperand(0)); 440 441 // metadata !{null} 442 Ops[0] = nullptr; 443 MDNode *NullOp = MDNode::get(Context, Ops); 444 ASSERT_EQ(nullptr, NullOp->getOperand(0)); 445 EXPECT_EQ(N, NullOp); 446 } 447 448 TEST_F(MDNodeTest, DistinctOnUniquingCollision) { 449 // !{} 450 MDNode *Empty = MDNode::get(Context, None); 451 ASSERT_TRUE(Empty->isResolved()); 452 EXPECT_FALSE(Empty->isDistinct()); 453 454 // !{!{}} 455 Metadata *Wrapped1Ops[] = {Empty}; 456 MDNode *Wrapped1 = MDNode::get(Context, Wrapped1Ops); 457 ASSERT_EQ(Empty, Wrapped1->getOperand(0)); 458 ASSERT_TRUE(Wrapped1->isResolved()); 459 EXPECT_FALSE(Wrapped1->isDistinct()); 460 461 // !{!{!{}}} 462 Metadata *Wrapped2Ops[] = {Wrapped1}; 463 MDNode *Wrapped2 = MDNode::get(Context, Wrapped2Ops); 464 ASSERT_EQ(Wrapped1, Wrapped2->getOperand(0)); 465 ASSERT_TRUE(Wrapped2->isResolved()); 466 EXPECT_FALSE(Wrapped2->isDistinct()); 467 468 // !{!{!{}}} => !{!{}} 469 Wrapped2->replaceOperandWith(0, Empty); 470 ASSERT_EQ(Empty, Wrapped2->getOperand(0)); 471 EXPECT_TRUE(Wrapped2->isDistinct()); 472 EXPECT_FALSE(Wrapped1->isDistinct()); 473 } 474 475 TEST_F(MDNodeTest, UniquedOnDeletedOperand) { 476 // temp !{} 477 TempMDTuple T = MDTuple::getTemporary(Context, None); 478 479 // !{temp !{}} 480 Metadata *Ops[] = {T.get()}; 481 MDTuple *N = MDTuple::get(Context, Ops); 482 483 // !{temp !{}} => !{null} 484 T.reset(); 485 ASSERT_TRUE(N->isUniqued()); 486 Metadata *NullOps[] = {nullptr}; 487 ASSERT_EQ(N, MDTuple::get(Context, NullOps)); 488 } 489 490 TEST_F(MDNodeTest, DistinctOnDeletedValueOperand) { 491 // i1* @GV 492 Type *Ty = Type::getInt1PtrTy(Context); 493 std::unique_ptr<GlobalVariable> GV( 494 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 495 ConstantAsMetadata *Op = ConstantAsMetadata::get(GV.get()); 496 497 // !{i1* @GV} 498 Metadata *Ops[] = {Op}; 499 MDTuple *N = MDTuple::get(Context, Ops); 500 501 // !{i1* @GV} => !{null} 502 GV.reset(); 503 ASSERT_TRUE(N->isDistinct()); 504 ASSERT_EQ(nullptr, N->getOperand(0)); 505 Metadata *NullOps[] = {nullptr}; 506 ASSERT_NE(N, MDTuple::get(Context, NullOps)); 507 } 508 509 TEST_F(MDNodeTest, getDistinct) { 510 // !{} 511 MDNode *Empty = MDNode::get(Context, None); 512 ASSERT_TRUE(Empty->isResolved()); 513 ASSERT_FALSE(Empty->isDistinct()); 514 ASSERT_EQ(Empty, MDNode::get(Context, None)); 515 516 // distinct !{} 517 MDNode *Distinct1 = MDNode::getDistinct(Context, None); 518 MDNode *Distinct2 = MDNode::getDistinct(Context, None); 519 EXPECT_TRUE(Distinct1->isResolved()); 520 EXPECT_TRUE(Distinct2->isDistinct()); 521 EXPECT_NE(Empty, Distinct1); 522 EXPECT_NE(Empty, Distinct2); 523 EXPECT_NE(Distinct1, Distinct2); 524 525 // !{} 526 ASSERT_EQ(Empty, MDNode::get(Context, None)); 527 } 528 529 TEST_F(MDNodeTest, isUniqued) { 530 MDNode *U = MDTuple::get(Context, None); 531 MDNode *D = MDTuple::getDistinct(Context, None); 532 auto T = MDTuple::getTemporary(Context, None); 533 EXPECT_TRUE(U->isUniqued()); 534 EXPECT_FALSE(D->isUniqued()); 535 EXPECT_FALSE(T->isUniqued()); 536 } 537 538 TEST_F(MDNodeTest, isDistinct) { 539 MDNode *U = MDTuple::get(Context, None); 540 MDNode *D = MDTuple::getDistinct(Context, None); 541 auto T = MDTuple::getTemporary(Context, None); 542 EXPECT_FALSE(U->isDistinct()); 543 EXPECT_TRUE(D->isDistinct()); 544 EXPECT_FALSE(T->isDistinct()); 545 } 546 547 TEST_F(MDNodeTest, isTemporary) { 548 MDNode *U = MDTuple::get(Context, None); 549 MDNode *D = MDTuple::getDistinct(Context, None); 550 auto T = MDTuple::getTemporary(Context, None); 551 EXPECT_FALSE(U->isTemporary()); 552 EXPECT_FALSE(D->isTemporary()); 553 EXPECT_TRUE(T->isTemporary()); 554 } 555 556 TEST_F(MDNodeTest, getDistinctWithUnresolvedOperands) { 557 // temporary !{} 558 auto Temp = MDTuple::getTemporary(Context, None); 559 ASSERT_FALSE(Temp->isResolved()); 560 561 // distinct !{temporary !{}} 562 Metadata *Ops[] = {Temp.get()}; 563 MDNode *Distinct = MDNode::getDistinct(Context, Ops); 564 EXPECT_TRUE(Distinct->isResolved()); 565 EXPECT_EQ(Temp.get(), Distinct->getOperand(0)); 566 567 // temporary !{} => !{} 568 MDNode *Empty = MDNode::get(Context, None); 569 Temp->replaceAllUsesWith(Empty); 570 EXPECT_EQ(Empty, Distinct->getOperand(0)); 571 } 572 573 TEST_F(MDNodeTest, handleChangedOperandRecursion) { 574 // !0 = !{} 575 MDNode *N0 = MDNode::get(Context, None); 576 577 // !1 = !{!3, null} 578 auto Temp3 = MDTuple::getTemporary(Context, None); 579 Metadata *Ops1[] = {Temp3.get(), nullptr}; 580 MDNode *N1 = MDNode::get(Context, Ops1); 581 582 // !2 = !{!3, !0} 583 Metadata *Ops2[] = {Temp3.get(), N0}; 584 MDNode *N2 = MDNode::get(Context, Ops2); 585 586 // !3 = !{!2} 587 Metadata *Ops3[] = {N2}; 588 MDNode *N3 = MDNode::get(Context, Ops3); 589 Temp3->replaceAllUsesWith(N3); 590 591 // !4 = !{!1} 592 Metadata *Ops4[] = {N1}; 593 MDNode *N4 = MDNode::get(Context, Ops4); 594 595 // Confirm that the cycle prevented RAUW from getting dropped. 596 EXPECT_TRUE(N0->isResolved()); 597 EXPECT_FALSE(N1->isResolved()); 598 EXPECT_FALSE(N2->isResolved()); 599 EXPECT_FALSE(N3->isResolved()); 600 EXPECT_FALSE(N4->isResolved()); 601 602 // Create a couple of distinct nodes to observe what's going on. 603 // 604 // !5 = distinct !{!2} 605 // !6 = distinct !{!3} 606 Metadata *Ops5[] = {N2}; 607 MDNode *N5 = MDNode::getDistinct(Context, Ops5); 608 Metadata *Ops6[] = {N3}; 609 MDNode *N6 = MDNode::getDistinct(Context, Ops6); 610 611 // Mutate !2 to look like !1, causing a uniquing collision (and an RAUW). 612 // This will ripple up, with !3 colliding with !4, and RAUWing. Since !2 613 // references !3, this can cause a re-entry of handleChangedOperand() when !3 614 // is not ready for it. 615 // 616 // !2->replaceOperandWith(1, nullptr) 617 // !2: !{!3, !0} => !{!3, null} 618 // !2->replaceAllUsesWith(!1) 619 // !3: !{!2] => !{!1} 620 // !3->replaceAllUsesWith(!4) 621 N2->replaceOperandWith(1, nullptr); 622 623 // If all has gone well, N2 and N3 will have been RAUW'ed and deleted from 624 // under us. Just check that the other nodes are sane. 625 // 626 // !1 = !{!4, null} 627 // !4 = !{!1} 628 // !5 = distinct !{!1} 629 // !6 = distinct !{!4} 630 EXPECT_EQ(N4, N1->getOperand(0)); 631 EXPECT_EQ(N1, N4->getOperand(0)); 632 EXPECT_EQ(N1, N5->getOperand(0)); 633 EXPECT_EQ(N4, N6->getOperand(0)); 634 } 635 636 TEST_F(MDNodeTest, replaceResolvedOperand) { 637 // Check code for replacing one resolved operand with another. If doing this 638 // directly (via replaceOperandWith()) becomes illegal, change the operand to 639 // a global value that gets RAUW'ed. 640 // 641 // Use a temporary node to keep N from being resolved. 642 auto Temp = MDTuple::getTemporary(Context, None); 643 Metadata *Ops[] = {nullptr, Temp.get()}; 644 645 MDNode *Empty = MDTuple::get(Context, ArrayRef<Metadata *>()); 646 MDNode *N = MDTuple::get(Context, Ops); 647 EXPECT_EQ(nullptr, N->getOperand(0)); 648 ASSERT_FALSE(N->isResolved()); 649 650 // Check code for replacing resolved nodes. 651 N->replaceOperandWith(0, Empty); 652 EXPECT_EQ(Empty, N->getOperand(0)); 653 654 // Check code for adding another unresolved operand. 655 N->replaceOperandWith(0, Temp.get()); 656 EXPECT_EQ(Temp.get(), N->getOperand(0)); 657 658 // Remove the references to Temp; required for teardown. 659 Temp->replaceAllUsesWith(nullptr); 660 } 661 662 TEST_F(MDNodeTest, replaceWithUniqued) { 663 auto *Empty = MDTuple::get(Context, None); 664 MDTuple *FirstUniqued; 665 { 666 Metadata *Ops[] = {Empty}; 667 auto Temp = MDTuple::getTemporary(Context, Ops); 668 EXPECT_TRUE(Temp->isTemporary()); 669 670 // Don't expect a collision. 671 auto *Current = Temp.get(); 672 FirstUniqued = MDNode::replaceWithUniqued(std::move(Temp)); 673 EXPECT_TRUE(FirstUniqued->isUniqued()); 674 EXPECT_TRUE(FirstUniqued->isResolved()); 675 EXPECT_EQ(Current, FirstUniqued); 676 } 677 { 678 Metadata *Ops[] = {Empty}; 679 auto Temp = MDTuple::getTemporary(Context, Ops); 680 EXPECT_TRUE(Temp->isTemporary()); 681 682 // Should collide with Uniqued above this time. 683 auto *Uniqued = MDNode::replaceWithUniqued(std::move(Temp)); 684 EXPECT_TRUE(Uniqued->isUniqued()); 685 EXPECT_TRUE(Uniqued->isResolved()); 686 EXPECT_EQ(FirstUniqued, Uniqued); 687 } 688 { 689 auto Unresolved = MDTuple::getTemporary(Context, None); 690 Metadata *Ops[] = {Unresolved.get()}; 691 auto Temp = MDTuple::getTemporary(Context, Ops); 692 EXPECT_TRUE(Temp->isTemporary()); 693 694 // Shouldn't be resolved. 695 auto *Uniqued = MDNode::replaceWithUniqued(std::move(Temp)); 696 EXPECT_TRUE(Uniqued->isUniqued()); 697 EXPECT_FALSE(Uniqued->isResolved()); 698 699 // Should be a different node. 700 EXPECT_NE(FirstUniqued, Uniqued); 701 702 // Should resolve when we update its node (note: be careful to avoid a 703 // collision with any other nodes above). 704 Uniqued->replaceOperandWith(0, nullptr); 705 EXPECT_TRUE(Uniqued->isResolved()); 706 } 707 } 708 709 TEST_F(MDNodeTest, replaceWithUniquedResolvingOperand) { 710 // temp !{} 711 MDTuple *Op = MDTuple::getTemporary(Context, None).release(); 712 EXPECT_FALSE(Op->isResolved()); 713 714 // temp !{temp !{}} 715 Metadata *Ops[] = {Op}; 716 MDTuple *N = MDTuple::getTemporary(Context, Ops).release(); 717 EXPECT_FALSE(N->isResolved()); 718 719 // temp !{temp !{}} => !{temp !{}} 720 ASSERT_EQ(N, MDNode::replaceWithUniqued(TempMDTuple(N))); 721 EXPECT_FALSE(N->isResolved()); 722 723 // !{temp !{}} => !{!{}} 724 ASSERT_EQ(Op, MDNode::replaceWithUniqued(TempMDTuple(Op))); 725 EXPECT_TRUE(Op->isResolved()); 726 EXPECT_TRUE(N->isResolved()); 727 } 728 729 TEST_F(MDNodeTest, replaceWithUniquedDeletedOperand) { 730 // i1* @GV 731 Type *Ty = Type::getInt1PtrTy(Context); 732 std::unique_ptr<GlobalVariable> GV( 733 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 734 ConstantAsMetadata *Op = ConstantAsMetadata::get(GV.get()); 735 736 // temp !{i1* @GV} 737 Metadata *Ops[] = {Op}; 738 MDTuple *N = MDTuple::getTemporary(Context, Ops).release(); 739 740 // temp !{i1* @GV} => !{i1* @GV} 741 ASSERT_EQ(N, MDNode::replaceWithUniqued(TempMDTuple(N))); 742 ASSERT_TRUE(N->isUniqued()); 743 744 // !{i1* @GV} => !{null} 745 GV.reset(); 746 ASSERT_TRUE(N->isDistinct()); 747 ASSERT_EQ(nullptr, N->getOperand(0)); 748 Metadata *NullOps[] = {nullptr}; 749 ASSERT_NE(N, MDTuple::get(Context, NullOps)); 750 } 751 752 TEST_F(MDNodeTest, replaceWithUniquedChangedOperand) { 753 // i1* @GV 754 Type *Ty = Type::getInt1PtrTy(Context); 755 std::unique_ptr<GlobalVariable> GV( 756 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 757 ConstantAsMetadata *Op = ConstantAsMetadata::get(GV.get()); 758 759 // temp !{i1* @GV} 760 Metadata *Ops[] = {Op}; 761 MDTuple *N = MDTuple::getTemporary(Context, Ops).release(); 762 763 // temp !{i1* @GV} => !{i1* @GV} 764 ASSERT_EQ(N, MDNode::replaceWithUniqued(TempMDTuple(N))); 765 ASSERT_TRUE(N->isUniqued()); 766 767 // !{i1* @GV} => !{i1* @GV2} 768 std::unique_ptr<GlobalVariable> GV2( 769 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 770 GV->replaceAllUsesWith(GV2.get()); 771 ASSERT_TRUE(N->isUniqued()); 772 Metadata *NullOps[] = {ConstantAsMetadata::get(GV2.get())}; 773 ASSERT_EQ(N, MDTuple::get(Context, NullOps)); 774 } 775 776 TEST_F(MDNodeTest, replaceWithDistinct) { 777 { 778 auto *Empty = MDTuple::get(Context, None); 779 Metadata *Ops[] = {Empty}; 780 auto Temp = MDTuple::getTemporary(Context, Ops); 781 EXPECT_TRUE(Temp->isTemporary()); 782 783 // Don't expect a collision. 784 auto *Current = Temp.get(); 785 auto *Distinct = MDNode::replaceWithDistinct(std::move(Temp)); 786 EXPECT_TRUE(Distinct->isDistinct()); 787 EXPECT_TRUE(Distinct->isResolved()); 788 EXPECT_EQ(Current, Distinct); 789 } 790 { 791 auto Unresolved = MDTuple::getTemporary(Context, None); 792 Metadata *Ops[] = {Unresolved.get()}; 793 auto Temp = MDTuple::getTemporary(Context, Ops); 794 EXPECT_TRUE(Temp->isTemporary()); 795 796 // Don't expect a collision. 797 auto *Current = Temp.get(); 798 auto *Distinct = MDNode::replaceWithDistinct(std::move(Temp)); 799 EXPECT_TRUE(Distinct->isDistinct()); 800 EXPECT_TRUE(Distinct->isResolved()); 801 EXPECT_EQ(Current, Distinct); 802 803 // Cleanup; required for teardown. 804 Unresolved->replaceAllUsesWith(nullptr); 805 } 806 } 807 808 TEST_F(MDNodeTest, replaceWithPermanent) { 809 Metadata *Ops[] = {nullptr}; 810 auto Temp = MDTuple::getTemporary(Context, Ops); 811 auto *T = Temp.get(); 812 813 // U is a normal, uniqued node that references T. 814 auto *U = MDTuple::get(Context, T); 815 EXPECT_TRUE(U->isUniqued()); 816 817 // Make Temp self-referencing. 818 Temp->replaceOperandWith(0, T); 819 820 // Try to uniquify Temp. This should, despite the name in the API, give a 821 // 'distinct' node, since self-references aren't allowed to be uniqued. 822 // 823 // Since it's distinct, N should have the same address as when it was a 824 // temporary (i.e., be equal to T not U). 825 auto *N = MDNode::replaceWithPermanent(std::move(Temp)); 826 EXPECT_EQ(N, T); 827 EXPECT_TRUE(N->isDistinct()); 828 829 // U should be the canonical unique node with N as the argument. 830 EXPECT_EQ(U, MDTuple::get(Context, N)); 831 EXPECT_TRUE(U->isUniqued()); 832 833 // This temporary should collide with U when replaced, but it should still be 834 // uniqued. 835 EXPECT_EQ(U, MDNode::replaceWithPermanent(MDTuple::getTemporary(Context, N))); 836 EXPECT_TRUE(U->isUniqued()); 837 838 // This temporary should become a new uniqued node. 839 auto Temp2 = MDTuple::getTemporary(Context, U); 840 auto *V = Temp2.get(); 841 EXPECT_EQ(V, MDNode::replaceWithPermanent(std::move(Temp2))); 842 EXPECT_TRUE(V->isUniqued()); 843 EXPECT_EQ(U, V->getOperand(0)); 844 } 845 846 TEST_F(MDNodeTest, deleteTemporaryWithTrackingRef) { 847 TrackingMDRef Ref; 848 EXPECT_EQ(nullptr, Ref.get()); 849 { 850 auto Temp = MDTuple::getTemporary(Context, None); 851 Ref.reset(Temp.get()); 852 EXPECT_EQ(Temp.get(), Ref.get()); 853 } 854 EXPECT_EQ(nullptr, Ref.get()); 855 } 856 857 typedef MetadataTest DILocationTest; 858 859 TEST_F(DILocationTest, Overflow) { 860 DISubprogram *N = getSubprogram(); 861 { 862 DILocation *L = DILocation::get(Context, 2, 7, N); 863 EXPECT_EQ(2u, L->getLine()); 864 EXPECT_EQ(7u, L->getColumn()); 865 } 866 unsigned U16 = 1u << 16; 867 { 868 DILocation *L = DILocation::get(Context, UINT32_MAX, U16 - 1, N); 869 EXPECT_EQ(UINT32_MAX, L->getLine()); 870 EXPECT_EQ(U16 - 1, L->getColumn()); 871 } 872 { 873 DILocation *L = DILocation::get(Context, UINT32_MAX, U16, N); 874 EXPECT_EQ(UINT32_MAX, L->getLine()); 875 EXPECT_EQ(0u, L->getColumn()); 876 } 877 { 878 DILocation *L = DILocation::get(Context, UINT32_MAX, U16 + 1, N); 879 EXPECT_EQ(UINT32_MAX, L->getLine()); 880 EXPECT_EQ(0u, L->getColumn()); 881 } 882 } 883 884 TEST_F(DILocationTest, Merge) { 885 DISubprogram *N = getSubprogram(); 886 DIScope *S = DILexicalBlock::get(Context, N, getFile(), 3, 4); 887 888 { 889 // Identical. 890 auto *A = DILocation::get(Context, 2, 7, N); 891 auto *B = DILocation::get(Context, 2, 7, N); 892 auto *M = DILocation::getMergedLocation(A, B); 893 EXPECT_EQ(2u, M->getLine()); 894 EXPECT_EQ(7u, M->getColumn()); 895 EXPECT_EQ(N, M->getScope()); 896 } 897 898 { 899 // Identical, different scopes. 900 auto *A = DILocation::get(Context, 2, 7, N); 901 auto *B = DILocation::get(Context, 2, 7, S); 902 auto *M = DILocation::getMergedLocation(A, B); 903 EXPECT_EQ(0u, M->getLine()); // FIXME: Should this be 2? 904 EXPECT_EQ(0u, M->getColumn()); // FIXME: Should this be 7? 905 EXPECT_EQ(N, M->getScope()); 906 } 907 908 { 909 // Different lines, same scopes. 910 auto *A = DILocation::get(Context, 1, 6, N); 911 auto *B = DILocation::get(Context, 2, 7, N); 912 auto *M = DILocation::getMergedLocation(A, B); 913 EXPECT_EQ(0u, M->getLine()); 914 EXPECT_EQ(0u, M->getColumn()); 915 EXPECT_EQ(N, M->getScope()); 916 } 917 918 { 919 // Twisty locations, all different, same function. 920 auto *A = DILocation::get(Context, 1, 6, N); 921 auto *B = DILocation::get(Context, 2, 7, S); 922 auto *M = DILocation::getMergedLocation(A, B); 923 EXPECT_EQ(0u, M->getLine()); 924 EXPECT_EQ(0u, M->getColumn()); 925 EXPECT_EQ(N, M->getScope()); 926 } 927 928 { 929 // Different function, same inlined-at. 930 auto *F = getFile(); 931 auto *SP1 = DISubprogram::getDistinct(Context, F, "a", "a", F, 0, nullptr, 932 0, nullptr, 0, 0, DINode::FlagZero, 933 DISubprogram::SPFlagZero, nullptr); 934 auto *SP2 = DISubprogram::getDistinct(Context, F, "b", "b", F, 0, nullptr, 935 0, nullptr, 0, 0, DINode::FlagZero, 936 DISubprogram::SPFlagZero, nullptr); 937 938 auto *I = DILocation::get(Context, 2, 7, N); 939 auto *A = DILocation::get(Context, 1, 6, SP1, I); 940 auto *B = DILocation::get(Context, 2, 7, SP2, I); 941 auto *M = DILocation::getMergedLocation(A, B); 942 EXPECT_EQ(0u, M->getLine()); 943 EXPECT_EQ(0u, M->getColumn()); 944 EXPECT_TRUE(isa<DILocalScope>(M->getScope())); 945 EXPECT_EQ(I, M->getInlinedAt()); 946 } 947 948 { 949 // Completely different. 950 auto *I = DILocation::get(Context, 2, 7, N); 951 auto *A = DILocation::get(Context, 1, 6, S, I); 952 auto *B = DILocation::get(Context, 2, 7, getSubprogram()); 953 auto *M = DILocation::getMergedLocation(A, B); 954 EXPECT_EQ(0u, M->getLine()); 955 EXPECT_EQ(0u, M->getColumn()); 956 EXPECT_TRUE(isa<DILocalScope>(M->getScope())); 957 EXPECT_EQ(S, M->getScope()); 958 EXPECT_EQ(nullptr, M->getInlinedAt()); 959 } 960 } 961 962 TEST_F(DILocationTest, getDistinct) { 963 MDNode *N = getSubprogram(); 964 DILocation *L0 = DILocation::getDistinct(Context, 2, 7, N); 965 EXPECT_TRUE(L0->isDistinct()); 966 DILocation *L1 = DILocation::get(Context, 2, 7, N); 967 EXPECT_FALSE(L1->isDistinct()); 968 EXPECT_EQ(L1, DILocation::get(Context, 2, 7, N)); 969 } 970 971 TEST_F(DILocationTest, getTemporary) { 972 MDNode *N = MDNode::get(Context, None); 973 auto L = DILocation::getTemporary(Context, 2, 7, N); 974 EXPECT_TRUE(L->isTemporary()); 975 EXPECT_FALSE(L->isResolved()); 976 } 977 978 TEST_F(DILocationTest, cloneTemporary) { 979 MDNode *N = MDNode::get(Context, None); 980 auto L = DILocation::getTemporary(Context, 2, 7, N); 981 EXPECT_TRUE(L->isTemporary()); 982 auto L2 = L->clone(); 983 EXPECT_TRUE(L2->isTemporary()); 984 } 985 986 TEST_F(DILocationTest, discriminatorEncoding) { 987 EXPECT_EQ(0U, DILocation::encodeDiscriminator(0, 0, 0).getValue()); 988 989 // Encode base discriminator as a component: lsb is 0, then the value. 990 // The other components are all absent, so we leave all the other bits 0. 991 EXPECT_EQ(2U, DILocation::encodeDiscriminator(1, 0, 0).getValue()); 992 993 // Base discriminator component is empty, so lsb is 1. Next component is not 994 // empty, so its lsb is 0, then its value (1). Next component is empty. 995 // So the bit pattern is 101. 996 EXPECT_EQ(5U, DILocation::encodeDiscriminator(0, 1, 0).getValue()); 997 998 // First 2 components are empty, so the bit pattern is 11. Then the 999 // next component - ending up with 1011. 1000 EXPECT_EQ(0xbU, DILocation::encodeDiscriminator(0, 0, 1).getValue()); 1001 1002 // The bit pattern for the first 2 components is 11. The next bit is 0, 1003 // because the last component is not empty. We have 29 bits usable for 1004 // encoding, but we cap it at 12 bits uniformously for all components. We 1005 // encode the last component over 14 bits. 1006 EXPECT_EQ(0xfffbU, DILocation::encodeDiscriminator(0, 0, 0xfff).getValue()); 1007 1008 EXPECT_EQ(0x102U, DILocation::encodeDiscriminator(1, 1, 0).getValue()); 1009 1010 EXPECT_EQ(0x13eU, DILocation::encodeDiscriminator(0x1f, 1, 0).getValue()); 1011 1012 EXPECT_EQ(0x87feU, DILocation::encodeDiscriminator(0x1ff, 1, 0).getValue()); 1013 1014 EXPECT_EQ(0x1f3eU, DILocation::encodeDiscriminator(0x1f, 0x1f, 0).getValue()); 1015 1016 EXPECT_EQ(0x3ff3eU, 1017 DILocation::encodeDiscriminator(0x1f, 0x1ff, 0).getValue()); 1018 1019 EXPECT_EQ(0x1ff87feU, 1020 DILocation::encodeDiscriminator(0x1ff, 0x1ff, 0).getValue()); 1021 1022 EXPECT_EQ(0xfff9f3eU, 1023 DILocation::encodeDiscriminator(0x1f, 0x1f, 0xfff).getValue()); 1024 1025 EXPECT_EQ(0xffc3ff3eU, 1026 DILocation::encodeDiscriminator(0x1f, 0x1ff, 0x1ff).getValue()); 1027 1028 EXPECT_EQ(0xffcf87feU, 1029 DILocation::encodeDiscriminator(0x1ff, 0x1f, 0x1ff).getValue()); 1030 1031 EXPECT_EQ(0xe1ff87feU, 1032 DILocation::encodeDiscriminator(0x1ff, 0x1ff, 7).getValue()); 1033 } 1034 1035 TEST_F(DILocationTest, discriminatorEncodingNegativeTests) { 1036 EXPECT_EQ(None, DILocation::encodeDiscriminator(0, 0, 0x1000)); 1037 EXPECT_EQ(None, DILocation::encodeDiscriminator(0x1000, 0, 0)); 1038 EXPECT_EQ(None, DILocation::encodeDiscriminator(0, 0x1000, 0)); 1039 EXPECT_EQ(None, DILocation::encodeDiscriminator(0, 0, 0x1000)); 1040 EXPECT_EQ(None, DILocation::encodeDiscriminator(0x1ff, 0x1ff, 8)); 1041 EXPECT_EQ(None, 1042 DILocation::encodeDiscriminator(std::numeric_limits<uint32_t>::max(), 1043 std::numeric_limits<uint32_t>::max(), 1044 0)); 1045 } 1046 1047 TEST_F(DILocationTest, discriminatorSpecialCases) { 1048 // We don't test getCopyIdentifier here because the only way 1049 // to set it is by constructing an encoded discriminator using 1050 // encodeDiscriminator, which is already tested. 1051 auto L1 = DILocation::get(Context, 1, 2, getSubprogram()); 1052 EXPECT_EQ(0U, L1->getBaseDiscriminator()); 1053 EXPECT_EQ(1U, L1->getDuplicationFactor()); 1054 1055 EXPECT_EQ(L1, L1->cloneWithBaseDiscriminator(0).getValue()); 1056 EXPECT_EQ(L1, L1->cloneByMultiplyingDuplicationFactor(0).getValue()); 1057 EXPECT_EQ(L1, L1->cloneByMultiplyingDuplicationFactor(1).getValue()); 1058 1059 auto L2 = L1->cloneWithBaseDiscriminator(1).getValue(); 1060 EXPECT_EQ(0U, L1->getBaseDiscriminator()); 1061 EXPECT_EQ(1U, L1->getDuplicationFactor()); 1062 1063 EXPECT_EQ(1U, L2->getBaseDiscriminator()); 1064 EXPECT_EQ(1U, L2->getDuplicationFactor()); 1065 1066 auto L3 = L2->cloneByMultiplyingDuplicationFactor(2).getValue(); 1067 EXPECT_EQ(1U, L3->getBaseDiscriminator()); 1068 EXPECT_EQ(2U, L3->getDuplicationFactor()); 1069 1070 EXPECT_EQ(L2, L2->cloneByMultiplyingDuplicationFactor(1).getValue()); 1071 1072 auto L4 = L3->cloneByMultiplyingDuplicationFactor(4).getValue(); 1073 EXPECT_EQ(1U, L4->getBaseDiscriminator()); 1074 EXPECT_EQ(8U, L4->getDuplicationFactor()); 1075 1076 auto L5 = L4->cloneWithBaseDiscriminator(2).getValue(); 1077 EXPECT_EQ(2U, L5->getBaseDiscriminator()); 1078 EXPECT_EQ(8U, L5->getDuplicationFactor()); 1079 1080 // Check extreme cases 1081 auto L6 = L1->cloneWithBaseDiscriminator(0xfff).getValue(); 1082 EXPECT_EQ(0xfffU, L6->getBaseDiscriminator()); 1083 EXPECT_EQ(0xfffU, L6->cloneByMultiplyingDuplicationFactor(0xfff) 1084 .getValue() 1085 ->getDuplicationFactor()); 1086 1087 // Check we return None for unencodable cases. 1088 EXPECT_EQ(None, L4->cloneWithBaseDiscriminator(0x1000)); 1089 EXPECT_EQ(None, L4->cloneByMultiplyingDuplicationFactor(0x1000)); 1090 } 1091 1092 1093 typedef MetadataTest GenericDINodeTest; 1094 1095 TEST_F(GenericDINodeTest, get) { 1096 StringRef Header = "header"; 1097 auto *Empty = MDNode::get(Context, None); 1098 Metadata *Ops1[] = {Empty}; 1099 auto *N = GenericDINode::get(Context, 15, Header, Ops1); 1100 EXPECT_EQ(15u, N->getTag()); 1101 EXPECT_EQ(2u, N->getNumOperands()); 1102 EXPECT_EQ(Header, N->getHeader()); 1103 EXPECT_EQ(MDString::get(Context, Header), N->getOperand(0)); 1104 EXPECT_EQ(1u, N->getNumDwarfOperands()); 1105 EXPECT_EQ(Empty, N->getDwarfOperand(0)); 1106 EXPECT_EQ(Empty, N->getOperand(1)); 1107 ASSERT_TRUE(N->isUniqued()); 1108 1109 EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops1)); 1110 1111 N->replaceOperandWith(1, nullptr); 1112 EXPECT_EQ(15u, N->getTag()); 1113 EXPECT_EQ(Header, N->getHeader()); 1114 EXPECT_EQ(nullptr, N->getDwarfOperand(0)); 1115 ASSERT_TRUE(N->isUniqued()); 1116 1117 Metadata *Ops2[] = {nullptr}; 1118 EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops2)); 1119 1120 N->replaceDwarfOperandWith(0, Empty); 1121 EXPECT_EQ(15u, N->getTag()); 1122 EXPECT_EQ(Header, N->getHeader()); 1123 EXPECT_EQ(Empty, N->getDwarfOperand(0)); 1124 ASSERT_TRUE(N->isUniqued()); 1125 EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops1)); 1126 1127 TempGenericDINode Temp = N->clone(); 1128 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1129 } 1130 1131 TEST_F(GenericDINodeTest, getEmptyHeader) { 1132 // Canonicalize !"" to null. 1133 auto *N = GenericDINode::get(Context, 15, StringRef(), None); 1134 EXPECT_EQ(StringRef(), N->getHeader()); 1135 EXPECT_EQ(nullptr, N->getOperand(0)); 1136 } 1137 1138 typedef MetadataTest DISubrangeTest; 1139 1140 TEST_F(DISubrangeTest, get) { 1141 auto *N = DISubrange::get(Context, 5, 7); 1142 auto Count = N->getCount(); 1143 auto Lower = N->getLowerBound(); 1144 EXPECT_EQ(dwarf::DW_TAG_subrange_type, N->getTag()); 1145 ASSERT_TRUE(Count); 1146 ASSERT_TRUE(Count.is<ConstantInt*>()); 1147 EXPECT_EQ(5, Count.get<ConstantInt*>()->getSExtValue()); 1148 EXPECT_EQ(7, Lower.get<ConstantInt *>()->getSExtValue()); 1149 EXPECT_EQ(N, DISubrange::get(Context, 5, 7)); 1150 EXPECT_EQ(DISubrange::get(Context, 5, 0), DISubrange::get(Context, 5)); 1151 1152 TempDISubrange Temp = N->clone(); 1153 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1154 } 1155 1156 TEST_F(DISubrangeTest, getEmptyArray) { 1157 auto *N = DISubrange::get(Context, -1, 0); 1158 auto Count = N->getCount(); 1159 auto Lower = N->getLowerBound(); 1160 EXPECT_EQ(dwarf::DW_TAG_subrange_type, N->getTag()); 1161 ASSERT_TRUE(Count); 1162 ASSERT_TRUE(Count.is<ConstantInt*>()); 1163 EXPECT_EQ(-1, Count.get<ConstantInt*>()->getSExtValue()); 1164 EXPECT_EQ(0, Lower.get<ConstantInt *>()->getSExtValue()); 1165 EXPECT_EQ(N, DISubrange::get(Context, -1, 0)); 1166 } 1167 1168 TEST_F(DISubrangeTest, getVariableCount) { 1169 DILocalScope *Scope = getSubprogram(); 1170 DIFile *File = getFile(); 1171 DIType *Type = getDerivedType(); 1172 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 1173 auto *VlaExpr = DILocalVariable::get(Context, Scope, "vla_expr", File, 8, 1174 Type, 2, Flags, 8); 1175 1176 auto *N = DISubrange::get(Context, VlaExpr, 0); 1177 auto Count = N->getCount(); 1178 auto Lower = N->getLowerBound(); 1179 ASSERT_TRUE(Count); 1180 ASSERT_TRUE(Count.is<DIVariable*>()); 1181 EXPECT_EQ(VlaExpr, Count.get<DIVariable*>()); 1182 ASSERT_TRUE(isa<DIVariable>(N->getRawCountNode())); 1183 EXPECT_EQ(0, Lower.get<ConstantInt *>()->getSExtValue()); 1184 EXPECT_EQ("vla_expr", Count.get<DIVariable*>()->getName()); 1185 EXPECT_EQ(N, DISubrange::get(Context, VlaExpr, 0)); 1186 } 1187 1188 TEST_F(DISubrangeTest, fortranAllocatableInt) { 1189 DILocalScope *Scope = getSubprogram(); 1190 DIFile *File = getFile(); 1191 DIType *Type = getDerivedType(); 1192 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 1193 auto *LI = ConstantAsMetadata::get( 1194 ConstantInt::getSigned(Type::getInt64Ty(Context), -10)); 1195 auto *UI = ConstantAsMetadata::get( 1196 ConstantInt::getSigned(Type::getInt64Ty(Context), 10)); 1197 auto *SI = ConstantAsMetadata::get( 1198 ConstantInt::getSigned(Type::getInt64Ty(Context), 4)); 1199 auto *UIother = ConstantAsMetadata::get( 1200 ConstantInt::getSigned(Type::getInt64Ty(Context), 20)); 1201 auto *UVother = DILocalVariable::get(Context, Scope, "ubother", File, 8, Type, 1202 2, Flags, 8); 1203 auto *UEother = DIExpression::get(Context, {5, 6}); 1204 auto *LIZero = ConstantAsMetadata::get( 1205 ConstantInt::getSigned(Type::getInt64Ty(Context), 0)); 1206 auto *UIZero = ConstantAsMetadata::get( 1207 ConstantInt::getSigned(Type::getInt64Ty(Context), 0)); 1208 1209 auto *N = DISubrange::get(Context, nullptr, LI, UI, SI); 1210 1211 auto Lower = N->getLowerBound(); 1212 ASSERT_TRUE(Lower); 1213 ASSERT_TRUE(Lower.is<ConstantInt *>()); 1214 EXPECT_EQ(cast<ConstantInt>(LI->getValue()), Lower.get<ConstantInt *>()); 1215 1216 auto Upper = N->getUpperBound(); 1217 ASSERT_TRUE(Upper); 1218 ASSERT_TRUE(Upper.is<ConstantInt *>()); 1219 EXPECT_EQ(cast<ConstantInt>(UI->getValue()), Upper.get<ConstantInt *>()); 1220 1221 auto Stride = N->getStride(); 1222 ASSERT_TRUE(Stride); 1223 ASSERT_TRUE(Stride.is<ConstantInt *>()); 1224 EXPECT_EQ(cast<ConstantInt>(SI->getValue()), Stride.get<ConstantInt *>()); 1225 1226 EXPECT_EQ(N, DISubrange::get(Context, nullptr, LI, UI, SI)); 1227 1228 EXPECT_NE(N, DISubrange::get(Context, nullptr, LI, UIother, SI)); 1229 EXPECT_NE(N, DISubrange::get(Context, nullptr, LI, UEother, SI)); 1230 EXPECT_NE(N, DISubrange::get(Context, nullptr, LI, UVother, SI)); 1231 1232 auto *NZeroLower = DISubrange::get(Context, nullptr, LIZero, UI, SI); 1233 EXPECT_NE(NZeroLower, DISubrange::get(Context, nullptr, nullptr, UI, SI)); 1234 1235 auto *NZeroUpper = DISubrange::get(Context, nullptr, LI, UIZero, SI); 1236 EXPECT_NE(NZeroUpper, DISubrange::get(Context, nullptr, LI, nullptr, SI)); 1237 } 1238 1239 TEST_F(DISubrangeTest, fortranAllocatableVar) { 1240 DILocalScope *Scope = getSubprogram(); 1241 DIFile *File = getFile(); 1242 DIType *Type = getDerivedType(); 1243 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 1244 auto *LV = 1245 DILocalVariable::get(Context, Scope, "lb", File, 8, Type, 2, Flags, 8); 1246 auto *UV = 1247 DILocalVariable::get(Context, Scope, "ub", File, 8, Type, 2, Flags, 8); 1248 auto *SV = 1249 DILocalVariable::get(Context, Scope, "st", File, 8, Type, 2, Flags, 8); 1250 auto *SVother = DILocalVariable::get(Context, Scope, "stother", File, 8, Type, 1251 2, Flags, 8); 1252 auto *SIother = ConstantAsMetadata::get( 1253 ConstantInt::getSigned(Type::getInt64Ty(Context), 20)); 1254 auto *SEother = DIExpression::get(Context, {5, 6}); 1255 1256 auto *N = DISubrange::get(Context, nullptr, LV, UV, SV); 1257 1258 auto Lower = N->getLowerBound(); 1259 ASSERT_TRUE(Lower); 1260 ASSERT_TRUE(Lower.is<DIVariable *>()); 1261 EXPECT_EQ(LV, Lower.get<DIVariable *>()); 1262 1263 auto Upper = N->getUpperBound(); 1264 ASSERT_TRUE(Upper); 1265 ASSERT_TRUE(Upper.is<DIVariable *>()); 1266 EXPECT_EQ(UV, Upper.get<DIVariable *>()); 1267 1268 auto Stride = N->getStride(); 1269 ASSERT_TRUE(Stride); 1270 ASSERT_TRUE(Stride.is<DIVariable *>()); 1271 EXPECT_EQ(SV, Stride.get<DIVariable *>()); 1272 1273 EXPECT_EQ(N, DISubrange::get(Context, nullptr, LV, UV, SV)); 1274 1275 EXPECT_NE(N, DISubrange::get(Context, nullptr, LV, UV, SVother)); 1276 EXPECT_NE(N, DISubrange::get(Context, nullptr, LV, UV, SEother)); 1277 EXPECT_NE(N, DISubrange::get(Context, nullptr, LV, UV, SIother)); 1278 } 1279 1280 TEST_F(DISubrangeTest, fortranAllocatableExpr) { 1281 DILocalScope *Scope = getSubprogram(); 1282 DIFile *File = getFile(); 1283 DIType *Type = getDerivedType(); 1284 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 1285 auto *LE = DIExpression::get(Context, {1, 2}); 1286 auto *UE = DIExpression::get(Context, {2, 3}); 1287 auto *SE = DIExpression::get(Context, {3, 4}); 1288 auto *LEother = DIExpression::get(Context, {5, 6}); 1289 auto *LIother = ConstantAsMetadata::get( 1290 ConstantInt::getSigned(Type::getInt64Ty(Context), 20)); 1291 auto *LVother = DILocalVariable::get(Context, Scope, "lbother", File, 8, Type, 1292 2, Flags, 8); 1293 1294 auto *N = DISubrange::get(Context, nullptr, LE, UE, SE); 1295 1296 auto Lower = N->getLowerBound(); 1297 ASSERT_TRUE(Lower); 1298 ASSERT_TRUE(Lower.is<DIExpression *>()); 1299 EXPECT_EQ(LE, Lower.get<DIExpression *>()); 1300 1301 auto Upper = N->getUpperBound(); 1302 ASSERT_TRUE(Upper); 1303 ASSERT_TRUE(Upper.is<DIExpression *>()); 1304 EXPECT_EQ(UE, Upper.get<DIExpression *>()); 1305 1306 auto Stride = N->getStride(); 1307 ASSERT_TRUE(Stride); 1308 ASSERT_TRUE(Stride.is<DIExpression *>()); 1309 EXPECT_EQ(SE, Stride.get<DIExpression *>()); 1310 1311 EXPECT_EQ(N, DISubrange::get(Context, nullptr, LE, UE, SE)); 1312 1313 EXPECT_NE(N, DISubrange::get(Context, nullptr, LEother, UE, SE)); 1314 EXPECT_NE(N, DISubrange::get(Context, nullptr, LIother, UE, SE)); 1315 EXPECT_NE(N, DISubrange::get(Context, nullptr, LVother, UE, SE)); 1316 } 1317 1318 typedef MetadataTest DIGenericSubrangeTest; 1319 1320 TEST_F(DIGenericSubrangeTest, fortranAssumedRankInt) { 1321 DILocalScope *Scope = getSubprogram(); 1322 DIFile *File = getFile(); 1323 DIType *Type = getDerivedType(); 1324 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 1325 auto *LI = DIExpression::get( 1326 Context, {dwarf::DW_OP_consts, static_cast<uint64_t>(-10)}); 1327 auto *UI = DIExpression::get(Context, {dwarf::DW_OP_consts, 10}); 1328 auto *SI = DIExpression::get(Context, {dwarf::DW_OP_consts, 4}); 1329 auto *UIother = DIExpression::get(Context, {dwarf::DW_OP_consts, 20}); 1330 auto *UVother = DILocalVariable::get(Context, Scope, "ubother", File, 8, Type, 1331 2, Flags, 8); 1332 auto *UEother = DIExpression::get(Context, {5, 6}); 1333 auto *LIZero = DIExpression::get(Context, {dwarf::DW_OP_consts, 0}); 1334 auto *UIZero = DIExpression::get(Context, {dwarf::DW_OP_consts, 0}); 1335 1336 auto *N = DIGenericSubrange::get(Context, nullptr, LI, UI, SI); 1337 1338 auto Lower = N->getLowerBound(); 1339 ASSERT_TRUE(Lower); 1340 ASSERT_TRUE(Lower.is<DIExpression *>()); 1341 EXPECT_EQ(dyn_cast_or_null<DIExpression>(LI), Lower.get<DIExpression *>()); 1342 1343 auto Upper = N->getUpperBound(); 1344 ASSERT_TRUE(Upper); 1345 ASSERT_TRUE(Upper.is<DIExpression *>()); 1346 EXPECT_EQ(dyn_cast_or_null<DIExpression>(UI), Upper.get<DIExpression *>()); 1347 1348 auto Stride = N->getStride(); 1349 ASSERT_TRUE(Stride); 1350 ASSERT_TRUE(Stride.is<DIExpression *>()); 1351 EXPECT_EQ(dyn_cast_or_null<DIExpression>(SI), Stride.get<DIExpression *>()); 1352 1353 EXPECT_EQ(N, DIGenericSubrange::get(Context, nullptr, LI, UI, SI)); 1354 1355 EXPECT_NE(N, DIGenericSubrange::get(Context, nullptr, LI, UIother, SI)); 1356 EXPECT_NE(N, DIGenericSubrange::get(Context, nullptr, LI, UEother, SI)); 1357 EXPECT_NE(N, DIGenericSubrange::get(Context, nullptr, LI, UVother, SI)); 1358 1359 auto *NZeroLower = DIGenericSubrange::get(Context, nullptr, LIZero, UI, SI); 1360 EXPECT_NE(NZeroLower, 1361 DIGenericSubrange::get(Context, nullptr, nullptr, UI, SI)); 1362 1363 auto *NZeroUpper = DIGenericSubrange::get(Context, nullptr, LI, UIZero, SI); 1364 EXPECT_NE(NZeroUpper, 1365 DIGenericSubrange::get(Context, nullptr, LI, nullptr, SI)); 1366 } 1367 1368 TEST_F(DIGenericSubrangeTest, fortranAssumedRankVar) { 1369 DILocalScope *Scope = getSubprogram(); 1370 DIFile *File = getFile(); 1371 DIType *Type = getDerivedType(); 1372 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 1373 auto *LV = 1374 DILocalVariable::get(Context, Scope, "lb", File, 8, Type, 2, Flags, 8); 1375 auto *UV = 1376 DILocalVariable::get(Context, Scope, "ub", File, 8, Type, 2, Flags, 8); 1377 auto *SV = 1378 DILocalVariable::get(Context, Scope, "st", File, 8, Type, 2, Flags, 8); 1379 auto *SVother = DILocalVariable::get(Context, Scope, "stother", File, 8, Type, 1380 2, Flags, 8); 1381 auto *SIother = DIExpression::get( 1382 Context, {dwarf::DW_OP_consts, static_cast<uint64_t>(-1)}); 1383 auto *SEother = DIExpression::get(Context, {5, 6}); 1384 1385 auto *N = DIGenericSubrange::get(Context, nullptr, LV, UV, SV); 1386 1387 auto Lower = N->getLowerBound(); 1388 ASSERT_TRUE(Lower); 1389 ASSERT_TRUE(Lower.is<DIVariable *>()); 1390 EXPECT_EQ(LV, Lower.get<DIVariable *>()); 1391 1392 auto Upper = N->getUpperBound(); 1393 ASSERT_TRUE(Upper); 1394 ASSERT_TRUE(Upper.is<DIVariable *>()); 1395 EXPECT_EQ(UV, Upper.get<DIVariable *>()); 1396 1397 auto Stride = N->getStride(); 1398 ASSERT_TRUE(Stride); 1399 ASSERT_TRUE(Stride.is<DIVariable *>()); 1400 EXPECT_EQ(SV, Stride.get<DIVariable *>()); 1401 1402 EXPECT_EQ(N, DIGenericSubrange::get(Context, nullptr, LV, UV, SV)); 1403 1404 EXPECT_NE(N, DIGenericSubrange::get(Context, nullptr, LV, UV, SVother)); 1405 EXPECT_NE(N, DIGenericSubrange::get(Context, nullptr, LV, UV, SEother)); 1406 EXPECT_NE(N, DIGenericSubrange::get(Context, nullptr, LV, UV, SIother)); 1407 } 1408 1409 TEST_F(DIGenericSubrangeTest, useDIBuilder) { 1410 DILocalScope *Scope = getSubprogram(); 1411 DIFile *File = getFile(); 1412 DIType *Type = getDerivedType(); 1413 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 1414 auto *LV = 1415 DILocalVariable::get(Context, Scope, "lb", File, 8, Type, 2, Flags, 8); 1416 auto *UE = DIExpression::get(Context, {2, 3}); 1417 auto *SE = DIExpression::get(Context, {3, 4}); 1418 1419 auto *LVother = DILocalVariable::get(Context, Scope, "lbother", File, 8, Type, 1420 2, Flags, 8); 1421 auto *LIother = DIExpression::get( 1422 Context, {dwarf::DW_OP_consts, static_cast<uint64_t>(-1)}); 1423 1424 Module M("M", Context); 1425 DIBuilder DIB(M); 1426 1427 auto *N = DIB.getOrCreateGenericSubrange( 1428 DIGenericSubrange::BoundType(nullptr), DIGenericSubrange::BoundType(LV), 1429 DIGenericSubrange::BoundType(UE), DIGenericSubrange::BoundType(SE)); 1430 1431 auto Lower = N->getLowerBound(); 1432 ASSERT_TRUE(Lower); 1433 ASSERT_TRUE(Lower.is<DIVariable *>()); 1434 EXPECT_EQ(LV, Lower.get<DIVariable *>()); 1435 1436 auto Upper = N->getUpperBound(); 1437 ASSERT_TRUE(Upper); 1438 ASSERT_TRUE(Upper.is<DIExpression *>()); 1439 EXPECT_EQ(UE, Upper.get<DIExpression *>()); 1440 1441 auto Stride = N->getStride(); 1442 ASSERT_TRUE(Stride); 1443 ASSERT_TRUE(Stride.is<DIExpression *>()); 1444 EXPECT_EQ(SE, Stride.get<DIExpression *>()); 1445 1446 EXPECT_EQ( 1447 N, DIB.getOrCreateGenericSubrange(DIGenericSubrange::BoundType(nullptr), 1448 DIGenericSubrange::BoundType(LV), 1449 DIGenericSubrange::BoundType(UE), 1450 DIGenericSubrange::BoundType(SE))); 1451 1452 EXPECT_NE( 1453 N, DIB.getOrCreateGenericSubrange(DIGenericSubrange::BoundType(nullptr), 1454 DIGenericSubrange::BoundType(LVother), 1455 DIGenericSubrange::BoundType(UE), 1456 DIGenericSubrange::BoundType(SE))); 1457 EXPECT_NE( 1458 N, DIB.getOrCreateGenericSubrange(DIGenericSubrange::BoundType(nullptr), 1459 DIGenericSubrange::BoundType(LIother), 1460 DIGenericSubrange::BoundType(UE), 1461 DIGenericSubrange::BoundType(SE))); 1462 } 1463 typedef MetadataTest DIEnumeratorTest; 1464 1465 TEST_F(DIEnumeratorTest, get) { 1466 auto *N = DIEnumerator::get(Context, 7, false, "name"); 1467 EXPECT_EQ(dwarf::DW_TAG_enumerator, N->getTag()); 1468 EXPECT_EQ(7, N->getValue().getSExtValue()); 1469 EXPECT_FALSE(N->isUnsigned()); 1470 EXPECT_EQ("name", N->getName()); 1471 EXPECT_EQ(N, DIEnumerator::get(Context, 7, false, "name")); 1472 1473 EXPECT_NE(N, DIEnumerator::get(Context, 7, true, "name")); 1474 EXPECT_NE(N, DIEnumerator::get(Context, 8, false, "name")); 1475 EXPECT_NE(N, DIEnumerator::get(Context, 7, false, "nam")); 1476 1477 TempDIEnumerator Temp = N->clone(); 1478 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1479 } 1480 1481 TEST_F(DIEnumeratorTest, getWithLargeValues) { 1482 auto *N = DIEnumerator::get(Context, APInt::getMaxValue(128), false, "val"); 1483 EXPECT_EQ(128U, N->getValue().countPopulation()); 1484 EXPECT_EQ(N, 1485 DIEnumerator::get(Context, APInt::getMaxValue(128), false, "val")); 1486 EXPECT_NE(N, 1487 DIEnumerator::get(Context, APInt::getMinValue(128), false, "val")); 1488 } 1489 1490 typedef MetadataTest DIBasicTypeTest; 1491 1492 TEST_F(DIBasicTypeTest, get) { 1493 auto *N = 1494 DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 26, 7, 1495 DINode::FlagZero); 1496 EXPECT_EQ(dwarf::DW_TAG_base_type, N->getTag()); 1497 EXPECT_EQ("special", N->getName()); 1498 EXPECT_EQ(33u, N->getSizeInBits()); 1499 EXPECT_EQ(26u, N->getAlignInBits()); 1500 EXPECT_EQ(7u, N->getEncoding()); 1501 EXPECT_EQ(0u, N->getLine()); 1502 EXPECT_EQ(DINode::FlagZero, N->getFlags()); 1503 EXPECT_EQ(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1504 26, 7, DINode::FlagZero)); 1505 1506 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, 1507 "special", 33, 26, 7, DINode::FlagZero)); 1508 EXPECT_NE(N, 1509 DIBasicType::get(Context, dwarf::DW_TAG_base_type, "s", 33, 26, 7, 1510 DINode::FlagZero)); 1511 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 32, 1512 26, 7, DINode::FlagZero)); 1513 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1514 25, 7, DINode::FlagZero)); 1515 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1516 26, 6, DINode::FlagZero)); 1517 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1518 26, 7, DINode::FlagBigEndian)); 1519 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1520 26, 7, DINode::FlagLittleEndian)); 1521 1522 TempDIBasicType Temp = N->clone(); 1523 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1524 } 1525 1526 TEST_F(DIBasicTypeTest, getWithLargeValues) { 1527 auto *N = DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 1528 UINT64_MAX, UINT32_MAX - 1, 7, DINode::FlagZero); 1529 EXPECT_EQ(UINT64_MAX, N->getSizeInBits()); 1530 EXPECT_EQ(UINT32_MAX - 1, N->getAlignInBits()); 1531 } 1532 1533 TEST_F(DIBasicTypeTest, getUnspecified) { 1534 auto *N = 1535 DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, "unspecified"); 1536 EXPECT_EQ(dwarf::DW_TAG_unspecified_type, N->getTag()); 1537 EXPECT_EQ("unspecified", N->getName()); 1538 EXPECT_EQ(0u, N->getSizeInBits()); 1539 EXPECT_EQ(0u, N->getAlignInBits()); 1540 EXPECT_EQ(0u, N->getEncoding()); 1541 EXPECT_EQ(0u, N->getLine()); 1542 EXPECT_EQ(DINode::FlagZero, N->getFlags()); 1543 } 1544 1545 typedef MetadataTest DITypeTest; 1546 1547 TEST_F(DITypeTest, clone) { 1548 // Check that DIType has a specialized clone that returns TempDIType. 1549 DIType *N = DIBasicType::get(Context, dwarf::DW_TAG_base_type, "int", 32, 32, 1550 dwarf::DW_ATE_signed, DINode::FlagZero); 1551 1552 TempDIType Temp = N->clone(); 1553 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1554 } 1555 1556 TEST_F(DITypeTest, cloneWithFlags) { 1557 // void (void) 1558 Metadata *TypesOps[] = {nullptr}; 1559 Metadata *Types = MDTuple::get(Context, TypesOps); 1560 1561 DIType *D = 1562 DISubroutineType::getDistinct(Context, DINode::FlagZero, 0, Types); 1563 EXPECT_EQ(DINode::FlagZero, D->getFlags()); 1564 TempDIType D2 = D->cloneWithFlags(DINode::FlagRValueReference); 1565 EXPECT_EQ(DINode::FlagRValueReference, D2->getFlags()); 1566 EXPECT_EQ(DINode::FlagZero, D->getFlags()); 1567 1568 TempDIType T = 1569 DISubroutineType::getTemporary(Context, DINode::FlagZero, 0, Types); 1570 EXPECT_EQ(DINode::FlagZero, T->getFlags()); 1571 TempDIType T2 = T->cloneWithFlags(DINode::FlagRValueReference); 1572 EXPECT_EQ(DINode::FlagRValueReference, T2->getFlags()); 1573 EXPECT_EQ(DINode::FlagZero, T->getFlags()); 1574 } 1575 1576 typedef MetadataTest DIDerivedTypeTest; 1577 1578 TEST_F(DIDerivedTypeTest, get) { 1579 DIFile *File = getFile(); 1580 DIScope *Scope = getSubprogram(); 1581 DIType *BaseType = getBasicType("basic"); 1582 MDTuple *ExtraData = getTuple(); 1583 unsigned DWARFAddressSpace = 8; 1584 DINode::DIFlags Flags5 = static_cast<DINode::DIFlags>(5); 1585 DINode::DIFlags Flags4 = static_cast<DINode::DIFlags>(4); 1586 1587 auto *N = 1588 DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something", File, 1589 1, Scope, BaseType, 2, 3, 4, DWARFAddressSpace, Flags5, 1590 ExtraData); 1591 EXPECT_EQ(dwarf::DW_TAG_pointer_type, N->getTag()); 1592 EXPECT_EQ("something", N->getName()); 1593 EXPECT_EQ(File, N->getFile()); 1594 EXPECT_EQ(1u, N->getLine()); 1595 EXPECT_EQ(Scope, N->getScope()); 1596 EXPECT_EQ(BaseType, N->getBaseType()); 1597 EXPECT_EQ(2u, N->getSizeInBits()); 1598 EXPECT_EQ(3u, N->getAlignInBits()); 1599 EXPECT_EQ(4u, N->getOffsetInBits()); 1600 EXPECT_EQ(DWARFAddressSpace, N->getDWARFAddressSpace().getValue()); 1601 EXPECT_EQ(5u, N->getFlags()); 1602 EXPECT_EQ(ExtraData, N->getExtraData()); 1603 EXPECT_EQ(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1604 "something", File, 1, Scope, BaseType, 2, 3, 1605 4, DWARFAddressSpace, Flags5, ExtraData)); 1606 1607 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_reference_type, 1608 "something", File, 1, Scope, BaseType, 2, 3, 1609 4, DWARFAddressSpace, Flags5, ExtraData)); 1610 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "else", 1611 File, 1, Scope, BaseType, 2, 3, 1612 4, DWARFAddressSpace, Flags5, ExtraData)); 1613 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1614 "something", getFile(), 1, Scope, BaseType, 2, 1615 3, 4, DWARFAddressSpace, Flags5, ExtraData)); 1616 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1617 "something", File, 2, Scope, BaseType, 2, 3, 1618 4, DWARFAddressSpace, Flags5, ExtraData)); 1619 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1620 "something", File, 1, getSubprogram(), 1621 BaseType, 2, 3, 4, DWARFAddressSpace, Flags5, 1622 ExtraData)); 1623 EXPECT_NE(N, DIDerivedType::get( 1624 Context, dwarf::DW_TAG_pointer_type, "something", File, 1, 1625 Scope, getBasicType("basic2"), 2, 3, 4, DWARFAddressSpace, 1626 Flags5, ExtraData)); 1627 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1628 "something", File, 1, Scope, BaseType, 3, 3, 1629 4, DWARFAddressSpace, Flags5, ExtraData)); 1630 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1631 "something", File, 1, Scope, BaseType, 2, 2, 1632 4, DWARFAddressSpace, Flags5, ExtraData)); 1633 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1634 "something", File, 1, Scope, BaseType, 2, 3, 1635 5, DWARFAddressSpace, Flags5, ExtraData)); 1636 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1637 "something", File, 1, Scope, BaseType, 2, 3, 1638 4, DWARFAddressSpace + 1, Flags5, ExtraData)); 1639 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1640 "something", File, 1, Scope, BaseType, 2, 3, 1641 4, DWARFAddressSpace, Flags4, ExtraData)); 1642 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1643 "something", File, 1, Scope, BaseType, 2, 3, 1644 4, DWARFAddressSpace, Flags5, getTuple())); 1645 1646 TempDIDerivedType Temp = N->clone(); 1647 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1648 } 1649 1650 TEST_F(DIDerivedTypeTest, getWithLargeValues) { 1651 DIFile *File = getFile(); 1652 DIScope *Scope = getSubprogram(); 1653 DIType *BaseType = getBasicType("basic"); 1654 MDTuple *ExtraData = getTuple(); 1655 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1656 1657 auto *N = DIDerivedType::get( 1658 Context, dwarf::DW_TAG_pointer_type, "something", File, 1, Scope, 1659 BaseType, UINT64_MAX, UINT32_MAX - 1, UINT64_MAX - 2, UINT32_MAX - 3, 1660 Flags, ExtraData); 1661 EXPECT_EQ(UINT64_MAX, N->getSizeInBits()); 1662 EXPECT_EQ(UINT32_MAX - 1, N->getAlignInBits()); 1663 EXPECT_EQ(UINT64_MAX - 2, N->getOffsetInBits()); 1664 EXPECT_EQ(UINT32_MAX - 3, N->getDWARFAddressSpace().getValue()); 1665 } 1666 1667 typedef MetadataTest DICompositeTypeTest; 1668 1669 TEST_F(DICompositeTypeTest, get) { 1670 unsigned Tag = dwarf::DW_TAG_structure_type; 1671 StringRef Name = "some name"; 1672 DIFile *File = getFile(); 1673 unsigned Line = 1; 1674 DIScope *Scope = getSubprogram(); 1675 DIType *BaseType = getCompositeType(); 1676 uint64_t SizeInBits = 2; 1677 uint32_t AlignInBits = 3; 1678 uint64_t OffsetInBits = 4; 1679 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1680 MDTuple *Elements = getTuple(); 1681 unsigned RuntimeLang = 6; 1682 DIType *VTableHolder = getCompositeType(); 1683 MDTuple *TemplateParams = getTuple(); 1684 StringRef Identifier = "some id"; 1685 1686 auto *N = DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1687 BaseType, SizeInBits, AlignInBits, 1688 OffsetInBits, Flags, Elements, RuntimeLang, 1689 VTableHolder, TemplateParams, Identifier); 1690 EXPECT_EQ(Tag, N->getTag()); 1691 EXPECT_EQ(Name, N->getName()); 1692 EXPECT_EQ(File, N->getFile()); 1693 EXPECT_EQ(Line, N->getLine()); 1694 EXPECT_EQ(Scope, N->getScope()); 1695 EXPECT_EQ(BaseType, N->getBaseType()); 1696 EXPECT_EQ(SizeInBits, N->getSizeInBits()); 1697 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 1698 EXPECT_EQ(OffsetInBits, N->getOffsetInBits()); 1699 EXPECT_EQ(Flags, N->getFlags()); 1700 EXPECT_EQ(Elements, N->getElements().get()); 1701 EXPECT_EQ(RuntimeLang, N->getRuntimeLang()); 1702 EXPECT_EQ(VTableHolder, N->getVTableHolder()); 1703 EXPECT_EQ(TemplateParams, N->getTemplateParams().get()); 1704 EXPECT_EQ(Identifier, N->getIdentifier()); 1705 1706 EXPECT_EQ(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1707 BaseType, SizeInBits, AlignInBits, 1708 OffsetInBits, Flags, Elements, RuntimeLang, 1709 VTableHolder, TemplateParams, Identifier)); 1710 1711 EXPECT_NE(N, DICompositeType::get(Context, Tag + 1, Name, File, Line, Scope, 1712 BaseType, SizeInBits, AlignInBits, 1713 OffsetInBits, Flags, Elements, RuntimeLang, 1714 VTableHolder, TemplateParams, Identifier)); 1715 EXPECT_NE(N, DICompositeType::get(Context, Tag, "abc", File, Line, Scope, 1716 BaseType, SizeInBits, AlignInBits, 1717 OffsetInBits, Flags, Elements, RuntimeLang, 1718 VTableHolder, TemplateParams, Identifier)); 1719 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, getFile(), Line, Scope, 1720 BaseType, SizeInBits, AlignInBits, 1721 OffsetInBits, Flags, Elements, RuntimeLang, 1722 VTableHolder, TemplateParams, Identifier)); 1723 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line + 1, Scope, 1724 BaseType, SizeInBits, AlignInBits, 1725 OffsetInBits, Flags, Elements, RuntimeLang, 1726 VTableHolder, TemplateParams, Identifier)); 1727 EXPECT_NE(N, DICompositeType::get( 1728 Context, Tag, Name, File, Line, getSubprogram(), BaseType, 1729 SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, 1730 RuntimeLang, VTableHolder, TemplateParams, Identifier)); 1731 EXPECT_NE(N, DICompositeType::get( 1732 Context, Tag, Name, File, Line, Scope, getBasicType("other"), 1733 SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, 1734 RuntimeLang, VTableHolder, TemplateParams, Identifier)); 1735 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1736 BaseType, SizeInBits + 1, AlignInBits, 1737 OffsetInBits, Flags, Elements, RuntimeLang, 1738 VTableHolder, TemplateParams, Identifier)); 1739 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1740 BaseType, SizeInBits, AlignInBits + 1, 1741 OffsetInBits, Flags, Elements, RuntimeLang, 1742 VTableHolder, TemplateParams, Identifier)); 1743 EXPECT_NE(N, DICompositeType::get( 1744 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1745 AlignInBits, OffsetInBits + 1, Flags, Elements, RuntimeLang, 1746 VTableHolder, TemplateParams, Identifier)); 1747 DINode::DIFlags FlagsPOne = static_cast<DINode::DIFlags>(Flags + 1); 1748 EXPECT_NE(N, DICompositeType::get( 1749 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1750 AlignInBits, OffsetInBits, FlagsPOne, Elements, RuntimeLang, 1751 VTableHolder, TemplateParams, Identifier)); 1752 EXPECT_NE(N, DICompositeType::get( 1753 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1754 AlignInBits, OffsetInBits, Flags, getTuple(), RuntimeLang, 1755 VTableHolder, TemplateParams, Identifier)); 1756 EXPECT_NE(N, DICompositeType::get( 1757 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1758 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang + 1, 1759 VTableHolder, TemplateParams, Identifier)); 1760 EXPECT_NE(N, DICompositeType::get( 1761 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1762 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 1763 getCompositeType(), TemplateParams, Identifier)); 1764 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1765 BaseType, SizeInBits, AlignInBits, 1766 OffsetInBits, Flags, Elements, RuntimeLang, 1767 VTableHolder, getTuple(), Identifier)); 1768 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1769 BaseType, SizeInBits, AlignInBits, 1770 OffsetInBits, Flags, Elements, RuntimeLang, 1771 VTableHolder, TemplateParams, "other")); 1772 1773 // Be sure that missing identifiers get null pointers. 1774 EXPECT_FALSE(DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1775 BaseType, SizeInBits, AlignInBits, 1776 OffsetInBits, Flags, Elements, RuntimeLang, 1777 VTableHolder, TemplateParams, "") 1778 ->getRawIdentifier()); 1779 EXPECT_FALSE(DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1780 BaseType, SizeInBits, AlignInBits, 1781 OffsetInBits, Flags, Elements, RuntimeLang, 1782 VTableHolder, TemplateParams) 1783 ->getRawIdentifier()); 1784 1785 TempDICompositeType Temp = N->clone(); 1786 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1787 } 1788 1789 TEST_F(DICompositeTypeTest, getWithLargeValues) { 1790 unsigned Tag = dwarf::DW_TAG_structure_type; 1791 StringRef Name = "some name"; 1792 DIFile *File = getFile(); 1793 unsigned Line = 1; 1794 DIScope *Scope = getSubprogram(); 1795 DIType *BaseType = getCompositeType(); 1796 uint64_t SizeInBits = UINT64_MAX; 1797 uint32_t AlignInBits = UINT32_MAX - 1; 1798 uint64_t OffsetInBits = UINT64_MAX - 2; 1799 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1800 MDTuple *Elements = getTuple(); 1801 unsigned RuntimeLang = 6; 1802 DIType *VTableHolder = getCompositeType(); 1803 MDTuple *TemplateParams = getTuple(); 1804 StringRef Identifier = "some id"; 1805 1806 auto *N = DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1807 BaseType, SizeInBits, AlignInBits, 1808 OffsetInBits, Flags, Elements, RuntimeLang, 1809 VTableHolder, TemplateParams, Identifier); 1810 EXPECT_EQ(SizeInBits, N->getSizeInBits()); 1811 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 1812 EXPECT_EQ(OffsetInBits, N->getOffsetInBits()); 1813 } 1814 1815 TEST_F(DICompositeTypeTest, replaceOperands) { 1816 unsigned Tag = dwarf::DW_TAG_structure_type; 1817 StringRef Name = "some name"; 1818 DIFile *File = getFile(); 1819 unsigned Line = 1; 1820 DIScope *Scope = getSubprogram(); 1821 DIType *BaseType = getCompositeType(); 1822 uint64_t SizeInBits = 2; 1823 uint32_t AlignInBits = 3; 1824 uint64_t OffsetInBits = 4; 1825 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1826 unsigned RuntimeLang = 6; 1827 StringRef Identifier = "some id"; 1828 1829 auto *N = DICompositeType::get( 1830 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1831 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier); 1832 1833 auto *Elements = MDTuple::getDistinct(Context, None); 1834 EXPECT_EQ(nullptr, N->getElements().get()); 1835 N->replaceElements(Elements); 1836 EXPECT_EQ(Elements, N->getElements().get()); 1837 N->replaceElements(nullptr); 1838 EXPECT_EQ(nullptr, N->getElements().get()); 1839 1840 DIType *VTableHolder = getCompositeType(); 1841 EXPECT_EQ(nullptr, N->getVTableHolder()); 1842 N->replaceVTableHolder(VTableHolder); 1843 EXPECT_EQ(VTableHolder, N->getVTableHolder()); 1844 // As an extension, the containing type can be anything. This is 1845 // used by Rust to associate vtables with their concrete type. 1846 DIType *BasicType = getBasicType("basic"); 1847 N->replaceVTableHolder(BasicType); 1848 EXPECT_EQ(BasicType, N->getVTableHolder()); 1849 N->replaceVTableHolder(nullptr); 1850 EXPECT_EQ(nullptr, N->getVTableHolder()); 1851 1852 auto *TemplateParams = MDTuple::getDistinct(Context, None); 1853 EXPECT_EQ(nullptr, N->getTemplateParams().get()); 1854 N->replaceTemplateParams(TemplateParams); 1855 EXPECT_EQ(TemplateParams, N->getTemplateParams().get()); 1856 N->replaceTemplateParams(nullptr); 1857 EXPECT_EQ(nullptr, N->getTemplateParams().get()); 1858 } 1859 1860 TEST_F(DICompositeTypeTest, variant_part) { 1861 unsigned Tag = dwarf::DW_TAG_variant_part; 1862 StringRef Name = "some name"; 1863 DIFile *File = getFile(); 1864 unsigned Line = 1; 1865 DIScope *Scope = getSubprogram(); 1866 DIType *BaseType = getCompositeType(); 1867 uint64_t SizeInBits = 2; 1868 uint32_t AlignInBits = 3; 1869 uint64_t OffsetInBits = 4; 1870 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1871 unsigned RuntimeLang = 6; 1872 StringRef Identifier = "some id"; 1873 DIDerivedType *Discriminator = cast<DIDerivedType>(getDerivedType()); 1874 DIDerivedType *Discriminator2 = cast<DIDerivedType>(getDerivedType()); 1875 1876 EXPECT_NE(Discriminator, Discriminator2); 1877 1878 auto *N = DICompositeType::get( 1879 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1880 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1881 Discriminator); 1882 1883 // Test the hashing. 1884 auto *Same = DICompositeType::get( 1885 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1886 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1887 Discriminator); 1888 auto *Other = DICompositeType::get( 1889 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1890 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1891 Discriminator2); 1892 auto *NoDisc = DICompositeType::get( 1893 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1894 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1895 nullptr); 1896 1897 EXPECT_EQ(N, Same); 1898 EXPECT_NE(Same, Other); 1899 EXPECT_NE(Same, NoDisc); 1900 EXPECT_NE(Other, NoDisc); 1901 1902 EXPECT_EQ(N->getDiscriminator(), Discriminator); 1903 } 1904 1905 TEST_F(DICompositeTypeTest, dynamicArray) { 1906 unsigned Tag = dwarf::DW_TAG_array_type; 1907 StringRef Name = "some name"; 1908 DIFile *File = getFile(); 1909 unsigned Line = 1; 1910 DILocalScope *Scope = getSubprogram(); 1911 DIType *BaseType = getCompositeType(); 1912 uint64_t SizeInBits = 32; 1913 uint32_t AlignInBits = 32; 1914 uint64_t OffsetInBits = 4; 1915 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(3); 1916 unsigned RuntimeLang = 6; 1917 StringRef Identifier = "some id"; 1918 DIType *Type = getDerivedType(); 1919 Metadata *DlVar1 = DILocalVariable::get(Context, Scope, "dl_var1", File, 8, 1920 Type, 2, Flags, 8); 1921 Metadata *DlVar2 = DILocalVariable::get(Context, Scope, "dl_var2", File, 8, 1922 Type, 2, Flags, 8); 1923 uint64_t Elements1[] = {dwarf::DW_OP_push_object_address, dwarf::DW_OP_deref}; 1924 Metadata *DataLocation1 = DIExpression::get(Context, Elements1); 1925 1926 uint64_t Elements2[] = {dwarf::DW_OP_constu, 0}; 1927 Metadata *DataLocation2 = DIExpression::get(Context, Elements2); 1928 1929 uint64_t Elements3[] = {dwarf::DW_OP_constu, 3}; 1930 Metadata *Rank1 = DIExpression::get(Context, Elements3); 1931 1932 uint64_t Elements4[] = {dwarf::DW_OP_constu, 4}; 1933 Metadata *Rank2 = DIExpression::get(Context, Elements4); 1934 1935 ConstantInt *RankInt1 = ConstantInt::get(Context, APInt(7, 0)); 1936 ConstantAsMetadata *RankConst1 = ConstantAsMetadata::get(RankInt1); 1937 ConstantInt *RankInt2 = ConstantInt::get(Context, APInt(6, 0)); 1938 ConstantAsMetadata *RankConst2 = ConstantAsMetadata::get(RankInt2); 1939 auto *N1 = DICompositeType::get( 1940 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1941 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1942 nullptr, DlVar1); 1943 1944 auto *Same1 = DICompositeType::get( 1945 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1946 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1947 nullptr, DlVar1); 1948 1949 auto *Other1 = DICompositeType::get( 1950 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1951 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1952 nullptr, DlVar2); 1953 1954 EXPECT_EQ(N1, Same1); 1955 EXPECT_NE(Same1, Other1); 1956 EXPECT_EQ(N1->getDataLocation(), DlVar1); 1957 1958 auto *N2 = DICompositeType::get( 1959 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1960 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1961 nullptr, DataLocation1); 1962 1963 auto *Same2 = DICompositeType::get( 1964 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1965 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1966 nullptr, DataLocation1); 1967 1968 auto *Other2 = DICompositeType::get( 1969 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1970 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1971 nullptr, DataLocation2); 1972 1973 EXPECT_EQ(N2, Same2); 1974 EXPECT_NE(Same2, Other2); 1975 EXPECT_EQ(N2->getDataLocationExp(), DataLocation1); 1976 1977 auto *N3 = DICompositeType::get( 1978 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1979 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1980 nullptr, DataLocation1, nullptr, nullptr, Rank1); 1981 1982 auto *Same3 = DICompositeType::get( 1983 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1984 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1985 nullptr, DataLocation1, nullptr, nullptr, Rank1); 1986 1987 auto *Other3 = DICompositeType::get( 1988 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1989 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1990 nullptr, DataLocation1, nullptr, nullptr, Rank2); 1991 1992 EXPECT_EQ(N3, Same3); 1993 EXPECT_NE(Same3, Other3); 1994 EXPECT_EQ(N3->getRankExp(), Rank1); 1995 1996 auto *N4 = DICompositeType::get( 1997 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1998 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1999 nullptr, DataLocation1, nullptr, nullptr, RankConst1); 2000 2001 auto *Same4 = DICompositeType::get( 2002 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 2003 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 2004 nullptr, DataLocation1, nullptr, nullptr, RankConst1); 2005 2006 auto *Other4 = DICompositeType::get( 2007 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 2008 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 2009 nullptr, DataLocation1, nullptr, nullptr, RankConst2); 2010 2011 EXPECT_EQ(N4, Same4); 2012 EXPECT_NE(Same4, Other4); 2013 EXPECT_EQ(N4->getRankConst(), RankInt1); 2014 } 2015 2016 typedef MetadataTest DISubroutineTypeTest; 2017 2018 TEST_F(DISubroutineTypeTest, get) { 2019 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(1); 2020 DINode::DIFlags FlagsPOne = static_cast<DINode::DIFlags>(Flags + 1); 2021 MDTuple *TypeArray = getTuple(); 2022 2023 auto *N = DISubroutineType::get(Context, Flags, 0, TypeArray); 2024 EXPECT_EQ(dwarf::DW_TAG_subroutine_type, N->getTag()); 2025 EXPECT_EQ(Flags, N->getFlags()); 2026 EXPECT_EQ(TypeArray, N->getTypeArray().get()); 2027 EXPECT_EQ(N, DISubroutineType::get(Context, Flags, 0, TypeArray)); 2028 2029 EXPECT_NE(N, DISubroutineType::get(Context, FlagsPOne, 0, TypeArray)); 2030 EXPECT_NE(N, DISubroutineType::get(Context, Flags, 0, getTuple())); 2031 2032 // Test the hashing of calling conventions. 2033 auto *Fast = DISubroutineType::get( 2034 Context, Flags, dwarf::DW_CC_BORLAND_msfastcall, TypeArray); 2035 auto *Std = DISubroutineType::get(Context, Flags, 2036 dwarf::DW_CC_BORLAND_stdcall, TypeArray); 2037 EXPECT_EQ(Fast, 2038 DISubroutineType::get(Context, Flags, 2039 dwarf::DW_CC_BORLAND_msfastcall, TypeArray)); 2040 EXPECT_EQ(Std, DISubroutineType::get( 2041 Context, Flags, dwarf::DW_CC_BORLAND_stdcall, TypeArray)); 2042 2043 EXPECT_NE(N, Fast); 2044 EXPECT_NE(N, Std); 2045 EXPECT_NE(Fast, Std); 2046 2047 TempDISubroutineType Temp = N->clone(); 2048 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2049 2050 // Test always-empty operands. 2051 EXPECT_EQ(nullptr, N->getScope()); 2052 EXPECT_EQ(nullptr, N->getFile()); 2053 EXPECT_EQ("", N->getName()); 2054 } 2055 2056 typedef MetadataTest DIFileTest; 2057 2058 TEST_F(DIFileTest, get) { 2059 StringRef Filename = "file"; 2060 StringRef Directory = "dir"; 2061 DIFile::ChecksumKind CSKind = DIFile::ChecksumKind::CSK_MD5; 2062 StringRef ChecksumString = "000102030405060708090a0b0c0d0e0f"; 2063 DIFile::ChecksumInfo<StringRef> Checksum(CSKind, ChecksumString); 2064 StringRef Source = "source"; 2065 auto *N = DIFile::get(Context, Filename, Directory, Checksum, Source); 2066 2067 EXPECT_EQ(dwarf::DW_TAG_file_type, N->getTag()); 2068 EXPECT_EQ(Filename, N->getFilename()); 2069 EXPECT_EQ(Directory, N->getDirectory()); 2070 EXPECT_EQ(Checksum, N->getChecksum()); 2071 EXPECT_EQ(Source, N->getSource()); 2072 EXPECT_EQ(N, DIFile::get(Context, Filename, Directory, Checksum, Source)); 2073 2074 EXPECT_NE(N, DIFile::get(Context, "other", Directory, Checksum, Source)); 2075 EXPECT_NE(N, DIFile::get(Context, Filename, "other", Checksum, Source)); 2076 DIFile::ChecksumInfo<StringRef> OtherChecksum(DIFile::ChecksumKind::CSK_SHA1, ChecksumString); 2077 EXPECT_NE( 2078 N, DIFile::get(Context, Filename, Directory, OtherChecksum)); 2079 StringRef OtherSource = "other"; 2080 EXPECT_NE(N, DIFile::get(Context, Filename, Directory, Checksum, OtherSource)); 2081 EXPECT_NE(N, DIFile::get(Context, Filename, Directory, Checksum)); 2082 EXPECT_NE(N, DIFile::get(Context, Filename, Directory)); 2083 2084 TempDIFile Temp = N->clone(); 2085 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2086 } 2087 2088 TEST_F(DIFileTest, ScopeGetFile) { 2089 // Ensure that DIScope::getFile() returns itself. 2090 DIScope *N = DIFile::get(Context, "file", "dir"); 2091 EXPECT_EQ(N, N->getFile()); 2092 } 2093 2094 typedef MetadataTest DICompileUnitTest; 2095 2096 TEST_F(DICompileUnitTest, get) { 2097 unsigned SourceLanguage = 1; 2098 DIFile *File = getFile(); 2099 StringRef Producer = "some producer"; 2100 bool IsOptimized = false; 2101 StringRef Flags = "flag after flag"; 2102 unsigned RuntimeVersion = 2; 2103 StringRef SplitDebugFilename = "another/file"; 2104 auto EmissionKind = DICompileUnit::FullDebug; 2105 MDTuple *EnumTypes = getTuple(); 2106 MDTuple *RetainedTypes = getTuple(); 2107 MDTuple *GlobalVariables = getTuple(); 2108 MDTuple *ImportedEntities = getTuple(); 2109 uint64_t DWOId = 0x10000000c0ffee; 2110 MDTuple *Macros = getTuple(); 2111 StringRef SysRoot = "/"; 2112 StringRef SDK = "MacOSX.sdk"; 2113 auto *N = DICompileUnit::getDistinct( 2114 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 2115 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 2116 RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, true, 2117 false, DICompileUnit::DebugNameTableKind::Default, false, SysRoot, SDK); 2118 2119 EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag()); 2120 EXPECT_EQ(SourceLanguage, N->getSourceLanguage()); 2121 EXPECT_EQ(File, N->getFile()); 2122 EXPECT_EQ(Producer, N->getProducer()); 2123 EXPECT_EQ(IsOptimized, N->isOptimized()); 2124 EXPECT_EQ(Flags, N->getFlags()); 2125 EXPECT_EQ(RuntimeVersion, N->getRuntimeVersion()); 2126 EXPECT_EQ(SplitDebugFilename, N->getSplitDebugFilename()); 2127 EXPECT_EQ(EmissionKind, N->getEmissionKind()); 2128 EXPECT_EQ(EnumTypes, N->getEnumTypes().get()); 2129 EXPECT_EQ(RetainedTypes, N->getRetainedTypes().get()); 2130 EXPECT_EQ(GlobalVariables, N->getGlobalVariables().get()); 2131 EXPECT_EQ(ImportedEntities, N->getImportedEntities().get()); 2132 EXPECT_EQ(Macros, N->getMacros().get()); 2133 EXPECT_EQ(DWOId, N->getDWOId()); 2134 EXPECT_EQ(SysRoot, N->getSysRoot()); 2135 EXPECT_EQ(SDK, N->getSDK()); 2136 2137 TempDICompileUnit Temp = N->clone(); 2138 EXPECT_EQ(dwarf::DW_TAG_compile_unit, Temp->getTag()); 2139 EXPECT_EQ(SourceLanguage, Temp->getSourceLanguage()); 2140 EXPECT_EQ(File, Temp->getFile()); 2141 EXPECT_EQ(Producer, Temp->getProducer()); 2142 EXPECT_EQ(IsOptimized, Temp->isOptimized()); 2143 EXPECT_EQ(Flags, Temp->getFlags()); 2144 EXPECT_EQ(RuntimeVersion, Temp->getRuntimeVersion()); 2145 EXPECT_EQ(SplitDebugFilename, Temp->getSplitDebugFilename()); 2146 EXPECT_EQ(EmissionKind, Temp->getEmissionKind()); 2147 EXPECT_EQ(EnumTypes, Temp->getEnumTypes().get()); 2148 EXPECT_EQ(RetainedTypes, Temp->getRetainedTypes().get()); 2149 EXPECT_EQ(GlobalVariables, Temp->getGlobalVariables().get()); 2150 EXPECT_EQ(ImportedEntities, Temp->getImportedEntities().get()); 2151 EXPECT_EQ(Macros, Temp->getMacros().get()); 2152 EXPECT_EQ(SysRoot, Temp->getSysRoot()); 2153 EXPECT_EQ(SDK, Temp->getSDK()); 2154 2155 auto *TempAddress = Temp.get(); 2156 auto *Clone = MDNode::replaceWithPermanent(std::move(Temp)); 2157 EXPECT_TRUE(Clone->isDistinct()); 2158 EXPECT_EQ(TempAddress, Clone); 2159 } 2160 2161 TEST_F(DICompileUnitTest, replaceArrays) { 2162 unsigned SourceLanguage = 1; 2163 DIFile *File = getFile(); 2164 StringRef Producer = "some producer"; 2165 bool IsOptimized = false; 2166 StringRef Flags = "flag after flag"; 2167 unsigned RuntimeVersion = 2; 2168 StringRef SplitDebugFilename = "another/file"; 2169 auto EmissionKind = DICompileUnit::FullDebug; 2170 MDTuple *EnumTypes = MDTuple::getDistinct(Context, None); 2171 MDTuple *RetainedTypes = MDTuple::getDistinct(Context, None); 2172 MDTuple *ImportedEntities = MDTuple::getDistinct(Context, None); 2173 uint64_t DWOId = 0xc0ffee; 2174 StringRef SysRoot = "/"; 2175 StringRef SDK = "MacOSX.sdk"; 2176 auto *N = DICompileUnit::getDistinct( 2177 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 2178 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 2179 RetainedTypes, nullptr, ImportedEntities, nullptr, DWOId, true, false, 2180 DICompileUnit::DebugNameTableKind::Default, false, SysRoot, SDK); 2181 2182 auto *GlobalVariables = MDTuple::getDistinct(Context, None); 2183 EXPECT_EQ(nullptr, N->getGlobalVariables().get()); 2184 N->replaceGlobalVariables(GlobalVariables); 2185 EXPECT_EQ(GlobalVariables, N->getGlobalVariables().get()); 2186 N->replaceGlobalVariables(nullptr); 2187 EXPECT_EQ(nullptr, N->getGlobalVariables().get()); 2188 2189 auto *Macros = MDTuple::getDistinct(Context, None); 2190 EXPECT_EQ(nullptr, N->getMacros().get()); 2191 N->replaceMacros(Macros); 2192 EXPECT_EQ(Macros, N->getMacros().get()); 2193 N->replaceMacros(nullptr); 2194 EXPECT_EQ(nullptr, N->getMacros().get()); 2195 } 2196 2197 typedef MetadataTest DISubprogramTest; 2198 2199 TEST_F(DISubprogramTest, get) { 2200 DIScope *Scope = getCompositeType(); 2201 StringRef Name = "name"; 2202 StringRef LinkageName = "linkage"; 2203 DIFile *File = getFile(); 2204 unsigned Line = 2; 2205 DISubroutineType *Type = getSubroutineType(); 2206 bool IsLocalToUnit = false; 2207 bool IsDefinition = true; 2208 unsigned ScopeLine = 3; 2209 DIType *ContainingType = getCompositeType(); 2210 unsigned Virtuality = 2; 2211 unsigned VirtualIndex = 5; 2212 int ThisAdjustment = -3; 2213 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(6); 2214 bool IsOptimized = false; 2215 MDTuple *TemplateParams = getTuple(); 2216 DISubprogram *Declaration = getSubprogram(); 2217 MDTuple *RetainedNodes = getTuple(); 2218 MDTuple *ThrownTypes = getTuple(); 2219 DICompileUnit *Unit = getUnit(); 2220 DISubprogram::DISPFlags SPFlags = 2221 static_cast<DISubprogram::DISPFlags>(Virtuality); 2222 assert(!IsLocalToUnit && IsDefinition && !IsOptimized && 2223 "bools and SPFlags have to match"); 2224 SPFlags |= DISubprogram::SPFlagDefinition; 2225 2226 auto *N = DISubprogram::get( 2227 Context, Scope, Name, LinkageName, File, Line, Type, ScopeLine, 2228 ContainingType, VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, 2229 TemplateParams, Declaration, RetainedNodes, ThrownTypes); 2230 2231 EXPECT_EQ(dwarf::DW_TAG_subprogram, N->getTag()); 2232 EXPECT_EQ(Scope, N->getScope()); 2233 EXPECT_EQ(Name, N->getName()); 2234 EXPECT_EQ(LinkageName, N->getLinkageName()); 2235 EXPECT_EQ(File, N->getFile()); 2236 EXPECT_EQ(Line, N->getLine()); 2237 EXPECT_EQ(Type, N->getType()); 2238 EXPECT_EQ(IsLocalToUnit, N->isLocalToUnit()); 2239 EXPECT_EQ(IsDefinition, N->isDefinition()); 2240 EXPECT_EQ(ScopeLine, N->getScopeLine()); 2241 EXPECT_EQ(ContainingType, N->getContainingType()); 2242 EXPECT_EQ(Virtuality, N->getVirtuality()); 2243 EXPECT_EQ(VirtualIndex, N->getVirtualIndex()); 2244 EXPECT_EQ(ThisAdjustment, N->getThisAdjustment()); 2245 EXPECT_EQ(Flags, N->getFlags()); 2246 EXPECT_EQ(IsOptimized, N->isOptimized()); 2247 EXPECT_EQ(Unit, N->getUnit()); 2248 EXPECT_EQ(TemplateParams, N->getTemplateParams().get()); 2249 EXPECT_EQ(Declaration, N->getDeclaration()); 2250 EXPECT_EQ(RetainedNodes, N->getRetainedNodes().get()); 2251 EXPECT_EQ(ThrownTypes, N->getThrownTypes().get()); 2252 EXPECT_EQ(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2253 Type, ScopeLine, ContainingType, VirtualIndex, 2254 ThisAdjustment, Flags, SPFlags, Unit, 2255 TemplateParams, Declaration, RetainedNodes, 2256 ThrownTypes)); 2257 2258 EXPECT_NE(N, DISubprogram::get(Context, getCompositeType(), Name, LinkageName, 2259 File, Line, Type, ScopeLine, ContainingType, 2260 VirtualIndex, ThisAdjustment, Flags, SPFlags, 2261 Unit, TemplateParams, Declaration, 2262 RetainedNodes, ThrownTypes)); 2263 EXPECT_NE(N, DISubprogram::get(Context, Scope, "other", LinkageName, File, 2264 Line, Type, ScopeLine, ContainingType, 2265 VirtualIndex, ThisAdjustment, Flags, SPFlags, 2266 Unit, TemplateParams, Declaration, 2267 RetainedNodes, ThrownTypes)); 2268 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, "other", File, Line, 2269 Type, ScopeLine, ContainingType, VirtualIndex, 2270 ThisAdjustment, Flags, SPFlags, Unit, 2271 TemplateParams, Declaration, RetainedNodes, 2272 ThrownTypes)); 2273 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, getFile(), 2274 Line, Type, ScopeLine, ContainingType, 2275 VirtualIndex, ThisAdjustment, Flags, SPFlags, 2276 Unit, TemplateParams, Declaration, 2277 RetainedNodes, ThrownTypes)); 2278 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, 2279 Line + 1, Type, ScopeLine, ContainingType, 2280 VirtualIndex, ThisAdjustment, Flags, SPFlags, 2281 Unit, TemplateParams, Declaration, 2282 RetainedNodes, ThrownTypes)); 2283 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2284 getSubroutineType(), ScopeLine, ContainingType, 2285 VirtualIndex, ThisAdjustment, Flags, SPFlags, 2286 Unit, TemplateParams, Declaration, 2287 RetainedNodes, ThrownTypes)); 2288 EXPECT_NE(N, DISubprogram::get( 2289 Context, Scope, Name, LinkageName, File, Line, Type, 2290 ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, 2291 Flags, SPFlags ^ DISubprogram::SPFlagLocalToUnit, Unit, 2292 TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 2293 EXPECT_NE(N, DISubprogram::get( 2294 Context, Scope, Name, LinkageName, File, Line, Type, 2295 ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, 2296 Flags, SPFlags ^ DISubprogram::SPFlagDefinition, Unit, 2297 TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 2298 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2299 Type, ScopeLine + 1, ContainingType, 2300 VirtualIndex, ThisAdjustment, Flags, SPFlags, 2301 Unit, TemplateParams, Declaration, 2302 RetainedNodes, ThrownTypes)); 2303 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2304 Type, ScopeLine, getCompositeType(), 2305 VirtualIndex, ThisAdjustment, Flags, SPFlags, 2306 Unit, TemplateParams, Declaration, 2307 RetainedNodes, ThrownTypes)); 2308 EXPECT_NE(N, DISubprogram::get( 2309 Context, Scope, Name, LinkageName, File, Line, Type, 2310 ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, 2311 Flags, SPFlags ^ DISubprogram::SPFlagVirtual, Unit, 2312 TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 2313 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2314 Type, ScopeLine, ContainingType, 2315 VirtualIndex + 1, ThisAdjustment, Flags, 2316 SPFlags, Unit, TemplateParams, Declaration, 2317 RetainedNodes, ThrownTypes)); 2318 EXPECT_NE(N, DISubprogram::get( 2319 Context, Scope, Name, LinkageName, File, Line, Type, 2320 ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, 2321 Flags, SPFlags ^ DISubprogram::SPFlagOptimized, Unit, 2322 TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 2323 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2324 Type, ScopeLine, ContainingType, VirtualIndex, 2325 ThisAdjustment, Flags, SPFlags, nullptr, 2326 TemplateParams, Declaration, RetainedNodes, 2327 ThrownTypes)); 2328 EXPECT_NE(N, 2329 DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2330 Type, ScopeLine, ContainingType, VirtualIndex, 2331 ThisAdjustment, Flags, SPFlags, Unit, getTuple(), 2332 Declaration, RetainedNodes, ThrownTypes)); 2333 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2334 Type, ScopeLine, ContainingType, VirtualIndex, 2335 ThisAdjustment, Flags, SPFlags, Unit, 2336 TemplateParams, getSubprogram(), RetainedNodes, 2337 ThrownTypes)); 2338 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2339 Type, ScopeLine, ContainingType, VirtualIndex, 2340 ThisAdjustment, Flags, SPFlags, Unit, 2341 TemplateParams, Declaration, getTuple())); 2342 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 2343 Type, ScopeLine, ContainingType, VirtualIndex, 2344 ThisAdjustment, Flags, SPFlags, Unit, 2345 TemplateParams, Declaration, RetainedNodes, 2346 getTuple())); 2347 2348 TempDISubprogram Temp = N->clone(); 2349 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2350 } 2351 2352 typedef MetadataTest DILexicalBlockTest; 2353 2354 TEST_F(DILexicalBlockTest, get) { 2355 DILocalScope *Scope = getSubprogram(); 2356 DIFile *File = getFile(); 2357 unsigned Line = 5; 2358 unsigned Column = 8; 2359 2360 auto *N = DILexicalBlock::get(Context, Scope, File, Line, Column); 2361 2362 EXPECT_EQ(dwarf::DW_TAG_lexical_block, N->getTag()); 2363 EXPECT_EQ(Scope, N->getScope()); 2364 EXPECT_EQ(File, N->getFile()); 2365 EXPECT_EQ(Line, N->getLine()); 2366 EXPECT_EQ(Column, N->getColumn()); 2367 EXPECT_EQ(N, DILexicalBlock::get(Context, Scope, File, Line, Column)); 2368 2369 EXPECT_NE(N, 2370 DILexicalBlock::get(Context, getSubprogram(), File, Line, Column)); 2371 EXPECT_NE(N, DILexicalBlock::get(Context, Scope, getFile(), Line, Column)); 2372 EXPECT_NE(N, DILexicalBlock::get(Context, Scope, File, Line + 1, Column)); 2373 EXPECT_NE(N, DILexicalBlock::get(Context, Scope, File, Line, Column + 1)); 2374 2375 TempDILexicalBlock Temp = N->clone(); 2376 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2377 } 2378 2379 TEST_F(DILexicalBlockTest, Overflow) { 2380 DISubprogram *SP = getSubprogram(); 2381 DIFile *F = getFile(); 2382 { 2383 auto *LB = DILexicalBlock::get(Context, SP, F, 2, 7); 2384 EXPECT_EQ(2u, LB->getLine()); 2385 EXPECT_EQ(7u, LB->getColumn()); 2386 } 2387 unsigned U16 = 1u << 16; 2388 { 2389 auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16 - 1); 2390 EXPECT_EQ(UINT32_MAX, LB->getLine()); 2391 EXPECT_EQ(U16 - 1, LB->getColumn()); 2392 } 2393 { 2394 auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16); 2395 EXPECT_EQ(UINT32_MAX, LB->getLine()); 2396 EXPECT_EQ(0u, LB->getColumn()); 2397 } 2398 { 2399 auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16 + 1); 2400 EXPECT_EQ(UINT32_MAX, LB->getLine()); 2401 EXPECT_EQ(0u, LB->getColumn()); 2402 } 2403 } 2404 2405 typedef MetadataTest DILexicalBlockFileTest; 2406 2407 TEST_F(DILexicalBlockFileTest, get) { 2408 DILocalScope *Scope = getSubprogram(); 2409 DIFile *File = getFile(); 2410 unsigned Discriminator = 5; 2411 2412 auto *N = DILexicalBlockFile::get(Context, Scope, File, Discriminator); 2413 2414 EXPECT_EQ(dwarf::DW_TAG_lexical_block, N->getTag()); 2415 EXPECT_EQ(Scope, N->getScope()); 2416 EXPECT_EQ(File, N->getFile()); 2417 EXPECT_EQ(Discriminator, N->getDiscriminator()); 2418 EXPECT_EQ(N, DILexicalBlockFile::get(Context, Scope, File, Discriminator)); 2419 2420 EXPECT_NE(N, DILexicalBlockFile::get(Context, getSubprogram(), File, 2421 Discriminator)); 2422 EXPECT_NE(N, 2423 DILexicalBlockFile::get(Context, Scope, getFile(), Discriminator)); 2424 EXPECT_NE(N, 2425 DILexicalBlockFile::get(Context, Scope, File, Discriminator + 1)); 2426 2427 TempDILexicalBlockFile Temp = N->clone(); 2428 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2429 } 2430 2431 typedef MetadataTest DINamespaceTest; 2432 2433 TEST_F(DINamespaceTest, get) { 2434 DIScope *Scope = getFile(); 2435 StringRef Name = "namespace"; 2436 bool ExportSymbols = true; 2437 2438 auto *N = DINamespace::get(Context, Scope, Name, ExportSymbols); 2439 2440 EXPECT_EQ(dwarf::DW_TAG_namespace, N->getTag()); 2441 EXPECT_EQ(Scope, N->getScope()); 2442 EXPECT_EQ(Name, N->getName()); 2443 EXPECT_EQ(N, DINamespace::get(Context, Scope, Name, ExportSymbols)); 2444 EXPECT_NE(N, DINamespace::get(Context, getFile(), Name, ExportSymbols)); 2445 EXPECT_NE(N, DINamespace::get(Context, Scope, "other", ExportSymbols)); 2446 EXPECT_NE(N, DINamespace::get(Context, Scope, Name, !ExportSymbols)); 2447 2448 TempDINamespace Temp = N->clone(); 2449 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2450 } 2451 2452 typedef MetadataTest DIModuleTest; 2453 2454 TEST_F(DIModuleTest, get) { 2455 DIFile *File = getFile(); 2456 DIScope *Scope = getFile(); 2457 StringRef Name = "module"; 2458 StringRef ConfigMacro = "-DNDEBUG"; 2459 StringRef Includes = "-I."; 2460 StringRef APINotes = "/tmp/m.apinotes"; 2461 unsigned LineNo = 4; 2462 bool IsDecl = true; 2463 2464 auto *N = DIModule::get(Context, File, Scope, Name, ConfigMacro, Includes, 2465 APINotes, LineNo, IsDecl); 2466 2467 EXPECT_EQ(dwarf::DW_TAG_module, N->getTag()); 2468 EXPECT_EQ(File, N->getFile()); 2469 EXPECT_EQ(Scope, N->getScope()); 2470 EXPECT_EQ(Name, N->getName()); 2471 EXPECT_EQ(ConfigMacro, N->getConfigurationMacros()); 2472 EXPECT_EQ(Includes, N->getIncludePath()); 2473 EXPECT_EQ(APINotes, N->getAPINotesFile()); 2474 EXPECT_EQ(LineNo, N->getLineNo()); 2475 EXPECT_EQ(IsDecl, N->getIsDecl()); 2476 EXPECT_EQ(N, DIModule::get(Context, File, Scope, Name, ConfigMacro, Includes, 2477 APINotes, LineNo, IsDecl)); 2478 EXPECT_NE(N, DIModule::get(Context, getFile(), getFile(), Name, ConfigMacro, 2479 Includes, APINotes, LineNo, IsDecl)); 2480 EXPECT_NE(N, DIModule::get(Context, File, Scope, "other", ConfigMacro, 2481 Includes, APINotes, LineNo, IsDecl)); 2482 EXPECT_NE(N, DIModule::get(Context, File, Scope, Name, "other", Includes, 2483 APINotes, LineNo, IsDecl)); 2484 EXPECT_NE(N, DIModule::get(Context, File, Scope, Name, ConfigMacro, "other", 2485 APINotes, LineNo, IsDecl)); 2486 EXPECT_NE(N, DIModule::get(Context, File, Scope, Name, ConfigMacro, Includes, 2487 "other", LineNo, IsDecl)); 2488 EXPECT_NE(N, DIModule::get(Context, getFile(), Scope, Name, ConfigMacro, 2489 Includes, APINotes, LineNo, IsDecl)); 2490 EXPECT_NE(N, DIModule::get(Context, File, Scope, Name, ConfigMacro, Includes, 2491 APINotes, 5, IsDecl)); 2492 EXPECT_NE(N, DIModule::get(Context, File, Scope, Name, ConfigMacro, Includes, 2493 APINotes, LineNo, false)); 2494 2495 TempDIModule Temp = N->clone(); 2496 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2497 } 2498 2499 typedef MetadataTest DITemplateTypeParameterTest; 2500 2501 TEST_F(DITemplateTypeParameterTest, get) { 2502 StringRef Name = "template"; 2503 DIType *Type = getBasicType("basic"); 2504 bool defaulted = false; 2505 2506 auto *N = DITemplateTypeParameter::get(Context, Name, Type, defaulted); 2507 2508 EXPECT_EQ(dwarf::DW_TAG_template_type_parameter, N->getTag()); 2509 EXPECT_EQ(Name, N->getName()); 2510 EXPECT_EQ(Type, N->getType()); 2511 EXPECT_EQ(N, DITemplateTypeParameter::get(Context, Name, Type, defaulted)); 2512 2513 EXPECT_NE(N, DITemplateTypeParameter::get(Context, "other", Type, defaulted)); 2514 EXPECT_NE(N, DITemplateTypeParameter::get(Context, Name, 2515 getBasicType("other"), defaulted)); 2516 EXPECT_NE(N, DITemplateTypeParameter::get(Context, Name, Type, true)); 2517 2518 TempDITemplateTypeParameter Temp = N->clone(); 2519 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2520 } 2521 2522 typedef MetadataTest DITemplateValueParameterTest; 2523 2524 TEST_F(DITemplateValueParameterTest, get) { 2525 unsigned Tag = dwarf::DW_TAG_template_value_parameter; 2526 StringRef Name = "template"; 2527 DIType *Type = getBasicType("basic"); 2528 bool defaulted = false; 2529 Metadata *Value = getConstantAsMetadata(); 2530 2531 auto *N = 2532 DITemplateValueParameter::get(Context, Tag, Name, Type, defaulted, Value); 2533 EXPECT_EQ(Tag, N->getTag()); 2534 EXPECT_EQ(Name, N->getName()); 2535 EXPECT_EQ(Type, N->getType()); 2536 EXPECT_EQ(Value, N->getValue()); 2537 EXPECT_EQ(N, DITemplateValueParameter::get(Context, Tag, Name, Type, 2538 defaulted, Value)); 2539 2540 EXPECT_NE(N, DITemplateValueParameter::get( 2541 Context, dwarf::DW_TAG_GNU_template_template_param, Name, 2542 Type, defaulted, Value)); 2543 EXPECT_NE(N, DITemplateValueParameter::get(Context, Tag, "other", Type, 2544 defaulted, Value)); 2545 EXPECT_NE(N, DITemplateValueParameter::get(Context, Tag, Name, 2546 getBasicType("other"), defaulted, 2547 Value)); 2548 EXPECT_NE(N, 2549 DITemplateValueParameter::get(Context, Tag, Name, Type, defaulted, 2550 getConstantAsMetadata())); 2551 EXPECT_NE( 2552 N, DITemplateValueParameter::get(Context, Tag, Name, Type, true, Value)); 2553 2554 TempDITemplateValueParameter Temp = N->clone(); 2555 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2556 } 2557 2558 typedef MetadataTest DIGlobalVariableTest; 2559 2560 TEST_F(DIGlobalVariableTest, get) { 2561 DIScope *Scope = getSubprogram(); 2562 StringRef Name = "name"; 2563 StringRef LinkageName = "linkage"; 2564 DIFile *File = getFile(); 2565 unsigned Line = 5; 2566 DIType *Type = getDerivedType(); 2567 bool IsLocalToUnit = false; 2568 bool IsDefinition = true; 2569 MDTuple *templateParams = getTuple(); 2570 DIDerivedType *StaticDataMemberDeclaration = 2571 cast<DIDerivedType>(getDerivedType()); 2572 2573 uint32_t AlignInBits = 8; 2574 2575 auto *N = DIGlobalVariable::get( 2576 Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 2577 IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits); 2578 2579 EXPECT_EQ(dwarf::DW_TAG_variable, N->getTag()); 2580 EXPECT_EQ(Scope, N->getScope()); 2581 EXPECT_EQ(Name, N->getName()); 2582 EXPECT_EQ(LinkageName, N->getLinkageName()); 2583 EXPECT_EQ(File, N->getFile()); 2584 EXPECT_EQ(Line, N->getLine()); 2585 EXPECT_EQ(Type, N->getType()); 2586 EXPECT_EQ(IsLocalToUnit, N->isLocalToUnit()); 2587 EXPECT_EQ(IsDefinition, N->isDefinition()); 2588 EXPECT_EQ(StaticDataMemberDeclaration, N->getStaticDataMemberDeclaration()); 2589 EXPECT_EQ(templateParams, N->getTemplateParams()); 2590 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 2591 EXPECT_EQ(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2592 Line, Type, IsLocalToUnit, IsDefinition, 2593 StaticDataMemberDeclaration, 2594 templateParams, AlignInBits)); 2595 2596 EXPECT_NE(N, DIGlobalVariable::get( 2597 Context, getSubprogram(), Name, LinkageName, File, Line, 2598 Type, IsLocalToUnit, IsDefinition, 2599 StaticDataMemberDeclaration, templateParams, AlignInBits)); 2600 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, "other", LinkageName, File, 2601 Line, Type, IsLocalToUnit, IsDefinition, 2602 StaticDataMemberDeclaration, 2603 templateParams, AlignInBits)); 2604 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, "other", File, Line, 2605 Type, IsLocalToUnit, IsDefinition, 2606 StaticDataMemberDeclaration, 2607 templateParams, AlignInBits)); 2608 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, 2609 getFile(), Line, Type, IsLocalToUnit, 2610 IsDefinition, StaticDataMemberDeclaration, 2611 templateParams, AlignInBits)); 2612 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2613 Line + 1, Type, IsLocalToUnit, 2614 IsDefinition, StaticDataMemberDeclaration, 2615 templateParams, AlignInBits)); 2616 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2617 Line, getDerivedType(), IsLocalToUnit, 2618 IsDefinition, StaticDataMemberDeclaration, 2619 templateParams, AlignInBits)); 2620 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2621 Line, Type, !IsLocalToUnit, IsDefinition, 2622 StaticDataMemberDeclaration, 2623 templateParams, AlignInBits)); 2624 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2625 Line, Type, IsLocalToUnit, !IsDefinition, 2626 StaticDataMemberDeclaration, 2627 templateParams, AlignInBits)); 2628 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2629 Line, Type, IsLocalToUnit, IsDefinition, 2630 cast<DIDerivedType>(getDerivedType()), 2631 templateParams, AlignInBits)); 2632 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2633 Line, Type, IsLocalToUnit, IsDefinition, 2634 StaticDataMemberDeclaration, nullptr, 2635 AlignInBits)); 2636 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2637 Line, Type, IsLocalToUnit, IsDefinition, 2638 StaticDataMemberDeclaration, 2639 templateParams, (AlignInBits << 1))); 2640 2641 TempDIGlobalVariable Temp = N->clone(); 2642 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2643 } 2644 2645 typedef MetadataTest DIGlobalVariableExpressionTest; 2646 2647 TEST_F(DIGlobalVariableExpressionTest, get) { 2648 DIScope *Scope = getSubprogram(); 2649 StringRef Name = "name"; 2650 StringRef LinkageName = "linkage"; 2651 DIFile *File = getFile(); 2652 unsigned Line = 5; 2653 DIType *Type = getDerivedType(); 2654 bool IsLocalToUnit = false; 2655 bool IsDefinition = true; 2656 MDTuple *templateParams = getTuple(); 2657 auto *Expr = DIExpression::get(Context, {1, 2}); 2658 auto *Expr2 = DIExpression::get(Context, {1, 2, 3}); 2659 DIDerivedType *StaticDataMemberDeclaration = 2660 cast<DIDerivedType>(getDerivedType()); 2661 uint32_t AlignInBits = 8; 2662 2663 auto *Var = DIGlobalVariable::get( 2664 Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 2665 IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits); 2666 auto *Var2 = DIGlobalVariable::get( 2667 Context, Scope, "other", LinkageName, File, Line, Type, IsLocalToUnit, 2668 IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits); 2669 auto *N = DIGlobalVariableExpression::get(Context, Var, Expr); 2670 2671 EXPECT_EQ(Var, N->getVariable()); 2672 EXPECT_EQ(Expr, N->getExpression()); 2673 EXPECT_EQ(N, DIGlobalVariableExpression::get(Context, Var, Expr)); 2674 EXPECT_NE(N, DIGlobalVariableExpression::get(Context, Var2, Expr)); 2675 EXPECT_NE(N, DIGlobalVariableExpression::get(Context, Var, Expr2)); 2676 2677 TempDIGlobalVariableExpression Temp = N->clone(); 2678 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2679 } 2680 2681 typedef MetadataTest DILocalVariableTest; 2682 2683 TEST_F(DILocalVariableTest, get) { 2684 DILocalScope *Scope = getSubprogram(); 2685 StringRef Name = "name"; 2686 DIFile *File = getFile(); 2687 unsigned Line = 5; 2688 DIType *Type = getDerivedType(); 2689 unsigned Arg = 6; 2690 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 2691 uint32_t AlignInBits = 8; 2692 2693 auto *N = 2694 DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg, Flags, 2695 AlignInBits); 2696 EXPECT_TRUE(N->isParameter()); 2697 EXPECT_EQ(Scope, N->getScope()); 2698 EXPECT_EQ(Name, N->getName()); 2699 EXPECT_EQ(File, N->getFile()); 2700 EXPECT_EQ(Line, N->getLine()); 2701 EXPECT_EQ(Type, N->getType()); 2702 EXPECT_EQ(Arg, N->getArg()); 2703 EXPECT_EQ(Flags, N->getFlags()); 2704 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 2705 EXPECT_EQ(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg, 2706 Flags, AlignInBits)); 2707 2708 EXPECT_FALSE( 2709 DILocalVariable::get(Context, Scope, Name, File, Line, Type, 0, Flags, 2710 AlignInBits)->isParameter()); 2711 EXPECT_NE(N, DILocalVariable::get(Context, getSubprogram(), Name, File, Line, 2712 Type, Arg, Flags, AlignInBits)); 2713 EXPECT_NE(N, DILocalVariable::get(Context, Scope, "other", File, Line, Type, 2714 Arg, Flags, AlignInBits)); 2715 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, getFile(), Line, Type, 2716 Arg, Flags, AlignInBits)); 2717 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line + 1, Type, 2718 Arg, Flags, AlignInBits)); 2719 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, 2720 getDerivedType(), Arg, Flags, AlignInBits)); 2721 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, 2722 Arg + 1, Flags, AlignInBits)); 2723 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, 2724 Arg, Flags, (AlignInBits << 1))); 2725 2726 TempDILocalVariable Temp = N->clone(); 2727 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2728 } 2729 2730 TEST_F(DILocalVariableTest, getArg256) { 2731 EXPECT_EQ(255u, DILocalVariable::get(Context, getSubprogram(), "", getFile(), 2732 0, nullptr, 255, DINode::FlagZero, 0) 2733 ->getArg()); 2734 EXPECT_EQ(256u, DILocalVariable::get(Context, getSubprogram(), "", getFile(), 2735 0, nullptr, 256, DINode::FlagZero, 0) 2736 ->getArg()); 2737 EXPECT_EQ(257u, DILocalVariable::get(Context, getSubprogram(), "", getFile(), 2738 0, nullptr, 257, DINode::FlagZero, 0) 2739 ->getArg()); 2740 unsigned Max = UINT16_MAX; 2741 EXPECT_EQ(Max, DILocalVariable::get(Context, getSubprogram(), "", getFile(), 2742 0, nullptr, Max, DINode::FlagZero, 0) 2743 ->getArg()); 2744 } 2745 2746 typedef MetadataTest DIExpressionTest; 2747 2748 TEST_F(DIExpressionTest, get) { 2749 uint64_t Elements[] = {2, 6, 9, 78, 0}; 2750 auto *N = DIExpression::get(Context, Elements); 2751 EXPECT_EQ(makeArrayRef(Elements), N->getElements()); 2752 EXPECT_EQ(N, DIExpression::get(Context, Elements)); 2753 2754 EXPECT_EQ(5u, N->getNumElements()); 2755 EXPECT_EQ(2u, N->getElement(0)); 2756 EXPECT_EQ(6u, N->getElement(1)); 2757 EXPECT_EQ(9u, N->getElement(2)); 2758 EXPECT_EQ(78u, N->getElement(3)); 2759 EXPECT_EQ(0u, N->getElement(4)); 2760 2761 TempDIExpression Temp = N->clone(); 2762 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2763 2764 // Test DIExpression::prepend(). 2765 uint64_t Elts0[] = {dwarf::DW_OP_LLVM_fragment, 0, 32}; 2766 auto *N0 = DIExpression::get(Context, Elts0); 2767 uint8_t DIExprFlags = DIExpression::ApplyOffset; 2768 DIExprFlags |= DIExpression::DerefBefore; 2769 DIExprFlags |= DIExpression::DerefAfter; 2770 DIExprFlags |= DIExpression::StackValue; 2771 auto *N0WithPrependedOps = DIExpression::prepend(N0, DIExprFlags, 64); 2772 uint64_t Elts1[] = {dwarf::DW_OP_deref, 2773 dwarf::DW_OP_plus_uconst, 64, 2774 dwarf::DW_OP_deref, 2775 dwarf::DW_OP_stack_value, 2776 dwarf::DW_OP_LLVM_fragment, 0, 32}; 2777 auto *N1 = DIExpression::get(Context, Elts1); 2778 EXPECT_EQ(N0WithPrependedOps, N1); 2779 2780 // Test DIExpression::append(). 2781 uint64_t Elts2[] = {dwarf::DW_OP_deref, dwarf::DW_OP_plus_uconst, 64, 2782 dwarf::DW_OP_deref, dwarf::DW_OP_stack_value}; 2783 auto *N2 = DIExpression::append(N0, Elts2); 2784 EXPECT_EQ(N0WithPrependedOps, N2); 2785 } 2786 2787 TEST_F(DIExpressionTest, isValid) { 2788 #define EXPECT_VALID(...) \ 2789 do { \ 2790 uint64_t Elements[] = {__VA_ARGS__}; \ 2791 EXPECT_TRUE(DIExpression::get(Context, Elements)->isValid()); \ 2792 } while (false) 2793 #define EXPECT_INVALID(...) \ 2794 do { \ 2795 uint64_t Elements[] = {__VA_ARGS__}; \ 2796 EXPECT_FALSE(DIExpression::get(Context, Elements)->isValid()); \ 2797 } while (false) 2798 2799 // Empty expression should be valid. 2800 EXPECT_TRUE(DIExpression::get(Context, None)); 2801 2802 // Valid constructions. 2803 EXPECT_VALID(dwarf::DW_OP_plus_uconst, 6); 2804 EXPECT_VALID(dwarf::DW_OP_constu, 6, dwarf::DW_OP_plus); 2805 EXPECT_VALID(dwarf::DW_OP_deref); 2806 EXPECT_VALID(dwarf::DW_OP_LLVM_fragment, 3, 7); 2807 EXPECT_VALID(dwarf::DW_OP_plus_uconst, 6, dwarf::DW_OP_deref); 2808 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_plus_uconst, 6); 2809 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_LLVM_fragment, 3, 7); 2810 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_plus_uconst, 6, 2811 dwarf::DW_OP_LLVM_fragment, 3, 7); 2812 2813 // Invalid constructions. 2814 EXPECT_INVALID(~0u); 2815 EXPECT_INVALID(dwarf::DW_OP_plus, 0); 2816 EXPECT_INVALID(dwarf::DW_OP_plus_uconst); 2817 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment); 2818 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment, 3); 2819 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment, 3, 7, dwarf::DW_OP_plus_uconst, 3); 2820 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment, 3, 7, dwarf::DW_OP_deref); 2821 2822 #undef EXPECT_VALID 2823 #undef EXPECT_INVALID 2824 } 2825 2826 TEST_F(DIExpressionTest, createFragmentExpression) { 2827 #define EXPECT_VALID_FRAGMENT(Offset, Size, ...) \ 2828 do { \ 2829 uint64_t Elements[] = {__VA_ARGS__}; \ 2830 DIExpression* Expression = DIExpression::get(Context, Elements); \ 2831 EXPECT_TRUE(DIExpression::createFragmentExpression( \ 2832 Expression, Offset, Size).hasValue()); \ 2833 } while (false) 2834 #define EXPECT_INVALID_FRAGMENT(Offset, Size, ...) \ 2835 do { \ 2836 uint64_t Elements[] = {__VA_ARGS__}; \ 2837 DIExpression* Expression = DIExpression::get(Context, Elements); \ 2838 EXPECT_FALSE(DIExpression::createFragmentExpression( \ 2839 Expression, Offset, Size).hasValue()); \ 2840 } while (false) 2841 2842 // createFragmentExpression adds correct ops. 2843 Optional<DIExpression*> R = DIExpression::createFragmentExpression( 2844 DIExpression::get(Context, {}), 0, 32); 2845 EXPECT_EQ(R.hasValue(), true); 2846 EXPECT_EQ(3u, (*R)->getNumElements()); 2847 EXPECT_EQ(dwarf::DW_OP_LLVM_fragment, (*R)->getElement(0)); 2848 EXPECT_EQ(0u, (*R)->getElement(1)); 2849 EXPECT_EQ(32u, (*R)->getElement(2)); 2850 2851 // Valid fragment expressions. 2852 EXPECT_VALID_FRAGMENT(0, 32, {}); 2853 EXPECT_VALID_FRAGMENT(0, 32, dwarf::DW_OP_deref); 2854 EXPECT_VALID_FRAGMENT(0, 32, dwarf::DW_OP_LLVM_fragment, 0, 32); 2855 EXPECT_VALID_FRAGMENT(16, 16, dwarf::DW_OP_LLVM_fragment, 0, 32); 2856 2857 // Invalid fragment expressions (incompatible ops). 2858 EXPECT_INVALID_FRAGMENT(0, 32, dwarf::DW_OP_constu, 6, dwarf::DW_OP_plus); 2859 EXPECT_INVALID_FRAGMENT(0, 32, dwarf::DW_OP_constu, 14, dwarf::DW_OP_minus); 2860 EXPECT_INVALID_FRAGMENT(0, 32, dwarf::DW_OP_constu, 16, dwarf::DW_OP_shr); 2861 EXPECT_INVALID_FRAGMENT(0, 32, dwarf::DW_OP_constu, 16, dwarf::DW_OP_shl); 2862 EXPECT_INVALID_FRAGMENT(0, 32, dwarf::DW_OP_constu, 16, dwarf::DW_OP_shra); 2863 EXPECT_INVALID_FRAGMENT(0, 32, dwarf::DW_OP_plus_uconst, 6); 2864 2865 #undef EXPECT_VALID_FRAGMENT 2866 #undef EXPECT_INVALID_FRAGMENT 2867 } 2868 2869 typedef MetadataTest DIObjCPropertyTest; 2870 2871 TEST_F(DIObjCPropertyTest, get) { 2872 StringRef Name = "name"; 2873 DIFile *File = getFile(); 2874 unsigned Line = 5; 2875 StringRef GetterName = "getter"; 2876 StringRef SetterName = "setter"; 2877 unsigned Attributes = 7; 2878 DIType *Type = getBasicType("basic"); 2879 2880 auto *N = DIObjCProperty::get(Context, Name, File, Line, GetterName, 2881 SetterName, Attributes, Type); 2882 2883 EXPECT_EQ(dwarf::DW_TAG_APPLE_property, N->getTag()); 2884 EXPECT_EQ(Name, N->getName()); 2885 EXPECT_EQ(File, N->getFile()); 2886 EXPECT_EQ(Line, N->getLine()); 2887 EXPECT_EQ(GetterName, N->getGetterName()); 2888 EXPECT_EQ(SetterName, N->getSetterName()); 2889 EXPECT_EQ(Attributes, N->getAttributes()); 2890 EXPECT_EQ(Type, N->getType()); 2891 EXPECT_EQ(N, DIObjCProperty::get(Context, Name, File, Line, GetterName, 2892 SetterName, Attributes, Type)); 2893 2894 EXPECT_NE(N, DIObjCProperty::get(Context, "other", File, Line, GetterName, 2895 SetterName, Attributes, Type)); 2896 EXPECT_NE(N, DIObjCProperty::get(Context, Name, getFile(), Line, GetterName, 2897 SetterName, Attributes, Type)); 2898 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line + 1, GetterName, 2899 SetterName, Attributes, Type)); 2900 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, "other", 2901 SetterName, Attributes, Type)); 2902 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName, 2903 "other", Attributes, Type)); 2904 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName, 2905 SetterName, Attributes + 1, Type)); 2906 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName, 2907 SetterName, Attributes, 2908 getBasicType("other"))); 2909 2910 TempDIObjCProperty Temp = N->clone(); 2911 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2912 } 2913 2914 typedef MetadataTest DIImportedEntityTest; 2915 2916 TEST_F(DIImportedEntityTest, get) { 2917 unsigned Tag = dwarf::DW_TAG_imported_module; 2918 DIScope *Scope = getSubprogram(); 2919 DINode *Entity = getCompositeType(); 2920 DIFile *File = getFile(); 2921 unsigned Line = 5; 2922 StringRef Name = "name"; 2923 2924 auto *N = 2925 DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line, Name); 2926 2927 EXPECT_EQ(Tag, N->getTag()); 2928 EXPECT_EQ(Scope, N->getScope()); 2929 EXPECT_EQ(Entity, N->getEntity()); 2930 EXPECT_EQ(File, N->getFile()); 2931 EXPECT_EQ(Line, N->getLine()); 2932 EXPECT_EQ(Name, N->getName()); 2933 EXPECT_EQ( 2934 N, DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line, Name)); 2935 2936 EXPECT_NE(N, 2937 DIImportedEntity::get(Context, dwarf::DW_TAG_imported_declaration, 2938 Scope, Entity, File, Line, Name)); 2939 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, getSubprogram(), Entity, 2940 File, Line, Name)); 2941 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, getCompositeType(), 2942 File, Line, Name)); 2943 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, nullptr, Line, 2944 Name)); 2945 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, File, 2946 Line + 1, Name)); 2947 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line, 2948 "other")); 2949 2950 TempDIImportedEntity Temp = N->clone(); 2951 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2952 } 2953 2954 typedef MetadataTest MetadataAsValueTest; 2955 2956 TEST_F(MetadataAsValueTest, MDNode) { 2957 MDNode *N = MDNode::get(Context, None); 2958 auto *V = MetadataAsValue::get(Context, N); 2959 EXPECT_TRUE(V->getType()->isMetadataTy()); 2960 EXPECT_EQ(N, V->getMetadata()); 2961 2962 auto *V2 = MetadataAsValue::get(Context, N); 2963 EXPECT_EQ(V, V2); 2964 } 2965 2966 TEST_F(MetadataAsValueTest, MDNodeMDNode) { 2967 MDNode *N = MDNode::get(Context, None); 2968 Metadata *Ops[] = {N}; 2969 MDNode *N2 = MDNode::get(Context, Ops); 2970 auto *V = MetadataAsValue::get(Context, N2); 2971 EXPECT_TRUE(V->getType()->isMetadataTy()); 2972 EXPECT_EQ(N2, V->getMetadata()); 2973 2974 auto *V2 = MetadataAsValue::get(Context, N2); 2975 EXPECT_EQ(V, V2); 2976 2977 auto *V3 = MetadataAsValue::get(Context, N); 2978 EXPECT_TRUE(V3->getType()->isMetadataTy()); 2979 EXPECT_NE(V, V3); 2980 EXPECT_EQ(N, V3->getMetadata()); 2981 } 2982 2983 TEST_F(MetadataAsValueTest, MDNodeConstant) { 2984 auto *C = ConstantInt::getTrue(Context); 2985 auto *MD = ConstantAsMetadata::get(C); 2986 Metadata *Ops[] = {MD}; 2987 auto *N = MDNode::get(Context, Ops); 2988 2989 auto *V = MetadataAsValue::get(Context, MD); 2990 EXPECT_TRUE(V->getType()->isMetadataTy()); 2991 EXPECT_EQ(MD, V->getMetadata()); 2992 2993 auto *V2 = MetadataAsValue::get(Context, N); 2994 EXPECT_EQ(MD, V2->getMetadata()); 2995 EXPECT_EQ(V, V2); 2996 } 2997 2998 typedef MetadataTest ValueAsMetadataTest; 2999 3000 TEST_F(ValueAsMetadataTest, UpdatesOnRAUW) { 3001 Type *Ty = Type::getInt1PtrTy(Context); 3002 std::unique_ptr<GlobalVariable> GV0( 3003 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 3004 auto *MD = ValueAsMetadata::get(GV0.get()); 3005 EXPECT_TRUE(MD->getValue() == GV0.get()); 3006 ASSERT_TRUE(GV0->use_empty()); 3007 3008 std::unique_ptr<GlobalVariable> GV1( 3009 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 3010 GV0->replaceAllUsesWith(GV1.get()); 3011 EXPECT_TRUE(MD->getValue() == GV1.get()); 3012 } 3013 3014 TEST_F(ValueAsMetadataTest, TempTempReplacement) { 3015 // Create a constant. 3016 ConstantAsMetadata *CI = 3017 ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0))); 3018 3019 auto Temp1 = MDTuple::getTemporary(Context, None); 3020 auto Temp2 = MDTuple::getTemporary(Context, {CI}); 3021 auto *N = MDTuple::get(Context, {Temp1.get()}); 3022 3023 // Test replacing a temporary node with another temporary node. 3024 Temp1->replaceAllUsesWith(Temp2.get()); 3025 EXPECT_EQ(N->getOperand(0), Temp2.get()); 3026 3027 // Clean up Temp2 for teardown. 3028 Temp2->replaceAllUsesWith(nullptr); 3029 } 3030 3031 TEST_F(ValueAsMetadataTest, CollidingDoubleUpdates) { 3032 // Create a constant. 3033 ConstantAsMetadata *CI = 3034 ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0))); 3035 3036 // Create a temporary to prevent nodes from resolving. 3037 auto Temp = MDTuple::getTemporary(Context, None); 3038 3039 // When the first operand of N1 gets reset to nullptr, it'll collide with N2. 3040 Metadata *Ops1[] = {CI, CI, Temp.get()}; 3041 Metadata *Ops2[] = {nullptr, CI, Temp.get()}; 3042 3043 auto *N1 = MDTuple::get(Context, Ops1); 3044 auto *N2 = MDTuple::get(Context, Ops2); 3045 ASSERT_NE(N1, N2); 3046 3047 // Tell metadata that the constant is getting deleted. 3048 // 3049 // After this, N1 will be invalid, so don't touch it. 3050 ValueAsMetadata::handleDeletion(CI->getValue()); 3051 EXPECT_EQ(nullptr, N2->getOperand(0)); 3052 EXPECT_EQ(nullptr, N2->getOperand(1)); 3053 EXPECT_EQ(Temp.get(), N2->getOperand(2)); 3054 3055 // Clean up Temp for teardown. 3056 Temp->replaceAllUsesWith(nullptr); 3057 } 3058 3059 typedef MetadataTest DIArgListTest; 3060 3061 TEST_F(DIArgListTest, get) { 3062 SmallVector<ValueAsMetadata *, 2> VMs; 3063 VMs.push_back( 3064 ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0)))); 3065 VMs.push_back( 3066 ConstantAsMetadata::get(ConstantInt::get(Context, APInt(2, 0)))); 3067 DIArgList *DV0 = DIArgList::get(Context, VMs); 3068 DIArgList *DV1 = DIArgList::get(Context, VMs); 3069 EXPECT_EQ(DV0, DV1); 3070 } 3071 3072 TEST_F(DIArgListTest, UpdatesOnRAUW) { 3073 Type *Ty = Type::getInt1PtrTy(Context); 3074 ConstantAsMetadata *CI = 3075 ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0))); 3076 std::unique_ptr<GlobalVariable> GV0( 3077 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 3078 auto *MD0 = ValueAsMetadata::get(GV0.get()); 3079 3080 SmallVector<ValueAsMetadata *, 2> VMs; 3081 VMs.push_back(CI); 3082 VMs.push_back(MD0); 3083 auto *AL = DIArgList::get(Context, VMs); 3084 EXPECT_EQ(AL->getArgs()[0], CI); 3085 EXPECT_EQ(AL->getArgs()[1], MD0); 3086 3087 std::unique_ptr<GlobalVariable> GV1( 3088 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 3089 auto *MD1 = ValueAsMetadata::get(GV1.get()); 3090 GV0->replaceAllUsesWith(GV1.get()); 3091 EXPECT_EQ(AL->getArgs()[0], CI); 3092 EXPECT_EQ(AL->getArgs()[1], MD1); 3093 } 3094 3095 typedef MetadataTest TrackingMDRefTest; 3096 3097 TEST_F(TrackingMDRefTest, UpdatesOnRAUW) { 3098 Type *Ty = Type::getInt1PtrTy(Context); 3099 std::unique_ptr<GlobalVariable> GV0( 3100 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 3101 TypedTrackingMDRef<ValueAsMetadata> MD(ValueAsMetadata::get(GV0.get())); 3102 EXPECT_TRUE(MD->getValue() == GV0.get()); 3103 ASSERT_TRUE(GV0->use_empty()); 3104 3105 std::unique_ptr<GlobalVariable> GV1( 3106 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 3107 GV0->replaceAllUsesWith(GV1.get()); 3108 EXPECT_TRUE(MD->getValue() == GV1.get()); 3109 3110 // Reset it, so we don't inadvertently test deletion. 3111 MD.reset(); 3112 } 3113 3114 TEST_F(TrackingMDRefTest, UpdatesOnDeletion) { 3115 Type *Ty = Type::getInt1PtrTy(Context); 3116 std::unique_ptr<GlobalVariable> GV( 3117 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 3118 TypedTrackingMDRef<ValueAsMetadata> MD(ValueAsMetadata::get(GV.get())); 3119 EXPECT_TRUE(MD->getValue() == GV.get()); 3120 ASSERT_TRUE(GV->use_empty()); 3121 3122 GV.reset(); 3123 EXPECT_TRUE(!MD); 3124 } 3125 3126 TEST(NamedMDNodeTest, Search) { 3127 LLVMContext Context; 3128 ConstantAsMetadata *C = 3129 ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context), 1)); 3130 ConstantAsMetadata *C2 = 3131 ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context), 2)); 3132 3133 Metadata *const V = C; 3134 Metadata *const V2 = C2; 3135 MDNode *n = MDNode::get(Context, V); 3136 MDNode *n2 = MDNode::get(Context, V2); 3137 3138 Module M("MyModule", Context); 3139 const char *Name = "llvm.NMD1"; 3140 NamedMDNode *NMD = M.getOrInsertNamedMetadata(Name); 3141 NMD->addOperand(n); 3142 NMD->addOperand(n2); 3143 3144 std::string Str; 3145 raw_string_ostream oss(Str); 3146 NMD->print(oss); 3147 EXPECT_STREQ("!llvm.NMD1 = !{!0, !1}\n", 3148 oss.str().c_str()); 3149 } 3150 3151 typedef MetadataTest FunctionAttachmentTest; 3152 TEST_F(FunctionAttachmentTest, setMetadata) { 3153 Function *F = getFunction("foo"); 3154 ASSERT_FALSE(F->hasMetadata()); 3155 EXPECT_EQ(nullptr, F->getMetadata(LLVMContext::MD_dbg)); 3156 EXPECT_EQ(nullptr, F->getMetadata("dbg")); 3157 EXPECT_EQ(nullptr, F->getMetadata("other")); 3158 3159 DISubprogram *SP1 = getSubprogram(); 3160 DISubprogram *SP2 = getSubprogram(); 3161 ASSERT_NE(SP1, SP2); 3162 3163 F->setMetadata("dbg", SP1); 3164 EXPECT_TRUE(F->hasMetadata()); 3165 EXPECT_EQ(SP1, F->getMetadata(LLVMContext::MD_dbg)); 3166 EXPECT_EQ(SP1, F->getMetadata("dbg")); 3167 EXPECT_EQ(nullptr, F->getMetadata("other")); 3168 3169 F->setMetadata(LLVMContext::MD_dbg, SP2); 3170 EXPECT_TRUE(F->hasMetadata()); 3171 EXPECT_EQ(SP2, F->getMetadata(LLVMContext::MD_dbg)); 3172 EXPECT_EQ(SP2, F->getMetadata("dbg")); 3173 EXPECT_EQ(nullptr, F->getMetadata("other")); 3174 3175 F->setMetadata("dbg", nullptr); 3176 EXPECT_FALSE(F->hasMetadata()); 3177 EXPECT_EQ(nullptr, F->getMetadata(LLVMContext::MD_dbg)); 3178 EXPECT_EQ(nullptr, F->getMetadata("dbg")); 3179 EXPECT_EQ(nullptr, F->getMetadata("other")); 3180 3181 MDTuple *T1 = getTuple(); 3182 MDTuple *T2 = getTuple(); 3183 ASSERT_NE(T1, T2); 3184 3185 F->setMetadata("other1", T1); 3186 F->setMetadata("other2", T2); 3187 EXPECT_TRUE(F->hasMetadata()); 3188 EXPECT_EQ(T1, F->getMetadata("other1")); 3189 EXPECT_EQ(T2, F->getMetadata("other2")); 3190 EXPECT_EQ(nullptr, F->getMetadata("dbg")); 3191 3192 F->setMetadata("other1", T2); 3193 F->setMetadata("other2", T1); 3194 EXPECT_EQ(T2, F->getMetadata("other1")); 3195 EXPECT_EQ(T1, F->getMetadata("other2")); 3196 3197 F->setMetadata("other1", nullptr); 3198 F->setMetadata("other2", nullptr); 3199 EXPECT_FALSE(F->hasMetadata()); 3200 EXPECT_EQ(nullptr, F->getMetadata("other1")); 3201 EXPECT_EQ(nullptr, F->getMetadata("other2")); 3202 } 3203 3204 TEST_F(FunctionAttachmentTest, getAll) { 3205 Function *F = getFunction("foo"); 3206 3207 MDTuple *T1 = getTuple(); 3208 MDTuple *T2 = getTuple(); 3209 MDTuple *P = getTuple(); 3210 DISubprogram *SP = getSubprogram(); 3211 3212 F->setMetadata("other1", T2); 3213 F->setMetadata(LLVMContext::MD_dbg, SP); 3214 F->setMetadata("other2", T1); 3215 F->setMetadata(LLVMContext::MD_prof, P); 3216 F->setMetadata("other2", T2); 3217 F->setMetadata("other1", T1); 3218 3219 SmallVector<std::pair<unsigned, MDNode *>, 4> MDs; 3220 F->getAllMetadata(MDs); 3221 ASSERT_EQ(4u, MDs.size()); 3222 EXPECT_EQ(LLVMContext::MD_dbg, MDs[0].first); 3223 EXPECT_EQ(LLVMContext::MD_prof, MDs[1].first); 3224 EXPECT_EQ(Context.getMDKindID("other1"), MDs[2].first); 3225 EXPECT_EQ(Context.getMDKindID("other2"), MDs[3].first); 3226 EXPECT_EQ(SP, MDs[0].second); 3227 EXPECT_EQ(P, MDs[1].second); 3228 EXPECT_EQ(T1, MDs[2].second); 3229 EXPECT_EQ(T2, MDs[3].second); 3230 } 3231 3232 TEST_F(FunctionAttachmentTest, Verifier) { 3233 Function *F = getFunction("foo"); 3234 F->setMetadata("attach", getTuple()); 3235 F->setIsMaterializable(true); 3236 3237 // Confirm this is materializable. 3238 ASSERT_TRUE(F->isMaterializable()); 3239 3240 // Materializable functions cannot have metadata attachments. 3241 EXPECT_TRUE(verifyFunction(*F)); 3242 3243 // Function declarations can. 3244 F->setIsMaterializable(false); 3245 EXPECT_FALSE(verifyModule(*F->getParent())); 3246 EXPECT_FALSE(verifyFunction(*F)); 3247 3248 // So can definitions. 3249 (void)new UnreachableInst(Context, BasicBlock::Create(Context, "bb", F)); 3250 EXPECT_FALSE(verifyModule(*F->getParent())); 3251 EXPECT_FALSE(verifyFunction(*F)); 3252 } 3253 3254 TEST_F(FunctionAttachmentTest, EntryCount) { 3255 Function *F = getFunction("foo"); 3256 EXPECT_FALSE(F->getEntryCount().hasValue()); 3257 F->setEntryCount(12304, Function::PCT_Real); 3258 auto Count = F->getEntryCount(); 3259 EXPECT_TRUE(Count.hasValue()); 3260 EXPECT_EQ(12304u, Count.getCount()); 3261 EXPECT_EQ(Function::PCT_Real, Count.getType()); 3262 3263 // Repeat the same for synthetic counts. 3264 F = getFunction("bar"); 3265 EXPECT_FALSE(F->getEntryCount().hasValue()); 3266 F->setEntryCount(123, Function::PCT_Synthetic); 3267 Count = F->getEntryCount(true /*allow synthetic*/); 3268 EXPECT_TRUE(Count.hasValue()); 3269 EXPECT_EQ(123u, Count.getCount()); 3270 EXPECT_EQ(Function::PCT_Synthetic, Count.getType()); 3271 } 3272 3273 TEST_F(FunctionAttachmentTest, SubprogramAttachment) { 3274 Function *F = getFunction("foo"); 3275 DISubprogram *SP = getSubprogram(); 3276 F->setSubprogram(SP); 3277 3278 // Note that the static_cast confirms that F->getSubprogram() actually 3279 // returns an DISubprogram. 3280 EXPECT_EQ(SP, static_cast<DISubprogram *>(F->getSubprogram())); 3281 EXPECT_EQ(SP, F->getMetadata("dbg")); 3282 EXPECT_EQ(SP, F->getMetadata(LLVMContext::MD_dbg)); 3283 } 3284 3285 typedef MetadataTest DistinctMDOperandPlaceholderTest; 3286 TEST_F(DistinctMDOperandPlaceholderTest, getID) { 3287 EXPECT_EQ(7u, DistinctMDOperandPlaceholder(7).getID()); 3288 } 3289 3290 TEST_F(DistinctMDOperandPlaceholderTest, replaceUseWith) { 3291 // Set up some placeholders. 3292 DistinctMDOperandPlaceholder PH0(7); 3293 DistinctMDOperandPlaceholder PH1(3); 3294 DistinctMDOperandPlaceholder PH2(0); 3295 Metadata *Ops[] = {&PH0, &PH1, &PH2}; 3296 auto *D = MDTuple::getDistinct(Context, Ops); 3297 ASSERT_EQ(&PH0, D->getOperand(0)); 3298 ASSERT_EQ(&PH1, D->getOperand(1)); 3299 ASSERT_EQ(&PH2, D->getOperand(2)); 3300 3301 // Replace them. 3302 auto *N0 = MDTuple::get(Context, None); 3303 auto *N1 = MDTuple::get(Context, N0); 3304 PH0.replaceUseWith(N0); 3305 PH1.replaceUseWith(N1); 3306 PH2.replaceUseWith(nullptr); 3307 EXPECT_EQ(N0, D->getOperand(0)); 3308 EXPECT_EQ(N1, D->getOperand(1)); 3309 EXPECT_EQ(nullptr, D->getOperand(2)); 3310 } 3311 3312 TEST_F(DistinctMDOperandPlaceholderTest, replaceUseWithNoUser) { 3313 // There is no user, but we can still call replace. 3314 DistinctMDOperandPlaceholder(7).replaceUseWith(MDTuple::get(Context, None)); 3315 } 3316 3317 // Test various assertions in metadata tracking. Don't run these tests if gtest 3318 // will use SEH to recover from them. Two of these tests get halfway through 3319 // inserting metadata into DenseMaps for tracking purposes, and then they 3320 // assert, and we attempt to destroy an LLVMContext with broken invariants, 3321 // leading to infinite loops. 3322 #if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG) && !defined(GTEST_HAS_SEH) 3323 TEST_F(DistinctMDOperandPlaceholderTest, MetadataAsValue) { 3324 // This shouldn't crash. 3325 DistinctMDOperandPlaceholder PH(7); 3326 EXPECT_DEATH(MetadataAsValue::get(Context, &PH), 3327 "Unexpected callback to owner"); 3328 } 3329 3330 TEST_F(DistinctMDOperandPlaceholderTest, UniquedMDNode) { 3331 // This shouldn't crash. 3332 DistinctMDOperandPlaceholder PH(7); 3333 EXPECT_DEATH(MDTuple::get(Context, &PH), "Unexpected callback to owner"); 3334 } 3335 3336 TEST_F(DistinctMDOperandPlaceholderTest, SecondDistinctMDNode) { 3337 // This shouldn't crash. 3338 DistinctMDOperandPlaceholder PH(7); 3339 MDTuple::getDistinct(Context, &PH); 3340 EXPECT_DEATH(MDTuple::getDistinct(Context, &PH), 3341 "Placeholders can only be used once"); 3342 } 3343 3344 TEST_F(DistinctMDOperandPlaceholderTest, TrackingMDRefAndDistinctMDNode) { 3345 // TrackingMDRef doesn't install an owner callback, so it can't be detected 3346 // as an invalid use. However, using a placeholder in a TrackingMDRef *and* 3347 // a distinct node isn't possible and we should assert. 3348 // 3349 // (There's no positive test for using TrackingMDRef because it's not a 3350 // useful thing to do.) 3351 { 3352 DistinctMDOperandPlaceholder PH(7); 3353 MDTuple::getDistinct(Context, &PH); 3354 EXPECT_DEATH(TrackingMDRef Ref(&PH), "Placeholders can only be used once"); 3355 } 3356 { 3357 DistinctMDOperandPlaceholder PH(7); 3358 TrackingMDRef Ref(&PH); 3359 EXPECT_DEATH(MDTuple::getDistinct(Context, &PH), 3360 "Placeholders can only be used once"); 3361 } 3362 } 3363 #endif 3364 3365 typedef MetadataTest DebugVariableTest; 3366 TEST_F(DebugVariableTest, DenseMap) { 3367 DenseMap<DebugVariable, uint64_t> DebugVariableMap; 3368 3369 DILocalScope *Scope = getSubprogram(); 3370 DIFile *File = getFile(); 3371 DIType *Type = getDerivedType(); 3372 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 3373 3374 DILocation *InlinedLoc = DILocation::get(Context, 2, 7, Scope); 3375 3376 DILocalVariable *VarA = 3377 DILocalVariable::get(Context, Scope, "A", File, 5, Type, 2, Flags, 8); 3378 DILocalVariable *VarB = 3379 DILocalVariable::get(Context, Scope, "B", File, 7, Type, 3, Flags, 8); 3380 3381 DebugVariable DebugVariableA(VarA, NoneType(), nullptr); 3382 DebugVariable DebugVariableInlineA(VarA, NoneType(), InlinedLoc); 3383 DebugVariable DebugVariableB(VarB, NoneType(), nullptr); 3384 DebugVariable DebugVariableFragB(VarB, {{16, 16}}, nullptr); 3385 3386 DebugVariableMap.insert({DebugVariableA, 2}); 3387 DebugVariableMap.insert({DebugVariableInlineA, 3}); 3388 DebugVariableMap.insert({DebugVariableB, 6}); 3389 DebugVariableMap.insert({DebugVariableFragB, 12}); 3390 3391 EXPECT_EQ(DebugVariableMap.count(DebugVariableA), 1u); 3392 EXPECT_EQ(DebugVariableMap.count(DebugVariableInlineA), 1u); 3393 EXPECT_EQ(DebugVariableMap.count(DebugVariableB), 1u); 3394 EXPECT_EQ(DebugVariableMap.count(DebugVariableFragB), 1u); 3395 3396 EXPECT_EQ(DebugVariableMap.find(DebugVariableA)->second, 2u); 3397 EXPECT_EQ(DebugVariableMap.find(DebugVariableInlineA)->second, 3u); 3398 EXPECT_EQ(DebugVariableMap.find(DebugVariableB)->second, 6u); 3399 EXPECT_EQ(DebugVariableMap.find(DebugVariableFragB)->second, 12u); 3400 } 3401 3402 } // end namespace 3403