1 //===- unittests/IR/MetadataTest.cpp - Metadata unit tests ----------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "llvm/ADT/STLExtras.h" 11 #include "llvm/IR/Constants.h" 12 #include "llvm/IR/DebugInfoMetadata.h" 13 #include "llvm/IR/Function.h" 14 #include "llvm/IR/Instructions.h" 15 #include "llvm/IR/LLVMContext.h" 16 #include "llvm/IR/Metadata.h" 17 #include "llvm/IR/Module.h" 18 #include "llvm/IR/Type.h" 19 #include "llvm/Support/raw_ostream.h" 20 #include "gtest/gtest.h" 21 using namespace llvm; 22 23 namespace { 24 25 TEST(ContextAndReplaceableUsesTest, FromContext) { 26 LLVMContext Context; 27 ContextAndReplaceableUses CRU(Context); 28 EXPECT_EQ(&Context, &CRU.getContext()); 29 EXPECT_FALSE(CRU.hasReplaceableUses()); 30 EXPECT_FALSE(CRU.getReplaceableUses()); 31 } 32 33 TEST(ContextAndReplaceableUsesTest, FromReplaceableUses) { 34 LLVMContext Context; 35 ContextAndReplaceableUses CRU(make_unique<ReplaceableMetadataImpl>(Context)); 36 EXPECT_EQ(&Context, &CRU.getContext()); 37 EXPECT_TRUE(CRU.hasReplaceableUses()); 38 EXPECT_TRUE(CRU.getReplaceableUses()); 39 } 40 41 TEST(ContextAndReplaceableUsesTest, makeReplaceable) { 42 LLVMContext Context; 43 ContextAndReplaceableUses CRU(Context); 44 CRU.makeReplaceable(make_unique<ReplaceableMetadataImpl>(Context)); 45 EXPECT_EQ(&Context, &CRU.getContext()); 46 EXPECT_TRUE(CRU.hasReplaceableUses()); 47 EXPECT_TRUE(CRU.getReplaceableUses()); 48 } 49 50 TEST(ContextAndReplaceableUsesTest, takeReplaceableUses) { 51 LLVMContext Context; 52 auto ReplaceableUses = make_unique<ReplaceableMetadataImpl>(Context); 53 auto *Ptr = ReplaceableUses.get(); 54 ContextAndReplaceableUses CRU(std::move(ReplaceableUses)); 55 ReplaceableUses = CRU.takeReplaceableUses(); 56 EXPECT_EQ(&Context, &CRU.getContext()); 57 EXPECT_FALSE(CRU.hasReplaceableUses()); 58 EXPECT_FALSE(CRU.getReplaceableUses()); 59 EXPECT_EQ(Ptr, ReplaceableUses.get()); 60 } 61 62 class MetadataTest : public testing::Test { 63 protected: 64 LLVMContext Context; 65 MDNode *getNode() { return MDNode::get(Context, None); } 66 MDNode *getNode(Metadata *MD) { return MDNode::get(Context, MD); } 67 MDNode *getNode(Metadata *MD1, Metadata *MD2) { 68 Metadata *MDs[] = {MD1, MD2}; 69 return MDNode::get(Context, MDs); 70 } 71 }; 72 typedef MetadataTest MDStringTest; 73 74 // Test that construction of MDString with different value produces different 75 // MDString objects, even with the same string pointer and nulls in the string. 76 TEST_F(MDStringTest, CreateDifferent) { 77 char x[3] = { 'f', 0, 'A' }; 78 MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); 79 x[2] = 'B'; 80 MDString *s2 = MDString::get(Context, StringRef(&x[0], 3)); 81 EXPECT_NE(s1, s2); 82 } 83 84 // Test that creation of MDStrings with the same string contents produces the 85 // same MDString object, even with different pointers. 86 TEST_F(MDStringTest, CreateSame) { 87 char x[4] = { 'a', 'b', 'c', 'X' }; 88 char y[4] = { 'a', 'b', 'c', 'Y' }; 89 90 MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); 91 MDString *s2 = MDString::get(Context, StringRef(&y[0], 3)); 92 EXPECT_EQ(s1, s2); 93 } 94 95 // Test that MDString prints out the string we fed it. 96 TEST_F(MDStringTest, PrintingSimple) { 97 char *str = new char[13]; 98 strncpy(str, "testing 1 2 3", 13); 99 MDString *s = MDString::get(Context, StringRef(str, 13)); 100 strncpy(str, "aaaaaaaaaaaaa", 13); 101 delete[] str; 102 103 std::string Str; 104 raw_string_ostream oss(Str); 105 s->print(oss); 106 EXPECT_STREQ("!\"testing 1 2 3\"", oss.str().c_str()); 107 } 108 109 // Test printing of MDString with non-printable characters. 110 TEST_F(MDStringTest, PrintingComplex) { 111 char str[5] = {0, '\n', '"', '\\', (char)-1}; 112 MDString *s = MDString::get(Context, StringRef(str+0, 5)); 113 std::string Str; 114 raw_string_ostream oss(Str); 115 s->print(oss); 116 EXPECT_STREQ("!\"\\00\\0A\\22\\5C\\FF\"", oss.str().c_str()); 117 } 118 119 typedef MetadataTest MDNodeTest; 120 121 // Test the two constructors, and containing other Constants. 122 TEST_F(MDNodeTest, Simple) { 123 char x[3] = { 'a', 'b', 'c' }; 124 char y[3] = { '1', '2', '3' }; 125 126 MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); 127 MDString *s2 = MDString::get(Context, StringRef(&y[0], 3)); 128 ConstantAsMetadata *CI = ConstantAsMetadata::get( 129 ConstantInt::get(getGlobalContext(), APInt(8, 0))); 130 131 std::vector<Metadata *> V; 132 V.push_back(s1); 133 V.push_back(CI); 134 V.push_back(s2); 135 136 MDNode *n1 = MDNode::get(Context, V); 137 Metadata *const c1 = n1; 138 MDNode *n2 = MDNode::get(Context, c1); 139 Metadata *const c2 = n2; 140 MDNode *n3 = MDNode::get(Context, V); 141 MDNode *n4 = MDNode::getIfExists(Context, V); 142 MDNode *n5 = MDNode::getIfExists(Context, c1); 143 MDNode *n6 = MDNode::getIfExists(Context, c2); 144 EXPECT_NE(n1, n2); 145 EXPECT_EQ(n1, n3); 146 EXPECT_EQ(n4, n1); 147 EXPECT_EQ(n5, n2); 148 EXPECT_EQ(n6, (Metadata *)nullptr); 149 150 EXPECT_EQ(3u, n1->getNumOperands()); 151 EXPECT_EQ(s1, n1->getOperand(0)); 152 EXPECT_EQ(CI, n1->getOperand(1)); 153 EXPECT_EQ(s2, n1->getOperand(2)); 154 155 EXPECT_EQ(1u, n2->getNumOperands()); 156 EXPECT_EQ(n1, n2->getOperand(0)); 157 } 158 159 TEST_F(MDNodeTest, Delete) { 160 Constant *C = ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 1); 161 Instruction *I = new BitCastInst(C, Type::getInt32Ty(getGlobalContext())); 162 163 Metadata *const V = LocalAsMetadata::get(I); 164 MDNode *n = MDNode::get(Context, V); 165 TrackingMDRef wvh(n); 166 167 EXPECT_EQ(n, wvh); 168 169 delete I; 170 } 171 172 TEST_F(MDNodeTest, SelfReference) { 173 // !0 = !{!0} 174 // !1 = !{!0} 175 { 176 auto Temp = MDNode::getTemporary(Context, None); 177 Metadata *Args[] = {Temp.get()}; 178 MDNode *Self = MDNode::get(Context, Args); 179 Self->replaceOperandWith(0, Self); 180 ASSERT_EQ(Self, Self->getOperand(0)); 181 182 // Self-references should be distinct, so MDNode::get() should grab a 183 // uniqued node that references Self, not Self. 184 Args[0] = Self; 185 MDNode *Ref1 = MDNode::get(Context, Args); 186 MDNode *Ref2 = MDNode::get(Context, Args); 187 EXPECT_NE(Self, Ref1); 188 EXPECT_EQ(Ref1, Ref2); 189 } 190 191 // !0 = !{!0, !{}} 192 // !1 = !{!0, !{}} 193 { 194 auto Temp = MDNode::getTemporary(Context, None); 195 Metadata *Args[] = {Temp.get(), MDNode::get(Context, None)}; 196 MDNode *Self = MDNode::get(Context, Args); 197 Self->replaceOperandWith(0, Self); 198 ASSERT_EQ(Self, Self->getOperand(0)); 199 200 // Self-references should be distinct, so MDNode::get() should grab a 201 // uniqued node that references Self, not Self itself. 202 Args[0] = Self; 203 MDNode *Ref1 = MDNode::get(Context, Args); 204 MDNode *Ref2 = MDNode::get(Context, Args); 205 EXPECT_NE(Self, Ref1); 206 EXPECT_EQ(Ref1, Ref2); 207 } 208 } 209 210 TEST_F(MDNodeTest, Print) { 211 Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 7); 212 MDString *S = MDString::get(Context, "foo"); 213 MDNode *N0 = getNode(); 214 MDNode *N1 = getNode(N0); 215 MDNode *N2 = getNode(N0, N1); 216 217 Metadata *Args[] = {ConstantAsMetadata::get(C), S, nullptr, N0, N1, N2}; 218 MDNode *N = MDNode::get(Context, Args); 219 220 std::string Expected; 221 { 222 raw_string_ostream OS(Expected); 223 OS << "!{"; 224 C->printAsOperand(OS); 225 OS << ", "; 226 S->printAsOperand(OS); 227 OS << ", null"; 228 MDNode *Nodes[] = {N0, N1, N2}; 229 for (auto *Node : Nodes) 230 OS << ", <" << (void *)Node << ">"; 231 OS << "}\n"; 232 } 233 234 std::string Actual; 235 { 236 raw_string_ostream OS(Actual); 237 N->print(OS); 238 } 239 240 EXPECT_EQ(Expected, Actual); 241 } 242 243 TEST_F(MDNodeTest, NullOperand) { 244 // metadata !{} 245 MDNode *Empty = MDNode::get(Context, None); 246 247 // metadata !{metadata !{}} 248 Metadata *Ops[] = {Empty}; 249 MDNode *N = MDNode::get(Context, Ops); 250 ASSERT_EQ(Empty, N->getOperand(0)); 251 252 // metadata !{metadata !{}} => metadata !{null} 253 N->replaceOperandWith(0, nullptr); 254 ASSERT_EQ(nullptr, N->getOperand(0)); 255 256 // metadata !{null} 257 Ops[0] = nullptr; 258 MDNode *NullOp = MDNode::get(Context, Ops); 259 ASSERT_EQ(nullptr, NullOp->getOperand(0)); 260 EXPECT_EQ(N, NullOp); 261 } 262 263 TEST_F(MDNodeTest, DistinctOnUniquingCollision) { 264 // !{} 265 MDNode *Empty = MDNode::get(Context, None); 266 ASSERT_TRUE(Empty->isResolved()); 267 EXPECT_FALSE(Empty->isDistinct()); 268 269 // !{!{}} 270 Metadata *Wrapped1Ops[] = {Empty}; 271 MDNode *Wrapped1 = MDNode::get(Context, Wrapped1Ops); 272 ASSERT_EQ(Empty, Wrapped1->getOperand(0)); 273 ASSERT_TRUE(Wrapped1->isResolved()); 274 EXPECT_FALSE(Wrapped1->isDistinct()); 275 276 // !{!{!{}}} 277 Metadata *Wrapped2Ops[] = {Wrapped1}; 278 MDNode *Wrapped2 = MDNode::get(Context, Wrapped2Ops); 279 ASSERT_EQ(Wrapped1, Wrapped2->getOperand(0)); 280 ASSERT_TRUE(Wrapped2->isResolved()); 281 EXPECT_FALSE(Wrapped2->isDistinct()); 282 283 // !{!{!{}}} => !{!{}} 284 Wrapped2->replaceOperandWith(0, Empty); 285 ASSERT_EQ(Empty, Wrapped2->getOperand(0)); 286 EXPECT_TRUE(Wrapped2->isDistinct()); 287 EXPECT_FALSE(Wrapped1->isDistinct()); 288 } 289 290 TEST_F(MDNodeTest, getDistinct) { 291 // !{} 292 MDNode *Empty = MDNode::get(Context, None); 293 ASSERT_TRUE(Empty->isResolved()); 294 ASSERT_FALSE(Empty->isDistinct()); 295 ASSERT_EQ(Empty, MDNode::get(Context, None)); 296 297 // distinct !{} 298 MDNode *Distinct1 = MDNode::getDistinct(Context, None); 299 MDNode *Distinct2 = MDNode::getDistinct(Context, None); 300 EXPECT_TRUE(Distinct1->isResolved()); 301 EXPECT_TRUE(Distinct2->isDistinct()); 302 EXPECT_NE(Empty, Distinct1); 303 EXPECT_NE(Empty, Distinct2); 304 EXPECT_NE(Distinct1, Distinct2); 305 306 // !{} 307 ASSERT_EQ(Empty, MDNode::get(Context, None)); 308 } 309 310 TEST_F(MDNodeTest, isUniqued) { 311 MDNode *U = MDTuple::get(Context, None); 312 MDNode *D = MDTuple::getDistinct(Context, None); 313 auto T = MDTuple::getTemporary(Context, None); 314 EXPECT_TRUE(U->isUniqued()); 315 EXPECT_FALSE(D->isUniqued()); 316 EXPECT_FALSE(T->isUniqued()); 317 } 318 319 TEST_F(MDNodeTest, isDistinct) { 320 MDNode *U = MDTuple::get(Context, None); 321 MDNode *D = MDTuple::getDistinct(Context, None); 322 auto T = MDTuple::getTemporary(Context, None); 323 EXPECT_FALSE(U->isDistinct()); 324 EXPECT_TRUE(D->isDistinct()); 325 EXPECT_FALSE(T->isDistinct()); 326 } 327 328 TEST_F(MDNodeTest, isTemporary) { 329 MDNode *U = MDTuple::get(Context, None); 330 MDNode *D = MDTuple::getDistinct(Context, None); 331 auto T = MDTuple::getTemporary(Context, None); 332 EXPECT_FALSE(U->isTemporary()); 333 EXPECT_FALSE(D->isTemporary()); 334 EXPECT_TRUE(T->isTemporary()); 335 } 336 337 TEST_F(MDNodeTest, getDistinctWithUnresolvedOperands) { 338 // temporary !{} 339 auto Temp = MDTuple::getTemporary(Context, None); 340 ASSERT_FALSE(Temp->isResolved()); 341 342 // distinct !{temporary !{}} 343 Metadata *Ops[] = {Temp.get()}; 344 MDNode *Distinct = MDNode::getDistinct(Context, Ops); 345 EXPECT_TRUE(Distinct->isResolved()); 346 EXPECT_EQ(Temp.get(), Distinct->getOperand(0)); 347 348 // temporary !{} => !{} 349 MDNode *Empty = MDNode::get(Context, None); 350 Temp->replaceAllUsesWith(Empty); 351 EXPECT_EQ(Empty, Distinct->getOperand(0)); 352 } 353 354 TEST_F(MDNodeTest, handleChangedOperandRecursion) { 355 // !0 = !{} 356 MDNode *N0 = MDNode::get(Context, None); 357 358 // !1 = !{!3, null} 359 auto Temp3 = MDTuple::getTemporary(Context, None); 360 Metadata *Ops1[] = {Temp3.get(), nullptr}; 361 MDNode *N1 = MDNode::get(Context, Ops1); 362 363 // !2 = !{!3, !0} 364 Metadata *Ops2[] = {Temp3.get(), N0}; 365 MDNode *N2 = MDNode::get(Context, Ops2); 366 367 // !3 = !{!2} 368 Metadata *Ops3[] = {N2}; 369 MDNode *N3 = MDNode::get(Context, Ops3); 370 Temp3->replaceAllUsesWith(N3); 371 372 // !4 = !{!1} 373 Metadata *Ops4[] = {N1}; 374 MDNode *N4 = MDNode::get(Context, Ops4); 375 376 // Confirm that the cycle prevented RAUW from getting dropped. 377 EXPECT_TRUE(N0->isResolved()); 378 EXPECT_FALSE(N1->isResolved()); 379 EXPECT_FALSE(N2->isResolved()); 380 EXPECT_FALSE(N3->isResolved()); 381 EXPECT_FALSE(N4->isResolved()); 382 383 // Create a couple of distinct nodes to observe what's going on. 384 // 385 // !5 = distinct !{!2} 386 // !6 = distinct !{!3} 387 Metadata *Ops5[] = {N2}; 388 MDNode *N5 = MDNode::getDistinct(Context, Ops5); 389 Metadata *Ops6[] = {N3}; 390 MDNode *N6 = MDNode::getDistinct(Context, Ops6); 391 392 // Mutate !2 to look like !1, causing a uniquing collision (and an RAUW). 393 // This will ripple up, with !3 colliding with !4, and RAUWing. Since !2 394 // references !3, this can cause a re-entry of handleChangedOperand() when !3 395 // is not ready for it. 396 // 397 // !2->replaceOperandWith(1, nullptr) 398 // !2: !{!3, !0} => !{!3, null} 399 // !2->replaceAllUsesWith(!1) 400 // !3: !{!2] => !{!1} 401 // !3->replaceAllUsesWith(!4) 402 N2->replaceOperandWith(1, nullptr); 403 404 // If all has gone well, N2 and N3 will have been RAUW'ed and deleted from 405 // under us. Just check that the other nodes are sane. 406 // 407 // !1 = !{!4, null} 408 // !4 = !{!1} 409 // !5 = distinct !{!1} 410 // !6 = distinct !{!4} 411 EXPECT_EQ(N4, N1->getOperand(0)); 412 EXPECT_EQ(N1, N4->getOperand(0)); 413 EXPECT_EQ(N1, N5->getOperand(0)); 414 EXPECT_EQ(N4, N6->getOperand(0)); 415 } 416 417 TEST_F(MDNodeTest, replaceResolvedOperand) { 418 // Check code for replacing one resolved operand with another. If doing this 419 // directly (via replaceOperandWith()) becomes illegal, change the operand to 420 // a global value that gets RAUW'ed. 421 // 422 // Use a temporary node to keep N from being resolved. 423 auto Temp = MDTuple::getTemporary(Context, None); 424 Metadata *Ops[] = {nullptr, Temp.get()}; 425 426 MDNode *Empty = MDTuple::get(Context, ArrayRef<Metadata *>()); 427 MDNode *N = MDTuple::get(Context, Ops); 428 EXPECT_EQ(nullptr, N->getOperand(0)); 429 ASSERT_FALSE(N->isResolved()); 430 431 // Check code for replacing resolved nodes. 432 N->replaceOperandWith(0, Empty); 433 EXPECT_EQ(Empty, N->getOperand(0)); 434 435 // Check code for adding another unresolved operand. 436 N->replaceOperandWith(0, Temp.get()); 437 EXPECT_EQ(Temp.get(), N->getOperand(0)); 438 439 // Remove the references to Temp; required for teardown. 440 Temp->replaceAllUsesWith(nullptr); 441 } 442 443 TEST_F(MDNodeTest, replaceWithUniqued) { 444 auto *Empty = MDTuple::get(Context, None); 445 MDTuple *FirstUniqued; 446 { 447 Metadata *Ops[] = {Empty}; 448 auto Temp = MDTuple::getTemporary(Context, Ops); 449 EXPECT_TRUE(Temp->isTemporary()); 450 451 // Don't expect a collision. 452 auto *Current = Temp.get(); 453 FirstUniqued = MDNode::replaceWithUniqued(std::move(Temp)); 454 EXPECT_TRUE(FirstUniqued->isUniqued()); 455 EXPECT_TRUE(FirstUniqued->isResolved()); 456 EXPECT_EQ(Current, FirstUniqued); 457 } 458 { 459 Metadata *Ops[] = {Empty}; 460 auto Temp = MDTuple::getTemporary(Context, Ops); 461 EXPECT_TRUE(Temp->isTemporary()); 462 463 // Should collide with Uniqued above this time. 464 auto *Uniqued = MDNode::replaceWithUniqued(std::move(Temp)); 465 EXPECT_TRUE(Uniqued->isUniqued()); 466 EXPECT_TRUE(Uniqued->isResolved()); 467 EXPECT_EQ(FirstUniqued, Uniqued); 468 } 469 { 470 auto Unresolved = MDTuple::getTemporary(Context, None); 471 Metadata *Ops[] = {Unresolved.get()}; 472 auto Temp = MDTuple::getTemporary(Context, Ops); 473 EXPECT_TRUE(Temp->isTemporary()); 474 475 // Shouldn't be resolved. 476 auto *Uniqued = MDNode::replaceWithUniqued(std::move(Temp)); 477 EXPECT_TRUE(Uniqued->isUniqued()); 478 EXPECT_FALSE(Uniqued->isResolved()); 479 480 // Should be a different node. 481 EXPECT_NE(FirstUniqued, Uniqued); 482 483 // Should resolve when we update its node (note: be careful to avoid a 484 // collision with any other nodes above). 485 Uniqued->replaceOperandWith(0, nullptr); 486 EXPECT_TRUE(Uniqued->isResolved()); 487 } 488 } 489 490 TEST_F(MDNodeTest, replaceWithDistinct) { 491 { 492 auto *Empty = MDTuple::get(Context, None); 493 Metadata *Ops[] = {Empty}; 494 auto Temp = MDTuple::getTemporary(Context, Ops); 495 EXPECT_TRUE(Temp->isTemporary()); 496 497 // Don't expect a collision. 498 auto *Current = Temp.get(); 499 auto *Distinct = MDNode::replaceWithDistinct(std::move(Temp)); 500 EXPECT_TRUE(Distinct->isDistinct()); 501 EXPECT_TRUE(Distinct->isResolved()); 502 EXPECT_EQ(Current, Distinct); 503 } 504 { 505 auto Unresolved = MDTuple::getTemporary(Context, None); 506 Metadata *Ops[] = {Unresolved.get()}; 507 auto Temp = MDTuple::getTemporary(Context, Ops); 508 EXPECT_TRUE(Temp->isTemporary()); 509 510 // Don't expect a collision. 511 auto *Current = Temp.get(); 512 auto *Distinct = MDNode::replaceWithDistinct(std::move(Temp)); 513 EXPECT_TRUE(Distinct->isDistinct()); 514 EXPECT_TRUE(Distinct->isResolved()); 515 EXPECT_EQ(Current, Distinct); 516 517 // Cleanup; required for teardown. 518 Unresolved->replaceAllUsesWith(nullptr); 519 } 520 } 521 522 TEST_F(MDNodeTest, replaceWithPermanent) { 523 Metadata *Ops[] = {nullptr}; 524 auto Temp = MDTuple::getTemporary(Context, Ops); 525 auto *T = Temp.get(); 526 527 // U is a normal, uniqued node that references T. 528 auto *U = MDTuple::get(Context, T); 529 EXPECT_TRUE(U->isUniqued()); 530 531 // Make Temp self-referencing. 532 Temp->replaceOperandWith(0, T); 533 534 // Try to uniquify Temp. This should, despite the name in the API, give a 535 // 'distinct' node, since self-references aren't allowed to be uniqued. 536 // 537 // Since it's distinct, N should have the same address as when it was a 538 // temporary (i.e., be equal to T not U). 539 auto *N = MDNode::replaceWithPermanent(std::move(Temp)); 540 EXPECT_EQ(N, T); 541 EXPECT_TRUE(N->isDistinct()); 542 543 // U should be the canonical unique node with N as the argument. 544 EXPECT_EQ(U, MDTuple::get(Context, N)); 545 EXPECT_TRUE(U->isUniqued()); 546 547 // This temporary should collide with U when replaced, but it should still be 548 // uniqued. 549 EXPECT_EQ(U, MDNode::replaceWithPermanent(MDTuple::getTemporary(Context, N))); 550 EXPECT_TRUE(U->isUniqued()); 551 552 // This temporary should become a new uniqued node. 553 auto Temp2 = MDTuple::getTemporary(Context, U); 554 auto *V = Temp2.get(); 555 EXPECT_EQ(V, MDNode::replaceWithPermanent(std::move(Temp2))); 556 EXPECT_TRUE(V->isUniqued()); 557 EXPECT_EQ(U, V->getOperand(0)); 558 } 559 560 TEST_F(MDNodeTest, deleteTemporaryWithTrackingRef) { 561 TrackingMDRef Ref; 562 EXPECT_EQ(nullptr, Ref.get()); 563 { 564 auto Temp = MDTuple::getTemporary(Context, None); 565 Ref.reset(Temp.get()); 566 EXPECT_EQ(Temp.get(), Ref.get()); 567 } 568 EXPECT_EQ(nullptr, Ref.get()); 569 } 570 571 typedef MetadataTest MDLocationTest; 572 573 TEST_F(MDLocationTest, Overflow) { 574 MDNode *N = MDNode::get(Context, None); 575 { 576 MDLocation *L = MDLocation::get(Context, 2, 7, N); 577 EXPECT_EQ(2u, L->getLine()); 578 EXPECT_EQ(7u, L->getColumn()); 579 } 580 unsigned U16 = 1u << 16; 581 { 582 MDLocation *L = MDLocation::get(Context, UINT32_MAX, U16 - 1, N); 583 EXPECT_EQ(UINT32_MAX, L->getLine()); 584 EXPECT_EQ(U16 - 1, L->getColumn()); 585 } 586 { 587 MDLocation *L = MDLocation::get(Context, UINT32_MAX, U16, N); 588 EXPECT_EQ(UINT32_MAX, L->getLine()); 589 EXPECT_EQ(0u, L->getColumn()); 590 } 591 { 592 MDLocation *L = MDLocation::get(Context, UINT32_MAX, U16 + 1, N); 593 EXPECT_EQ(UINT32_MAX, L->getLine()); 594 EXPECT_EQ(0u, L->getColumn()); 595 } 596 } 597 598 TEST_F(MDLocationTest, getDistinct) { 599 MDNode *N = MDNode::get(Context, None); 600 MDLocation *L0 = MDLocation::getDistinct(Context, 2, 7, N); 601 EXPECT_TRUE(L0->isDistinct()); 602 MDLocation *L1 = MDLocation::get(Context, 2, 7, N); 603 EXPECT_FALSE(L1->isDistinct()); 604 EXPECT_EQ(L1, MDLocation::get(Context, 2, 7, N)); 605 } 606 607 TEST_F(MDLocationTest, getTemporary) { 608 MDNode *N = MDNode::get(Context, None); 609 auto L = MDLocation::getTemporary(Context, 2, 7, N); 610 EXPECT_TRUE(L->isTemporary()); 611 EXPECT_FALSE(L->isResolved()); 612 } 613 614 typedef MetadataTest GenericDebugNodeTest; 615 616 TEST_F(GenericDebugNodeTest, get) { 617 StringRef Header = "header"; 618 auto *Empty = MDNode::get(Context, None); 619 Metadata *Ops1[] = {Empty}; 620 auto *N = GenericDebugNode::get(Context, 15, Header, Ops1); 621 EXPECT_EQ(15u, N->getTag()); 622 EXPECT_EQ(2u, N->getNumOperands()); 623 EXPECT_EQ(Header, N->getHeader()); 624 EXPECT_EQ(MDString::get(Context, Header), N->getOperand(0)); 625 EXPECT_EQ(1u, N->getNumDwarfOperands()); 626 EXPECT_EQ(Empty, N->getDwarfOperand(0)); 627 EXPECT_EQ(Empty, N->getOperand(1)); 628 ASSERT_TRUE(N->isUniqued()); 629 630 EXPECT_EQ(N, GenericDebugNode::get(Context, 15, Header, Ops1)); 631 632 N->replaceOperandWith(1, nullptr); 633 EXPECT_EQ(15u, N->getTag()); 634 EXPECT_EQ(Header, N->getHeader()); 635 EXPECT_EQ(nullptr, N->getDwarfOperand(0)); 636 ASSERT_TRUE(N->isUniqued()); 637 638 Metadata *Ops2[] = {nullptr}; 639 EXPECT_EQ(N, GenericDebugNode::get(Context, 15, Header, Ops2)); 640 641 N->replaceDwarfOperandWith(0, Empty); 642 EXPECT_EQ(15u, N->getTag()); 643 EXPECT_EQ(Header, N->getHeader()); 644 EXPECT_EQ(Empty, N->getDwarfOperand(0)); 645 ASSERT_TRUE(N->isUniqued()); 646 EXPECT_EQ(N, GenericDebugNode::get(Context, 15, Header, Ops1)); 647 648 TempGenericDebugNode Temp = N->clone(); 649 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 650 } 651 652 TEST_F(GenericDebugNodeTest, getEmptyHeader) { 653 // Canonicalize !"" to null. 654 auto *N = GenericDebugNode::get(Context, 15, StringRef(), None); 655 EXPECT_EQ(StringRef(), N->getHeader()); 656 EXPECT_EQ(nullptr, N->getOperand(0)); 657 } 658 659 typedef MetadataTest MDSubrangeTest; 660 661 TEST_F(MDSubrangeTest, get) { 662 auto *N = MDSubrange::get(Context, 5, 7); 663 EXPECT_EQ(dwarf::DW_TAG_subrange_type, N->getTag()); 664 EXPECT_EQ(5, N->getCount()); 665 EXPECT_EQ(7, N->getLo()); 666 EXPECT_EQ(N, MDSubrange::get(Context, 5, 7)); 667 EXPECT_EQ(MDSubrange::get(Context, 5, 0), MDSubrange::get(Context, 5)); 668 669 TempMDSubrange Temp = N->clone(); 670 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 671 } 672 673 TEST_F(MDSubrangeTest, getEmptyArray) { 674 auto *N = MDSubrange::get(Context, -1, 0); 675 EXPECT_EQ(dwarf::DW_TAG_subrange_type, N->getTag()); 676 EXPECT_EQ(-1, N->getCount()); 677 EXPECT_EQ(0, N->getLo()); 678 EXPECT_EQ(N, MDSubrange::get(Context, -1, 0)); 679 } 680 681 typedef MetadataTest MDEnumeratorTest; 682 683 TEST_F(MDEnumeratorTest, get) { 684 auto *N = MDEnumerator::get(Context, 7, "name"); 685 EXPECT_EQ(dwarf::DW_TAG_enumerator, N->getTag()); 686 EXPECT_EQ(7, N->getValue()); 687 EXPECT_EQ("name", N->getName()); 688 EXPECT_EQ(N, MDEnumerator::get(Context, 7, "name")); 689 690 EXPECT_NE(N, MDEnumerator::get(Context, 8, "name")); 691 EXPECT_NE(N, MDEnumerator::get(Context, 7, "nam")); 692 693 TempMDEnumerator Temp = N->clone(); 694 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 695 } 696 697 typedef MetadataTest MDBasicTypeTest; 698 699 TEST_F(MDBasicTypeTest, get) { 700 auto *N = 701 MDBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 26, 7); 702 EXPECT_EQ(dwarf::DW_TAG_base_type, N->getTag()); 703 EXPECT_EQ("special", N->getName()); 704 EXPECT_EQ(33u, N->getSizeInBits()); 705 EXPECT_EQ(26u, N->getAlignInBits()); 706 EXPECT_EQ(7u, N->getEncoding()); 707 EXPECT_EQ(0u, N->getLine()); 708 EXPECT_EQ(N, MDBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 709 26, 7)); 710 711 EXPECT_NE(N, MDBasicType::get(Context, dwarf::DW_TAG_unspecified_type, 712 "special", 33, 26, 7)); 713 EXPECT_NE(N, 714 MDBasicType::get(Context, dwarf::DW_TAG_base_type, "s", 33, 26, 7)); 715 EXPECT_NE(N, MDBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 32, 716 26, 7)); 717 EXPECT_NE(N, MDBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 718 25, 7)); 719 EXPECT_NE(N, MDBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 720 26, 6)); 721 722 TempMDBasicType Temp = N->clone(); 723 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 724 } 725 726 TEST_F(MDBasicTypeTest, getWithLargeValues) { 727 auto *N = MDBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 728 UINT64_MAX, UINT64_MAX - 1, 7); 729 EXPECT_EQ(UINT64_MAX, N->getSizeInBits()); 730 EXPECT_EQ(UINT64_MAX - 1, N->getAlignInBits()); 731 } 732 733 typedef MetadataTest MDDerivedTypeTest; 734 735 TEST_F(MDDerivedTypeTest, get) { 736 Metadata *File = MDTuple::getDistinct(Context, None); 737 Metadata *Scope = MDTuple::getDistinct(Context, None); 738 Metadata *BaseType = MDTuple::getDistinct(Context, None); 739 Metadata *ExtraData = MDTuple::getDistinct(Context, None); 740 741 auto *N = MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something", 742 File, 1, Scope, BaseType, 2, 3, 4, 5, ExtraData); 743 EXPECT_EQ(dwarf::DW_TAG_pointer_type, N->getTag()); 744 EXPECT_EQ("something", N->getName()); 745 EXPECT_EQ(File, N->getFile()); 746 EXPECT_EQ(1u, N->getLine()); 747 EXPECT_EQ(Scope, N->getScope()); 748 EXPECT_EQ(BaseType, N->getBaseType()); 749 EXPECT_EQ(2u, N->getSizeInBits()); 750 EXPECT_EQ(3u, N->getAlignInBits()); 751 EXPECT_EQ(4u, N->getOffsetInBits()); 752 EXPECT_EQ(5u, N->getFlags()); 753 EXPECT_EQ(ExtraData, N->getExtraData()); 754 EXPECT_EQ(N, MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 755 "something", File, 1, Scope, BaseType, 2, 3, 756 4, 5, ExtraData)); 757 758 EXPECT_NE(N, MDDerivedType::get(Context, dwarf::DW_TAG_reference_type, 759 "something", File, 1, Scope, BaseType, 2, 3, 760 4, 5, ExtraData)); 761 EXPECT_NE(N, MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "else", 762 File, 1, Scope, BaseType, 2, 3, 4, 5, 763 ExtraData)); 764 EXPECT_NE(N, MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 765 "something", Scope, 1, Scope, BaseType, 2, 3, 766 4, 5, ExtraData)); 767 EXPECT_NE(N, MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 768 "something", File, 2, Scope, BaseType, 2, 3, 769 4, 5, ExtraData)); 770 EXPECT_NE(N, 771 MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something", 772 File, 1, File, BaseType, 2, 3, 4, 5, ExtraData)); 773 EXPECT_NE(N, 774 MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something", 775 File, 1, Scope, File, 2, 3, 4, 5, ExtraData)); 776 EXPECT_NE(N, MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 777 "something", File, 1, Scope, BaseType, 3, 3, 778 4, 5, ExtraData)); 779 EXPECT_NE(N, MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 780 "something", File, 1, Scope, BaseType, 2, 2, 781 4, 5, ExtraData)); 782 EXPECT_NE(N, MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 783 "something", File, 1, Scope, BaseType, 2, 3, 784 5, 5, ExtraData)); 785 EXPECT_NE(N, MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 786 "something", File, 1, Scope, BaseType, 2, 3, 787 4, 4, ExtraData)); 788 EXPECT_NE(N, 789 MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something", 790 File, 1, Scope, BaseType, 2, 3, 4, 5, File)); 791 792 TempMDDerivedType Temp = N->clone(); 793 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 794 } 795 796 TEST_F(MDDerivedTypeTest, getWithLargeValues) { 797 Metadata *File = MDTuple::getDistinct(Context, None); 798 Metadata *Scope = MDTuple::getDistinct(Context, None); 799 Metadata *BaseType = MDTuple::getDistinct(Context, None); 800 Metadata *ExtraData = MDTuple::getDistinct(Context, None); 801 802 auto *N = MDDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something", 803 File, 1, Scope, BaseType, UINT64_MAX, 804 UINT64_MAX - 1, UINT64_MAX - 2, 5, ExtraData); 805 EXPECT_EQ(UINT64_MAX, N->getSizeInBits()); 806 EXPECT_EQ(UINT64_MAX - 1, N->getAlignInBits()); 807 EXPECT_EQ(UINT64_MAX - 2, N->getOffsetInBits()); 808 } 809 810 typedef MetadataTest MDCompositeTypeTest; 811 812 TEST_F(MDCompositeTypeTest, get) { 813 unsigned Tag = dwarf::DW_TAG_structure_type; 814 StringRef Name = "some name"; 815 Metadata *File = MDTuple::getDistinct(Context, None); 816 unsigned Line = 1; 817 Metadata *Scope = MDTuple::getDistinct(Context, None); 818 Metadata *BaseType = MDTuple::getDistinct(Context, None); 819 uint64_t SizeInBits = 2; 820 uint64_t AlignInBits = 3; 821 uint64_t OffsetInBits = 4; 822 unsigned Flags = 5; 823 Metadata *Elements = MDTuple::getDistinct(Context, None); 824 unsigned RuntimeLang = 6; 825 Metadata *VTableHolder = MDTuple::getDistinct(Context, None); 826 Metadata *TemplateParams = MDTuple::getDistinct(Context, None); 827 StringRef Identifier = "some id"; 828 829 auto *N = MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 830 BaseType, SizeInBits, AlignInBits, 831 OffsetInBits, Flags, Elements, RuntimeLang, 832 VTableHolder, TemplateParams, Identifier); 833 EXPECT_EQ(Tag, N->getTag()); 834 EXPECT_EQ(Name, N->getName()); 835 EXPECT_EQ(File, N->getFile()); 836 EXPECT_EQ(Line, N->getLine()); 837 EXPECT_EQ(Scope, N->getScope()); 838 EXPECT_EQ(BaseType, N->getBaseType()); 839 EXPECT_EQ(SizeInBits, N->getSizeInBits()); 840 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 841 EXPECT_EQ(OffsetInBits, N->getOffsetInBits()); 842 EXPECT_EQ(Flags, N->getFlags()); 843 EXPECT_EQ(Elements, N->getElements()); 844 EXPECT_EQ(RuntimeLang, N->getRuntimeLang()); 845 EXPECT_EQ(VTableHolder, N->getVTableHolder()); 846 EXPECT_EQ(TemplateParams, N->getTemplateParams()); 847 EXPECT_EQ(Identifier, N->getIdentifier()); 848 849 EXPECT_EQ(N, MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 850 BaseType, SizeInBits, AlignInBits, 851 OffsetInBits, Flags, Elements, RuntimeLang, 852 VTableHolder, TemplateParams, Identifier)); 853 854 EXPECT_NE(N, MDCompositeType::get(Context, Tag + 1, Name, File, Line, Scope, 855 BaseType, SizeInBits, AlignInBits, 856 OffsetInBits, Flags, Elements, RuntimeLang, 857 VTableHolder, TemplateParams, Identifier)); 858 EXPECT_NE(N, MDCompositeType::get(Context, Tag, "abc", File, Line, Scope, 859 BaseType, SizeInBits, AlignInBits, 860 OffsetInBits, Flags, Elements, RuntimeLang, 861 VTableHolder, TemplateParams, Identifier)); 862 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, Scope, Line, Scope, 863 BaseType, SizeInBits, AlignInBits, 864 OffsetInBits, Flags, Elements, RuntimeLang, 865 VTableHolder, TemplateParams, Identifier)); 866 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line + 1, Scope, 867 BaseType, SizeInBits, AlignInBits, 868 OffsetInBits, Flags, Elements, RuntimeLang, 869 VTableHolder, TemplateParams, Identifier)); 870 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line, File, 871 BaseType, SizeInBits, AlignInBits, 872 OffsetInBits, Flags, Elements, RuntimeLang, 873 VTableHolder, TemplateParams, Identifier)); 874 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line, Scope, File, 875 SizeInBits, AlignInBits, OffsetInBits, 876 Flags, Elements, RuntimeLang, VTableHolder, 877 TemplateParams, Identifier)); 878 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 879 BaseType, SizeInBits + 1, AlignInBits, 880 OffsetInBits, Flags, Elements, RuntimeLang, 881 VTableHolder, TemplateParams, Identifier)); 882 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 883 BaseType, SizeInBits, AlignInBits + 1, 884 OffsetInBits, Flags, Elements, RuntimeLang, 885 VTableHolder, TemplateParams, Identifier)); 886 EXPECT_NE(N, MDCompositeType::get( 887 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 888 AlignInBits, OffsetInBits + 1, Flags, Elements, RuntimeLang, 889 VTableHolder, TemplateParams, Identifier)); 890 EXPECT_NE(N, MDCompositeType::get( 891 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 892 AlignInBits, OffsetInBits, Flags + 1, Elements, RuntimeLang, 893 VTableHolder, TemplateParams, Identifier)); 894 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 895 BaseType, SizeInBits, AlignInBits, 896 OffsetInBits, Flags, File, RuntimeLang, 897 VTableHolder, TemplateParams, Identifier)); 898 EXPECT_NE(N, MDCompositeType::get( 899 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 900 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang + 1, 901 VTableHolder, TemplateParams, Identifier)); 902 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 903 BaseType, SizeInBits, AlignInBits, 904 OffsetInBits, Flags, Elements, RuntimeLang, 905 File, TemplateParams, Identifier)); 906 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 907 BaseType, SizeInBits, AlignInBits, 908 OffsetInBits, Flags, Elements, RuntimeLang, 909 VTableHolder, File, Identifier)); 910 EXPECT_NE(N, MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 911 BaseType, SizeInBits, AlignInBits, 912 OffsetInBits, Flags, Elements, RuntimeLang, 913 VTableHolder, TemplateParams, "other")); 914 915 // Be sure that missing identifiers get null pointers. 916 EXPECT_FALSE(MDCompositeType::get( 917 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 918 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 919 VTableHolder, TemplateParams, "")->getRawIdentifier()); 920 EXPECT_FALSE(MDCompositeType::get( 921 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 922 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 923 VTableHolder, TemplateParams)->getRawIdentifier()); 924 925 TempMDCompositeType Temp = N->clone(); 926 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 927 } 928 929 TEST_F(MDCompositeTypeTest, getWithLargeValues) { 930 unsigned Tag = dwarf::DW_TAG_structure_type; 931 StringRef Name = "some name"; 932 Metadata *File = MDTuple::getDistinct(Context, None); 933 unsigned Line = 1; 934 Metadata *Scope = MDTuple::getDistinct(Context, None); 935 Metadata *BaseType = MDTuple::getDistinct(Context, None); 936 uint64_t SizeInBits = UINT64_MAX; 937 uint64_t AlignInBits = UINT64_MAX - 1; 938 uint64_t OffsetInBits = UINT64_MAX - 2; 939 unsigned Flags = 5; 940 Metadata *Elements = MDTuple::getDistinct(Context, None); 941 unsigned RuntimeLang = 6; 942 Metadata *VTableHolder = MDTuple::getDistinct(Context, None); 943 Metadata *TemplateParams = MDTuple::getDistinct(Context, None); 944 StringRef Identifier = "some id"; 945 946 auto *N = MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 947 BaseType, SizeInBits, AlignInBits, 948 OffsetInBits, Flags, Elements, RuntimeLang, 949 VTableHolder, TemplateParams, Identifier); 950 EXPECT_EQ(SizeInBits, N->getSizeInBits()); 951 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 952 EXPECT_EQ(OffsetInBits, N->getOffsetInBits()); 953 } 954 955 TEST_F(MDCompositeTypeTest, replaceOperands) { 956 unsigned Tag = dwarf::DW_TAG_structure_type; 957 StringRef Name = "some name"; 958 Metadata *File = MDTuple::getDistinct(Context, None); 959 unsigned Line = 1; 960 Metadata *Scope = MDTuple::getDistinct(Context, None); 961 Metadata *BaseType = MDTuple::getDistinct(Context, None); 962 uint64_t SizeInBits = 2; 963 uint64_t AlignInBits = 3; 964 uint64_t OffsetInBits = 4; 965 unsigned Flags = 5; 966 unsigned RuntimeLang = 6; 967 StringRef Identifier = "some id"; 968 969 auto *N = MDCompositeType::get(Context, Tag, Name, File, Line, Scope, 970 BaseType, SizeInBits, AlignInBits, 971 OffsetInBits, Flags, nullptr, RuntimeLang, 972 nullptr, nullptr, Identifier); 973 974 auto *Elements = MDTuple::getDistinct(Context, None); 975 EXPECT_EQ(nullptr, N->getElements()); 976 N->replaceElements(Elements); 977 EXPECT_EQ(Elements, N->getElements()); 978 N->replaceElements(nullptr); 979 EXPECT_EQ(nullptr, N->getElements()); 980 981 auto *VTableHolder = MDTuple::getDistinct(Context, None); 982 EXPECT_EQ(nullptr, N->getVTableHolder()); 983 N->replaceVTableHolder(VTableHolder); 984 EXPECT_EQ(VTableHolder, N->getVTableHolder()); 985 N->replaceVTableHolder(nullptr); 986 EXPECT_EQ(nullptr, N->getVTableHolder()); 987 988 auto *TemplateParams = MDTuple::getDistinct(Context, None); 989 EXPECT_EQ(nullptr, N->getTemplateParams()); 990 N->replaceTemplateParams(TemplateParams); 991 EXPECT_EQ(TemplateParams, N->getTemplateParams()); 992 N->replaceTemplateParams(nullptr); 993 EXPECT_EQ(nullptr, N->getTemplateParams()); 994 } 995 996 typedef MetadataTest MDSubroutineTypeTest; 997 998 TEST_F(MDSubroutineTypeTest, get) { 999 unsigned Flags = 1; 1000 Metadata *TypeArray = MDTuple::getDistinct(Context, None); 1001 1002 auto *N = MDSubroutineType::get(Context, Flags, TypeArray); 1003 EXPECT_EQ(dwarf::DW_TAG_subroutine_type, N->getTag()); 1004 EXPECT_EQ(Flags, N->getFlags()); 1005 EXPECT_EQ(TypeArray, N->getTypeArray()); 1006 EXPECT_EQ(N, MDSubroutineType::get(Context, Flags, TypeArray)); 1007 1008 EXPECT_NE(N, MDSubroutineType::get(Context, Flags + 1, TypeArray)); 1009 EXPECT_NE(N, MDSubroutineType::get(Context, Flags, 1010 MDTuple::getDistinct(Context, None))); 1011 1012 TempMDSubroutineType Temp = N->clone(); 1013 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1014 1015 // Test always-empty operands. 1016 EXPECT_EQ(nullptr, N->getScope()); 1017 EXPECT_EQ(nullptr, N->getFile()); 1018 EXPECT_EQ("", N->getName()); 1019 EXPECT_EQ(nullptr, N->getBaseType()); 1020 EXPECT_EQ(nullptr, N->getVTableHolder()); 1021 EXPECT_EQ(nullptr, N->getTemplateParams()); 1022 EXPECT_EQ("", N->getIdentifier()); 1023 } 1024 1025 typedef MetadataTest MDFileTest; 1026 1027 TEST_F(MDFileTest, get) { 1028 StringRef Filename = "file"; 1029 StringRef Directory = "dir"; 1030 auto *N = MDFile::get(Context, Filename, Directory); 1031 1032 EXPECT_EQ(dwarf::DW_TAG_file_type, N->getTag()); 1033 EXPECT_EQ(Filename, N->getFilename()); 1034 EXPECT_EQ(Directory, N->getDirectory()); 1035 EXPECT_EQ(N, MDFile::get(Context, Filename, Directory)); 1036 1037 EXPECT_NE(N, MDFile::get(Context, "other", Directory)); 1038 EXPECT_NE(N, MDFile::get(Context, Filename, "other")); 1039 1040 TempMDFile Temp = N->clone(); 1041 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1042 } 1043 1044 typedef MetadataTest MDCompileUnitTest; 1045 1046 TEST_F(MDCompileUnitTest, get) { 1047 unsigned SourceLanguage = 1; 1048 Metadata *File = MDTuple::getDistinct(Context, None); 1049 StringRef Producer = "some producer"; 1050 bool IsOptimized = false; 1051 StringRef Flags = "flag after flag"; 1052 unsigned RuntimeVersion = 2; 1053 StringRef SplitDebugFilename = "another/file"; 1054 unsigned EmissionKind = 3; 1055 Metadata *EnumTypes = MDTuple::getDistinct(Context, None); 1056 Metadata *RetainedTypes = MDTuple::getDistinct(Context, None); 1057 Metadata *Subprograms = MDTuple::getDistinct(Context, None); 1058 Metadata *GlobalVariables = MDTuple::getDistinct(Context, None); 1059 Metadata *ImportedEntities = MDTuple::getDistinct(Context, None); 1060 auto *N = MDCompileUnit::get( 1061 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 1062 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 1063 RetainedTypes, Subprograms, GlobalVariables, ImportedEntities); 1064 1065 EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag()); 1066 EXPECT_EQ(SourceLanguage, N->getSourceLanguage()); 1067 EXPECT_EQ(File, N->getFile()); 1068 EXPECT_EQ(Producer, N->getProducer()); 1069 EXPECT_EQ(IsOptimized, N->isOptimized()); 1070 EXPECT_EQ(Flags, N->getFlags()); 1071 EXPECT_EQ(RuntimeVersion, N->getRuntimeVersion()); 1072 EXPECT_EQ(SplitDebugFilename, N->getSplitDebugFilename()); 1073 EXPECT_EQ(EmissionKind, N->getEmissionKind()); 1074 EXPECT_EQ(EnumTypes, N->getEnumTypes()); 1075 EXPECT_EQ(RetainedTypes, N->getRetainedTypes()); 1076 EXPECT_EQ(Subprograms, N->getSubprograms()); 1077 EXPECT_EQ(GlobalVariables, N->getGlobalVariables()); 1078 EXPECT_EQ(ImportedEntities, N->getImportedEntities()); 1079 EXPECT_EQ(N, MDCompileUnit::get(Context, SourceLanguage, File, Producer, 1080 IsOptimized, Flags, RuntimeVersion, 1081 SplitDebugFilename, EmissionKind, EnumTypes, 1082 RetainedTypes, Subprograms, GlobalVariables, 1083 ImportedEntities)); 1084 1085 EXPECT_NE(N, MDCompileUnit::get(Context, SourceLanguage + 1, File, Producer, 1086 IsOptimized, Flags, RuntimeVersion, 1087 SplitDebugFilename, EmissionKind, EnumTypes, 1088 RetainedTypes, Subprograms, GlobalVariables, 1089 ImportedEntities)); 1090 EXPECT_NE(N, MDCompileUnit::get(Context, SourceLanguage, EnumTypes, Producer, 1091 IsOptimized, Flags, RuntimeVersion, 1092 SplitDebugFilename, EmissionKind, EnumTypes, 1093 RetainedTypes, Subprograms, GlobalVariables, 1094 ImportedEntities)); 1095 EXPECT_NE(N, MDCompileUnit::get(Context, SourceLanguage, File, "other", 1096 IsOptimized, Flags, RuntimeVersion, 1097 SplitDebugFilename, EmissionKind, EnumTypes, 1098 RetainedTypes, Subprograms, GlobalVariables, 1099 ImportedEntities)); 1100 EXPECT_NE(N, MDCompileUnit::get(Context, SourceLanguage, File, Producer, 1101 !IsOptimized, Flags, RuntimeVersion, 1102 SplitDebugFilename, EmissionKind, EnumTypes, 1103 RetainedTypes, Subprograms, GlobalVariables, 1104 ImportedEntities)); 1105 EXPECT_NE(N, MDCompileUnit::get(Context, SourceLanguage, File, Producer, 1106 IsOptimized, "other", RuntimeVersion, 1107 SplitDebugFilename, EmissionKind, EnumTypes, 1108 RetainedTypes, Subprograms, GlobalVariables, 1109 ImportedEntities)); 1110 EXPECT_NE(N, MDCompileUnit::get(Context, SourceLanguage, File, Producer, 1111 IsOptimized, Flags, RuntimeVersion + 1, 1112 SplitDebugFilename, EmissionKind, EnumTypes, 1113 RetainedTypes, Subprograms, GlobalVariables, 1114 ImportedEntities)); 1115 EXPECT_NE(N, 1116 MDCompileUnit::get(Context, SourceLanguage, File, Producer, 1117 IsOptimized, Flags, RuntimeVersion, "other", 1118 EmissionKind, EnumTypes, RetainedTypes, 1119 Subprograms, GlobalVariables, ImportedEntities)); 1120 EXPECT_NE(N, MDCompileUnit::get(Context, SourceLanguage, File, Producer, 1121 IsOptimized, Flags, RuntimeVersion, 1122 SplitDebugFilename, EmissionKind + 1, 1123 EnumTypes, RetainedTypes, Subprograms, 1124 GlobalVariables, ImportedEntities)); 1125 EXPECT_NE(N, MDCompileUnit::get(Context, SourceLanguage, File, Producer, 1126 IsOptimized, Flags, RuntimeVersion, 1127 SplitDebugFilename, EmissionKind, File, 1128 RetainedTypes, Subprograms, GlobalVariables, 1129 ImportedEntities)); 1130 EXPECT_NE(N, MDCompileUnit::get( 1131 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 1132 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 1133 File, Subprograms, GlobalVariables, ImportedEntities)); 1134 EXPECT_NE(N, MDCompileUnit::get( 1135 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 1136 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 1137 RetainedTypes, File, GlobalVariables, ImportedEntities)); 1138 EXPECT_NE(N, MDCompileUnit::get( 1139 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 1140 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 1141 RetainedTypes, Subprograms, File, ImportedEntities)); 1142 EXPECT_NE(N, MDCompileUnit::get( 1143 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 1144 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 1145 RetainedTypes, Subprograms, GlobalVariables, File)); 1146 1147 TempMDCompileUnit Temp = N->clone(); 1148 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1149 } 1150 1151 TEST_F(MDCompileUnitTest, replaceArrays) { 1152 unsigned SourceLanguage = 1; 1153 Metadata *File = MDTuple::getDistinct(Context, None); 1154 StringRef Producer = "some producer"; 1155 bool IsOptimized = false; 1156 StringRef Flags = "flag after flag"; 1157 unsigned RuntimeVersion = 2; 1158 StringRef SplitDebugFilename = "another/file"; 1159 unsigned EmissionKind = 3; 1160 Metadata *EnumTypes = MDTuple::getDistinct(Context, None); 1161 Metadata *RetainedTypes = MDTuple::getDistinct(Context, None); 1162 Metadata *ImportedEntities = MDTuple::getDistinct(Context, None); 1163 auto *N = MDCompileUnit::get( 1164 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 1165 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 1166 RetainedTypes, nullptr, nullptr, ImportedEntities); 1167 1168 auto *Subprograms = MDTuple::getDistinct(Context, None); 1169 EXPECT_EQ(nullptr, N->getSubprograms()); 1170 N->replaceSubprograms(Subprograms); 1171 EXPECT_EQ(Subprograms, N->getSubprograms()); 1172 N->replaceSubprograms(nullptr); 1173 EXPECT_EQ(nullptr, N->getSubprograms()); 1174 1175 auto *GlobalVariables = MDTuple::getDistinct(Context, None); 1176 EXPECT_EQ(nullptr, N->getGlobalVariables()); 1177 N->replaceGlobalVariables(GlobalVariables); 1178 EXPECT_EQ(GlobalVariables, N->getGlobalVariables()); 1179 N->replaceGlobalVariables(nullptr); 1180 EXPECT_EQ(nullptr, N->getGlobalVariables()); 1181 } 1182 1183 typedef MetadataTest MDSubprogramTest; 1184 1185 TEST_F(MDSubprogramTest, get) { 1186 Metadata *Scope = MDTuple::getDistinct(Context, None); 1187 StringRef Name = "name"; 1188 StringRef LinkageName = "linkage"; 1189 Metadata *File = MDTuple::getDistinct(Context, None); 1190 unsigned Line = 2; 1191 Metadata *Type = MDTuple::getDistinct(Context, None); 1192 bool IsLocalToUnit = false; 1193 bool IsDefinition = true; 1194 unsigned ScopeLine = 3; 1195 Metadata *ContainingType = MDTuple::getDistinct(Context, None); 1196 unsigned Virtuality = 4; 1197 unsigned VirtualIndex = 5; 1198 unsigned Flags = 6; 1199 bool IsOptimized = false; 1200 Metadata *Function = MDTuple::getDistinct(Context, None); 1201 Metadata *TemplateParams = MDTuple::getDistinct(Context, None); 1202 Metadata *Declaration = MDTuple::getDistinct(Context, None); 1203 Metadata *Variables = MDTuple::getDistinct(Context, None); 1204 1205 auto *N = MDSubprogram::get( 1206 Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 1207 IsDefinition, ScopeLine, ContainingType, Virtuality, VirtualIndex, Flags, 1208 IsOptimized, Function, TemplateParams, Declaration, Variables); 1209 1210 EXPECT_EQ(dwarf::DW_TAG_subprogram, N->getTag()); 1211 EXPECT_EQ(Scope, N->getScope()); 1212 EXPECT_EQ(Name, N->getName()); 1213 EXPECT_EQ(LinkageName, N->getLinkageName()); 1214 EXPECT_EQ(File, N->getFile()); 1215 EXPECT_EQ(Line, N->getLine()); 1216 EXPECT_EQ(Type, N->getType()); 1217 EXPECT_EQ(IsLocalToUnit, N->isLocalToUnit()); 1218 EXPECT_EQ(IsDefinition, N->isDefinition()); 1219 EXPECT_EQ(ScopeLine, N->getScopeLine()); 1220 EXPECT_EQ(ContainingType, N->getContainingType()); 1221 EXPECT_EQ(Virtuality, N->getVirtuality()); 1222 EXPECT_EQ(VirtualIndex, N->getVirtualIndex()); 1223 EXPECT_EQ(Flags, N->getFlags()); 1224 EXPECT_EQ(IsOptimized, N->isOptimized()); 1225 EXPECT_EQ(Function, N->getFunction()); 1226 EXPECT_EQ(TemplateParams, N->getTemplateParams()); 1227 EXPECT_EQ(Declaration, N->getDeclaration()); 1228 EXPECT_EQ(Variables, N->getVariables()); 1229 EXPECT_EQ(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1230 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1231 ContainingType, Virtuality, VirtualIndex, 1232 Flags, IsOptimized, Function, TemplateParams, 1233 Declaration, Variables)); 1234 1235 EXPECT_NE(N, MDSubprogram::get(Context, File, Name, LinkageName, File, Line, 1236 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1237 ContainingType, Virtuality, VirtualIndex, 1238 Flags, IsOptimized, Function, TemplateParams, 1239 Declaration, Variables)); 1240 EXPECT_NE(N, MDSubprogram::get(Context, Scope, "other", LinkageName, File, 1241 Line, Type, IsLocalToUnit, IsDefinition, 1242 ScopeLine, ContainingType, Virtuality, 1243 VirtualIndex, Flags, IsOptimized, Function, 1244 TemplateParams, Declaration, Variables)); 1245 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, "other", File, Line, 1246 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1247 ContainingType, Virtuality, VirtualIndex, 1248 Flags, IsOptimized, Function, TemplateParams, 1249 Declaration, Variables)); 1250 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, Scope, Line, 1251 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1252 ContainingType, Virtuality, VirtualIndex, 1253 Flags, IsOptimized, Function, TemplateParams, 1254 Declaration, Variables)); 1255 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, 1256 Line + 1, Type, IsLocalToUnit, IsDefinition, 1257 ScopeLine, ContainingType, Virtuality, 1258 VirtualIndex, Flags, IsOptimized, Function, 1259 TemplateParams, Declaration, Variables)); 1260 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1261 Scope, IsLocalToUnit, IsDefinition, ScopeLine, 1262 ContainingType, Virtuality, VirtualIndex, 1263 Flags, IsOptimized, Function, TemplateParams, 1264 Declaration, Variables)); 1265 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1266 Type, !IsLocalToUnit, IsDefinition, ScopeLine, 1267 ContainingType, Virtuality, VirtualIndex, 1268 Flags, IsOptimized, Function, TemplateParams, 1269 Declaration, Variables)); 1270 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1271 Type, IsLocalToUnit, !IsDefinition, ScopeLine, 1272 ContainingType, Virtuality, VirtualIndex, 1273 Flags, IsOptimized, Function, TemplateParams, 1274 Declaration, Variables)); 1275 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1276 Type, IsLocalToUnit, IsDefinition, 1277 ScopeLine + 1, ContainingType, Virtuality, 1278 VirtualIndex, Flags, IsOptimized, Function, 1279 TemplateParams, Declaration, Variables)); 1280 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1281 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1282 Type, Virtuality, VirtualIndex, Flags, 1283 IsOptimized, Function, TemplateParams, 1284 Declaration, Variables)); 1285 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1286 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1287 ContainingType, Virtuality + 1, VirtualIndex, 1288 Flags, IsOptimized, Function, TemplateParams, 1289 Declaration, Variables)); 1290 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1291 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1292 ContainingType, Virtuality, VirtualIndex + 1, 1293 Flags, IsOptimized, Function, TemplateParams, 1294 Declaration, Variables)); 1295 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1296 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1297 ContainingType, Virtuality, VirtualIndex, 1298 ~Flags, IsOptimized, Function, TemplateParams, 1299 Declaration, Variables)); 1300 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1301 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1302 ContainingType, Virtuality, VirtualIndex, 1303 Flags, !IsOptimized, Function, TemplateParams, 1304 Declaration, Variables)); 1305 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1306 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1307 ContainingType, Virtuality, VirtualIndex, 1308 Flags, IsOptimized, Type, TemplateParams, 1309 Declaration, Variables)); 1310 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1311 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1312 ContainingType, Virtuality, VirtualIndex, 1313 Flags, IsOptimized, Function, Type, 1314 Declaration, Variables)); 1315 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1316 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1317 ContainingType, Virtuality, VirtualIndex, 1318 Flags, IsOptimized, Function, TemplateParams, 1319 Type, Variables)); 1320 EXPECT_NE(N, MDSubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1321 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1322 ContainingType, Virtuality, VirtualIndex, 1323 Flags, IsOptimized, Function, TemplateParams, 1324 Declaration, Type)); 1325 1326 TempMDSubprogram Temp = N->clone(); 1327 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1328 } 1329 1330 TEST_F(MDSubprogramTest, replaceFunction) { 1331 Metadata *Scope = MDTuple::getDistinct(Context, None); 1332 StringRef Name = "name"; 1333 StringRef LinkageName = "linkage"; 1334 Metadata *File = MDTuple::getDistinct(Context, None); 1335 unsigned Line = 2; 1336 Metadata *Type = MDTuple::getDistinct(Context, None); 1337 bool IsLocalToUnit = false; 1338 bool IsDefinition = true; 1339 unsigned ScopeLine = 3; 1340 Metadata *ContainingType = MDTuple::getDistinct(Context, None); 1341 unsigned Virtuality = 4; 1342 unsigned VirtualIndex = 5; 1343 unsigned Flags = 6; 1344 bool IsOptimized = false; 1345 Metadata *TemplateParams = MDTuple::getDistinct(Context, None); 1346 Metadata *Declaration = MDTuple::getDistinct(Context, None); 1347 Metadata *Variables = MDTuple::getDistinct(Context, None); 1348 1349 auto *N = MDSubprogram::get( 1350 Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 1351 IsDefinition, ScopeLine, ContainingType, Virtuality, VirtualIndex, Flags, 1352 IsOptimized, nullptr, TemplateParams, Declaration, Variables); 1353 1354 EXPECT_EQ(nullptr, N->getFunction()); 1355 1356 std::unique_ptr<Function> F( 1357 Function::Create(FunctionType::get(Type::getVoidTy(Context), false), 1358 GlobalValue::ExternalLinkage)); 1359 N->replaceFunction(F.get()); 1360 EXPECT_EQ(ConstantAsMetadata::get(F.get()), N->getFunction()); 1361 1362 N->replaceFunction(nullptr); 1363 EXPECT_EQ(nullptr, N->getFunction()); 1364 } 1365 1366 typedef MetadataTest MDLexicalBlockTest; 1367 1368 TEST_F(MDLexicalBlockTest, get) { 1369 Metadata *Scope = MDTuple::getDistinct(Context, None); 1370 Metadata *File = MDTuple::getDistinct(Context, None); 1371 unsigned Line = 5; 1372 unsigned Column = 8; 1373 1374 auto *N = MDLexicalBlock::get(Context, Scope, File, Line, Column); 1375 1376 EXPECT_EQ(dwarf::DW_TAG_lexical_block, N->getTag()); 1377 EXPECT_EQ(Scope, N->getScope()); 1378 EXPECT_EQ(File, N->getFile()); 1379 EXPECT_EQ(Line, N->getLine()); 1380 EXPECT_EQ(Column, N->getColumn()); 1381 EXPECT_EQ(N, MDLexicalBlock::get(Context, Scope, File, Line, Column)); 1382 1383 EXPECT_NE(N, MDLexicalBlock::get(Context, File, File, Line, Column)); 1384 EXPECT_NE(N, MDLexicalBlock::get(Context, Scope, Scope, Line, Column)); 1385 EXPECT_NE(N, MDLexicalBlock::get(Context, Scope, File, Line + 1, Column)); 1386 EXPECT_NE(N, MDLexicalBlock::get(Context, Scope, File, Line, Column + 1)); 1387 1388 TempMDLexicalBlock Temp = N->clone(); 1389 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1390 } 1391 1392 typedef MetadataTest MDLexicalBlockFileTest; 1393 1394 TEST_F(MDLexicalBlockFileTest, get) { 1395 Metadata *Scope = MDTuple::getDistinct(Context, None); 1396 Metadata *File = MDTuple::getDistinct(Context, None); 1397 unsigned Discriminator = 5; 1398 1399 auto *N = MDLexicalBlockFile::get(Context, Scope, File, Discriminator); 1400 1401 EXPECT_EQ(dwarf::DW_TAG_lexical_block, N->getTag()); 1402 EXPECT_EQ(Scope, N->getScope()); 1403 EXPECT_EQ(File, N->getFile()); 1404 EXPECT_EQ(Discriminator, N->getDiscriminator()); 1405 EXPECT_EQ(N, MDLexicalBlockFile::get(Context, Scope, File, Discriminator)); 1406 1407 EXPECT_NE(N, MDLexicalBlockFile::get(Context, File, File, Discriminator)); 1408 EXPECT_NE(N, MDLexicalBlockFile::get(Context, Scope, Scope, Discriminator)); 1409 EXPECT_NE(N, 1410 MDLexicalBlockFile::get(Context, Scope, File, Discriminator + 1)); 1411 1412 TempMDLexicalBlockFile Temp = N->clone(); 1413 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1414 } 1415 1416 typedef MetadataTest MDNamespaceTest; 1417 1418 TEST_F(MDNamespaceTest, get) { 1419 Metadata *Scope = MDTuple::getDistinct(Context, None); 1420 Metadata *File = MDTuple::getDistinct(Context, None); 1421 StringRef Name = "namespace"; 1422 unsigned Line = 5; 1423 1424 auto *N = MDNamespace::get(Context, Scope, File, Name, Line); 1425 1426 EXPECT_EQ(dwarf::DW_TAG_namespace, N->getTag()); 1427 EXPECT_EQ(Scope, N->getScope()); 1428 EXPECT_EQ(File, N->getFile()); 1429 EXPECT_EQ(Name, N->getName()); 1430 EXPECT_EQ(Line, N->getLine()); 1431 EXPECT_EQ(N, MDNamespace::get(Context, Scope, File, Name, Line)); 1432 1433 EXPECT_NE(N, MDNamespace::get(Context, File, File, Name, Line)); 1434 EXPECT_NE(N, MDNamespace::get(Context, Scope, Scope, Name, Line)); 1435 EXPECT_NE(N, MDNamespace::get(Context, Scope, File, "other", Line)); 1436 EXPECT_NE(N, MDNamespace::get(Context, Scope, File, Name, Line + 1)); 1437 1438 TempMDNamespace Temp = N->clone(); 1439 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1440 } 1441 1442 typedef MetadataTest MDTemplateTypeParameterTest; 1443 1444 TEST_F(MDTemplateTypeParameterTest, get) { 1445 StringRef Name = "template"; 1446 Metadata *Type = MDTuple::getDistinct(Context, None); 1447 Metadata *Other = MDTuple::getDistinct(Context, None); 1448 1449 auto *N = MDTemplateTypeParameter::get(Context, Name, Type); 1450 1451 EXPECT_EQ(dwarf::DW_TAG_template_type_parameter, N->getTag()); 1452 EXPECT_EQ(Name, N->getName()); 1453 EXPECT_EQ(Type, N->getType()); 1454 EXPECT_EQ(N, MDTemplateTypeParameter::get(Context, Name, Type)); 1455 1456 EXPECT_NE(N, MDTemplateTypeParameter::get(Context, "other", Type)); 1457 EXPECT_NE(N, MDTemplateTypeParameter::get(Context, Name, Other)); 1458 1459 TempMDTemplateTypeParameter Temp = N->clone(); 1460 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1461 } 1462 1463 typedef MetadataTest MDTemplateValueParameterTest; 1464 1465 TEST_F(MDTemplateValueParameterTest, get) { 1466 unsigned Tag = dwarf::DW_TAG_template_value_parameter; 1467 StringRef Name = "template"; 1468 Metadata *Type = MDTuple::getDistinct(Context, None); 1469 Metadata *Value = MDTuple::getDistinct(Context, None); 1470 Metadata *Other = MDTuple::getDistinct(Context, None); 1471 1472 auto *N = MDTemplateValueParameter::get(Context, Tag, Name, Type, Value); 1473 EXPECT_EQ(Tag, N->getTag()); 1474 EXPECT_EQ(Name, N->getName()); 1475 EXPECT_EQ(Type, N->getType()); 1476 EXPECT_EQ(Value, N->getValue()); 1477 EXPECT_EQ(N, MDTemplateValueParameter::get(Context, Tag, Name, Type, Value)); 1478 1479 EXPECT_NE(N, MDTemplateValueParameter::get( 1480 Context, dwarf::DW_TAG_GNU_template_template_param, Name, 1481 Type, Value)); 1482 EXPECT_NE(N, MDTemplateValueParameter::get(Context, Tag, "other", Type, 1483 Value)); 1484 EXPECT_NE(N, MDTemplateValueParameter::get(Context, Tag, Name, Other, 1485 Value)); 1486 EXPECT_NE(N, MDTemplateValueParameter::get(Context, Tag, Name, Type, Other)); 1487 1488 TempMDTemplateValueParameter Temp = N->clone(); 1489 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1490 } 1491 1492 typedef MetadataTest MDGlobalVariableTest; 1493 1494 TEST_F(MDGlobalVariableTest, get) { 1495 Metadata *Scope = MDTuple::getDistinct(Context, None); 1496 StringRef Name = "name"; 1497 StringRef LinkageName = "linkage"; 1498 Metadata *File = MDTuple::getDistinct(Context, None); 1499 unsigned Line = 5; 1500 Metadata *Type = MDTuple::getDistinct(Context, None); 1501 bool IsLocalToUnit = false; 1502 bool IsDefinition = true; 1503 Metadata *Variable = MDTuple::getDistinct(Context, None); 1504 Metadata *StaticDataMemberDeclaration = MDTuple::getDistinct(Context, None); 1505 1506 auto *N = MDGlobalVariable::get(Context, Scope, Name, LinkageName, File, Line, 1507 Type, IsLocalToUnit, IsDefinition, Variable, 1508 StaticDataMemberDeclaration); 1509 EXPECT_EQ(dwarf::DW_TAG_variable, N->getTag()); 1510 EXPECT_EQ(Scope, N->getScope()); 1511 EXPECT_EQ(Name, N->getName()); 1512 EXPECT_EQ(LinkageName, N->getLinkageName()); 1513 EXPECT_EQ(File, N->getFile()); 1514 EXPECT_EQ(Line, N->getLine()); 1515 EXPECT_EQ(Type, N->getType()); 1516 EXPECT_EQ(IsLocalToUnit, N->isLocalToUnit()); 1517 EXPECT_EQ(IsDefinition, N->isDefinition()); 1518 EXPECT_EQ(Variable, N->getVariable()); 1519 EXPECT_EQ(StaticDataMemberDeclaration, N->getStaticDataMemberDeclaration()); 1520 EXPECT_EQ(N, MDGlobalVariable::get(Context, Scope, Name, LinkageName, File, 1521 Line, Type, IsLocalToUnit, IsDefinition, 1522 Variable, StaticDataMemberDeclaration)); 1523 1524 EXPECT_NE(N, MDGlobalVariable::get(Context, File, Name, LinkageName, File, 1525 Line, Type, IsLocalToUnit, IsDefinition, 1526 Variable, StaticDataMemberDeclaration)); 1527 EXPECT_NE(N, MDGlobalVariable::get(Context, Scope, "other", LinkageName, File, 1528 Line, Type, IsLocalToUnit, IsDefinition, 1529 Variable, StaticDataMemberDeclaration)); 1530 EXPECT_NE(N, MDGlobalVariable::get(Context, Scope, Name, "other", File, Line, 1531 Type, IsLocalToUnit, IsDefinition, 1532 Variable, StaticDataMemberDeclaration)); 1533 EXPECT_NE(N, MDGlobalVariable::get(Context, Scope, Name, LinkageName, Scope, 1534 Line, Type, IsLocalToUnit, IsDefinition, 1535 Variable, StaticDataMemberDeclaration)); 1536 EXPECT_NE(N, 1537 MDGlobalVariable::get(Context, Scope, Name, LinkageName, File, 1538 Line + 1, Type, IsLocalToUnit, IsDefinition, 1539 Variable, StaticDataMemberDeclaration)); 1540 EXPECT_NE(N, MDGlobalVariable::get(Context, Scope, Name, LinkageName, File, 1541 Line, Scope, IsLocalToUnit, IsDefinition, 1542 Variable, StaticDataMemberDeclaration)); 1543 EXPECT_NE(N, MDGlobalVariable::get(Context, Scope, Name, LinkageName, File, 1544 Line, Type, !IsLocalToUnit, IsDefinition, 1545 Variable, StaticDataMemberDeclaration)); 1546 EXPECT_NE(N, MDGlobalVariable::get(Context, Scope, Name, LinkageName, File, 1547 Line, Type, IsLocalToUnit, !IsDefinition, 1548 Variable, StaticDataMemberDeclaration)); 1549 EXPECT_NE(N, MDGlobalVariable::get(Context, Scope, Name, LinkageName, File, 1550 Line, Type, IsLocalToUnit, IsDefinition, 1551 Type, StaticDataMemberDeclaration)); 1552 EXPECT_NE(N, MDGlobalVariable::get(Context, Scope, Name, LinkageName, File, 1553 Line, Type, IsLocalToUnit, IsDefinition, 1554 Variable, Type)); 1555 1556 TempMDGlobalVariable Temp = N->clone(); 1557 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1558 } 1559 1560 typedef MetadataTest MDLocalVariableTest; 1561 1562 TEST_F(MDLocalVariableTest, get) { 1563 unsigned Tag = dwarf::DW_TAG_arg_variable; 1564 Metadata *Scope = MDTuple::getDistinct(Context, None); 1565 StringRef Name = "name"; 1566 Metadata *File = MDTuple::getDistinct(Context, None); 1567 unsigned Line = 5; 1568 Metadata *Type = MDTuple::getDistinct(Context, None); 1569 unsigned Arg = 6; 1570 unsigned Flags = 7; 1571 Metadata *InlinedAt = MDTuple::getDistinct(Context, None); 1572 1573 auto *N = MDLocalVariable::get(Context, Tag, Scope, Name, File, Line, Type, 1574 Arg, Flags, InlinedAt); 1575 EXPECT_EQ(Tag, N->getTag()); 1576 EXPECT_EQ(Scope, N->getScope()); 1577 EXPECT_EQ(Name, N->getName()); 1578 EXPECT_EQ(File, N->getFile()); 1579 EXPECT_EQ(Line, N->getLine()); 1580 EXPECT_EQ(Type, N->getType()); 1581 EXPECT_EQ(Arg, N->getArg()); 1582 EXPECT_EQ(Flags, N->getFlags()); 1583 EXPECT_EQ(InlinedAt, N->getInlinedAt()); 1584 EXPECT_EQ(N, MDLocalVariable::get(Context, Tag, Scope, Name, File, Line, Type, 1585 Arg, Flags, InlinedAt)); 1586 1587 EXPECT_NE(N, MDLocalVariable::get(Context, dwarf::DW_TAG_auto_variable, Scope, 1588 Name, File, Line, Type, Arg, Flags, 1589 InlinedAt)); 1590 EXPECT_NE(N, MDLocalVariable::get(Context, Tag, File, Name, File, Line, 1591 Type, Arg, Flags, InlinedAt)); 1592 EXPECT_NE(N, MDLocalVariable::get(Context, Tag, Scope, "other", File, Line, 1593 Type, Arg, Flags, InlinedAt)); 1594 EXPECT_NE(N, MDLocalVariable::get(Context, Tag, Scope, Name, Scope, Line, 1595 Type, Arg, Flags, InlinedAt)); 1596 EXPECT_NE(N, MDLocalVariable::get(Context, Tag, Scope, Name, File, Line + 1, 1597 Type, Arg, Flags, InlinedAt)); 1598 EXPECT_NE(N, MDLocalVariable::get(Context, Tag, Scope, Name, File, Line, 1599 Scope, Arg, Flags, InlinedAt)); 1600 EXPECT_NE(N, MDLocalVariable::get(Context, Tag, Scope, Name, File, Line, Type, 1601 Arg + 1, Flags, InlinedAt)); 1602 EXPECT_NE(N, MDLocalVariable::get(Context, Tag, Scope, Name, File, Line, Type, 1603 Arg, ~Flags, InlinedAt)); 1604 EXPECT_NE(N, MDLocalVariable::get(Context, Tag, Scope, Name, File, Line, Type, 1605 Arg, Flags, Scope)); 1606 1607 TempMDLocalVariable Temp = N->clone(); 1608 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1609 } 1610 1611 typedef MetadataTest MDExpressionTest; 1612 1613 TEST_F(MDExpressionTest, get) { 1614 uint64_t Elements[] = {2, 6, 9, 78, 0}; 1615 auto *N = MDExpression::get(Context, Elements); 1616 EXPECT_EQ(makeArrayRef(Elements), N->getElements()); 1617 EXPECT_EQ(N, MDExpression::get(Context, Elements)); 1618 1619 EXPECT_EQ(5u, N->getNumElements()); 1620 EXPECT_EQ(2u, N->getElement(0)); 1621 EXPECT_EQ(6u, N->getElement(1)); 1622 EXPECT_EQ(9u, N->getElement(2)); 1623 EXPECT_EQ(78u, N->getElement(3)); 1624 EXPECT_EQ(0u, N->getElement(4)); 1625 1626 TempMDExpression Temp = N->clone(); 1627 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1628 } 1629 1630 TEST_F(MDExpressionTest, isValid) { 1631 #define EXPECT_VALID(...) \ 1632 do { \ 1633 uint64_t Elements[] = {__VA_ARGS__}; \ 1634 EXPECT_TRUE(MDExpression::get(Context, Elements)->isValid()); \ 1635 } while (false) 1636 #define EXPECT_INVALID(...) \ 1637 do { \ 1638 uint64_t Elements[] = {__VA_ARGS__}; \ 1639 EXPECT_FALSE(MDExpression::get(Context, Elements)->isValid()); \ 1640 } while (false) 1641 1642 // Empty expression should be valid. 1643 EXPECT_TRUE(MDExpression::get(Context, None)); 1644 1645 // Valid constructions. 1646 EXPECT_VALID(dwarf::DW_OP_plus, 6); 1647 EXPECT_VALID(dwarf::DW_OP_deref); 1648 EXPECT_VALID(dwarf::DW_OP_bit_piece, 3, 7); 1649 EXPECT_VALID(dwarf::DW_OP_plus, 6, dwarf::DW_OP_deref); 1650 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_plus, 6); 1651 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_bit_piece, 3, 7); 1652 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_plus, 6, dwarf::DW_OP_bit_piece, 3, 7); 1653 1654 // Invalid constructions. 1655 EXPECT_INVALID(~0u); 1656 EXPECT_INVALID(dwarf::DW_OP_plus); 1657 EXPECT_INVALID(dwarf::DW_OP_bit_piece); 1658 EXPECT_INVALID(dwarf::DW_OP_bit_piece, 3); 1659 EXPECT_INVALID(dwarf::DW_OP_bit_piece, 3, 7, dwarf::DW_OP_plus, 3); 1660 EXPECT_INVALID(dwarf::DW_OP_bit_piece, 3, 7, dwarf::DW_OP_deref); 1661 1662 #undef EXPECT_VALID 1663 #undef EXPECT_INVALID 1664 } 1665 1666 typedef MetadataTest MDObjCPropertyTest; 1667 1668 TEST_F(MDObjCPropertyTest, get) { 1669 StringRef Name = "name"; 1670 Metadata *File = MDTuple::getDistinct(Context, None); 1671 unsigned Line = 5; 1672 StringRef GetterName = "getter"; 1673 StringRef SetterName = "setter"; 1674 unsigned Attributes = 7; 1675 Metadata *Type = MDTuple::getDistinct(Context, None); 1676 1677 auto *N = MDObjCProperty::get(Context, Name, File, Line, GetterName, 1678 SetterName, Attributes, Type); 1679 1680 EXPECT_EQ(dwarf::DW_TAG_APPLE_property, N->getTag()); 1681 EXPECT_EQ(Name, N->getName()); 1682 EXPECT_EQ(File, N->getFile()); 1683 EXPECT_EQ(Line, N->getLine()); 1684 EXPECT_EQ(GetterName, N->getGetterName()); 1685 EXPECT_EQ(SetterName, N->getSetterName()); 1686 EXPECT_EQ(Attributes, N->getAttributes()); 1687 EXPECT_EQ(Type, N->getType()); 1688 EXPECT_EQ(N, MDObjCProperty::get(Context, Name, File, Line, GetterName, 1689 SetterName, Attributes, Type)); 1690 1691 EXPECT_NE(N, MDObjCProperty::get(Context, "other", File, Line, GetterName, 1692 SetterName, Attributes, Type)); 1693 EXPECT_NE(N, MDObjCProperty::get(Context, Name, Type, Line, GetterName, 1694 SetterName, Attributes, Type)); 1695 EXPECT_NE(N, MDObjCProperty::get(Context, Name, File, Line + 1, GetterName, 1696 SetterName, Attributes, Type)); 1697 EXPECT_NE(N, MDObjCProperty::get(Context, Name, File, Line, "other", 1698 SetterName, Attributes, Type)); 1699 EXPECT_NE(N, MDObjCProperty::get(Context, Name, File, Line, GetterName, 1700 "other", Attributes, Type)); 1701 EXPECT_NE(N, MDObjCProperty::get(Context, Name, File, Line, GetterName, 1702 SetterName, Attributes + 1, Type)); 1703 EXPECT_NE(N, MDObjCProperty::get(Context, Name, File, Line, GetterName, 1704 SetterName, Attributes, File)); 1705 1706 TempMDObjCProperty Temp = N->clone(); 1707 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1708 } 1709 1710 typedef MetadataTest MDImportedEntityTest; 1711 1712 TEST_F(MDImportedEntityTest, get) { 1713 unsigned Tag = dwarf::DW_TAG_imported_module; 1714 Metadata *Scope = MDTuple::getDistinct(Context, None); 1715 Metadata *Entity = MDTuple::getDistinct(Context, None); 1716 unsigned Line = 5; 1717 StringRef Name = "name"; 1718 1719 auto *N = MDImportedEntity::get(Context, Tag, Scope, Entity, Line, Name); 1720 1721 EXPECT_EQ(Tag, N->getTag()); 1722 EXPECT_EQ(Scope, N->getScope()); 1723 EXPECT_EQ(Entity, N->getEntity()); 1724 EXPECT_EQ(Line, N->getLine()); 1725 EXPECT_EQ(Name, N->getName()); 1726 EXPECT_EQ(N, MDImportedEntity::get(Context, Tag, Scope, Entity, Line, Name)); 1727 1728 EXPECT_NE(N, 1729 MDImportedEntity::get(Context, dwarf::DW_TAG_imported_declaration, 1730 Scope, Entity, Line, Name)); 1731 EXPECT_NE(N, MDImportedEntity::get(Context, Tag, Entity, Entity, Line, Name)); 1732 EXPECT_NE(N, MDImportedEntity::get(Context, Tag, Scope, Scope, Line, Name)); 1733 EXPECT_NE(N, 1734 MDImportedEntity::get(Context, Tag, Scope, Entity, Line + 1, Name)); 1735 EXPECT_NE(N, 1736 MDImportedEntity::get(Context, Tag, Scope, Entity, Line, "other")); 1737 1738 TempMDImportedEntity Temp = N->clone(); 1739 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1740 } 1741 1742 typedef MetadataTest MetadataAsValueTest; 1743 1744 TEST_F(MetadataAsValueTest, MDNode) { 1745 MDNode *N = MDNode::get(Context, None); 1746 auto *V = MetadataAsValue::get(Context, N); 1747 EXPECT_TRUE(V->getType()->isMetadataTy()); 1748 EXPECT_EQ(N, V->getMetadata()); 1749 1750 auto *V2 = MetadataAsValue::get(Context, N); 1751 EXPECT_EQ(V, V2); 1752 } 1753 1754 TEST_F(MetadataAsValueTest, MDNodeMDNode) { 1755 MDNode *N = MDNode::get(Context, None); 1756 Metadata *Ops[] = {N}; 1757 MDNode *N2 = MDNode::get(Context, Ops); 1758 auto *V = MetadataAsValue::get(Context, N2); 1759 EXPECT_TRUE(V->getType()->isMetadataTy()); 1760 EXPECT_EQ(N2, V->getMetadata()); 1761 1762 auto *V2 = MetadataAsValue::get(Context, N2); 1763 EXPECT_EQ(V, V2); 1764 1765 auto *V3 = MetadataAsValue::get(Context, N); 1766 EXPECT_TRUE(V3->getType()->isMetadataTy()); 1767 EXPECT_NE(V, V3); 1768 EXPECT_EQ(N, V3->getMetadata()); 1769 } 1770 1771 TEST_F(MetadataAsValueTest, MDNodeConstant) { 1772 auto *C = ConstantInt::getTrue(Context); 1773 auto *MD = ConstantAsMetadata::get(C); 1774 Metadata *Ops[] = {MD}; 1775 auto *N = MDNode::get(Context, Ops); 1776 1777 auto *V = MetadataAsValue::get(Context, MD); 1778 EXPECT_TRUE(V->getType()->isMetadataTy()); 1779 EXPECT_EQ(MD, V->getMetadata()); 1780 1781 auto *V2 = MetadataAsValue::get(Context, N); 1782 EXPECT_EQ(MD, V2->getMetadata()); 1783 EXPECT_EQ(V, V2); 1784 } 1785 1786 typedef MetadataTest ValueAsMetadataTest; 1787 1788 TEST_F(ValueAsMetadataTest, UpdatesOnRAUW) { 1789 Type *Ty = Type::getInt1PtrTy(Context); 1790 std::unique_ptr<GlobalVariable> GV0( 1791 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 1792 auto *MD = ValueAsMetadata::get(GV0.get()); 1793 EXPECT_TRUE(MD->getValue() == GV0.get()); 1794 ASSERT_TRUE(GV0->use_empty()); 1795 1796 std::unique_ptr<GlobalVariable> GV1( 1797 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 1798 GV0->replaceAllUsesWith(GV1.get()); 1799 EXPECT_TRUE(MD->getValue() == GV1.get()); 1800 } 1801 1802 TEST_F(ValueAsMetadataTest, CollidingDoubleUpdates) { 1803 // Create a constant. 1804 ConstantAsMetadata *CI = ConstantAsMetadata::get( 1805 ConstantInt::get(getGlobalContext(), APInt(8, 0))); 1806 1807 // Create a temporary to prevent nodes from resolving. 1808 auto Temp = MDTuple::getTemporary(Context, None); 1809 1810 // When the first operand of N1 gets reset to nullptr, it'll collide with N2. 1811 Metadata *Ops1[] = {CI, CI, Temp.get()}; 1812 Metadata *Ops2[] = {nullptr, CI, Temp.get()}; 1813 1814 auto *N1 = MDTuple::get(Context, Ops1); 1815 auto *N2 = MDTuple::get(Context, Ops2); 1816 ASSERT_NE(N1, N2); 1817 1818 // Tell metadata that the constant is getting deleted. 1819 // 1820 // After this, N1 will be invalid, so don't touch it. 1821 ValueAsMetadata::handleDeletion(CI->getValue()); 1822 EXPECT_EQ(nullptr, N2->getOperand(0)); 1823 EXPECT_EQ(nullptr, N2->getOperand(1)); 1824 EXPECT_EQ(Temp.get(), N2->getOperand(2)); 1825 1826 // Clean up Temp for teardown. 1827 Temp->replaceAllUsesWith(nullptr); 1828 } 1829 1830 typedef MetadataTest TrackingMDRefTest; 1831 1832 TEST_F(TrackingMDRefTest, UpdatesOnRAUW) { 1833 Type *Ty = Type::getInt1PtrTy(Context); 1834 std::unique_ptr<GlobalVariable> GV0( 1835 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 1836 TypedTrackingMDRef<ValueAsMetadata> MD(ValueAsMetadata::get(GV0.get())); 1837 EXPECT_TRUE(MD->getValue() == GV0.get()); 1838 ASSERT_TRUE(GV0->use_empty()); 1839 1840 std::unique_ptr<GlobalVariable> GV1( 1841 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 1842 GV0->replaceAllUsesWith(GV1.get()); 1843 EXPECT_TRUE(MD->getValue() == GV1.get()); 1844 1845 // Reset it, so we don't inadvertently test deletion. 1846 MD.reset(); 1847 } 1848 1849 TEST_F(TrackingMDRefTest, UpdatesOnDeletion) { 1850 Type *Ty = Type::getInt1PtrTy(Context); 1851 std::unique_ptr<GlobalVariable> GV( 1852 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 1853 TypedTrackingMDRef<ValueAsMetadata> MD(ValueAsMetadata::get(GV.get())); 1854 EXPECT_TRUE(MD->getValue() == GV.get()); 1855 ASSERT_TRUE(GV->use_empty()); 1856 1857 GV.reset(); 1858 EXPECT_TRUE(!MD); 1859 } 1860 1861 TEST(NamedMDNodeTest, Search) { 1862 LLVMContext Context; 1863 ConstantAsMetadata *C = 1864 ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context), 1)); 1865 ConstantAsMetadata *C2 = 1866 ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context), 2)); 1867 1868 Metadata *const V = C; 1869 Metadata *const V2 = C2; 1870 MDNode *n = MDNode::get(Context, V); 1871 MDNode *n2 = MDNode::get(Context, V2); 1872 1873 Module M("MyModule", Context); 1874 const char *Name = "llvm.NMD1"; 1875 NamedMDNode *NMD = M.getOrInsertNamedMetadata(Name); 1876 NMD->addOperand(n); 1877 NMD->addOperand(n2); 1878 1879 std::string Str; 1880 raw_string_ostream oss(Str); 1881 NMD->print(oss); 1882 EXPECT_STREQ("!llvm.NMD1 = !{!0, !1}\n", 1883 oss.str().c_str()); 1884 } 1885 } 1886