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/IR/Metadata.h" 11 #include "llvm/ADT/STLExtras.h" 12 #include "llvm/IR/Constants.h" 13 #include "llvm/IR/DebugInfo.h" 14 #include "llvm/IR/DebugInfoMetadata.h" 15 #include "llvm/IR/Function.h" 16 #include "llvm/IR/Instructions.h" 17 #include "llvm/IR/LLVMContext.h" 18 #include "llvm/IR/Module.h" 19 #include "llvm/IR/ModuleSlotTracker.h" 20 #include "llvm/IR/Type.h" 21 #include "llvm/IR/Verifier.h" 22 #include "llvm/Support/raw_ostream.h" 23 #include "gtest/gtest.h" 24 using namespace llvm; 25 26 namespace { 27 28 TEST(ContextAndReplaceableUsesTest, FromContext) { 29 LLVMContext Context; 30 ContextAndReplaceableUses CRU(Context); 31 EXPECT_EQ(&Context, &CRU.getContext()); 32 EXPECT_FALSE(CRU.hasReplaceableUses()); 33 EXPECT_FALSE(CRU.getReplaceableUses()); 34 } 35 36 TEST(ContextAndReplaceableUsesTest, FromReplaceableUses) { 37 LLVMContext Context; 38 ContextAndReplaceableUses CRU(make_unique<ReplaceableMetadataImpl>(Context)); 39 EXPECT_EQ(&Context, &CRU.getContext()); 40 EXPECT_TRUE(CRU.hasReplaceableUses()); 41 EXPECT_TRUE(CRU.getReplaceableUses()); 42 } 43 44 TEST(ContextAndReplaceableUsesTest, makeReplaceable) { 45 LLVMContext Context; 46 ContextAndReplaceableUses CRU(Context); 47 CRU.makeReplaceable(make_unique<ReplaceableMetadataImpl>(Context)); 48 EXPECT_EQ(&Context, &CRU.getContext()); 49 EXPECT_TRUE(CRU.hasReplaceableUses()); 50 EXPECT_TRUE(CRU.getReplaceableUses()); 51 } 52 53 TEST(ContextAndReplaceableUsesTest, takeReplaceableUses) { 54 LLVMContext Context; 55 auto ReplaceableUses = make_unique<ReplaceableMetadataImpl>(Context); 56 auto *Ptr = ReplaceableUses.get(); 57 ContextAndReplaceableUses CRU(std::move(ReplaceableUses)); 58 ReplaceableUses = CRU.takeReplaceableUses(); 59 EXPECT_EQ(&Context, &CRU.getContext()); 60 EXPECT_FALSE(CRU.hasReplaceableUses()); 61 EXPECT_FALSE(CRU.getReplaceableUses()); 62 EXPECT_EQ(Ptr, ReplaceableUses.get()); 63 } 64 65 class MetadataTest : public testing::Test { 66 public: 67 MetadataTest() : M("test", Context), Counter(0) {} 68 69 protected: 70 LLVMContext Context; 71 Module M; 72 int Counter; 73 74 MDNode *getNode() { return MDNode::get(Context, None); } 75 MDNode *getNode(Metadata *MD) { return MDNode::get(Context, MD); } 76 MDNode *getNode(Metadata *MD1, Metadata *MD2) { 77 Metadata *MDs[] = {MD1, MD2}; 78 return MDNode::get(Context, MDs); 79 } 80 81 MDTuple *getTuple() { return MDTuple::getDistinct(Context, None); } 82 DISubroutineType *getSubroutineType() { 83 return DISubroutineType::getDistinct(Context, DINode::FlagZero, 0, 84 getNode(nullptr)); 85 } 86 DISubprogram *getSubprogram() { 87 return DISubprogram::getDistinct(Context, nullptr, "", "", nullptr, 0, 88 nullptr, false, false, 0, nullptr, 0, 0, 0, 89 DINode::FlagZero, false, nullptr); 90 } 91 DIFile *getFile() { 92 return DIFile::getDistinct(Context, "file.c", "/path/to/dir"); 93 } 94 DICompileUnit *getUnit() { 95 return DICompileUnit::getDistinct( 96 Context, 1, getFile(), "clang", false, "-g", 2, "", 97 DICompileUnit::FullDebug, getTuple(), getTuple(), getTuple(), 98 getTuple(), getTuple(), 0, true, false, 99 DICompileUnit::DebugNameTableKind::Default); 100 } 101 DIType *getBasicType(StringRef Name) { 102 return DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, Name); 103 } 104 DIType *getDerivedType() { 105 return DIDerivedType::getDistinct( 106 Context, dwarf::DW_TAG_pointer_type, "", nullptr, 0, nullptr, 107 getBasicType("basictype"), 1, 2, 0, None, DINode::FlagZero); 108 } 109 Constant *getConstant() { 110 return ConstantInt::get(Type::getInt32Ty(Context), Counter++); 111 } 112 ConstantAsMetadata *getConstantAsMetadata() { 113 return ConstantAsMetadata::get(getConstant()); 114 } 115 DIType *getCompositeType() { 116 return DICompositeType::getDistinct( 117 Context, dwarf::DW_TAG_structure_type, "", nullptr, 0, nullptr, nullptr, 118 32, 32, 0, DINode::FlagZero, nullptr, 0, nullptr, nullptr, ""); 119 } 120 Function *getFunction(StringRef Name) { 121 return cast<Function>(M.getOrInsertFunction( 122 Name, FunctionType::get(Type::getVoidTy(Context), None, false))); 123 } 124 }; 125 typedef MetadataTest MDStringTest; 126 127 // Test that construction of MDString with different value produces different 128 // MDString objects, even with the same string pointer and nulls in the string. 129 TEST_F(MDStringTest, CreateDifferent) { 130 char x[3] = { 'f', 0, 'A' }; 131 MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); 132 x[2] = 'B'; 133 MDString *s2 = MDString::get(Context, StringRef(&x[0], 3)); 134 EXPECT_NE(s1, s2); 135 } 136 137 // Test that creation of MDStrings with the same string contents produces the 138 // same MDString object, even with different pointers. 139 TEST_F(MDStringTest, CreateSame) { 140 char x[4] = { 'a', 'b', 'c', 'X' }; 141 char y[4] = { 'a', 'b', 'c', 'Y' }; 142 143 MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); 144 MDString *s2 = MDString::get(Context, StringRef(&y[0], 3)); 145 EXPECT_EQ(s1, s2); 146 } 147 148 // Test that MDString prints out the string we fed it. 149 TEST_F(MDStringTest, PrintingSimple) { 150 char *str = new char[13]; 151 strncpy(str, "testing 1 2 3", 13); 152 MDString *s = MDString::get(Context, StringRef(str, 13)); 153 strncpy(str, "aaaaaaaaaaaaa", 13); 154 delete[] str; 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\\5C\\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 #undef EXPECT_PRINTER_EQ 406 407 TEST_F(MDNodeTest, NullOperand) { 408 // metadata !{} 409 MDNode *Empty = MDNode::get(Context, None); 410 411 // metadata !{metadata !{}} 412 Metadata *Ops[] = {Empty}; 413 MDNode *N = MDNode::get(Context, Ops); 414 ASSERT_EQ(Empty, N->getOperand(0)); 415 416 // metadata !{metadata !{}} => metadata !{null} 417 N->replaceOperandWith(0, nullptr); 418 ASSERT_EQ(nullptr, N->getOperand(0)); 419 420 // metadata !{null} 421 Ops[0] = nullptr; 422 MDNode *NullOp = MDNode::get(Context, Ops); 423 ASSERT_EQ(nullptr, NullOp->getOperand(0)); 424 EXPECT_EQ(N, NullOp); 425 } 426 427 TEST_F(MDNodeTest, DistinctOnUniquingCollision) { 428 // !{} 429 MDNode *Empty = MDNode::get(Context, None); 430 ASSERT_TRUE(Empty->isResolved()); 431 EXPECT_FALSE(Empty->isDistinct()); 432 433 // !{!{}} 434 Metadata *Wrapped1Ops[] = {Empty}; 435 MDNode *Wrapped1 = MDNode::get(Context, Wrapped1Ops); 436 ASSERT_EQ(Empty, Wrapped1->getOperand(0)); 437 ASSERT_TRUE(Wrapped1->isResolved()); 438 EXPECT_FALSE(Wrapped1->isDistinct()); 439 440 // !{!{!{}}} 441 Metadata *Wrapped2Ops[] = {Wrapped1}; 442 MDNode *Wrapped2 = MDNode::get(Context, Wrapped2Ops); 443 ASSERT_EQ(Wrapped1, Wrapped2->getOperand(0)); 444 ASSERT_TRUE(Wrapped2->isResolved()); 445 EXPECT_FALSE(Wrapped2->isDistinct()); 446 447 // !{!{!{}}} => !{!{}} 448 Wrapped2->replaceOperandWith(0, Empty); 449 ASSERT_EQ(Empty, Wrapped2->getOperand(0)); 450 EXPECT_TRUE(Wrapped2->isDistinct()); 451 EXPECT_FALSE(Wrapped1->isDistinct()); 452 } 453 454 TEST_F(MDNodeTest, UniquedOnDeletedOperand) { 455 // temp !{} 456 TempMDTuple T = MDTuple::getTemporary(Context, None); 457 458 // !{temp !{}} 459 Metadata *Ops[] = {T.get()}; 460 MDTuple *N = MDTuple::get(Context, Ops); 461 462 // !{temp !{}} => !{null} 463 T.reset(); 464 ASSERT_TRUE(N->isUniqued()); 465 Metadata *NullOps[] = {nullptr}; 466 ASSERT_EQ(N, MDTuple::get(Context, NullOps)); 467 } 468 469 TEST_F(MDNodeTest, DistinctOnDeletedValueOperand) { 470 // i1* @GV 471 Type *Ty = Type::getInt1PtrTy(Context); 472 std::unique_ptr<GlobalVariable> GV( 473 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 474 ConstantAsMetadata *Op = ConstantAsMetadata::get(GV.get()); 475 476 // !{i1* @GV} 477 Metadata *Ops[] = {Op}; 478 MDTuple *N = MDTuple::get(Context, Ops); 479 480 // !{i1* @GV} => !{null} 481 GV.reset(); 482 ASSERT_TRUE(N->isDistinct()); 483 ASSERT_EQ(nullptr, N->getOperand(0)); 484 Metadata *NullOps[] = {nullptr}; 485 ASSERT_NE(N, MDTuple::get(Context, NullOps)); 486 } 487 488 TEST_F(MDNodeTest, getDistinct) { 489 // !{} 490 MDNode *Empty = MDNode::get(Context, None); 491 ASSERT_TRUE(Empty->isResolved()); 492 ASSERT_FALSE(Empty->isDistinct()); 493 ASSERT_EQ(Empty, MDNode::get(Context, None)); 494 495 // distinct !{} 496 MDNode *Distinct1 = MDNode::getDistinct(Context, None); 497 MDNode *Distinct2 = MDNode::getDistinct(Context, None); 498 EXPECT_TRUE(Distinct1->isResolved()); 499 EXPECT_TRUE(Distinct2->isDistinct()); 500 EXPECT_NE(Empty, Distinct1); 501 EXPECT_NE(Empty, Distinct2); 502 EXPECT_NE(Distinct1, Distinct2); 503 504 // !{} 505 ASSERT_EQ(Empty, MDNode::get(Context, None)); 506 } 507 508 TEST_F(MDNodeTest, isUniqued) { 509 MDNode *U = MDTuple::get(Context, None); 510 MDNode *D = MDTuple::getDistinct(Context, None); 511 auto T = MDTuple::getTemporary(Context, None); 512 EXPECT_TRUE(U->isUniqued()); 513 EXPECT_FALSE(D->isUniqued()); 514 EXPECT_FALSE(T->isUniqued()); 515 } 516 517 TEST_F(MDNodeTest, isDistinct) { 518 MDNode *U = MDTuple::get(Context, None); 519 MDNode *D = MDTuple::getDistinct(Context, None); 520 auto T = MDTuple::getTemporary(Context, None); 521 EXPECT_FALSE(U->isDistinct()); 522 EXPECT_TRUE(D->isDistinct()); 523 EXPECT_FALSE(T->isDistinct()); 524 } 525 526 TEST_F(MDNodeTest, isTemporary) { 527 MDNode *U = MDTuple::get(Context, None); 528 MDNode *D = MDTuple::getDistinct(Context, None); 529 auto T = MDTuple::getTemporary(Context, None); 530 EXPECT_FALSE(U->isTemporary()); 531 EXPECT_FALSE(D->isTemporary()); 532 EXPECT_TRUE(T->isTemporary()); 533 } 534 535 TEST_F(MDNodeTest, getDistinctWithUnresolvedOperands) { 536 // temporary !{} 537 auto Temp = MDTuple::getTemporary(Context, None); 538 ASSERT_FALSE(Temp->isResolved()); 539 540 // distinct !{temporary !{}} 541 Metadata *Ops[] = {Temp.get()}; 542 MDNode *Distinct = MDNode::getDistinct(Context, Ops); 543 EXPECT_TRUE(Distinct->isResolved()); 544 EXPECT_EQ(Temp.get(), Distinct->getOperand(0)); 545 546 // temporary !{} => !{} 547 MDNode *Empty = MDNode::get(Context, None); 548 Temp->replaceAllUsesWith(Empty); 549 EXPECT_EQ(Empty, Distinct->getOperand(0)); 550 } 551 552 TEST_F(MDNodeTest, handleChangedOperandRecursion) { 553 // !0 = !{} 554 MDNode *N0 = MDNode::get(Context, None); 555 556 // !1 = !{!3, null} 557 auto Temp3 = MDTuple::getTemporary(Context, None); 558 Metadata *Ops1[] = {Temp3.get(), nullptr}; 559 MDNode *N1 = MDNode::get(Context, Ops1); 560 561 // !2 = !{!3, !0} 562 Metadata *Ops2[] = {Temp3.get(), N0}; 563 MDNode *N2 = MDNode::get(Context, Ops2); 564 565 // !3 = !{!2} 566 Metadata *Ops3[] = {N2}; 567 MDNode *N3 = MDNode::get(Context, Ops3); 568 Temp3->replaceAllUsesWith(N3); 569 570 // !4 = !{!1} 571 Metadata *Ops4[] = {N1}; 572 MDNode *N4 = MDNode::get(Context, Ops4); 573 574 // Confirm that the cycle prevented RAUW from getting dropped. 575 EXPECT_TRUE(N0->isResolved()); 576 EXPECT_FALSE(N1->isResolved()); 577 EXPECT_FALSE(N2->isResolved()); 578 EXPECT_FALSE(N3->isResolved()); 579 EXPECT_FALSE(N4->isResolved()); 580 581 // Create a couple of distinct nodes to observe what's going on. 582 // 583 // !5 = distinct !{!2} 584 // !6 = distinct !{!3} 585 Metadata *Ops5[] = {N2}; 586 MDNode *N5 = MDNode::getDistinct(Context, Ops5); 587 Metadata *Ops6[] = {N3}; 588 MDNode *N6 = MDNode::getDistinct(Context, Ops6); 589 590 // Mutate !2 to look like !1, causing a uniquing collision (and an RAUW). 591 // This will ripple up, with !3 colliding with !4, and RAUWing. Since !2 592 // references !3, this can cause a re-entry of handleChangedOperand() when !3 593 // is not ready for it. 594 // 595 // !2->replaceOperandWith(1, nullptr) 596 // !2: !{!3, !0} => !{!3, null} 597 // !2->replaceAllUsesWith(!1) 598 // !3: !{!2] => !{!1} 599 // !3->replaceAllUsesWith(!4) 600 N2->replaceOperandWith(1, nullptr); 601 602 // If all has gone well, N2 and N3 will have been RAUW'ed and deleted from 603 // under us. Just check that the other nodes are sane. 604 // 605 // !1 = !{!4, null} 606 // !4 = !{!1} 607 // !5 = distinct !{!1} 608 // !6 = distinct !{!4} 609 EXPECT_EQ(N4, N1->getOperand(0)); 610 EXPECT_EQ(N1, N4->getOperand(0)); 611 EXPECT_EQ(N1, N5->getOperand(0)); 612 EXPECT_EQ(N4, N6->getOperand(0)); 613 } 614 615 TEST_F(MDNodeTest, replaceResolvedOperand) { 616 // Check code for replacing one resolved operand with another. If doing this 617 // directly (via replaceOperandWith()) becomes illegal, change the operand to 618 // a global value that gets RAUW'ed. 619 // 620 // Use a temporary node to keep N from being resolved. 621 auto Temp = MDTuple::getTemporary(Context, None); 622 Metadata *Ops[] = {nullptr, Temp.get()}; 623 624 MDNode *Empty = MDTuple::get(Context, ArrayRef<Metadata *>()); 625 MDNode *N = MDTuple::get(Context, Ops); 626 EXPECT_EQ(nullptr, N->getOperand(0)); 627 ASSERT_FALSE(N->isResolved()); 628 629 // Check code for replacing resolved nodes. 630 N->replaceOperandWith(0, Empty); 631 EXPECT_EQ(Empty, N->getOperand(0)); 632 633 // Check code for adding another unresolved operand. 634 N->replaceOperandWith(0, Temp.get()); 635 EXPECT_EQ(Temp.get(), N->getOperand(0)); 636 637 // Remove the references to Temp; required for teardown. 638 Temp->replaceAllUsesWith(nullptr); 639 } 640 641 TEST_F(MDNodeTest, replaceWithUniqued) { 642 auto *Empty = MDTuple::get(Context, None); 643 MDTuple *FirstUniqued; 644 { 645 Metadata *Ops[] = {Empty}; 646 auto Temp = MDTuple::getTemporary(Context, Ops); 647 EXPECT_TRUE(Temp->isTemporary()); 648 649 // Don't expect a collision. 650 auto *Current = Temp.get(); 651 FirstUniqued = MDNode::replaceWithUniqued(std::move(Temp)); 652 EXPECT_TRUE(FirstUniqued->isUniqued()); 653 EXPECT_TRUE(FirstUniqued->isResolved()); 654 EXPECT_EQ(Current, FirstUniqued); 655 } 656 { 657 Metadata *Ops[] = {Empty}; 658 auto Temp = MDTuple::getTemporary(Context, Ops); 659 EXPECT_TRUE(Temp->isTemporary()); 660 661 // Should collide with Uniqued above this time. 662 auto *Uniqued = MDNode::replaceWithUniqued(std::move(Temp)); 663 EXPECT_TRUE(Uniqued->isUniqued()); 664 EXPECT_TRUE(Uniqued->isResolved()); 665 EXPECT_EQ(FirstUniqued, Uniqued); 666 } 667 { 668 auto Unresolved = MDTuple::getTemporary(Context, None); 669 Metadata *Ops[] = {Unresolved.get()}; 670 auto Temp = MDTuple::getTemporary(Context, Ops); 671 EXPECT_TRUE(Temp->isTemporary()); 672 673 // Shouldn't be resolved. 674 auto *Uniqued = MDNode::replaceWithUniqued(std::move(Temp)); 675 EXPECT_TRUE(Uniqued->isUniqued()); 676 EXPECT_FALSE(Uniqued->isResolved()); 677 678 // Should be a different node. 679 EXPECT_NE(FirstUniqued, Uniqued); 680 681 // Should resolve when we update its node (note: be careful to avoid a 682 // collision with any other nodes above). 683 Uniqued->replaceOperandWith(0, nullptr); 684 EXPECT_TRUE(Uniqued->isResolved()); 685 } 686 } 687 688 TEST_F(MDNodeTest, replaceWithUniquedResolvingOperand) { 689 // temp !{} 690 MDTuple *Op = MDTuple::getTemporary(Context, None).release(); 691 EXPECT_FALSE(Op->isResolved()); 692 693 // temp !{temp !{}} 694 Metadata *Ops[] = {Op}; 695 MDTuple *N = MDTuple::getTemporary(Context, Ops).release(); 696 EXPECT_FALSE(N->isResolved()); 697 698 // temp !{temp !{}} => !{temp !{}} 699 ASSERT_EQ(N, MDNode::replaceWithUniqued(TempMDTuple(N))); 700 EXPECT_FALSE(N->isResolved()); 701 702 // !{temp !{}} => !{!{}} 703 ASSERT_EQ(Op, MDNode::replaceWithUniqued(TempMDTuple(Op))); 704 EXPECT_TRUE(Op->isResolved()); 705 EXPECT_TRUE(N->isResolved()); 706 } 707 708 TEST_F(MDNodeTest, replaceWithUniquedDeletedOperand) { 709 // i1* @GV 710 Type *Ty = Type::getInt1PtrTy(Context); 711 std::unique_ptr<GlobalVariable> GV( 712 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 713 ConstantAsMetadata *Op = ConstantAsMetadata::get(GV.get()); 714 715 // temp !{i1* @GV} 716 Metadata *Ops[] = {Op}; 717 MDTuple *N = MDTuple::getTemporary(Context, Ops).release(); 718 719 // temp !{i1* @GV} => !{i1* @GV} 720 ASSERT_EQ(N, MDNode::replaceWithUniqued(TempMDTuple(N))); 721 ASSERT_TRUE(N->isUniqued()); 722 723 // !{i1* @GV} => !{null} 724 GV.reset(); 725 ASSERT_TRUE(N->isDistinct()); 726 ASSERT_EQ(nullptr, N->getOperand(0)); 727 Metadata *NullOps[] = {nullptr}; 728 ASSERT_NE(N, MDTuple::get(Context, NullOps)); 729 } 730 731 TEST_F(MDNodeTest, replaceWithUniquedChangedOperand) { 732 // i1* @GV 733 Type *Ty = Type::getInt1PtrTy(Context); 734 std::unique_ptr<GlobalVariable> GV( 735 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 736 ConstantAsMetadata *Op = ConstantAsMetadata::get(GV.get()); 737 738 // temp !{i1* @GV} 739 Metadata *Ops[] = {Op}; 740 MDTuple *N = MDTuple::getTemporary(Context, Ops).release(); 741 742 // temp !{i1* @GV} => !{i1* @GV} 743 ASSERT_EQ(N, MDNode::replaceWithUniqued(TempMDTuple(N))); 744 ASSERT_TRUE(N->isUniqued()); 745 746 // !{i1* @GV} => !{i1* @GV2} 747 std::unique_ptr<GlobalVariable> GV2( 748 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 749 GV->replaceAllUsesWith(GV2.get()); 750 ASSERT_TRUE(N->isUniqued()); 751 Metadata *NullOps[] = {ConstantAsMetadata::get(GV2.get())}; 752 ASSERT_EQ(N, MDTuple::get(Context, NullOps)); 753 } 754 755 TEST_F(MDNodeTest, replaceWithDistinct) { 756 { 757 auto *Empty = MDTuple::get(Context, None); 758 Metadata *Ops[] = {Empty}; 759 auto Temp = MDTuple::getTemporary(Context, Ops); 760 EXPECT_TRUE(Temp->isTemporary()); 761 762 // Don't expect a collision. 763 auto *Current = Temp.get(); 764 auto *Distinct = MDNode::replaceWithDistinct(std::move(Temp)); 765 EXPECT_TRUE(Distinct->isDistinct()); 766 EXPECT_TRUE(Distinct->isResolved()); 767 EXPECT_EQ(Current, Distinct); 768 } 769 { 770 auto Unresolved = MDTuple::getTemporary(Context, None); 771 Metadata *Ops[] = {Unresolved.get()}; 772 auto Temp = MDTuple::getTemporary(Context, Ops); 773 EXPECT_TRUE(Temp->isTemporary()); 774 775 // Don't expect a collision. 776 auto *Current = Temp.get(); 777 auto *Distinct = MDNode::replaceWithDistinct(std::move(Temp)); 778 EXPECT_TRUE(Distinct->isDistinct()); 779 EXPECT_TRUE(Distinct->isResolved()); 780 EXPECT_EQ(Current, Distinct); 781 782 // Cleanup; required for teardown. 783 Unresolved->replaceAllUsesWith(nullptr); 784 } 785 } 786 787 TEST_F(MDNodeTest, replaceWithPermanent) { 788 Metadata *Ops[] = {nullptr}; 789 auto Temp = MDTuple::getTemporary(Context, Ops); 790 auto *T = Temp.get(); 791 792 // U is a normal, uniqued node that references T. 793 auto *U = MDTuple::get(Context, T); 794 EXPECT_TRUE(U->isUniqued()); 795 796 // Make Temp self-referencing. 797 Temp->replaceOperandWith(0, T); 798 799 // Try to uniquify Temp. This should, despite the name in the API, give a 800 // 'distinct' node, since self-references aren't allowed to be uniqued. 801 // 802 // Since it's distinct, N should have the same address as when it was a 803 // temporary (i.e., be equal to T not U). 804 auto *N = MDNode::replaceWithPermanent(std::move(Temp)); 805 EXPECT_EQ(N, T); 806 EXPECT_TRUE(N->isDistinct()); 807 808 // U should be the canonical unique node with N as the argument. 809 EXPECT_EQ(U, MDTuple::get(Context, N)); 810 EXPECT_TRUE(U->isUniqued()); 811 812 // This temporary should collide with U when replaced, but it should still be 813 // uniqued. 814 EXPECT_EQ(U, MDNode::replaceWithPermanent(MDTuple::getTemporary(Context, N))); 815 EXPECT_TRUE(U->isUniqued()); 816 817 // This temporary should become a new uniqued node. 818 auto Temp2 = MDTuple::getTemporary(Context, U); 819 auto *V = Temp2.get(); 820 EXPECT_EQ(V, MDNode::replaceWithPermanent(std::move(Temp2))); 821 EXPECT_TRUE(V->isUniqued()); 822 EXPECT_EQ(U, V->getOperand(0)); 823 } 824 825 TEST_F(MDNodeTest, deleteTemporaryWithTrackingRef) { 826 TrackingMDRef Ref; 827 EXPECT_EQ(nullptr, Ref.get()); 828 { 829 auto Temp = MDTuple::getTemporary(Context, None); 830 Ref.reset(Temp.get()); 831 EXPECT_EQ(Temp.get(), Ref.get()); 832 } 833 EXPECT_EQ(nullptr, Ref.get()); 834 } 835 836 typedef MetadataTest DILocationTest; 837 838 TEST_F(DILocationTest, Overflow) { 839 DISubprogram *N = getSubprogram(); 840 { 841 DILocation *L = DILocation::get(Context, 2, 7, N); 842 EXPECT_EQ(2u, L->getLine()); 843 EXPECT_EQ(7u, L->getColumn()); 844 } 845 unsigned U16 = 1u << 16; 846 { 847 DILocation *L = DILocation::get(Context, UINT32_MAX, U16 - 1, N); 848 EXPECT_EQ(UINT32_MAX, L->getLine()); 849 EXPECT_EQ(U16 - 1, L->getColumn()); 850 } 851 { 852 DILocation *L = DILocation::get(Context, UINT32_MAX, U16, N); 853 EXPECT_EQ(UINT32_MAX, L->getLine()); 854 EXPECT_EQ(0u, L->getColumn()); 855 } 856 { 857 DILocation *L = DILocation::get(Context, UINT32_MAX, U16 + 1, N); 858 EXPECT_EQ(UINT32_MAX, L->getLine()); 859 EXPECT_EQ(0u, L->getColumn()); 860 } 861 } 862 863 TEST_F(DILocationTest, Merge) { 864 DISubprogram *N = getSubprogram(); 865 DIScope *S = DILexicalBlock::get(Context, N, getFile(), 3, 4); 866 867 { 868 // Identical. 869 auto *A = DILocation::get(Context, 2, 7, N); 870 auto *B = DILocation::get(Context, 2, 7, N); 871 auto *M = DILocation::getMergedLocation(A, B); 872 EXPECT_EQ(2u, M->getLine()); 873 EXPECT_EQ(7u, M->getColumn()); 874 EXPECT_EQ(N, M->getScope()); 875 } 876 877 { 878 // Identical, different scopes. 879 auto *A = DILocation::get(Context, 2, 7, N); 880 auto *B = DILocation::get(Context, 2, 7, S); 881 auto *M = DILocation::getMergedLocation(A, B); 882 EXPECT_EQ(0u, M->getLine()); // FIXME: Should this be 2? 883 EXPECT_EQ(0u, M->getColumn()); // FIXME: Should this be 7? 884 EXPECT_EQ(N, M->getScope()); 885 } 886 887 { 888 // Different lines, same scopes. 889 auto *A = DILocation::get(Context, 1, 6, N); 890 auto *B = DILocation::get(Context, 2, 7, N); 891 auto *M = DILocation::getMergedLocation(A, B); 892 EXPECT_EQ(0u, M->getLine()); 893 EXPECT_EQ(0u, M->getColumn()); 894 EXPECT_EQ(N, M->getScope()); 895 } 896 897 { 898 // Twisty locations, all different, same function. 899 auto *A = DILocation::get(Context, 1, 6, N); 900 auto *B = DILocation::get(Context, 2, 7, S); 901 auto *M = DILocation::getMergedLocation(A, B); 902 EXPECT_EQ(0u, M->getLine()); 903 EXPECT_EQ(0u, M->getColumn()); 904 EXPECT_EQ(N, M->getScope()); 905 } 906 907 { 908 // Different function, same inlined-at. 909 auto *F = getFile(); 910 auto *SP1 = DISubprogram::getDistinct(Context, F, "a", "a", F, 0, nullptr, 911 false, false, 0, nullptr, 0, 0, 0, 912 DINode::FlagZero, false, nullptr); 913 auto *SP2 = DISubprogram::getDistinct(Context, F, "b", "b", F, 0, nullptr, 914 false, false, 0, nullptr, 0, 0, 0, 915 DINode::FlagZero, false, nullptr); 916 917 auto *I = DILocation::get(Context, 2, 7, N); 918 auto *A = DILocation::get(Context, 1, 6, SP1, I); 919 auto *B = DILocation::get(Context, 2, 7, SP2, I); 920 auto *M = DILocation::getMergedLocation(A, B); 921 EXPECT_EQ(0u, M->getLine()); 922 EXPECT_EQ(0u, M->getColumn()); 923 EXPECT_TRUE(isa<DILocalScope>(M->getScope())); 924 EXPECT_EQ(I, M->getInlinedAt()); 925 } 926 927 { 928 // Completely different. 929 auto *I = DILocation::get(Context, 2, 7, N); 930 auto *A = DILocation::get(Context, 1, 6, S, I); 931 auto *B = DILocation::get(Context, 2, 7, getSubprogram()); 932 auto *M = DILocation::getMergedLocation(A, B); 933 EXPECT_EQ(0u, M->getLine()); 934 EXPECT_EQ(0u, M->getColumn()); 935 EXPECT_TRUE(isa<DILocalScope>(M->getScope())); 936 EXPECT_EQ(S, M->getScope()); 937 EXPECT_EQ(nullptr, M->getInlinedAt()); 938 } 939 } 940 941 TEST_F(DILocationTest, getDistinct) { 942 MDNode *N = getSubprogram(); 943 DILocation *L0 = DILocation::getDistinct(Context, 2, 7, N); 944 EXPECT_TRUE(L0->isDistinct()); 945 DILocation *L1 = DILocation::get(Context, 2, 7, N); 946 EXPECT_FALSE(L1->isDistinct()); 947 EXPECT_EQ(L1, DILocation::get(Context, 2, 7, N)); 948 } 949 950 TEST_F(DILocationTest, getTemporary) { 951 MDNode *N = MDNode::get(Context, None); 952 auto L = DILocation::getTemporary(Context, 2, 7, N); 953 EXPECT_TRUE(L->isTemporary()); 954 EXPECT_FALSE(L->isResolved()); 955 } 956 957 TEST_F(DILocationTest, cloneTemporary) { 958 MDNode *N = MDNode::get(Context, None); 959 auto L = DILocation::getTemporary(Context, 2, 7, N); 960 EXPECT_TRUE(L->isTemporary()); 961 auto L2 = L->clone(); 962 EXPECT_TRUE(L2->isTemporary()); 963 } 964 965 typedef MetadataTest GenericDINodeTest; 966 967 TEST_F(GenericDINodeTest, get) { 968 StringRef Header = "header"; 969 auto *Empty = MDNode::get(Context, None); 970 Metadata *Ops1[] = {Empty}; 971 auto *N = GenericDINode::get(Context, 15, Header, Ops1); 972 EXPECT_EQ(15u, N->getTag()); 973 EXPECT_EQ(2u, N->getNumOperands()); 974 EXPECT_EQ(Header, N->getHeader()); 975 EXPECT_EQ(MDString::get(Context, Header), N->getOperand(0)); 976 EXPECT_EQ(1u, N->getNumDwarfOperands()); 977 EXPECT_EQ(Empty, N->getDwarfOperand(0)); 978 EXPECT_EQ(Empty, N->getOperand(1)); 979 ASSERT_TRUE(N->isUniqued()); 980 981 EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops1)); 982 983 N->replaceOperandWith(1, nullptr); 984 EXPECT_EQ(15u, N->getTag()); 985 EXPECT_EQ(Header, N->getHeader()); 986 EXPECT_EQ(nullptr, N->getDwarfOperand(0)); 987 ASSERT_TRUE(N->isUniqued()); 988 989 Metadata *Ops2[] = {nullptr}; 990 EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops2)); 991 992 N->replaceDwarfOperandWith(0, Empty); 993 EXPECT_EQ(15u, N->getTag()); 994 EXPECT_EQ(Header, N->getHeader()); 995 EXPECT_EQ(Empty, N->getDwarfOperand(0)); 996 ASSERT_TRUE(N->isUniqued()); 997 EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops1)); 998 999 TempGenericDINode Temp = N->clone(); 1000 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1001 } 1002 1003 TEST_F(GenericDINodeTest, getEmptyHeader) { 1004 // Canonicalize !"" to null. 1005 auto *N = GenericDINode::get(Context, 15, StringRef(), None); 1006 EXPECT_EQ(StringRef(), N->getHeader()); 1007 EXPECT_EQ(nullptr, N->getOperand(0)); 1008 } 1009 1010 typedef MetadataTest DISubrangeTest; 1011 1012 TEST_F(DISubrangeTest, get) { 1013 auto *N = DISubrange::get(Context, 5, 7); 1014 auto Count = N->getCount(); 1015 EXPECT_EQ(dwarf::DW_TAG_subrange_type, N->getTag()); 1016 ASSERT_TRUE(Count); 1017 ASSERT_TRUE(Count.is<ConstantInt*>()); 1018 EXPECT_EQ(5, Count.get<ConstantInt*>()->getSExtValue()); 1019 EXPECT_EQ(7, N->getLowerBound()); 1020 EXPECT_EQ(N, DISubrange::get(Context, 5, 7)); 1021 EXPECT_EQ(DISubrange::get(Context, 5, 0), DISubrange::get(Context, 5)); 1022 1023 TempDISubrange Temp = N->clone(); 1024 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1025 } 1026 1027 TEST_F(DISubrangeTest, getEmptyArray) { 1028 auto *N = DISubrange::get(Context, -1, 0); 1029 auto Count = N->getCount(); 1030 EXPECT_EQ(dwarf::DW_TAG_subrange_type, N->getTag()); 1031 ASSERT_TRUE(Count); 1032 ASSERT_TRUE(Count.is<ConstantInt*>()); 1033 EXPECT_EQ(-1, Count.get<ConstantInt*>()->getSExtValue()); 1034 EXPECT_EQ(0, N->getLowerBound()); 1035 EXPECT_EQ(N, DISubrange::get(Context, -1, 0)); 1036 } 1037 1038 TEST_F(DISubrangeTest, getVariableCount) { 1039 DILocalScope *Scope = getSubprogram(); 1040 DIFile *File = getFile(); 1041 DIType *Type = getDerivedType(); 1042 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 1043 auto *VlaExpr = DILocalVariable::get(Context, Scope, "vla_expr", File, 8, 1044 Type, 2, Flags, 8); 1045 1046 auto *N = DISubrange::get(Context, VlaExpr, 0); 1047 auto Count = N->getCount(); 1048 ASSERT_TRUE(Count); 1049 ASSERT_TRUE(Count.is<DIVariable*>()); 1050 EXPECT_EQ(VlaExpr, Count.get<DIVariable*>()); 1051 ASSERT_TRUE(isa<DIVariable>(N->getRawCountNode())); 1052 EXPECT_EQ(0, N->getLowerBound()); 1053 EXPECT_EQ("vla_expr", Count.get<DIVariable*>()->getName()); 1054 EXPECT_EQ(N, DISubrange::get(Context, VlaExpr, 0)); 1055 } 1056 1057 typedef MetadataTest DIEnumeratorTest; 1058 1059 TEST_F(DIEnumeratorTest, get) { 1060 auto *N = DIEnumerator::get(Context, 7, false, "name"); 1061 EXPECT_EQ(dwarf::DW_TAG_enumerator, N->getTag()); 1062 EXPECT_EQ(7, N->getValue()); 1063 EXPECT_FALSE(N->isUnsigned()); 1064 EXPECT_EQ("name", N->getName()); 1065 EXPECT_EQ(N, DIEnumerator::get(Context, 7, false, "name")); 1066 1067 EXPECT_NE(N, DIEnumerator::get(Context, 7, true, "name")); 1068 EXPECT_NE(N, DIEnumerator::get(Context, 8, false, "name")); 1069 EXPECT_NE(N, DIEnumerator::get(Context, 7, false, "nam")); 1070 1071 TempDIEnumerator Temp = N->clone(); 1072 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1073 } 1074 1075 typedef MetadataTest DIBasicTypeTest; 1076 1077 TEST_F(DIBasicTypeTest, get) { 1078 auto *N = 1079 DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 26, 7, 1080 DINode::FlagZero); 1081 EXPECT_EQ(dwarf::DW_TAG_base_type, N->getTag()); 1082 EXPECT_EQ("special", N->getName()); 1083 EXPECT_EQ(33u, N->getSizeInBits()); 1084 EXPECT_EQ(26u, N->getAlignInBits()); 1085 EXPECT_EQ(7u, N->getEncoding()); 1086 EXPECT_EQ(0u, N->getLine()); 1087 EXPECT_EQ(DINode::FlagZero, N->getFlags()); 1088 EXPECT_EQ(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1089 26, 7, DINode::FlagZero)); 1090 1091 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, 1092 "special", 33, 26, 7, DINode::FlagZero)); 1093 EXPECT_NE(N, 1094 DIBasicType::get(Context, dwarf::DW_TAG_base_type, "s", 33, 26, 7, 1095 DINode::FlagZero)); 1096 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 32, 1097 26, 7, DINode::FlagZero)); 1098 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1099 25, 7, DINode::FlagZero)); 1100 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1101 26, 6, DINode::FlagZero)); 1102 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1103 26, 7, DINode::FlagBigEndian)); 1104 EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 1105 26, 7, DINode::FlagLittleEndian)); 1106 1107 TempDIBasicType Temp = N->clone(); 1108 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1109 } 1110 1111 TEST_F(DIBasicTypeTest, getWithLargeValues) { 1112 auto *N = DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 1113 UINT64_MAX, UINT32_MAX - 1, 7, DINode::FlagZero); 1114 EXPECT_EQ(UINT64_MAX, N->getSizeInBits()); 1115 EXPECT_EQ(UINT32_MAX - 1, N->getAlignInBits()); 1116 } 1117 1118 TEST_F(DIBasicTypeTest, getUnspecified) { 1119 auto *N = 1120 DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, "unspecified"); 1121 EXPECT_EQ(dwarf::DW_TAG_unspecified_type, N->getTag()); 1122 EXPECT_EQ("unspecified", N->getName()); 1123 EXPECT_EQ(0u, N->getSizeInBits()); 1124 EXPECT_EQ(0u, N->getAlignInBits()); 1125 EXPECT_EQ(0u, N->getEncoding()); 1126 EXPECT_EQ(0u, N->getLine()); 1127 EXPECT_EQ(DINode::FlagZero, N->getFlags()); 1128 } 1129 1130 typedef MetadataTest DITypeTest; 1131 1132 TEST_F(DITypeTest, clone) { 1133 // Check that DIType has a specialized clone that returns TempDIType. 1134 DIType *N = DIBasicType::get(Context, dwarf::DW_TAG_base_type, "int", 32, 32, 1135 dwarf::DW_ATE_signed, DINode::FlagZero); 1136 1137 TempDIType Temp = N->clone(); 1138 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1139 } 1140 1141 TEST_F(DITypeTest, cloneWithFlags) { 1142 // void (void) 1143 Metadata *TypesOps[] = {nullptr}; 1144 Metadata *Types = MDTuple::get(Context, TypesOps); 1145 1146 DIType *D = 1147 DISubroutineType::getDistinct(Context, DINode::FlagZero, 0, Types); 1148 EXPECT_EQ(DINode::FlagZero, D->getFlags()); 1149 TempDIType D2 = D->cloneWithFlags(DINode::FlagRValueReference); 1150 EXPECT_EQ(DINode::FlagRValueReference, D2->getFlags()); 1151 EXPECT_EQ(DINode::FlagZero, D->getFlags()); 1152 1153 TempDIType T = 1154 DISubroutineType::getTemporary(Context, DINode::FlagZero, 0, Types); 1155 EXPECT_EQ(DINode::FlagZero, T->getFlags()); 1156 TempDIType T2 = T->cloneWithFlags(DINode::FlagRValueReference); 1157 EXPECT_EQ(DINode::FlagRValueReference, T2->getFlags()); 1158 EXPECT_EQ(DINode::FlagZero, T->getFlags()); 1159 } 1160 1161 typedef MetadataTest DIDerivedTypeTest; 1162 1163 TEST_F(DIDerivedTypeTest, get) { 1164 DIFile *File = getFile(); 1165 DIScope *Scope = getSubprogram(); 1166 DIType *BaseType = getBasicType("basic"); 1167 MDTuple *ExtraData = getTuple(); 1168 unsigned DWARFAddressSpace = 8; 1169 DINode::DIFlags Flags5 = static_cast<DINode::DIFlags>(5); 1170 DINode::DIFlags Flags4 = static_cast<DINode::DIFlags>(4); 1171 1172 auto *N = 1173 DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something", File, 1174 1, Scope, BaseType, 2, 3, 4, DWARFAddressSpace, Flags5, 1175 ExtraData); 1176 EXPECT_EQ(dwarf::DW_TAG_pointer_type, N->getTag()); 1177 EXPECT_EQ("something", N->getName()); 1178 EXPECT_EQ(File, N->getFile()); 1179 EXPECT_EQ(1u, N->getLine()); 1180 EXPECT_EQ(Scope, N->getScope()); 1181 EXPECT_EQ(BaseType, N->getBaseType()); 1182 EXPECT_EQ(2u, N->getSizeInBits()); 1183 EXPECT_EQ(3u, N->getAlignInBits()); 1184 EXPECT_EQ(4u, N->getOffsetInBits()); 1185 EXPECT_EQ(DWARFAddressSpace, N->getDWARFAddressSpace().getValue()); 1186 EXPECT_EQ(5u, N->getFlags()); 1187 EXPECT_EQ(ExtraData, N->getExtraData()); 1188 EXPECT_EQ(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1189 "something", File, 1, Scope, BaseType, 2, 3, 1190 4, DWARFAddressSpace, Flags5, ExtraData)); 1191 1192 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_reference_type, 1193 "something", File, 1, Scope, BaseType, 2, 3, 1194 4, DWARFAddressSpace, Flags5, ExtraData)); 1195 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "else", 1196 File, 1, Scope, BaseType, 2, 3, 1197 4, DWARFAddressSpace, Flags5, ExtraData)); 1198 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1199 "something", getFile(), 1, Scope, BaseType, 2, 1200 3, 4, DWARFAddressSpace, Flags5, ExtraData)); 1201 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1202 "something", File, 2, Scope, BaseType, 2, 3, 1203 4, DWARFAddressSpace, Flags5, ExtraData)); 1204 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1205 "something", File, 1, getSubprogram(), 1206 BaseType, 2, 3, 4, DWARFAddressSpace, Flags5, 1207 ExtraData)); 1208 EXPECT_NE(N, DIDerivedType::get( 1209 Context, dwarf::DW_TAG_pointer_type, "something", File, 1, 1210 Scope, getBasicType("basic2"), 2, 3, 4, DWARFAddressSpace, 1211 Flags5, ExtraData)); 1212 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1213 "something", File, 1, Scope, BaseType, 3, 3, 1214 4, DWARFAddressSpace, Flags5, ExtraData)); 1215 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1216 "something", File, 1, Scope, BaseType, 2, 2, 1217 4, DWARFAddressSpace, Flags5, ExtraData)); 1218 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1219 "something", File, 1, Scope, BaseType, 2, 3, 1220 5, DWARFAddressSpace, Flags5, ExtraData)); 1221 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1222 "something", File, 1, Scope, BaseType, 2, 3, 1223 4, DWARFAddressSpace + 1, Flags5, ExtraData)); 1224 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1225 "something", File, 1, Scope, BaseType, 2, 3, 1226 4, DWARFAddressSpace, Flags4, ExtraData)); 1227 EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, 1228 "something", File, 1, Scope, BaseType, 2, 3, 1229 4, DWARFAddressSpace, Flags5, getTuple())); 1230 1231 TempDIDerivedType Temp = N->clone(); 1232 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1233 } 1234 1235 TEST_F(DIDerivedTypeTest, getWithLargeValues) { 1236 DIFile *File = getFile(); 1237 DIScope *Scope = getSubprogram(); 1238 DIType *BaseType = getBasicType("basic"); 1239 MDTuple *ExtraData = getTuple(); 1240 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1241 1242 auto *N = DIDerivedType::get( 1243 Context, dwarf::DW_TAG_pointer_type, "something", File, 1, Scope, 1244 BaseType, UINT64_MAX, UINT32_MAX - 1, UINT64_MAX - 2, UINT32_MAX - 3, 1245 Flags, ExtraData); 1246 EXPECT_EQ(UINT64_MAX, N->getSizeInBits()); 1247 EXPECT_EQ(UINT32_MAX - 1, N->getAlignInBits()); 1248 EXPECT_EQ(UINT64_MAX - 2, N->getOffsetInBits()); 1249 EXPECT_EQ(UINT32_MAX - 3, N->getDWARFAddressSpace().getValue()); 1250 } 1251 1252 typedef MetadataTest DICompositeTypeTest; 1253 1254 TEST_F(DICompositeTypeTest, get) { 1255 unsigned Tag = dwarf::DW_TAG_structure_type; 1256 StringRef Name = "some name"; 1257 DIFile *File = getFile(); 1258 unsigned Line = 1; 1259 DIScope *Scope = getSubprogram(); 1260 DIType *BaseType = getCompositeType(); 1261 uint64_t SizeInBits = 2; 1262 uint32_t AlignInBits = 3; 1263 uint64_t OffsetInBits = 4; 1264 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1265 MDTuple *Elements = getTuple(); 1266 unsigned RuntimeLang = 6; 1267 DIType *VTableHolder = getCompositeType(); 1268 MDTuple *TemplateParams = getTuple(); 1269 StringRef Identifier = "some id"; 1270 1271 auto *N = DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1272 BaseType, SizeInBits, AlignInBits, 1273 OffsetInBits, Flags, Elements, RuntimeLang, 1274 VTableHolder, TemplateParams, Identifier); 1275 EXPECT_EQ(Tag, N->getTag()); 1276 EXPECT_EQ(Name, N->getName()); 1277 EXPECT_EQ(File, N->getFile()); 1278 EXPECT_EQ(Line, N->getLine()); 1279 EXPECT_EQ(Scope, N->getScope()); 1280 EXPECT_EQ(BaseType, N->getBaseType()); 1281 EXPECT_EQ(SizeInBits, N->getSizeInBits()); 1282 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 1283 EXPECT_EQ(OffsetInBits, N->getOffsetInBits()); 1284 EXPECT_EQ(Flags, N->getFlags()); 1285 EXPECT_EQ(Elements, N->getElements().get()); 1286 EXPECT_EQ(RuntimeLang, N->getRuntimeLang()); 1287 EXPECT_EQ(VTableHolder, N->getVTableHolder()); 1288 EXPECT_EQ(TemplateParams, N->getTemplateParams().get()); 1289 EXPECT_EQ(Identifier, N->getIdentifier()); 1290 1291 EXPECT_EQ(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1292 BaseType, SizeInBits, AlignInBits, 1293 OffsetInBits, Flags, Elements, RuntimeLang, 1294 VTableHolder, TemplateParams, Identifier)); 1295 1296 EXPECT_NE(N, DICompositeType::get(Context, Tag + 1, Name, File, Line, Scope, 1297 BaseType, SizeInBits, AlignInBits, 1298 OffsetInBits, Flags, Elements, RuntimeLang, 1299 VTableHolder, TemplateParams, Identifier)); 1300 EXPECT_NE(N, DICompositeType::get(Context, Tag, "abc", File, Line, Scope, 1301 BaseType, SizeInBits, AlignInBits, 1302 OffsetInBits, Flags, Elements, RuntimeLang, 1303 VTableHolder, TemplateParams, Identifier)); 1304 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, getFile(), Line, Scope, 1305 BaseType, SizeInBits, AlignInBits, 1306 OffsetInBits, Flags, Elements, RuntimeLang, 1307 VTableHolder, TemplateParams, Identifier)); 1308 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line + 1, Scope, 1309 BaseType, SizeInBits, AlignInBits, 1310 OffsetInBits, Flags, Elements, RuntimeLang, 1311 VTableHolder, TemplateParams, Identifier)); 1312 EXPECT_NE(N, DICompositeType::get( 1313 Context, Tag, Name, File, Line, getSubprogram(), BaseType, 1314 SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, 1315 RuntimeLang, VTableHolder, TemplateParams, Identifier)); 1316 EXPECT_NE(N, DICompositeType::get( 1317 Context, Tag, Name, File, Line, Scope, getBasicType("other"), 1318 SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, 1319 RuntimeLang, VTableHolder, TemplateParams, Identifier)); 1320 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1321 BaseType, SizeInBits + 1, AlignInBits, 1322 OffsetInBits, Flags, Elements, RuntimeLang, 1323 VTableHolder, TemplateParams, Identifier)); 1324 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1325 BaseType, SizeInBits, AlignInBits + 1, 1326 OffsetInBits, Flags, Elements, RuntimeLang, 1327 VTableHolder, TemplateParams, Identifier)); 1328 EXPECT_NE(N, DICompositeType::get( 1329 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1330 AlignInBits, OffsetInBits + 1, Flags, Elements, RuntimeLang, 1331 VTableHolder, TemplateParams, Identifier)); 1332 DINode::DIFlags FlagsPOne = static_cast<DINode::DIFlags>(Flags + 1); 1333 EXPECT_NE(N, DICompositeType::get( 1334 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1335 AlignInBits, OffsetInBits, FlagsPOne, Elements, RuntimeLang, 1336 VTableHolder, TemplateParams, Identifier)); 1337 EXPECT_NE(N, DICompositeType::get( 1338 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1339 AlignInBits, OffsetInBits, Flags, getTuple(), RuntimeLang, 1340 VTableHolder, TemplateParams, Identifier)); 1341 EXPECT_NE(N, DICompositeType::get( 1342 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1343 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang + 1, 1344 VTableHolder, TemplateParams, Identifier)); 1345 EXPECT_NE(N, DICompositeType::get( 1346 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, 1347 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 1348 getCompositeType(), TemplateParams, Identifier)); 1349 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1350 BaseType, SizeInBits, AlignInBits, 1351 OffsetInBits, Flags, Elements, RuntimeLang, 1352 VTableHolder, getTuple(), Identifier)); 1353 EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1354 BaseType, SizeInBits, AlignInBits, 1355 OffsetInBits, Flags, Elements, RuntimeLang, 1356 VTableHolder, TemplateParams, "other")); 1357 1358 // Be sure that missing identifiers get null pointers. 1359 EXPECT_FALSE(DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1360 BaseType, SizeInBits, AlignInBits, 1361 OffsetInBits, Flags, Elements, RuntimeLang, 1362 VTableHolder, TemplateParams, "") 1363 ->getRawIdentifier()); 1364 EXPECT_FALSE(DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1365 BaseType, SizeInBits, AlignInBits, 1366 OffsetInBits, Flags, Elements, RuntimeLang, 1367 VTableHolder, TemplateParams) 1368 ->getRawIdentifier()); 1369 1370 TempDICompositeType Temp = N->clone(); 1371 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1372 } 1373 1374 TEST_F(DICompositeTypeTest, getWithLargeValues) { 1375 unsigned Tag = dwarf::DW_TAG_structure_type; 1376 StringRef Name = "some name"; 1377 DIFile *File = getFile(); 1378 unsigned Line = 1; 1379 DIScope *Scope = getSubprogram(); 1380 DIType *BaseType = getCompositeType(); 1381 uint64_t SizeInBits = UINT64_MAX; 1382 uint32_t AlignInBits = UINT32_MAX - 1; 1383 uint64_t OffsetInBits = UINT64_MAX - 2; 1384 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1385 MDTuple *Elements = getTuple(); 1386 unsigned RuntimeLang = 6; 1387 DIType *VTableHolder = getCompositeType(); 1388 MDTuple *TemplateParams = getTuple(); 1389 StringRef Identifier = "some id"; 1390 1391 auto *N = DICompositeType::get(Context, Tag, Name, File, Line, Scope, 1392 BaseType, SizeInBits, AlignInBits, 1393 OffsetInBits, Flags, Elements, RuntimeLang, 1394 VTableHolder, TemplateParams, Identifier); 1395 EXPECT_EQ(SizeInBits, N->getSizeInBits()); 1396 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 1397 EXPECT_EQ(OffsetInBits, N->getOffsetInBits()); 1398 } 1399 1400 TEST_F(DICompositeTypeTest, replaceOperands) { 1401 unsigned Tag = dwarf::DW_TAG_structure_type; 1402 StringRef Name = "some name"; 1403 DIFile *File = getFile(); 1404 unsigned Line = 1; 1405 DIScope *Scope = getSubprogram(); 1406 DIType *BaseType = getCompositeType(); 1407 uint64_t SizeInBits = 2; 1408 uint32_t AlignInBits = 3; 1409 uint64_t OffsetInBits = 4; 1410 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1411 unsigned RuntimeLang = 6; 1412 StringRef Identifier = "some id"; 1413 1414 auto *N = DICompositeType::get( 1415 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1416 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier); 1417 1418 auto *Elements = MDTuple::getDistinct(Context, None); 1419 EXPECT_EQ(nullptr, N->getElements().get()); 1420 N->replaceElements(Elements); 1421 EXPECT_EQ(Elements, N->getElements().get()); 1422 N->replaceElements(nullptr); 1423 EXPECT_EQ(nullptr, N->getElements().get()); 1424 1425 DIType *VTableHolder = getCompositeType(); 1426 EXPECT_EQ(nullptr, N->getVTableHolder()); 1427 N->replaceVTableHolder(VTableHolder); 1428 EXPECT_EQ(VTableHolder, N->getVTableHolder()); 1429 // As an extension, the containing type can be anything. This is 1430 // used by Rust to associate vtables with their concrete type. 1431 DIType *BasicType = getBasicType("basic"); 1432 N->replaceVTableHolder(BasicType); 1433 EXPECT_EQ(BasicType, N->getVTableHolder()); 1434 N->replaceVTableHolder(nullptr); 1435 EXPECT_EQ(nullptr, N->getVTableHolder()); 1436 1437 auto *TemplateParams = MDTuple::getDistinct(Context, None); 1438 EXPECT_EQ(nullptr, N->getTemplateParams().get()); 1439 N->replaceTemplateParams(TemplateParams); 1440 EXPECT_EQ(TemplateParams, N->getTemplateParams().get()); 1441 N->replaceTemplateParams(nullptr); 1442 EXPECT_EQ(nullptr, N->getTemplateParams().get()); 1443 } 1444 1445 TEST_F(DICompositeTypeTest, variant_part) { 1446 unsigned Tag = dwarf::DW_TAG_variant_part; 1447 StringRef Name = "some name"; 1448 DIFile *File = getFile(); 1449 unsigned Line = 1; 1450 DIScope *Scope = getSubprogram(); 1451 DIType *BaseType = getCompositeType(); 1452 uint64_t SizeInBits = 2; 1453 uint32_t AlignInBits = 3; 1454 uint64_t OffsetInBits = 4; 1455 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(5); 1456 unsigned RuntimeLang = 6; 1457 StringRef Identifier = "some id"; 1458 DIDerivedType *Discriminator = cast<DIDerivedType>(getDerivedType()); 1459 DIDerivedType *Discriminator2 = cast<DIDerivedType>(getDerivedType()); 1460 1461 EXPECT_NE(Discriminator, Discriminator2); 1462 1463 auto *N = DICompositeType::get( 1464 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1465 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1466 Discriminator); 1467 1468 // Test the hashing. 1469 auto *Same = DICompositeType::get( 1470 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1471 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1472 Discriminator); 1473 auto *Other = DICompositeType::get( 1474 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1475 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1476 Discriminator2); 1477 auto *NoDisc = DICompositeType::get( 1478 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, 1479 OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier, 1480 nullptr); 1481 1482 EXPECT_EQ(N, Same); 1483 EXPECT_NE(Same, Other); 1484 EXPECT_NE(Same, NoDisc); 1485 EXPECT_NE(Other, NoDisc); 1486 1487 EXPECT_EQ(N->getDiscriminator(), Discriminator); 1488 } 1489 1490 typedef MetadataTest DISubroutineTypeTest; 1491 1492 TEST_F(DISubroutineTypeTest, get) { 1493 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(1); 1494 DINode::DIFlags FlagsPOne = static_cast<DINode::DIFlags>(Flags + 1); 1495 MDTuple *TypeArray = getTuple(); 1496 1497 auto *N = DISubroutineType::get(Context, Flags, 0, TypeArray); 1498 EXPECT_EQ(dwarf::DW_TAG_subroutine_type, N->getTag()); 1499 EXPECT_EQ(Flags, N->getFlags()); 1500 EXPECT_EQ(TypeArray, N->getTypeArray().get()); 1501 EXPECT_EQ(N, DISubroutineType::get(Context, Flags, 0, TypeArray)); 1502 1503 EXPECT_NE(N, DISubroutineType::get(Context, FlagsPOne, 0, TypeArray)); 1504 EXPECT_NE(N, DISubroutineType::get(Context, Flags, 0, getTuple())); 1505 1506 // Test the hashing of calling conventions. 1507 auto *Fast = DISubroutineType::get( 1508 Context, Flags, dwarf::DW_CC_BORLAND_msfastcall, TypeArray); 1509 auto *Std = DISubroutineType::get(Context, Flags, 1510 dwarf::DW_CC_BORLAND_stdcall, TypeArray); 1511 EXPECT_EQ(Fast, 1512 DISubroutineType::get(Context, Flags, 1513 dwarf::DW_CC_BORLAND_msfastcall, TypeArray)); 1514 EXPECT_EQ(Std, DISubroutineType::get( 1515 Context, Flags, dwarf::DW_CC_BORLAND_stdcall, TypeArray)); 1516 1517 EXPECT_NE(N, Fast); 1518 EXPECT_NE(N, Std); 1519 EXPECT_NE(Fast, Std); 1520 1521 TempDISubroutineType Temp = N->clone(); 1522 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1523 1524 // Test always-empty operands. 1525 EXPECT_EQ(nullptr, N->getScope()); 1526 EXPECT_EQ(nullptr, N->getFile()); 1527 EXPECT_EQ("", N->getName()); 1528 } 1529 1530 typedef MetadataTest DIFileTest; 1531 1532 TEST_F(DIFileTest, get) { 1533 StringRef Filename = "file"; 1534 StringRef Directory = "dir"; 1535 DIFile::ChecksumKind CSKind = DIFile::ChecksumKind::CSK_MD5; 1536 StringRef ChecksumString = "000102030405060708090a0b0c0d0e0f"; 1537 DIFile::ChecksumInfo<StringRef> Checksum(CSKind, ChecksumString); 1538 StringRef Source = "source"; 1539 auto *N = DIFile::get(Context, Filename, Directory, Checksum, Source); 1540 1541 EXPECT_EQ(dwarf::DW_TAG_file_type, N->getTag()); 1542 EXPECT_EQ(Filename, N->getFilename()); 1543 EXPECT_EQ(Directory, N->getDirectory()); 1544 EXPECT_EQ(Checksum, N->getChecksum()); 1545 EXPECT_EQ(Source, N->getSource()); 1546 EXPECT_EQ(N, DIFile::get(Context, Filename, Directory, Checksum, Source)); 1547 1548 EXPECT_NE(N, DIFile::get(Context, "other", Directory, Checksum, Source)); 1549 EXPECT_NE(N, DIFile::get(Context, Filename, "other", Checksum, Source)); 1550 DIFile::ChecksumInfo<StringRef> OtherChecksum(DIFile::ChecksumKind::CSK_SHA1, ChecksumString); 1551 EXPECT_NE( 1552 N, DIFile::get(Context, Filename, Directory, OtherChecksum)); 1553 StringRef OtherSource = "other"; 1554 EXPECT_NE(N, DIFile::get(Context, Filename, Directory, Checksum, OtherSource)); 1555 EXPECT_NE(N, DIFile::get(Context, Filename, Directory, Checksum)); 1556 EXPECT_NE(N, DIFile::get(Context, Filename, Directory)); 1557 1558 TempDIFile Temp = N->clone(); 1559 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1560 } 1561 1562 TEST_F(DIFileTest, ScopeGetFile) { 1563 // Ensure that DIScope::getFile() returns itself. 1564 DIScope *N = DIFile::get(Context, "file", "dir"); 1565 EXPECT_EQ(N, N->getFile()); 1566 } 1567 1568 typedef MetadataTest DICompileUnitTest; 1569 1570 TEST_F(DICompileUnitTest, get) { 1571 unsigned SourceLanguage = 1; 1572 DIFile *File = getFile(); 1573 StringRef Producer = "some producer"; 1574 bool IsOptimized = false; 1575 StringRef Flags = "flag after flag"; 1576 unsigned RuntimeVersion = 2; 1577 StringRef SplitDebugFilename = "another/file"; 1578 auto EmissionKind = DICompileUnit::FullDebug; 1579 MDTuple *EnumTypes = getTuple(); 1580 MDTuple *RetainedTypes = getTuple(); 1581 MDTuple *GlobalVariables = getTuple(); 1582 MDTuple *ImportedEntities = getTuple(); 1583 uint64_t DWOId = 0x10000000c0ffee; 1584 MDTuple *Macros = getTuple(); 1585 auto *N = DICompileUnit::getDistinct( 1586 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 1587 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 1588 RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, true, 1589 false, DICompileUnit::DebugNameTableKind::Default); 1590 1591 EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag()); 1592 EXPECT_EQ(SourceLanguage, N->getSourceLanguage()); 1593 EXPECT_EQ(File, N->getFile()); 1594 EXPECT_EQ(Producer, N->getProducer()); 1595 EXPECT_EQ(IsOptimized, N->isOptimized()); 1596 EXPECT_EQ(Flags, N->getFlags()); 1597 EXPECT_EQ(RuntimeVersion, N->getRuntimeVersion()); 1598 EXPECT_EQ(SplitDebugFilename, N->getSplitDebugFilename()); 1599 EXPECT_EQ(EmissionKind, N->getEmissionKind()); 1600 EXPECT_EQ(EnumTypes, N->getEnumTypes().get()); 1601 EXPECT_EQ(RetainedTypes, N->getRetainedTypes().get()); 1602 EXPECT_EQ(GlobalVariables, N->getGlobalVariables().get()); 1603 EXPECT_EQ(ImportedEntities, N->getImportedEntities().get()); 1604 EXPECT_EQ(Macros, N->getMacros().get()); 1605 EXPECT_EQ(DWOId, N->getDWOId()); 1606 1607 TempDICompileUnit Temp = N->clone(); 1608 EXPECT_EQ(dwarf::DW_TAG_compile_unit, Temp->getTag()); 1609 EXPECT_EQ(SourceLanguage, Temp->getSourceLanguage()); 1610 EXPECT_EQ(File, Temp->getFile()); 1611 EXPECT_EQ(Producer, Temp->getProducer()); 1612 EXPECT_EQ(IsOptimized, Temp->isOptimized()); 1613 EXPECT_EQ(Flags, Temp->getFlags()); 1614 EXPECT_EQ(RuntimeVersion, Temp->getRuntimeVersion()); 1615 EXPECT_EQ(SplitDebugFilename, Temp->getSplitDebugFilename()); 1616 EXPECT_EQ(EmissionKind, Temp->getEmissionKind()); 1617 EXPECT_EQ(EnumTypes, Temp->getEnumTypes().get()); 1618 EXPECT_EQ(RetainedTypes, Temp->getRetainedTypes().get()); 1619 EXPECT_EQ(GlobalVariables, Temp->getGlobalVariables().get()); 1620 EXPECT_EQ(ImportedEntities, Temp->getImportedEntities().get()); 1621 EXPECT_EQ(Macros, Temp->getMacros().get()); 1622 EXPECT_EQ(DWOId, Temp->getDWOId()); 1623 1624 auto *TempAddress = Temp.get(); 1625 auto *Clone = MDNode::replaceWithPermanent(std::move(Temp)); 1626 EXPECT_TRUE(Clone->isDistinct()); 1627 EXPECT_EQ(TempAddress, Clone); 1628 } 1629 1630 TEST_F(DICompileUnitTest, replaceArrays) { 1631 unsigned SourceLanguage = 1; 1632 DIFile *File = getFile(); 1633 StringRef Producer = "some producer"; 1634 bool IsOptimized = false; 1635 StringRef Flags = "flag after flag"; 1636 unsigned RuntimeVersion = 2; 1637 StringRef SplitDebugFilename = "another/file"; 1638 auto EmissionKind = DICompileUnit::FullDebug; 1639 MDTuple *EnumTypes = MDTuple::getDistinct(Context, None); 1640 MDTuple *RetainedTypes = MDTuple::getDistinct(Context, None); 1641 MDTuple *ImportedEntities = MDTuple::getDistinct(Context, None); 1642 uint64_t DWOId = 0xc0ffee; 1643 auto *N = DICompileUnit::getDistinct( 1644 Context, SourceLanguage, File, Producer, IsOptimized, Flags, 1645 RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, 1646 RetainedTypes, nullptr, ImportedEntities, nullptr, DWOId, true, false, 1647 DICompileUnit::DebugNameTableKind::Default); 1648 1649 auto *GlobalVariables = MDTuple::getDistinct(Context, None); 1650 EXPECT_EQ(nullptr, N->getGlobalVariables().get()); 1651 N->replaceGlobalVariables(GlobalVariables); 1652 EXPECT_EQ(GlobalVariables, N->getGlobalVariables().get()); 1653 N->replaceGlobalVariables(nullptr); 1654 EXPECT_EQ(nullptr, N->getGlobalVariables().get()); 1655 1656 auto *Macros = MDTuple::getDistinct(Context, None); 1657 EXPECT_EQ(nullptr, N->getMacros().get()); 1658 N->replaceMacros(Macros); 1659 EXPECT_EQ(Macros, N->getMacros().get()); 1660 N->replaceMacros(nullptr); 1661 EXPECT_EQ(nullptr, N->getMacros().get()); 1662 } 1663 1664 typedef MetadataTest DISubprogramTest; 1665 1666 TEST_F(DISubprogramTest, get) { 1667 DIScope *Scope = getCompositeType(); 1668 StringRef Name = "name"; 1669 StringRef LinkageName = "linkage"; 1670 DIFile *File = getFile(); 1671 unsigned Line = 2; 1672 DISubroutineType *Type = getSubroutineType(); 1673 bool IsLocalToUnit = false; 1674 bool IsDefinition = true; 1675 unsigned ScopeLine = 3; 1676 DIType *ContainingType = getCompositeType(); 1677 unsigned Virtuality = 2; 1678 unsigned VirtualIndex = 5; 1679 int ThisAdjustment = -3; 1680 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(6); 1681 bool IsOptimized = false; 1682 MDTuple *TemplateParams = getTuple(); 1683 DISubprogram *Declaration = getSubprogram(); 1684 MDTuple *RetainedNodes = getTuple(); 1685 MDTuple *ThrownTypes = getTuple(); 1686 DICompileUnit *Unit = getUnit(); 1687 1688 auto *N = DISubprogram::get( 1689 Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 1690 IsDefinition, ScopeLine, ContainingType, Virtuality, VirtualIndex, 1691 ThisAdjustment, Flags, IsOptimized, Unit, TemplateParams, Declaration, 1692 RetainedNodes, ThrownTypes); 1693 1694 EXPECT_EQ(dwarf::DW_TAG_subprogram, N->getTag()); 1695 EXPECT_EQ(Scope, N->getScope()); 1696 EXPECT_EQ(Name, N->getName()); 1697 EXPECT_EQ(LinkageName, N->getLinkageName()); 1698 EXPECT_EQ(File, N->getFile()); 1699 EXPECT_EQ(Line, N->getLine()); 1700 EXPECT_EQ(Type, N->getType()); 1701 EXPECT_EQ(IsLocalToUnit, N->isLocalToUnit()); 1702 EXPECT_EQ(IsDefinition, N->isDefinition()); 1703 EXPECT_EQ(ScopeLine, N->getScopeLine()); 1704 EXPECT_EQ(ContainingType, N->getContainingType()); 1705 EXPECT_EQ(Virtuality, N->getVirtuality()); 1706 EXPECT_EQ(VirtualIndex, N->getVirtualIndex()); 1707 EXPECT_EQ(ThisAdjustment, N->getThisAdjustment()); 1708 EXPECT_EQ(Flags, N->getFlags()); 1709 EXPECT_EQ(IsOptimized, N->isOptimized()); 1710 EXPECT_EQ(Unit, N->getUnit()); 1711 EXPECT_EQ(TemplateParams, N->getTemplateParams().get()); 1712 EXPECT_EQ(Declaration, N->getDeclaration()); 1713 EXPECT_EQ(RetainedNodes, N->getRetainedNodes().get()); 1714 EXPECT_EQ(ThrownTypes, N->getThrownTypes().get()); 1715 EXPECT_EQ(N, DISubprogram::get( 1716 Context, Scope, Name, LinkageName, File, Line, Type, 1717 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1718 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1719 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1720 1721 EXPECT_NE(N, DISubprogram::get( 1722 Context, getCompositeType(), Name, LinkageName, File, Line, 1723 Type, IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1724 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1725 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1726 EXPECT_NE(N, DISubprogram::get( 1727 Context, Scope, "other", LinkageName, File, Line, Type, 1728 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1729 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1730 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1731 EXPECT_NE(N, DISubprogram::get( 1732 Context, Scope, Name, "other", File, Line, Type, 1733 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1734 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1735 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1736 EXPECT_NE(N, DISubprogram::get( 1737 Context, Scope, Name, LinkageName, getFile(), Line, Type, 1738 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1739 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1740 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1741 EXPECT_NE(N, DISubprogram::get( 1742 Context, Scope, Name, LinkageName, File, Line + 1, Type, 1743 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1744 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1745 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1746 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1747 getSubroutineType(), IsLocalToUnit, 1748 IsDefinition, ScopeLine, ContainingType, 1749 Virtuality, VirtualIndex, ThisAdjustment, 1750 Flags, IsOptimized, Unit, TemplateParams, 1751 Declaration, RetainedNodes, ThrownTypes)); 1752 EXPECT_NE(N, DISubprogram::get( 1753 Context, Scope, Name, LinkageName, File, Line, Type, 1754 !IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1755 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1756 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1757 EXPECT_NE(N, DISubprogram::get( 1758 Context, Scope, Name, LinkageName, File, Line, Type, 1759 IsLocalToUnit, !IsDefinition, ScopeLine, ContainingType, 1760 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1761 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1762 EXPECT_NE(N, DISubprogram::get( 1763 Context, Scope, Name, LinkageName, File, Line, Type, 1764 IsLocalToUnit, IsDefinition, ScopeLine + 1, ContainingType, 1765 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1766 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1767 EXPECT_NE(N, DISubprogram::get( 1768 Context, Scope, Name, LinkageName, File, Line, Type, 1769 IsLocalToUnit, IsDefinition, ScopeLine, getCompositeType(), 1770 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1771 Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes)); 1772 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1773 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1774 ContainingType, Virtuality + 1, VirtualIndex, 1775 ThisAdjustment, Flags, IsOptimized, Unit, 1776 TemplateParams, Declaration, RetainedNodes, 1777 ThrownTypes)); 1778 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1779 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1780 ContainingType, Virtuality, VirtualIndex + 1, 1781 ThisAdjustment, Flags, IsOptimized, Unit, 1782 TemplateParams, Declaration, RetainedNodes, 1783 ThrownTypes)); 1784 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1785 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1786 ContainingType, Virtuality, VirtualIndex, 1787 ThisAdjustment, Flags, !IsOptimized, Unit, 1788 TemplateParams, Declaration, RetainedNodes, 1789 ThrownTypes)); 1790 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1791 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1792 ContainingType, Virtuality, VirtualIndex, 1793 ThisAdjustment, Flags, IsOptimized, nullptr, 1794 TemplateParams, Declaration, RetainedNodes, 1795 ThrownTypes)); 1796 EXPECT_NE(N, DISubprogram::get( 1797 Context, Scope, Name, LinkageName, File, Line, Type, 1798 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1799 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1800 Unit, getTuple(), Declaration, RetainedNodes, ThrownTypes)); 1801 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1802 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1803 ContainingType, Virtuality, VirtualIndex, 1804 ThisAdjustment, Flags, IsOptimized, Unit, 1805 TemplateParams, getSubprogram(), RetainedNodes, 1806 ThrownTypes)); 1807 EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line, 1808 Type, IsLocalToUnit, IsDefinition, ScopeLine, 1809 ContainingType, Virtuality, VirtualIndex, 1810 ThisAdjustment, Flags, IsOptimized, Unit, 1811 TemplateParams, Declaration, getTuple())); 1812 EXPECT_NE(N, DISubprogram::get( 1813 Context, Scope, Name, LinkageName, File, Line, Type, 1814 IsLocalToUnit, IsDefinition, ScopeLine, ContainingType, 1815 Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized, 1816 Unit, TemplateParams, Declaration, RetainedNodes, getTuple())); 1817 1818 TempDISubprogram Temp = N->clone(); 1819 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1820 } 1821 1822 typedef MetadataTest DILexicalBlockTest; 1823 1824 TEST_F(DILexicalBlockTest, get) { 1825 DILocalScope *Scope = getSubprogram(); 1826 DIFile *File = getFile(); 1827 unsigned Line = 5; 1828 unsigned Column = 8; 1829 1830 auto *N = DILexicalBlock::get(Context, Scope, File, Line, Column); 1831 1832 EXPECT_EQ(dwarf::DW_TAG_lexical_block, N->getTag()); 1833 EXPECT_EQ(Scope, N->getScope()); 1834 EXPECT_EQ(File, N->getFile()); 1835 EXPECT_EQ(Line, N->getLine()); 1836 EXPECT_EQ(Column, N->getColumn()); 1837 EXPECT_EQ(N, DILexicalBlock::get(Context, Scope, File, Line, Column)); 1838 1839 EXPECT_NE(N, 1840 DILexicalBlock::get(Context, getSubprogram(), File, Line, Column)); 1841 EXPECT_NE(N, DILexicalBlock::get(Context, Scope, getFile(), Line, Column)); 1842 EXPECT_NE(N, DILexicalBlock::get(Context, Scope, File, Line + 1, Column)); 1843 EXPECT_NE(N, DILexicalBlock::get(Context, Scope, File, Line, Column + 1)); 1844 1845 TempDILexicalBlock Temp = N->clone(); 1846 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1847 } 1848 1849 TEST_F(DILexicalBlockTest, Overflow) { 1850 DISubprogram *SP = getSubprogram(); 1851 DIFile *F = getFile(); 1852 { 1853 auto *LB = DILexicalBlock::get(Context, SP, F, 2, 7); 1854 EXPECT_EQ(2u, LB->getLine()); 1855 EXPECT_EQ(7u, LB->getColumn()); 1856 } 1857 unsigned U16 = 1u << 16; 1858 { 1859 auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16 - 1); 1860 EXPECT_EQ(UINT32_MAX, LB->getLine()); 1861 EXPECT_EQ(U16 - 1, LB->getColumn()); 1862 } 1863 { 1864 auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16); 1865 EXPECT_EQ(UINT32_MAX, LB->getLine()); 1866 EXPECT_EQ(0u, LB->getColumn()); 1867 } 1868 { 1869 auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16 + 1); 1870 EXPECT_EQ(UINT32_MAX, LB->getLine()); 1871 EXPECT_EQ(0u, LB->getColumn()); 1872 } 1873 } 1874 1875 typedef MetadataTest DILexicalBlockFileTest; 1876 1877 TEST_F(DILexicalBlockFileTest, get) { 1878 DILocalScope *Scope = getSubprogram(); 1879 DIFile *File = getFile(); 1880 unsigned Discriminator = 5; 1881 1882 auto *N = DILexicalBlockFile::get(Context, Scope, File, Discriminator); 1883 1884 EXPECT_EQ(dwarf::DW_TAG_lexical_block, N->getTag()); 1885 EXPECT_EQ(Scope, N->getScope()); 1886 EXPECT_EQ(File, N->getFile()); 1887 EXPECT_EQ(Discriminator, N->getDiscriminator()); 1888 EXPECT_EQ(N, DILexicalBlockFile::get(Context, Scope, File, Discriminator)); 1889 1890 EXPECT_NE(N, DILexicalBlockFile::get(Context, getSubprogram(), File, 1891 Discriminator)); 1892 EXPECT_NE(N, 1893 DILexicalBlockFile::get(Context, Scope, getFile(), Discriminator)); 1894 EXPECT_NE(N, 1895 DILexicalBlockFile::get(Context, Scope, File, Discriminator + 1)); 1896 1897 TempDILexicalBlockFile Temp = N->clone(); 1898 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1899 } 1900 1901 typedef MetadataTest DINamespaceTest; 1902 1903 TEST_F(DINamespaceTest, get) { 1904 DIScope *Scope = getFile(); 1905 StringRef Name = "namespace"; 1906 bool ExportSymbols = true; 1907 1908 auto *N = DINamespace::get(Context, Scope, Name, ExportSymbols); 1909 1910 EXPECT_EQ(dwarf::DW_TAG_namespace, N->getTag()); 1911 EXPECT_EQ(Scope, N->getScope()); 1912 EXPECT_EQ(Name, N->getName()); 1913 EXPECT_EQ(N, DINamespace::get(Context, Scope, Name, ExportSymbols)); 1914 EXPECT_NE(N, DINamespace::get(Context, getFile(), Name, ExportSymbols)); 1915 EXPECT_NE(N, DINamespace::get(Context, Scope, "other", ExportSymbols)); 1916 EXPECT_NE(N, DINamespace::get(Context, Scope, Name, !ExportSymbols)); 1917 1918 TempDINamespace Temp = N->clone(); 1919 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1920 } 1921 1922 typedef MetadataTest DIModuleTest; 1923 1924 TEST_F(DIModuleTest, get) { 1925 DIScope *Scope = getFile(); 1926 StringRef Name = "module"; 1927 StringRef ConfigMacro = "-DNDEBUG"; 1928 StringRef Includes = "-I."; 1929 StringRef Sysroot = "/"; 1930 1931 auto *N = DIModule::get(Context, Scope, Name, ConfigMacro, Includes, Sysroot); 1932 1933 EXPECT_EQ(dwarf::DW_TAG_module, N->getTag()); 1934 EXPECT_EQ(Scope, N->getScope()); 1935 EXPECT_EQ(Name, N->getName()); 1936 EXPECT_EQ(ConfigMacro, N->getConfigurationMacros()); 1937 EXPECT_EQ(Includes, N->getIncludePath()); 1938 EXPECT_EQ(Sysroot, N->getISysRoot()); 1939 EXPECT_EQ(N, DIModule::get(Context, Scope, Name, 1940 ConfigMacro, Includes, Sysroot)); 1941 EXPECT_NE(N, DIModule::get(Context, getFile(), Name, 1942 ConfigMacro, Includes, Sysroot)); 1943 EXPECT_NE(N, DIModule::get(Context, Scope, "other", 1944 ConfigMacro, Includes, Sysroot)); 1945 EXPECT_NE(N, DIModule::get(Context, Scope, Name, 1946 "other", Includes, Sysroot)); 1947 EXPECT_NE(N, DIModule::get(Context, Scope, Name, 1948 ConfigMacro, "other", Sysroot)); 1949 EXPECT_NE(N, DIModule::get(Context, Scope, Name, 1950 ConfigMacro, Includes, "other")); 1951 1952 TempDIModule Temp = N->clone(); 1953 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1954 } 1955 1956 typedef MetadataTest DITemplateTypeParameterTest; 1957 1958 TEST_F(DITemplateTypeParameterTest, get) { 1959 StringRef Name = "template"; 1960 DIType *Type = getBasicType("basic"); 1961 1962 auto *N = DITemplateTypeParameter::get(Context, Name, Type); 1963 1964 EXPECT_EQ(dwarf::DW_TAG_template_type_parameter, N->getTag()); 1965 EXPECT_EQ(Name, N->getName()); 1966 EXPECT_EQ(Type, N->getType()); 1967 EXPECT_EQ(N, DITemplateTypeParameter::get(Context, Name, Type)); 1968 1969 EXPECT_NE(N, DITemplateTypeParameter::get(Context, "other", Type)); 1970 EXPECT_NE(N, 1971 DITemplateTypeParameter::get(Context, Name, getBasicType("other"))); 1972 1973 TempDITemplateTypeParameter Temp = N->clone(); 1974 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 1975 } 1976 1977 typedef MetadataTest DITemplateValueParameterTest; 1978 1979 TEST_F(DITemplateValueParameterTest, get) { 1980 unsigned Tag = dwarf::DW_TAG_template_value_parameter; 1981 StringRef Name = "template"; 1982 DIType *Type = getBasicType("basic"); 1983 Metadata *Value = getConstantAsMetadata(); 1984 1985 auto *N = DITemplateValueParameter::get(Context, Tag, Name, Type, Value); 1986 EXPECT_EQ(Tag, N->getTag()); 1987 EXPECT_EQ(Name, N->getName()); 1988 EXPECT_EQ(Type, N->getType()); 1989 EXPECT_EQ(Value, N->getValue()); 1990 EXPECT_EQ(N, DITemplateValueParameter::get(Context, Tag, Name, Type, Value)); 1991 1992 EXPECT_NE(N, DITemplateValueParameter::get( 1993 Context, dwarf::DW_TAG_GNU_template_template_param, Name, 1994 Type, Value)); 1995 EXPECT_NE(N, 1996 DITemplateValueParameter::get(Context, Tag, "other", Type, Value)); 1997 EXPECT_NE(N, DITemplateValueParameter::get(Context, Tag, Name, 1998 getBasicType("other"), Value)); 1999 EXPECT_NE(N, DITemplateValueParameter::get(Context, Tag, Name, Type, 2000 getConstantAsMetadata())); 2001 2002 TempDITemplateValueParameter Temp = N->clone(); 2003 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2004 } 2005 2006 typedef MetadataTest DIGlobalVariableTest; 2007 2008 TEST_F(DIGlobalVariableTest, get) { 2009 DIScope *Scope = getSubprogram(); 2010 StringRef Name = "name"; 2011 StringRef LinkageName = "linkage"; 2012 DIFile *File = getFile(); 2013 unsigned Line = 5; 2014 DIType *Type = getDerivedType(); 2015 bool IsLocalToUnit = false; 2016 bool IsDefinition = true; 2017 MDTuple *templateParams = getTuple(); 2018 DIDerivedType *StaticDataMemberDeclaration = 2019 cast<DIDerivedType>(getDerivedType()); 2020 2021 uint32_t AlignInBits = 8; 2022 2023 auto *N = DIGlobalVariable::get( 2024 Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 2025 IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits); 2026 2027 EXPECT_EQ(dwarf::DW_TAG_variable, N->getTag()); 2028 EXPECT_EQ(Scope, N->getScope()); 2029 EXPECT_EQ(Name, N->getName()); 2030 EXPECT_EQ(LinkageName, N->getLinkageName()); 2031 EXPECT_EQ(File, N->getFile()); 2032 EXPECT_EQ(Line, N->getLine()); 2033 EXPECT_EQ(Type, N->getType()); 2034 EXPECT_EQ(IsLocalToUnit, N->isLocalToUnit()); 2035 EXPECT_EQ(IsDefinition, N->isDefinition()); 2036 EXPECT_EQ(StaticDataMemberDeclaration, N->getStaticDataMemberDeclaration()); 2037 EXPECT_EQ(templateParams, N->getTemplateParams()); 2038 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 2039 EXPECT_EQ(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2040 Line, Type, IsLocalToUnit, IsDefinition, 2041 StaticDataMemberDeclaration, 2042 templateParams, AlignInBits)); 2043 2044 EXPECT_NE(N, DIGlobalVariable::get( 2045 Context, getSubprogram(), Name, LinkageName, File, Line, 2046 Type, IsLocalToUnit, IsDefinition, 2047 StaticDataMemberDeclaration, templateParams, AlignInBits)); 2048 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, "other", LinkageName, File, 2049 Line, Type, IsLocalToUnit, IsDefinition, 2050 StaticDataMemberDeclaration, 2051 templateParams, AlignInBits)); 2052 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, "other", File, Line, 2053 Type, IsLocalToUnit, IsDefinition, 2054 StaticDataMemberDeclaration, 2055 templateParams, AlignInBits)); 2056 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, 2057 getFile(), Line, Type, IsLocalToUnit, 2058 IsDefinition, StaticDataMemberDeclaration, 2059 templateParams, AlignInBits)); 2060 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2061 Line + 1, Type, IsLocalToUnit, 2062 IsDefinition, StaticDataMemberDeclaration, 2063 templateParams, AlignInBits)); 2064 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2065 Line, getDerivedType(), IsLocalToUnit, 2066 IsDefinition, StaticDataMemberDeclaration, 2067 templateParams, AlignInBits)); 2068 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2069 Line, Type, !IsLocalToUnit, IsDefinition, 2070 StaticDataMemberDeclaration, 2071 templateParams, AlignInBits)); 2072 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2073 Line, Type, IsLocalToUnit, !IsDefinition, 2074 StaticDataMemberDeclaration, 2075 templateParams, AlignInBits)); 2076 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2077 Line, Type, IsLocalToUnit, IsDefinition, 2078 cast<DIDerivedType>(getDerivedType()), 2079 templateParams, AlignInBits)); 2080 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2081 Line, Type, IsLocalToUnit, IsDefinition, 2082 StaticDataMemberDeclaration, nullptr, 2083 AlignInBits)); 2084 EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, 2085 Line, Type, IsLocalToUnit, IsDefinition, 2086 StaticDataMemberDeclaration, 2087 templateParams, (AlignInBits << 1))); 2088 2089 TempDIGlobalVariable Temp = N->clone(); 2090 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2091 } 2092 2093 typedef MetadataTest DIGlobalVariableExpressionTest; 2094 2095 TEST_F(DIGlobalVariableExpressionTest, get) { 2096 DIScope *Scope = getSubprogram(); 2097 StringRef Name = "name"; 2098 StringRef LinkageName = "linkage"; 2099 DIFile *File = getFile(); 2100 unsigned Line = 5; 2101 DIType *Type = getDerivedType(); 2102 bool IsLocalToUnit = false; 2103 bool IsDefinition = true; 2104 MDTuple *templateParams = getTuple(); 2105 auto *Expr = DIExpression::get(Context, {1, 2}); 2106 auto *Expr2 = DIExpression::get(Context, {1, 2, 3}); 2107 DIDerivedType *StaticDataMemberDeclaration = 2108 cast<DIDerivedType>(getDerivedType()); 2109 uint32_t AlignInBits = 8; 2110 2111 auto *Var = DIGlobalVariable::get( 2112 Context, Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, 2113 IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits); 2114 auto *Var2 = DIGlobalVariable::get( 2115 Context, Scope, "other", LinkageName, File, Line, Type, IsLocalToUnit, 2116 IsDefinition, StaticDataMemberDeclaration, templateParams, AlignInBits); 2117 auto *N = DIGlobalVariableExpression::get(Context, Var, Expr); 2118 2119 EXPECT_EQ(Var, N->getVariable()); 2120 EXPECT_EQ(Expr, N->getExpression()); 2121 EXPECT_EQ(N, DIGlobalVariableExpression::get(Context, Var, Expr)); 2122 EXPECT_NE(N, DIGlobalVariableExpression::get(Context, Var2, Expr)); 2123 EXPECT_NE(N, DIGlobalVariableExpression::get(Context, Var, Expr2)); 2124 2125 TempDIGlobalVariableExpression Temp = N->clone(); 2126 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2127 } 2128 2129 typedef MetadataTest DILocalVariableTest; 2130 2131 TEST_F(DILocalVariableTest, get) { 2132 DILocalScope *Scope = getSubprogram(); 2133 StringRef Name = "name"; 2134 DIFile *File = getFile(); 2135 unsigned Line = 5; 2136 DIType *Type = getDerivedType(); 2137 unsigned Arg = 6; 2138 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(7); 2139 uint32_t AlignInBits = 8; 2140 2141 auto *N = 2142 DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg, Flags, 2143 AlignInBits); 2144 EXPECT_TRUE(N->isParameter()); 2145 EXPECT_EQ(Scope, N->getScope()); 2146 EXPECT_EQ(Name, N->getName()); 2147 EXPECT_EQ(File, N->getFile()); 2148 EXPECT_EQ(Line, N->getLine()); 2149 EXPECT_EQ(Type, N->getType()); 2150 EXPECT_EQ(Arg, N->getArg()); 2151 EXPECT_EQ(Flags, N->getFlags()); 2152 EXPECT_EQ(AlignInBits, N->getAlignInBits()); 2153 EXPECT_EQ(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg, 2154 Flags, AlignInBits)); 2155 2156 EXPECT_FALSE( 2157 DILocalVariable::get(Context, Scope, Name, File, Line, Type, 0, Flags, 2158 AlignInBits)->isParameter()); 2159 EXPECT_NE(N, DILocalVariable::get(Context, getSubprogram(), Name, File, Line, 2160 Type, Arg, Flags, AlignInBits)); 2161 EXPECT_NE(N, DILocalVariable::get(Context, Scope, "other", File, Line, Type, 2162 Arg, Flags, AlignInBits)); 2163 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, getFile(), Line, Type, 2164 Arg, Flags, AlignInBits)); 2165 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line + 1, Type, 2166 Arg, Flags, AlignInBits)); 2167 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, 2168 getDerivedType(), Arg, Flags, AlignInBits)); 2169 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, 2170 Arg + 1, Flags, AlignInBits)); 2171 EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, 2172 Arg, Flags, (AlignInBits << 1))); 2173 2174 TempDILocalVariable Temp = N->clone(); 2175 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2176 } 2177 2178 TEST_F(DILocalVariableTest, getArg256) { 2179 EXPECT_EQ(255u, DILocalVariable::get(Context, getSubprogram(), "", getFile(), 2180 0, nullptr, 255, DINode::FlagZero, 0) 2181 ->getArg()); 2182 EXPECT_EQ(256u, DILocalVariable::get(Context, getSubprogram(), "", getFile(), 2183 0, nullptr, 256, DINode::FlagZero, 0) 2184 ->getArg()); 2185 EXPECT_EQ(257u, DILocalVariable::get(Context, getSubprogram(), "", getFile(), 2186 0, nullptr, 257, DINode::FlagZero, 0) 2187 ->getArg()); 2188 unsigned Max = UINT16_MAX; 2189 EXPECT_EQ(Max, DILocalVariable::get(Context, getSubprogram(), "", getFile(), 2190 0, nullptr, Max, DINode::FlagZero, 0) 2191 ->getArg()); 2192 } 2193 2194 typedef MetadataTest DIExpressionTest; 2195 2196 TEST_F(DIExpressionTest, get) { 2197 uint64_t Elements[] = {2, 6, 9, 78, 0}; 2198 auto *N = DIExpression::get(Context, Elements); 2199 EXPECT_EQ(makeArrayRef(Elements), N->getElements()); 2200 EXPECT_EQ(N, DIExpression::get(Context, Elements)); 2201 2202 EXPECT_EQ(5u, N->getNumElements()); 2203 EXPECT_EQ(2u, N->getElement(0)); 2204 EXPECT_EQ(6u, N->getElement(1)); 2205 EXPECT_EQ(9u, N->getElement(2)); 2206 EXPECT_EQ(78u, N->getElement(3)); 2207 EXPECT_EQ(0u, N->getElement(4)); 2208 2209 TempDIExpression Temp = N->clone(); 2210 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2211 2212 // Test DIExpression::prepend(). 2213 uint64_t Elts0[] = {dwarf::DW_OP_LLVM_fragment, 0, 32}; 2214 auto *N0 = DIExpression::get(Context, Elts0); 2215 auto *N0WithPrependedOps = DIExpression::prepend(N0, true, 64, true, true); 2216 uint64_t Elts1[] = {dwarf::DW_OP_deref, 2217 dwarf::DW_OP_plus_uconst, 64, 2218 dwarf::DW_OP_deref, 2219 dwarf::DW_OP_stack_value, 2220 dwarf::DW_OP_LLVM_fragment, 0, 32}; 2221 auto *N1 = DIExpression::get(Context, Elts1); 2222 EXPECT_EQ(N0WithPrependedOps, N1); 2223 2224 // Test DIExpression::append(). 2225 uint64_t Elts2[] = {dwarf::DW_OP_deref, dwarf::DW_OP_plus_uconst, 64, 2226 dwarf::DW_OP_deref, dwarf::DW_OP_stack_value}; 2227 auto *N2 = DIExpression::append(N0, Elts2); 2228 EXPECT_EQ(N0WithPrependedOps, N2); 2229 } 2230 2231 TEST_F(DIExpressionTest, isValid) { 2232 #define EXPECT_VALID(...) \ 2233 do { \ 2234 uint64_t Elements[] = {__VA_ARGS__}; \ 2235 EXPECT_TRUE(DIExpression::get(Context, Elements)->isValid()); \ 2236 } while (false) 2237 #define EXPECT_INVALID(...) \ 2238 do { \ 2239 uint64_t Elements[] = {__VA_ARGS__}; \ 2240 EXPECT_FALSE(DIExpression::get(Context, Elements)->isValid()); \ 2241 } while (false) 2242 2243 // Empty expression should be valid. 2244 EXPECT_TRUE(DIExpression::get(Context, None)); 2245 2246 // Valid constructions. 2247 EXPECT_VALID(dwarf::DW_OP_plus_uconst, 6); 2248 EXPECT_VALID(dwarf::DW_OP_constu, 6, dwarf::DW_OP_plus); 2249 EXPECT_VALID(dwarf::DW_OP_deref); 2250 EXPECT_VALID(dwarf::DW_OP_LLVM_fragment, 3, 7); 2251 EXPECT_VALID(dwarf::DW_OP_plus_uconst, 6, dwarf::DW_OP_deref); 2252 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_plus_uconst, 6); 2253 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_LLVM_fragment, 3, 7); 2254 EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_plus_uconst, 6, 2255 dwarf::DW_OP_LLVM_fragment, 3, 7); 2256 2257 // Invalid constructions. 2258 EXPECT_INVALID(~0u); 2259 EXPECT_INVALID(dwarf::DW_OP_plus, 0); 2260 EXPECT_INVALID(dwarf::DW_OP_plus_uconst); 2261 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment); 2262 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment, 3); 2263 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment, 3, 7, dwarf::DW_OP_plus_uconst, 3); 2264 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment, 3, 7, dwarf::DW_OP_deref); 2265 2266 #undef EXPECT_VALID 2267 #undef EXPECT_INVALID 2268 } 2269 2270 typedef MetadataTest DIObjCPropertyTest; 2271 2272 TEST_F(DIObjCPropertyTest, get) { 2273 StringRef Name = "name"; 2274 DIFile *File = getFile(); 2275 unsigned Line = 5; 2276 StringRef GetterName = "getter"; 2277 StringRef SetterName = "setter"; 2278 unsigned Attributes = 7; 2279 DIType *Type = getBasicType("basic"); 2280 2281 auto *N = DIObjCProperty::get(Context, Name, File, Line, GetterName, 2282 SetterName, Attributes, Type); 2283 2284 EXPECT_EQ(dwarf::DW_TAG_APPLE_property, N->getTag()); 2285 EXPECT_EQ(Name, N->getName()); 2286 EXPECT_EQ(File, N->getFile()); 2287 EXPECT_EQ(Line, N->getLine()); 2288 EXPECT_EQ(GetterName, N->getGetterName()); 2289 EXPECT_EQ(SetterName, N->getSetterName()); 2290 EXPECT_EQ(Attributes, N->getAttributes()); 2291 EXPECT_EQ(Type, N->getType()); 2292 EXPECT_EQ(N, DIObjCProperty::get(Context, Name, File, Line, GetterName, 2293 SetterName, Attributes, Type)); 2294 2295 EXPECT_NE(N, DIObjCProperty::get(Context, "other", File, Line, GetterName, 2296 SetterName, Attributes, Type)); 2297 EXPECT_NE(N, DIObjCProperty::get(Context, Name, getFile(), Line, GetterName, 2298 SetterName, Attributes, Type)); 2299 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line + 1, GetterName, 2300 SetterName, Attributes, Type)); 2301 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, "other", 2302 SetterName, Attributes, Type)); 2303 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName, 2304 "other", Attributes, Type)); 2305 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName, 2306 SetterName, Attributes + 1, Type)); 2307 EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName, 2308 SetterName, Attributes, 2309 getBasicType("other"))); 2310 2311 TempDIObjCProperty Temp = N->clone(); 2312 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2313 } 2314 2315 typedef MetadataTest DIImportedEntityTest; 2316 2317 TEST_F(DIImportedEntityTest, get) { 2318 unsigned Tag = dwarf::DW_TAG_imported_module; 2319 DIScope *Scope = getSubprogram(); 2320 DINode *Entity = getCompositeType(); 2321 DIFile *File = getFile(); 2322 unsigned Line = 5; 2323 StringRef Name = "name"; 2324 2325 auto *N = 2326 DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line, Name); 2327 2328 EXPECT_EQ(Tag, N->getTag()); 2329 EXPECT_EQ(Scope, N->getScope()); 2330 EXPECT_EQ(Entity, N->getEntity()); 2331 EXPECT_EQ(File, N->getFile()); 2332 EXPECT_EQ(Line, N->getLine()); 2333 EXPECT_EQ(Name, N->getName()); 2334 EXPECT_EQ( 2335 N, DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line, Name)); 2336 2337 EXPECT_NE(N, 2338 DIImportedEntity::get(Context, dwarf::DW_TAG_imported_declaration, 2339 Scope, Entity, File, Line, Name)); 2340 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, getSubprogram(), Entity, 2341 File, Line, Name)); 2342 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, getCompositeType(), 2343 File, Line, Name)); 2344 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, nullptr, Line, 2345 Name)); 2346 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, File, 2347 Line + 1, Name)); 2348 EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, Entity, File, Line, 2349 "other")); 2350 2351 TempDIImportedEntity Temp = N->clone(); 2352 EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp))); 2353 } 2354 2355 typedef MetadataTest MetadataAsValueTest; 2356 2357 TEST_F(MetadataAsValueTest, MDNode) { 2358 MDNode *N = MDNode::get(Context, None); 2359 auto *V = MetadataAsValue::get(Context, N); 2360 EXPECT_TRUE(V->getType()->isMetadataTy()); 2361 EXPECT_EQ(N, V->getMetadata()); 2362 2363 auto *V2 = MetadataAsValue::get(Context, N); 2364 EXPECT_EQ(V, V2); 2365 } 2366 2367 TEST_F(MetadataAsValueTest, MDNodeMDNode) { 2368 MDNode *N = MDNode::get(Context, None); 2369 Metadata *Ops[] = {N}; 2370 MDNode *N2 = MDNode::get(Context, Ops); 2371 auto *V = MetadataAsValue::get(Context, N2); 2372 EXPECT_TRUE(V->getType()->isMetadataTy()); 2373 EXPECT_EQ(N2, V->getMetadata()); 2374 2375 auto *V2 = MetadataAsValue::get(Context, N2); 2376 EXPECT_EQ(V, V2); 2377 2378 auto *V3 = MetadataAsValue::get(Context, N); 2379 EXPECT_TRUE(V3->getType()->isMetadataTy()); 2380 EXPECT_NE(V, V3); 2381 EXPECT_EQ(N, V3->getMetadata()); 2382 } 2383 2384 TEST_F(MetadataAsValueTest, MDNodeConstant) { 2385 auto *C = ConstantInt::getTrue(Context); 2386 auto *MD = ConstantAsMetadata::get(C); 2387 Metadata *Ops[] = {MD}; 2388 auto *N = MDNode::get(Context, Ops); 2389 2390 auto *V = MetadataAsValue::get(Context, MD); 2391 EXPECT_TRUE(V->getType()->isMetadataTy()); 2392 EXPECT_EQ(MD, V->getMetadata()); 2393 2394 auto *V2 = MetadataAsValue::get(Context, N); 2395 EXPECT_EQ(MD, V2->getMetadata()); 2396 EXPECT_EQ(V, V2); 2397 } 2398 2399 typedef MetadataTest ValueAsMetadataTest; 2400 2401 TEST_F(ValueAsMetadataTest, UpdatesOnRAUW) { 2402 Type *Ty = Type::getInt1PtrTy(Context); 2403 std::unique_ptr<GlobalVariable> GV0( 2404 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 2405 auto *MD = ValueAsMetadata::get(GV0.get()); 2406 EXPECT_TRUE(MD->getValue() == GV0.get()); 2407 ASSERT_TRUE(GV0->use_empty()); 2408 2409 std::unique_ptr<GlobalVariable> GV1( 2410 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 2411 GV0->replaceAllUsesWith(GV1.get()); 2412 EXPECT_TRUE(MD->getValue() == GV1.get()); 2413 } 2414 2415 TEST_F(ValueAsMetadataTest, TempTempReplacement) { 2416 // Create a constant. 2417 ConstantAsMetadata *CI = 2418 ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0))); 2419 2420 auto Temp1 = MDTuple::getTemporary(Context, None); 2421 auto Temp2 = MDTuple::getTemporary(Context, {CI}); 2422 auto *N = MDTuple::get(Context, {Temp1.get()}); 2423 2424 // Test replacing a temporary node with another temporary node. 2425 Temp1->replaceAllUsesWith(Temp2.get()); 2426 EXPECT_EQ(N->getOperand(0), Temp2.get()); 2427 2428 // Clean up Temp2 for teardown. 2429 Temp2->replaceAllUsesWith(nullptr); 2430 } 2431 2432 TEST_F(ValueAsMetadataTest, CollidingDoubleUpdates) { 2433 // Create a constant. 2434 ConstantAsMetadata *CI = 2435 ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0))); 2436 2437 // Create a temporary to prevent nodes from resolving. 2438 auto Temp = MDTuple::getTemporary(Context, None); 2439 2440 // When the first operand of N1 gets reset to nullptr, it'll collide with N2. 2441 Metadata *Ops1[] = {CI, CI, Temp.get()}; 2442 Metadata *Ops2[] = {nullptr, CI, Temp.get()}; 2443 2444 auto *N1 = MDTuple::get(Context, Ops1); 2445 auto *N2 = MDTuple::get(Context, Ops2); 2446 ASSERT_NE(N1, N2); 2447 2448 // Tell metadata that the constant is getting deleted. 2449 // 2450 // After this, N1 will be invalid, so don't touch it. 2451 ValueAsMetadata::handleDeletion(CI->getValue()); 2452 EXPECT_EQ(nullptr, N2->getOperand(0)); 2453 EXPECT_EQ(nullptr, N2->getOperand(1)); 2454 EXPECT_EQ(Temp.get(), N2->getOperand(2)); 2455 2456 // Clean up Temp for teardown. 2457 Temp->replaceAllUsesWith(nullptr); 2458 } 2459 2460 typedef MetadataTest TrackingMDRefTest; 2461 2462 TEST_F(TrackingMDRefTest, UpdatesOnRAUW) { 2463 Type *Ty = Type::getInt1PtrTy(Context); 2464 std::unique_ptr<GlobalVariable> GV0( 2465 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 2466 TypedTrackingMDRef<ValueAsMetadata> MD(ValueAsMetadata::get(GV0.get())); 2467 EXPECT_TRUE(MD->getValue() == GV0.get()); 2468 ASSERT_TRUE(GV0->use_empty()); 2469 2470 std::unique_ptr<GlobalVariable> GV1( 2471 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 2472 GV0->replaceAllUsesWith(GV1.get()); 2473 EXPECT_TRUE(MD->getValue() == GV1.get()); 2474 2475 // Reset it, so we don't inadvertently test deletion. 2476 MD.reset(); 2477 } 2478 2479 TEST_F(TrackingMDRefTest, UpdatesOnDeletion) { 2480 Type *Ty = Type::getInt1PtrTy(Context); 2481 std::unique_ptr<GlobalVariable> GV( 2482 new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage)); 2483 TypedTrackingMDRef<ValueAsMetadata> MD(ValueAsMetadata::get(GV.get())); 2484 EXPECT_TRUE(MD->getValue() == GV.get()); 2485 ASSERT_TRUE(GV->use_empty()); 2486 2487 GV.reset(); 2488 EXPECT_TRUE(!MD); 2489 } 2490 2491 TEST(NamedMDNodeTest, Search) { 2492 LLVMContext Context; 2493 ConstantAsMetadata *C = 2494 ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context), 1)); 2495 ConstantAsMetadata *C2 = 2496 ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context), 2)); 2497 2498 Metadata *const V = C; 2499 Metadata *const V2 = C2; 2500 MDNode *n = MDNode::get(Context, V); 2501 MDNode *n2 = MDNode::get(Context, V2); 2502 2503 Module M("MyModule", Context); 2504 const char *Name = "llvm.NMD1"; 2505 NamedMDNode *NMD = M.getOrInsertNamedMetadata(Name); 2506 NMD->addOperand(n); 2507 NMD->addOperand(n2); 2508 2509 std::string Str; 2510 raw_string_ostream oss(Str); 2511 NMD->print(oss); 2512 EXPECT_STREQ("!llvm.NMD1 = !{!0, !1}\n", 2513 oss.str().c_str()); 2514 } 2515 2516 typedef MetadataTest FunctionAttachmentTest; 2517 TEST_F(FunctionAttachmentTest, setMetadata) { 2518 Function *F = getFunction("foo"); 2519 ASSERT_FALSE(F->hasMetadata()); 2520 EXPECT_EQ(nullptr, F->getMetadata(LLVMContext::MD_dbg)); 2521 EXPECT_EQ(nullptr, F->getMetadata("dbg")); 2522 EXPECT_EQ(nullptr, F->getMetadata("other")); 2523 2524 DISubprogram *SP1 = getSubprogram(); 2525 DISubprogram *SP2 = getSubprogram(); 2526 ASSERT_NE(SP1, SP2); 2527 2528 F->setMetadata("dbg", SP1); 2529 EXPECT_TRUE(F->hasMetadata()); 2530 EXPECT_EQ(SP1, F->getMetadata(LLVMContext::MD_dbg)); 2531 EXPECT_EQ(SP1, F->getMetadata("dbg")); 2532 EXPECT_EQ(nullptr, F->getMetadata("other")); 2533 2534 F->setMetadata(LLVMContext::MD_dbg, SP2); 2535 EXPECT_TRUE(F->hasMetadata()); 2536 EXPECT_EQ(SP2, F->getMetadata(LLVMContext::MD_dbg)); 2537 EXPECT_EQ(SP2, F->getMetadata("dbg")); 2538 EXPECT_EQ(nullptr, F->getMetadata("other")); 2539 2540 F->setMetadata("dbg", nullptr); 2541 EXPECT_FALSE(F->hasMetadata()); 2542 EXPECT_EQ(nullptr, F->getMetadata(LLVMContext::MD_dbg)); 2543 EXPECT_EQ(nullptr, F->getMetadata("dbg")); 2544 EXPECT_EQ(nullptr, F->getMetadata("other")); 2545 2546 MDTuple *T1 = getTuple(); 2547 MDTuple *T2 = getTuple(); 2548 ASSERT_NE(T1, T2); 2549 2550 F->setMetadata("other1", T1); 2551 F->setMetadata("other2", T2); 2552 EXPECT_TRUE(F->hasMetadata()); 2553 EXPECT_EQ(T1, F->getMetadata("other1")); 2554 EXPECT_EQ(T2, F->getMetadata("other2")); 2555 EXPECT_EQ(nullptr, F->getMetadata("dbg")); 2556 2557 F->setMetadata("other1", T2); 2558 F->setMetadata("other2", T1); 2559 EXPECT_EQ(T2, F->getMetadata("other1")); 2560 EXPECT_EQ(T1, F->getMetadata("other2")); 2561 2562 F->setMetadata("other1", nullptr); 2563 F->setMetadata("other2", nullptr); 2564 EXPECT_FALSE(F->hasMetadata()); 2565 EXPECT_EQ(nullptr, F->getMetadata("other1")); 2566 EXPECT_EQ(nullptr, F->getMetadata("other2")); 2567 } 2568 2569 TEST_F(FunctionAttachmentTest, getAll) { 2570 Function *F = getFunction("foo"); 2571 2572 MDTuple *T1 = getTuple(); 2573 MDTuple *T2 = getTuple(); 2574 MDTuple *P = getTuple(); 2575 DISubprogram *SP = getSubprogram(); 2576 2577 F->setMetadata("other1", T2); 2578 F->setMetadata(LLVMContext::MD_dbg, SP); 2579 F->setMetadata("other2", T1); 2580 F->setMetadata(LLVMContext::MD_prof, P); 2581 F->setMetadata("other2", T2); 2582 F->setMetadata("other1", T1); 2583 2584 SmallVector<std::pair<unsigned, MDNode *>, 4> MDs; 2585 F->getAllMetadata(MDs); 2586 ASSERT_EQ(4u, MDs.size()); 2587 EXPECT_EQ(LLVMContext::MD_dbg, MDs[0].first); 2588 EXPECT_EQ(LLVMContext::MD_prof, MDs[1].first); 2589 EXPECT_EQ(Context.getMDKindID("other1"), MDs[2].first); 2590 EXPECT_EQ(Context.getMDKindID("other2"), MDs[3].first); 2591 EXPECT_EQ(SP, MDs[0].second); 2592 EXPECT_EQ(P, MDs[1].second); 2593 EXPECT_EQ(T1, MDs[2].second); 2594 EXPECT_EQ(T2, MDs[3].second); 2595 } 2596 2597 TEST_F(FunctionAttachmentTest, Verifier) { 2598 Function *F = getFunction("foo"); 2599 F->setMetadata("attach", getTuple()); 2600 F->setIsMaterializable(true); 2601 2602 // Confirm this is materializable. 2603 ASSERT_TRUE(F->isMaterializable()); 2604 2605 // Materializable functions cannot have metadata attachments. 2606 EXPECT_TRUE(verifyFunction(*F)); 2607 2608 // Function declarations can. 2609 F->setIsMaterializable(false); 2610 EXPECT_FALSE(verifyModule(*F->getParent())); 2611 EXPECT_FALSE(verifyFunction(*F)); 2612 2613 // So can definitions. 2614 (void)new UnreachableInst(Context, BasicBlock::Create(Context, "bb", F)); 2615 EXPECT_FALSE(verifyModule(*F->getParent())); 2616 EXPECT_FALSE(verifyFunction(*F)); 2617 } 2618 2619 TEST_F(FunctionAttachmentTest, EntryCount) { 2620 Function *F = getFunction("foo"); 2621 EXPECT_FALSE(F->getEntryCount().hasValue()); 2622 F->setEntryCount(12304, Function::PCT_Real); 2623 auto Count = F->getEntryCount(); 2624 EXPECT_TRUE(Count.hasValue()); 2625 EXPECT_EQ(12304u, Count.getCount()); 2626 EXPECT_EQ(Function::PCT_Real, Count.getType()); 2627 2628 // Repeat the same for synthetic counts. 2629 F = getFunction("bar"); 2630 EXPECT_FALSE(F->getEntryCount().hasValue()); 2631 F->setEntryCount(123, Function::PCT_Synthetic); 2632 Count = F->getEntryCount(); 2633 EXPECT_TRUE(Count.hasValue()); 2634 EXPECT_EQ(123u, Count.getCount()); 2635 EXPECT_EQ(Function::PCT_Synthetic, Count.getType()); 2636 } 2637 2638 TEST_F(FunctionAttachmentTest, SubprogramAttachment) { 2639 Function *F = getFunction("foo"); 2640 DISubprogram *SP = getSubprogram(); 2641 F->setSubprogram(SP); 2642 2643 // Note that the static_cast confirms that F->getSubprogram() actually 2644 // returns an DISubprogram. 2645 EXPECT_EQ(SP, static_cast<DISubprogram *>(F->getSubprogram())); 2646 EXPECT_EQ(SP, F->getMetadata("dbg")); 2647 EXPECT_EQ(SP, F->getMetadata(LLVMContext::MD_dbg)); 2648 } 2649 2650 typedef MetadataTest DistinctMDOperandPlaceholderTest; 2651 TEST_F(DistinctMDOperandPlaceholderTest, getID) { 2652 EXPECT_EQ(7u, DistinctMDOperandPlaceholder(7).getID()); 2653 } 2654 2655 TEST_F(DistinctMDOperandPlaceholderTest, replaceUseWith) { 2656 // Set up some placeholders. 2657 DistinctMDOperandPlaceholder PH0(7); 2658 DistinctMDOperandPlaceholder PH1(3); 2659 DistinctMDOperandPlaceholder PH2(0); 2660 Metadata *Ops[] = {&PH0, &PH1, &PH2}; 2661 auto *D = MDTuple::getDistinct(Context, Ops); 2662 ASSERT_EQ(&PH0, D->getOperand(0)); 2663 ASSERT_EQ(&PH1, D->getOperand(1)); 2664 ASSERT_EQ(&PH2, D->getOperand(2)); 2665 2666 // Replace them. 2667 auto *N0 = MDTuple::get(Context, None); 2668 auto *N1 = MDTuple::get(Context, N0); 2669 PH0.replaceUseWith(N0); 2670 PH1.replaceUseWith(N1); 2671 PH2.replaceUseWith(nullptr); 2672 EXPECT_EQ(N0, D->getOperand(0)); 2673 EXPECT_EQ(N1, D->getOperand(1)); 2674 EXPECT_EQ(nullptr, D->getOperand(2)); 2675 } 2676 2677 TEST_F(DistinctMDOperandPlaceholderTest, replaceUseWithNoUser) { 2678 // There is no user, but we can still call replace. 2679 DistinctMDOperandPlaceholder(7).replaceUseWith(MDTuple::get(Context, None)); 2680 } 2681 2682 // Test various assertions in metadata tracking. Don't run these tests if gtest 2683 // will use SEH to recover from them. Two of these tests get halfway through 2684 // inserting metadata into DenseMaps for tracking purposes, and then they 2685 // assert, and we attempt to destroy an LLVMContext with broken invariants, 2686 // leading to infinite loops. 2687 #if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG) && !defined(GTEST_HAS_SEH) 2688 TEST_F(DistinctMDOperandPlaceholderTest, MetadataAsValue) { 2689 // This shouldn't crash. 2690 DistinctMDOperandPlaceholder PH(7); 2691 EXPECT_DEATH(MetadataAsValue::get(Context, &PH), 2692 "Unexpected callback to owner"); 2693 } 2694 2695 TEST_F(DistinctMDOperandPlaceholderTest, UniquedMDNode) { 2696 // This shouldn't crash. 2697 DistinctMDOperandPlaceholder PH(7); 2698 EXPECT_DEATH(MDTuple::get(Context, &PH), "Unexpected callback to owner"); 2699 } 2700 2701 TEST_F(DistinctMDOperandPlaceholderTest, SecondDistinctMDNode) { 2702 // This shouldn't crash. 2703 DistinctMDOperandPlaceholder PH(7); 2704 MDTuple::getDistinct(Context, &PH); 2705 EXPECT_DEATH(MDTuple::getDistinct(Context, &PH), 2706 "Placeholders can only be used once"); 2707 } 2708 2709 TEST_F(DistinctMDOperandPlaceholderTest, TrackingMDRefAndDistinctMDNode) { 2710 // TrackingMDRef doesn't install an owner callback, so it can't be detected 2711 // as an invalid use. However, using a placeholder in a TrackingMDRef *and* 2712 // a distinct node isn't possible and we should assert. 2713 // 2714 // (There's no positive test for using TrackingMDRef because it's not a 2715 // useful thing to do.) 2716 { 2717 DistinctMDOperandPlaceholder PH(7); 2718 MDTuple::getDistinct(Context, &PH); 2719 EXPECT_DEATH(TrackingMDRef Ref(&PH), "Placeholders can only be used once"); 2720 } 2721 { 2722 DistinctMDOperandPlaceholder PH(7); 2723 TrackingMDRef Ref(&PH); 2724 EXPECT_DEATH(MDTuple::getDistinct(Context, &PH), 2725 "Placeholders can only be used once"); 2726 } 2727 } 2728 #endif 2729 2730 } // end namespace 2731