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