xref: /aosp_15_r20/external/llvm/unittests/IR/MetadataTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- unittests/IR/MetadataTest.cpp - Metadata unit tests ----------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugInfo.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugInfoMetadata.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ModuleSlotTracker.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Type.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Verifier.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
23*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
24*9880d681SAndroid Build Coastguard Worker using namespace llvm;
25*9880d681SAndroid Build Coastguard Worker 
26*9880d681SAndroid Build Coastguard Worker namespace {
27*9880d681SAndroid Build Coastguard Worker 
TEST(ContextAndReplaceableUsesTest,FromContext)28*9880d681SAndroid Build Coastguard Worker TEST(ContextAndReplaceableUsesTest, FromContext) {
29*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
30*9880d681SAndroid Build Coastguard Worker   ContextAndReplaceableUses CRU(Context);
31*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(&Context, &CRU.getContext());
32*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(CRU.hasReplaceableUses());
33*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(CRU.getReplaceableUses());
34*9880d681SAndroid Build Coastguard Worker }
35*9880d681SAndroid Build Coastguard Worker 
TEST(ContextAndReplaceableUsesTest,FromReplaceableUses)36*9880d681SAndroid Build Coastguard Worker TEST(ContextAndReplaceableUsesTest, FromReplaceableUses) {
37*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
38*9880d681SAndroid Build Coastguard Worker   ContextAndReplaceableUses CRU(make_unique<ReplaceableMetadataImpl>(Context));
39*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(&Context, &CRU.getContext());
40*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(CRU.hasReplaceableUses());
41*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(CRU.getReplaceableUses());
42*9880d681SAndroid Build Coastguard Worker }
43*9880d681SAndroid Build Coastguard Worker 
TEST(ContextAndReplaceableUsesTest,makeReplaceable)44*9880d681SAndroid Build Coastguard Worker TEST(ContextAndReplaceableUsesTest, makeReplaceable) {
45*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
46*9880d681SAndroid Build Coastguard Worker   ContextAndReplaceableUses CRU(Context);
47*9880d681SAndroid Build Coastguard Worker   CRU.makeReplaceable(make_unique<ReplaceableMetadataImpl>(Context));
48*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(&Context, &CRU.getContext());
49*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(CRU.hasReplaceableUses());
50*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(CRU.getReplaceableUses());
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker 
TEST(ContextAndReplaceableUsesTest,takeReplaceableUses)53*9880d681SAndroid Build Coastguard Worker TEST(ContextAndReplaceableUsesTest, takeReplaceableUses) {
54*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
55*9880d681SAndroid Build Coastguard Worker   auto ReplaceableUses = make_unique<ReplaceableMetadataImpl>(Context);
56*9880d681SAndroid Build Coastguard Worker   auto *Ptr = ReplaceableUses.get();
57*9880d681SAndroid Build Coastguard Worker   ContextAndReplaceableUses CRU(std::move(ReplaceableUses));
58*9880d681SAndroid Build Coastguard Worker   ReplaceableUses = CRU.takeReplaceableUses();
59*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(&Context, &CRU.getContext());
60*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(CRU.hasReplaceableUses());
61*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(CRU.getReplaceableUses());
62*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Ptr, ReplaceableUses.get());
63*9880d681SAndroid Build Coastguard Worker }
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker class MetadataTest : public testing::Test {
66*9880d681SAndroid Build Coastguard Worker public:
MetadataTest()67*9880d681SAndroid Build Coastguard Worker   MetadataTest() : M("test", Context), Counter(0) {}
68*9880d681SAndroid Build Coastguard Worker 
69*9880d681SAndroid Build Coastguard Worker protected:
70*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
71*9880d681SAndroid Build Coastguard Worker   Module M;
72*9880d681SAndroid Build Coastguard Worker   int Counter;
73*9880d681SAndroid Build Coastguard Worker 
getNode()74*9880d681SAndroid Build Coastguard Worker   MDNode *getNode() { return MDNode::get(Context, None); }
getNode(Metadata * MD)75*9880d681SAndroid Build Coastguard Worker   MDNode *getNode(Metadata *MD) { return MDNode::get(Context, MD); }
getNode(Metadata * MD1,Metadata * MD2)76*9880d681SAndroid Build Coastguard Worker   MDNode *getNode(Metadata *MD1, Metadata *MD2) {
77*9880d681SAndroid Build Coastguard Worker     Metadata *MDs[] = {MD1, MD2};
78*9880d681SAndroid Build Coastguard Worker     return MDNode::get(Context, MDs);
79*9880d681SAndroid Build Coastguard Worker   }
80*9880d681SAndroid Build Coastguard Worker 
getTuple()81*9880d681SAndroid Build Coastguard Worker   MDTuple *getTuple() { return MDTuple::getDistinct(Context, None); }
getSubroutineType()82*9880d681SAndroid Build Coastguard Worker   DISubroutineType *getSubroutineType() {
83*9880d681SAndroid Build Coastguard Worker     return DISubroutineType::getDistinct(Context, 0, 0, getNode(nullptr));
84*9880d681SAndroid Build Coastguard Worker   }
getSubprogram()85*9880d681SAndroid Build Coastguard Worker   DISubprogram *getSubprogram() {
86*9880d681SAndroid Build Coastguard Worker     return DISubprogram::getDistinct(Context, nullptr, "", "", nullptr, 0,
87*9880d681SAndroid Build Coastguard Worker                                      nullptr, false, false, 0, nullptr,
88*9880d681SAndroid Build Coastguard Worker                                      0, 0, 0, 0, false, nullptr);
89*9880d681SAndroid Build Coastguard Worker   }
getFile()90*9880d681SAndroid Build Coastguard Worker   DIFile *getFile() {
91*9880d681SAndroid Build Coastguard Worker     return DIFile::getDistinct(Context, "file.c", "/path/to/dir");
92*9880d681SAndroid Build Coastguard Worker   }
getUnit()93*9880d681SAndroid Build Coastguard Worker   DICompileUnit *getUnit() {
94*9880d681SAndroid Build Coastguard Worker     return DICompileUnit::getDistinct(Context, 1, getFile(), "clang", false,
95*9880d681SAndroid Build Coastguard Worker                                       "-g", 2, "", DICompileUnit::FullDebug,
96*9880d681SAndroid Build Coastguard Worker                                       getTuple(), getTuple(), getTuple(),
97*9880d681SAndroid Build Coastguard Worker                                       getTuple(), getTuple(), 0);
98*9880d681SAndroid Build Coastguard Worker   }
getBasicType(StringRef Name)99*9880d681SAndroid Build Coastguard Worker   DIType *getBasicType(StringRef Name) {
100*9880d681SAndroid Build Coastguard Worker     return DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, Name);
101*9880d681SAndroid Build Coastguard Worker   }
getDerivedType()102*9880d681SAndroid Build Coastguard Worker   DIType *getDerivedType() {
103*9880d681SAndroid Build Coastguard Worker     return DIDerivedType::getDistinct(Context, dwarf::DW_TAG_pointer_type, "",
104*9880d681SAndroid Build Coastguard Worker                                       nullptr, 0, nullptr,
105*9880d681SAndroid Build Coastguard Worker                                       getBasicType("basictype"), 1, 2, 0, 0);
106*9880d681SAndroid Build Coastguard Worker   }
getConstant()107*9880d681SAndroid Build Coastguard Worker   Constant *getConstant() {
108*9880d681SAndroid Build Coastguard Worker     return ConstantInt::get(Type::getInt32Ty(Context), Counter++);
109*9880d681SAndroid Build Coastguard Worker   }
getConstantAsMetadata()110*9880d681SAndroid Build Coastguard Worker   ConstantAsMetadata *getConstantAsMetadata() {
111*9880d681SAndroid Build Coastguard Worker     return ConstantAsMetadata::get(getConstant());
112*9880d681SAndroid Build Coastguard Worker   }
getCompositeType()113*9880d681SAndroid Build Coastguard Worker   DIType *getCompositeType() {
114*9880d681SAndroid Build Coastguard Worker     return DICompositeType::getDistinct(
115*9880d681SAndroid Build Coastguard Worker         Context, dwarf::DW_TAG_structure_type, "", nullptr, 0, nullptr, nullptr,
116*9880d681SAndroid Build Coastguard Worker         32, 32, 0, 0, nullptr, 0, nullptr, nullptr, "");
117*9880d681SAndroid Build Coastguard Worker   }
getFunction(StringRef Name)118*9880d681SAndroid Build Coastguard Worker   Function *getFunction(StringRef Name) {
119*9880d681SAndroid Build Coastguard Worker     return cast<Function>(M.getOrInsertFunction(
120*9880d681SAndroid Build Coastguard Worker         Name, FunctionType::get(Type::getVoidTy(Context), None, false)));
121*9880d681SAndroid Build Coastguard Worker   }
122*9880d681SAndroid Build Coastguard Worker };
123*9880d681SAndroid Build Coastguard Worker typedef MetadataTest MDStringTest;
124*9880d681SAndroid Build Coastguard Worker 
125*9880d681SAndroid Build Coastguard Worker // Test that construction of MDString with different value produces different
126*9880d681SAndroid Build Coastguard Worker // MDString objects, even with the same string pointer and nulls in the string.
TEST_F(MDStringTest,CreateDifferent)127*9880d681SAndroid Build Coastguard Worker TEST_F(MDStringTest, CreateDifferent) {
128*9880d681SAndroid Build Coastguard Worker   char x[3] = { 'f', 0, 'A' };
129*9880d681SAndroid Build Coastguard Worker   MDString *s1 = MDString::get(Context, StringRef(&x[0], 3));
130*9880d681SAndroid Build Coastguard Worker   x[2] = 'B';
131*9880d681SAndroid Build Coastguard Worker   MDString *s2 = MDString::get(Context, StringRef(&x[0], 3));
132*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(s1, s2);
133*9880d681SAndroid Build Coastguard Worker }
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker // Test that creation of MDStrings with the same string contents produces the
136*9880d681SAndroid Build Coastguard Worker // same MDString object, even with different pointers.
TEST_F(MDStringTest,CreateSame)137*9880d681SAndroid Build Coastguard Worker TEST_F(MDStringTest, CreateSame) {
138*9880d681SAndroid Build Coastguard Worker   char x[4] = { 'a', 'b', 'c', 'X' };
139*9880d681SAndroid Build Coastguard Worker   char y[4] = { 'a', 'b', 'c', 'Y' };
140*9880d681SAndroid Build Coastguard Worker 
141*9880d681SAndroid Build Coastguard Worker   MDString *s1 = MDString::get(Context, StringRef(&x[0], 3));
142*9880d681SAndroid Build Coastguard Worker   MDString *s2 = MDString::get(Context, StringRef(&y[0], 3));
143*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(s1, s2);
144*9880d681SAndroid Build Coastguard Worker }
145*9880d681SAndroid Build Coastguard Worker 
146*9880d681SAndroid Build Coastguard Worker // Test that MDString prints out the string we fed it.
TEST_F(MDStringTest,PrintingSimple)147*9880d681SAndroid Build Coastguard Worker TEST_F(MDStringTest, PrintingSimple) {
148*9880d681SAndroid Build Coastguard Worker   char *str = new char[13];
149*9880d681SAndroid Build Coastguard Worker   strncpy(str, "testing 1 2 3", 13);
150*9880d681SAndroid Build Coastguard Worker   MDString *s = MDString::get(Context, StringRef(str, 13));
151*9880d681SAndroid Build Coastguard Worker   strncpy(str, "aaaaaaaaaaaaa", 13);
152*9880d681SAndroid Build Coastguard Worker   delete[] str;
153*9880d681SAndroid Build Coastguard Worker 
154*9880d681SAndroid Build Coastguard Worker   std::string Str;
155*9880d681SAndroid Build Coastguard Worker   raw_string_ostream oss(Str);
156*9880d681SAndroid Build Coastguard Worker   s->print(oss);
157*9880d681SAndroid Build Coastguard Worker   EXPECT_STREQ("!\"testing 1 2 3\"", oss.str().c_str());
158*9880d681SAndroid Build Coastguard Worker }
159*9880d681SAndroid Build Coastguard Worker 
160*9880d681SAndroid Build Coastguard Worker // Test printing of MDString with non-printable characters.
TEST_F(MDStringTest,PrintingComplex)161*9880d681SAndroid Build Coastguard Worker TEST_F(MDStringTest, PrintingComplex) {
162*9880d681SAndroid Build Coastguard Worker   char str[5] = {0, '\n', '"', '\\', (char)-1};
163*9880d681SAndroid Build Coastguard Worker   MDString *s = MDString::get(Context, StringRef(str+0, 5));
164*9880d681SAndroid Build Coastguard Worker   std::string Str;
165*9880d681SAndroid Build Coastguard Worker   raw_string_ostream oss(Str);
166*9880d681SAndroid Build Coastguard Worker   s->print(oss);
167*9880d681SAndroid Build Coastguard Worker   EXPECT_STREQ("!\"\\00\\0A\\22\\5C\\FF\"", oss.str().c_str());
168*9880d681SAndroid Build Coastguard Worker }
169*9880d681SAndroid Build Coastguard Worker 
170*9880d681SAndroid Build Coastguard Worker typedef MetadataTest MDNodeTest;
171*9880d681SAndroid Build Coastguard Worker 
172*9880d681SAndroid Build Coastguard Worker // Test the two constructors, and containing other Constants.
TEST_F(MDNodeTest,Simple)173*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, Simple) {
174*9880d681SAndroid Build Coastguard Worker   char x[3] = { 'a', 'b', 'c' };
175*9880d681SAndroid Build Coastguard Worker   char y[3] = { '1', '2', '3' };
176*9880d681SAndroid Build Coastguard Worker 
177*9880d681SAndroid Build Coastguard Worker   MDString *s1 = MDString::get(Context, StringRef(&x[0], 3));
178*9880d681SAndroid Build Coastguard Worker   MDString *s2 = MDString::get(Context, StringRef(&y[0], 3));
179*9880d681SAndroid Build Coastguard Worker   ConstantAsMetadata *CI =
180*9880d681SAndroid Build Coastguard Worker       ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0)));
181*9880d681SAndroid Build Coastguard Worker 
182*9880d681SAndroid Build Coastguard Worker   std::vector<Metadata *> V;
183*9880d681SAndroid Build Coastguard Worker   V.push_back(s1);
184*9880d681SAndroid Build Coastguard Worker   V.push_back(CI);
185*9880d681SAndroid Build Coastguard Worker   V.push_back(s2);
186*9880d681SAndroid Build Coastguard Worker 
187*9880d681SAndroid Build Coastguard Worker   MDNode *n1 = MDNode::get(Context, V);
188*9880d681SAndroid Build Coastguard Worker   Metadata *const c1 = n1;
189*9880d681SAndroid Build Coastguard Worker   MDNode *n2 = MDNode::get(Context, c1);
190*9880d681SAndroid Build Coastguard Worker   Metadata *const c2 = n2;
191*9880d681SAndroid Build Coastguard Worker   MDNode *n3 = MDNode::get(Context, V);
192*9880d681SAndroid Build Coastguard Worker   MDNode *n4 = MDNode::getIfExists(Context, V);
193*9880d681SAndroid Build Coastguard Worker   MDNode *n5 = MDNode::getIfExists(Context, c1);
194*9880d681SAndroid Build Coastguard Worker   MDNode *n6 = MDNode::getIfExists(Context, c2);
195*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(n1, n2);
196*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(n1, n3);
197*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(n4, n1);
198*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(n5, n2);
199*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(n6, (Metadata *)nullptr);
200*9880d681SAndroid Build Coastguard Worker 
201*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(3u, n1->getNumOperands());
202*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(s1, n1->getOperand(0));
203*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(CI, n1->getOperand(1));
204*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(s2, n1->getOperand(2));
205*9880d681SAndroid Build Coastguard Worker 
206*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(1u, n2->getNumOperands());
207*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(n1, n2->getOperand(0));
208*9880d681SAndroid Build Coastguard Worker }
209*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,Delete)210*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, Delete) {
211*9880d681SAndroid Build Coastguard Worker   Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 1);
212*9880d681SAndroid Build Coastguard Worker   Instruction *I = new BitCastInst(C, Type::getInt32Ty(Context));
213*9880d681SAndroid Build Coastguard Worker 
214*9880d681SAndroid Build Coastguard Worker   Metadata *const V = LocalAsMetadata::get(I);
215*9880d681SAndroid Build Coastguard Worker   MDNode *n = MDNode::get(Context, V);
216*9880d681SAndroid Build Coastguard Worker   TrackingMDRef wvh(n);
217*9880d681SAndroid Build Coastguard Worker 
218*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(n, wvh);
219*9880d681SAndroid Build Coastguard Worker 
220*9880d681SAndroid Build Coastguard Worker   delete I;
221*9880d681SAndroid Build Coastguard Worker }
222*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,SelfReference)223*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, SelfReference) {
224*9880d681SAndroid Build Coastguard Worker   // !0 = !{!0}
225*9880d681SAndroid Build Coastguard Worker   // !1 = !{!0}
226*9880d681SAndroid Build Coastguard Worker   {
227*9880d681SAndroid Build Coastguard Worker     auto Temp = MDNode::getTemporary(Context, None);
228*9880d681SAndroid Build Coastguard Worker     Metadata *Args[] = {Temp.get()};
229*9880d681SAndroid Build Coastguard Worker     MDNode *Self = MDNode::get(Context, Args);
230*9880d681SAndroid Build Coastguard Worker     Self->replaceOperandWith(0, Self);
231*9880d681SAndroid Build Coastguard Worker     ASSERT_EQ(Self, Self->getOperand(0));
232*9880d681SAndroid Build Coastguard Worker 
233*9880d681SAndroid Build Coastguard Worker     // Self-references should be distinct, so MDNode::get() should grab a
234*9880d681SAndroid Build Coastguard Worker     // uniqued node that references Self, not Self.
235*9880d681SAndroid Build Coastguard Worker     Args[0] = Self;
236*9880d681SAndroid Build Coastguard Worker     MDNode *Ref1 = MDNode::get(Context, Args);
237*9880d681SAndroid Build Coastguard Worker     MDNode *Ref2 = MDNode::get(Context, Args);
238*9880d681SAndroid Build Coastguard Worker     EXPECT_NE(Self, Ref1);
239*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Ref1, Ref2);
240*9880d681SAndroid Build Coastguard Worker   }
241*9880d681SAndroid Build Coastguard Worker 
242*9880d681SAndroid Build Coastguard Worker   // !0 = !{!0, !{}}
243*9880d681SAndroid Build Coastguard Worker   // !1 = !{!0, !{}}
244*9880d681SAndroid Build Coastguard Worker   {
245*9880d681SAndroid Build Coastguard Worker     auto Temp = MDNode::getTemporary(Context, None);
246*9880d681SAndroid Build Coastguard Worker     Metadata *Args[] = {Temp.get(), MDNode::get(Context, None)};
247*9880d681SAndroid Build Coastguard Worker     MDNode *Self = MDNode::get(Context, Args);
248*9880d681SAndroid Build Coastguard Worker     Self->replaceOperandWith(0, Self);
249*9880d681SAndroid Build Coastguard Worker     ASSERT_EQ(Self, Self->getOperand(0));
250*9880d681SAndroid Build Coastguard Worker 
251*9880d681SAndroid Build Coastguard Worker     // Self-references should be distinct, so MDNode::get() should grab a
252*9880d681SAndroid Build Coastguard Worker     // uniqued node that references Self, not Self itself.
253*9880d681SAndroid Build Coastguard Worker     Args[0] = Self;
254*9880d681SAndroid Build Coastguard Worker     MDNode *Ref1 = MDNode::get(Context, Args);
255*9880d681SAndroid Build Coastguard Worker     MDNode *Ref2 = MDNode::get(Context, Args);
256*9880d681SAndroid Build Coastguard Worker     EXPECT_NE(Self, Ref1);
257*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Ref1, Ref2);
258*9880d681SAndroid Build Coastguard Worker   }
259*9880d681SAndroid Build Coastguard Worker }
260*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,Print)261*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, Print) {
262*9880d681SAndroid Build Coastguard Worker   Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 7);
263*9880d681SAndroid Build Coastguard Worker   MDString *S = MDString::get(Context, "foo");
264*9880d681SAndroid Build Coastguard Worker   MDNode *N0 = getNode();
265*9880d681SAndroid Build Coastguard Worker   MDNode *N1 = getNode(N0);
266*9880d681SAndroid Build Coastguard Worker   MDNode *N2 = getNode(N0, N1);
267*9880d681SAndroid Build Coastguard Worker 
268*9880d681SAndroid Build Coastguard Worker   Metadata *Args[] = {ConstantAsMetadata::get(C), S, nullptr, N0, N1, N2};
269*9880d681SAndroid Build Coastguard Worker   MDNode *N = MDNode::get(Context, Args);
270*9880d681SAndroid Build Coastguard Worker 
271*9880d681SAndroid Build Coastguard Worker   std::string Expected;
272*9880d681SAndroid Build Coastguard Worker   {
273*9880d681SAndroid Build Coastguard Worker     raw_string_ostream OS(Expected);
274*9880d681SAndroid Build Coastguard Worker     OS << "<" << (void *)N << "> = !{";
275*9880d681SAndroid Build Coastguard Worker     C->printAsOperand(OS);
276*9880d681SAndroid Build Coastguard Worker     OS << ", ";
277*9880d681SAndroid Build Coastguard Worker     S->printAsOperand(OS);
278*9880d681SAndroid Build Coastguard Worker     OS << ", null";
279*9880d681SAndroid Build Coastguard Worker     MDNode *Nodes[] = {N0, N1, N2};
280*9880d681SAndroid Build Coastguard Worker     for (auto *Node : Nodes)
281*9880d681SAndroid Build Coastguard Worker       OS << ", <" << (void *)Node << ">";
282*9880d681SAndroid Build Coastguard Worker     OS << "}";
283*9880d681SAndroid Build Coastguard Worker   }
284*9880d681SAndroid Build Coastguard Worker 
285*9880d681SAndroid Build Coastguard Worker   std::string Actual;
286*9880d681SAndroid Build Coastguard Worker   {
287*9880d681SAndroid Build Coastguard Worker     raw_string_ostream OS(Actual);
288*9880d681SAndroid Build Coastguard Worker     N->print(OS);
289*9880d681SAndroid Build Coastguard Worker   }
290*9880d681SAndroid Build Coastguard Worker 
291*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Expected, Actual);
292*9880d681SAndroid Build Coastguard Worker }
293*9880d681SAndroid Build Coastguard Worker 
294*9880d681SAndroid Build Coastguard Worker #define EXPECT_PRINTER_EQ(EXPECTED, PRINT)                                     \
295*9880d681SAndroid Build Coastguard Worker   do {                                                                         \
296*9880d681SAndroid Build Coastguard Worker     std::string Actual_;                                                       \
297*9880d681SAndroid Build Coastguard Worker     raw_string_ostream OS(Actual_);                                            \
298*9880d681SAndroid Build Coastguard Worker     PRINT;                                                                     \
299*9880d681SAndroid Build Coastguard Worker     OS.flush();                                                                \
300*9880d681SAndroid Build Coastguard Worker     std::string Expected_(EXPECTED);                                           \
301*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Expected_, Actual_);                                             \
302*9880d681SAndroid Build Coastguard Worker   } while (false)
303*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,PrintTemporary)304*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, PrintTemporary) {
305*9880d681SAndroid Build Coastguard Worker   MDNode *Arg = getNode();
306*9880d681SAndroid Build Coastguard Worker   TempMDNode Temp = MDNode::getTemporary(Context, Arg);
307*9880d681SAndroid Build Coastguard Worker   MDNode *N = getNode(Temp.get());
308*9880d681SAndroid Build Coastguard Worker   Module M("test", Context);
309*9880d681SAndroid Build Coastguard Worker   NamedMDNode *NMD = M.getOrInsertNamedMetadata("named");
310*9880d681SAndroid Build Coastguard Worker   NMD->addOperand(N);
311*9880d681SAndroid Build Coastguard Worker 
312*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!0 = !{!1}", N->print(OS, &M));
313*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!1 = <temporary!> !{!2}", Temp->print(OS, &M));
314*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!2 = !{}", Arg->print(OS, &M));
315*9880d681SAndroid Build Coastguard Worker 
316*9880d681SAndroid Build Coastguard Worker   // Cleanup.
317*9880d681SAndroid Build Coastguard Worker   Temp->replaceAllUsesWith(Arg);
318*9880d681SAndroid Build Coastguard Worker }
319*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,PrintFromModule)320*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, PrintFromModule) {
321*9880d681SAndroid Build Coastguard Worker   Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 7);
322*9880d681SAndroid Build Coastguard Worker   MDString *S = MDString::get(Context, "foo");
323*9880d681SAndroid Build Coastguard Worker   MDNode *N0 = getNode();
324*9880d681SAndroid Build Coastguard Worker   MDNode *N1 = getNode(N0);
325*9880d681SAndroid Build Coastguard Worker   MDNode *N2 = getNode(N0, N1);
326*9880d681SAndroid Build Coastguard Worker 
327*9880d681SAndroid Build Coastguard Worker   Metadata *Args[] = {ConstantAsMetadata::get(C), S, nullptr, N0, N1, N2};
328*9880d681SAndroid Build Coastguard Worker   MDNode *N = MDNode::get(Context, Args);
329*9880d681SAndroid Build Coastguard Worker   Module M("test", Context);
330*9880d681SAndroid Build Coastguard Worker   NamedMDNode *NMD = M.getOrInsertNamedMetadata("named");
331*9880d681SAndroid Build Coastguard Worker   NMD->addOperand(N);
332*9880d681SAndroid Build Coastguard Worker 
333*9880d681SAndroid Build Coastguard Worker   std::string Expected;
334*9880d681SAndroid Build Coastguard Worker   {
335*9880d681SAndroid Build Coastguard Worker     raw_string_ostream OS(Expected);
336*9880d681SAndroid Build Coastguard Worker     OS << "!0 = !{";
337*9880d681SAndroid Build Coastguard Worker     C->printAsOperand(OS);
338*9880d681SAndroid Build Coastguard Worker     OS << ", ";
339*9880d681SAndroid Build Coastguard Worker     S->printAsOperand(OS);
340*9880d681SAndroid Build Coastguard Worker     OS << ", null, !1, !2, !3}";
341*9880d681SAndroid Build Coastguard Worker   }
342*9880d681SAndroid Build Coastguard Worker 
343*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ(Expected, N->print(OS, &M));
344*9880d681SAndroid Build Coastguard Worker }
345*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,PrintFromFunction)346*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, PrintFromFunction) {
347*9880d681SAndroid Build Coastguard Worker   Module M("test", Context);
348*9880d681SAndroid Build Coastguard Worker   auto *FTy = FunctionType::get(Type::getVoidTy(Context), false);
349*9880d681SAndroid Build Coastguard Worker   auto *F0 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F0", &M);
350*9880d681SAndroid Build Coastguard Worker   auto *F1 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F1", &M);
351*9880d681SAndroid Build Coastguard Worker   auto *BB0 = BasicBlock::Create(Context, "entry", F0);
352*9880d681SAndroid Build Coastguard Worker   auto *BB1 = BasicBlock::Create(Context, "entry", F1);
353*9880d681SAndroid Build Coastguard Worker   auto *R0 = ReturnInst::Create(Context, BB0);
354*9880d681SAndroid Build Coastguard Worker   auto *R1 = ReturnInst::Create(Context, BB1);
355*9880d681SAndroid Build Coastguard Worker   auto *N0 = MDNode::getDistinct(Context, None);
356*9880d681SAndroid Build Coastguard Worker   auto *N1 = MDNode::getDistinct(Context, None);
357*9880d681SAndroid Build Coastguard Worker   R0->setMetadata("md", N0);
358*9880d681SAndroid Build Coastguard Worker   R1->setMetadata("md", N1);
359*9880d681SAndroid Build Coastguard Worker 
360*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!0 = distinct !{}", N0->print(OS, &M));
361*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!1 = distinct !{}", N1->print(OS, &M));
362*9880d681SAndroid Build Coastguard Worker 
363*9880d681SAndroid Build Coastguard Worker   ModuleSlotTracker MST(&M);
364*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!0 = distinct !{}", N0->print(OS, MST));
365*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!1 = distinct !{}", N1->print(OS, MST));
366*9880d681SAndroid Build Coastguard Worker }
367*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,PrintFromMetadataAsValue)368*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, PrintFromMetadataAsValue) {
369*9880d681SAndroid Build Coastguard Worker   Module M("test", Context);
370*9880d681SAndroid Build Coastguard Worker 
371*9880d681SAndroid Build Coastguard Worker   auto *Intrinsic =
372*9880d681SAndroid Build Coastguard Worker       Function::Create(FunctionType::get(Type::getVoidTy(Context),
373*9880d681SAndroid Build Coastguard Worker                                          Type::getMetadataTy(Context), false),
374*9880d681SAndroid Build Coastguard Worker                        GlobalValue::ExternalLinkage, "llvm.intrinsic", &M);
375*9880d681SAndroid Build Coastguard Worker 
376*9880d681SAndroid Build Coastguard Worker   auto *FTy = FunctionType::get(Type::getVoidTy(Context), false);
377*9880d681SAndroid Build Coastguard Worker   auto *F0 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F0", &M);
378*9880d681SAndroid Build Coastguard Worker   auto *F1 = Function::Create(FTy, GlobalValue::ExternalLinkage, "F1", &M);
379*9880d681SAndroid Build Coastguard Worker   auto *BB0 = BasicBlock::Create(Context, "entry", F0);
380*9880d681SAndroid Build Coastguard Worker   auto *BB1 = BasicBlock::Create(Context, "entry", F1);
381*9880d681SAndroid Build Coastguard Worker   auto *N0 = MDNode::getDistinct(Context, None);
382*9880d681SAndroid Build Coastguard Worker   auto *N1 = MDNode::getDistinct(Context, None);
383*9880d681SAndroid Build Coastguard Worker   auto *MAV0 = MetadataAsValue::get(Context, N0);
384*9880d681SAndroid Build Coastguard Worker   auto *MAV1 = MetadataAsValue::get(Context, N1);
385*9880d681SAndroid Build Coastguard Worker   CallInst::Create(Intrinsic, MAV0, "", BB0);
386*9880d681SAndroid Build Coastguard Worker   CallInst::Create(Intrinsic, MAV1, "", BB1);
387*9880d681SAndroid Build Coastguard Worker 
388*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!0 = distinct !{}", MAV0->print(OS));
389*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!1 = distinct !{}", MAV1->print(OS));
390*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!0", MAV0->printAsOperand(OS, false));
391*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!1", MAV1->printAsOperand(OS, false));
392*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("metadata !0", MAV0->printAsOperand(OS, true));
393*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("metadata !1", MAV1->printAsOperand(OS, true));
394*9880d681SAndroid Build Coastguard Worker 
395*9880d681SAndroid Build Coastguard Worker   ModuleSlotTracker MST(&M);
396*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!0 = distinct !{}", MAV0->print(OS, MST));
397*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!1 = distinct !{}", MAV1->print(OS, MST));
398*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!0", MAV0->printAsOperand(OS, false, MST));
399*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("!1", MAV1->printAsOperand(OS, false, MST));
400*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("metadata !0", MAV0->printAsOperand(OS, true, MST));
401*9880d681SAndroid Build Coastguard Worker   EXPECT_PRINTER_EQ("metadata !1", MAV1->printAsOperand(OS, true, MST));
402*9880d681SAndroid Build Coastguard Worker }
403*9880d681SAndroid Build Coastguard Worker #undef EXPECT_PRINTER_EQ
404*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,NullOperand)405*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, NullOperand) {
406*9880d681SAndroid Build Coastguard Worker   // metadata !{}
407*9880d681SAndroid Build Coastguard Worker   MDNode *Empty = MDNode::get(Context, None);
408*9880d681SAndroid Build Coastguard Worker 
409*9880d681SAndroid Build Coastguard Worker   // metadata !{metadata !{}}
410*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {Empty};
411*9880d681SAndroid Build Coastguard Worker   MDNode *N = MDNode::get(Context, Ops);
412*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(Empty, N->getOperand(0));
413*9880d681SAndroid Build Coastguard Worker 
414*9880d681SAndroid Build Coastguard Worker   // metadata !{metadata !{}} => metadata !{null}
415*9880d681SAndroid Build Coastguard Worker   N->replaceOperandWith(0, nullptr);
416*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, N->getOperand(0));
417*9880d681SAndroid Build Coastguard Worker 
418*9880d681SAndroid Build Coastguard Worker   // metadata !{null}
419*9880d681SAndroid Build Coastguard Worker   Ops[0] = nullptr;
420*9880d681SAndroid Build Coastguard Worker   MDNode *NullOp = MDNode::get(Context, Ops);
421*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, NullOp->getOperand(0));
422*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, NullOp);
423*9880d681SAndroid Build Coastguard Worker }
424*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,DistinctOnUniquingCollision)425*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, DistinctOnUniquingCollision) {
426*9880d681SAndroid Build Coastguard Worker   // !{}
427*9880d681SAndroid Build Coastguard Worker   MDNode *Empty = MDNode::get(Context, None);
428*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(Empty->isResolved());
429*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Empty->isDistinct());
430*9880d681SAndroid Build Coastguard Worker 
431*9880d681SAndroid Build Coastguard Worker   // !{!{}}
432*9880d681SAndroid Build Coastguard Worker   Metadata *Wrapped1Ops[] = {Empty};
433*9880d681SAndroid Build Coastguard Worker   MDNode *Wrapped1 = MDNode::get(Context, Wrapped1Ops);
434*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(Empty, Wrapped1->getOperand(0));
435*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(Wrapped1->isResolved());
436*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Wrapped1->isDistinct());
437*9880d681SAndroid Build Coastguard Worker 
438*9880d681SAndroid Build Coastguard Worker   // !{!{!{}}}
439*9880d681SAndroid Build Coastguard Worker   Metadata *Wrapped2Ops[] = {Wrapped1};
440*9880d681SAndroid Build Coastguard Worker   MDNode *Wrapped2 = MDNode::get(Context, Wrapped2Ops);
441*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(Wrapped1, Wrapped2->getOperand(0));
442*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(Wrapped2->isResolved());
443*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Wrapped2->isDistinct());
444*9880d681SAndroid Build Coastguard Worker 
445*9880d681SAndroid Build Coastguard Worker   // !{!{!{}}} => !{!{}}
446*9880d681SAndroid Build Coastguard Worker   Wrapped2->replaceOperandWith(0, Empty);
447*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(Empty, Wrapped2->getOperand(0));
448*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Wrapped2->isDistinct());
449*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Wrapped1->isDistinct());
450*9880d681SAndroid Build Coastguard Worker }
451*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,getDistinct)452*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, getDistinct) {
453*9880d681SAndroid Build Coastguard Worker   // !{}
454*9880d681SAndroid Build Coastguard Worker   MDNode *Empty = MDNode::get(Context, None);
455*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(Empty->isResolved());
456*9880d681SAndroid Build Coastguard Worker   ASSERT_FALSE(Empty->isDistinct());
457*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(Empty, MDNode::get(Context, None));
458*9880d681SAndroid Build Coastguard Worker 
459*9880d681SAndroid Build Coastguard Worker   // distinct !{}
460*9880d681SAndroid Build Coastguard Worker   MDNode *Distinct1 = MDNode::getDistinct(Context, None);
461*9880d681SAndroid Build Coastguard Worker   MDNode *Distinct2 = MDNode::getDistinct(Context, None);
462*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Distinct1->isResolved());
463*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Distinct2->isDistinct());
464*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(Empty, Distinct1);
465*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(Empty, Distinct2);
466*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(Distinct1, Distinct2);
467*9880d681SAndroid Build Coastguard Worker 
468*9880d681SAndroid Build Coastguard Worker   // !{}
469*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(Empty, MDNode::get(Context, None));
470*9880d681SAndroid Build Coastguard Worker }
471*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,isUniqued)472*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, isUniqued) {
473*9880d681SAndroid Build Coastguard Worker   MDNode *U = MDTuple::get(Context, None);
474*9880d681SAndroid Build Coastguard Worker   MDNode *D = MDTuple::getDistinct(Context, None);
475*9880d681SAndroid Build Coastguard Worker   auto T = MDTuple::getTemporary(Context, None);
476*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(U->isUniqued());
477*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(D->isUniqued());
478*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(T->isUniqued());
479*9880d681SAndroid Build Coastguard Worker }
480*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,isDistinct)481*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, isDistinct) {
482*9880d681SAndroid Build Coastguard Worker   MDNode *U = MDTuple::get(Context, None);
483*9880d681SAndroid Build Coastguard Worker   MDNode *D = MDTuple::getDistinct(Context, None);
484*9880d681SAndroid Build Coastguard Worker   auto T = MDTuple::getTemporary(Context, None);
485*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(U->isDistinct());
486*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(D->isDistinct());
487*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(T->isDistinct());
488*9880d681SAndroid Build Coastguard Worker }
489*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,isTemporary)490*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, isTemporary) {
491*9880d681SAndroid Build Coastguard Worker   MDNode *U = MDTuple::get(Context, None);
492*9880d681SAndroid Build Coastguard Worker   MDNode *D = MDTuple::getDistinct(Context, None);
493*9880d681SAndroid Build Coastguard Worker   auto T = MDTuple::getTemporary(Context, None);
494*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(U->isTemporary());
495*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(D->isTemporary());
496*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(T->isTemporary());
497*9880d681SAndroid Build Coastguard Worker }
498*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,getDistinctWithUnresolvedOperands)499*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, getDistinctWithUnresolvedOperands) {
500*9880d681SAndroid Build Coastguard Worker   // temporary !{}
501*9880d681SAndroid Build Coastguard Worker   auto Temp = MDTuple::getTemporary(Context, None);
502*9880d681SAndroid Build Coastguard Worker   ASSERT_FALSE(Temp->isResolved());
503*9880d681SAndroid Build Coastguard Worker 
504*9880d681SAndroid Build Coastguard Worker   // distinct !{temporary !{}}
505*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {Temp.get()};
506*9880d681SAndroid Build Coastguard Worker   MDNode *Distinct = MDNode::getDistinct(Context, Ops);
507*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Distinct->isResolved());
508*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Temp.get(), Distinct->getOperand(0));
509*9880d681SAndroid Build Coastguard Worker 
510*9880d681SAndroid Build Coastguard Worker   // temporary !{} => !{}
511*9880d681SAndroid Build Coastguard Worker   MDNode *Empty = MDNode::get(Context, None);
512*9880d681SAndroid Build Coastguard Worker   Temp->replaceAllUsesWith(Empty);
513*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Empty, Distinct->getOperand(0));
514*9880d681SAndroid Build Coastguard Worker }
515*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,handleChangedOperandRecursion)516*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, handleChangedOperandRecursion) {
517*9880d681SAndroid Build Coastguard Worker   // !0 = !{}
518*9880d681SAndroid Build Coastguard Worker   MDNode *N0 = MDNode::get(Context, None);
519*9880d681SAndroid Build Coastguard Worker 
520*9880d681SAndroid Build Coastguard Worker   // !1 = !{!3, null}
521*9880d681SAndroid Build Coastguard Worker   auto Temp3 = MDTuple::getTemporary(Context, None);
522*9880d681SAndroid Build Coastguard Worker   Metadata *Ops1[] = {Temp3.get(), nullptr};
523*9880d681SAndroid Build Coastguard Worker   MDNode *N1 = MDNode::get(Context, Ops1);
524*9880d681SAndroid Build Coastguard Worker 
525*9880d681SAndroid Build Coastguard Worker   // !2 = !{!3, !0}
526*9880d681SAndroid Build Coastguard Worker   Metadata *Ops2[] = {Temp3.get(), N0};
527*9880d681SAndroid Build Coastguard Worker   MDNode *N2 = MDNode::get(Context, Ops2);
528*9880d681SAndroid Build Coastguard Worker 
529*9880d681SAndroid Build Coastguard Worker   // !3 = !{!2}
530*9880d681SAndroid Build Coastguard Worker   Metadata *Ops3[] = {N2};
531*9880d681SAndroid Build Coastguard Worker   MDNode *N3 = MDNode::get(Context, Ops3);
532*9880d681SAndroid Build Coastguard Worker   Temp3->replaceAllUsesWith(N3);
533*9880d681SAndroid Build Coastguard Worker 
534*9880d681SAndroid Build Coastguard Worker   // !4 = !{!1}
535*9880d681SAndroid Build Coastguard Worker   Metadata *Ops4[] = {N1};
536*9880d681SAndroid Build Coastguard Worker   MDNode *N4 = MDNode::get(Context, Ops4);
537*9880d681SAndroid Build Coastguard Worker 
538*9880d681SAndroid Build Coastguard Worker   // Confirm that the cycle prevented RAUW from getting dropped.
539*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(N0->isResolved());
540*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(N1->isResolved());
541*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(N2->isResolved());
542*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(N3->isResolved());
543*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(N4->isResolved());
544*9880d681SAndroid Build Coastguard Worker 
545*9880d681SAndroid Build Coastguard Worker   // Create a couple of distinct nodes to observe what's going on.
546*9880d681SAndroid Build Coastguard Worker   //
547*9880d681SAndroid Build Coastguard Worker   // !5 = distinct !{!2}
548*9880d681SAndroid Build Coastguard Worker   // !6 = distinct !{!3}
549*9880d681SAndroid Build Coastguard Worker   Metadata *Ops5[] = {N2};
550*9880d681SAndroid Build Coastguard Worker   MDNode *N5 = MDNode::getDistinct(Context, Ops5);
551*9880d681SAndroid Build Coastguard Worker   Metadata *Ops6[] = {N3};
552*9880d681SAndroid Build Coastguard Worker   MDNode *N6 = MDNode::getDistinct(Context, Ops6);
553*9880d681SAndroid Build Coastguard Worker 
554*9880d681SAndroid Build Coastguard Worker   // Mutate !2 to look like !1, causing a uniquing collision (and an RAUW).
555*9880d681SAndroid Build Coastguard Worker   // This will ripple up, with !3 colliding with !4, and RAUWing.  Since !2
556*9880d681SAndroid Build Coastguard Worker   // references !3, this can cause a re-entry of handleChangedOperand() when !3
557*9880d681SAndroid Build Coastguard Worker   // is not ready for it.
558*9880d681SAndroid Build Coastguard Worker   //
559*9880d681SAndroid Build Coastguard Worker   // !2->replaceOperandWith(1, nullptr)
560*9880d681SAndroid Build Coastguard Worker   // !2: !{!3, !0} => !{!3, null}
561*9880d681SAndroid Build Coastguard Worker   // !2->replaceAllUsesWith(!1)
562*9880d681SAndroid Build Coastguard Worker   // !3: !{!2] => !{!1}
563*9880d681SAndroid Build Coastguard Worker   // !3->replaceAllUsesWith(!4)
564*9880d681SAndroid Build Coastguard Worker   N2->replaceOperandWith(1, nullptr);
565*9880d681SAndroid Build Coastguard Worker 
566*9880d681SAndroid Build Coastguard Worker   // If all has gone well, N2 and N3 will have been RAUW'ed and deleted from
567*9880d681SAndroid Build Coastguard Worker   // under us.  Just check that the other nodes are sane.
568*9880d681SAndroid Build Coastguard Worker   //
569*9880d681SAndroid Build Coastguard Worker   // !1 = !{!4, null}
570*9880d681SAndroid Build Coastguard Worker   // !4 = !{!1}
571*9880d681SAndroid Build Coastguard Worker   // !5 = distinct !{!1}
572*9880d681SAndroid Build Coastguard Worker   // !6 = distinct !{!4}
573*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N4, N1->getOperand(0));
574*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N1, N4->getOperand(0));
575*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N1, N5->getOperand(0));
576*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N4, N6->getOperand(0));
577*9880d681SAndroid Build Coastguard Worker }
578*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,replaceResolvedOperand)579*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, replaceResolvedOperand) {
580*9880d681SAndroid Build Coastguard Worker   // Check code for replacing one resolved operand with another.  If doing this
581*9880d681SAndroid Build Coastguard Worker   // directly (via replaceOperandWith()) becomes illegal, change the operand to
582*9880d681SAndroid Build Coastguard Worker   // a global value that gets RAUW'ed.
583*9880d681SAndroid Build Coastguard Worker   //
584*9880d681SAndroid Build Coastguard Worker   // Use a temporary node to keep N from being resolved.
585*9880d681SAndroid Build Coastguard Worker   auto Temp = MDTuple::getTemporary(Context, None);
586*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {nullptr, Temp.get()};
587*9880d681SAndroid Build Coastguard Worker 
588*9880d681SAndroid Build Coastguard Worker   MDNode *Empty = MDTuple::get(Context, ArrayRef<Metadata *>());
589*9880d681SAndroid Build Coastguard Worker   MDNode *N = MDTuple::get(Context, Ops);
590*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getOperand(0));
591*9880d681SAndroid Build Coastguard Worker   ASSERT_FALSE(N->isResolved());
592*9880d681SAndroid Build Coastguard Worker 
593*9880d681SAndroid Build Coastguard Worker   // Check code for replacing resolved nodes.
594*9880d681SAndroid Build Coastguard Worker   N->replaceOperandWith(0, Empty);
595*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Empty, N->getOperand(0));
596*9880d681SAndroid Build Coastguard Worker 
597*9880d681SAndroid Build Coastguard Worker   // Check code for adding another unresolved operand.
598*9880d681SAndroid Build Coastguard Worker   N->replaceOperandWith(0, Temp.get());
599*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Temp.get(), N->getOperand(0));
600*9880d681SAndroid Build Coastguard Worker 
601*9880d681SAndroid Build Coastguard Worker   // Remove the references to Temp; required for teardown.
602*9880d681SAndroid Build Coastguard Worker   Temp->replaceAllUsesWith(nullptr);
603*9880d681SAndroid Build Coastguard Worker }
604*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,replaceWithUniqued)605*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, replaceWithUniqued) {
606*9880d681SAndroid Build Coastguard Worker   auto *Empty = MDTuple::get(Context, None);
607*9880d681SAndroid Build Coastguard Worker   MDTuple *FirstUniqued;
608*9880d681SAndroid Build Coastguard Worker   {
609*9880d681SAndroid Build Coastguard Worker     Metadata *Ops[] = {Empty};
610*9880d681SAndroid Build Coastguard Worker     auto Temp = MDTuple::getTemporary(Context, Ops);
611*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Temp->isTemporary());
612*9880d681SAndroid Build Coastguard Worker 
613*9880d681SAndroid Build Coastguard Worker     // Don't expect a collision.
614*9880d681SAndroid Build Coastguard Worker     auto *Current = Temp.get();
615*9880d681SAndroid Build Coastguard Worker     FirstUniqued = MDNode::replaceWithUniqued(std::move(Temp));
616*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(FirstUniqued->isUniqued());
617*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(FirstUniqued->isResolved());
618*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Current, FirstUniqued);
619*9880d681SAndroid Build Coastguard Worker   }
620*9880d681SAndroid Build Coastguard Worker   {
621*9880d681SAndroid Build Coastguard Worker     Metadata *Ops[] = {Empty};
622*9880d681SAndroid Build Coastguard Worker     auto Temp = MDTuple::getTemporary(Context, Ops);
623*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Temp->isTemporary());
624*9880d681SAndroid Build Coastguard Worker 
625*9880d681SAndroid Build Coastguard Worker     // Should collide with Uniqued above this time.
626*9880d681SAndroid Build Coastguard Worker     auto *Uniqued = MDNode::replaceWithUniqued(std::move(Temp));
627*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Uniqued->isUniqued());
628*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Uniqued->isResolved());
629*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(FirstUniqued, Uniqued);
630*9880d681SAndroid Build Coastguard Worker   }
631*9880d681SAndroid Build Coastguard Worker   {
632*9880d681SAndroid Build Coastguard Worker     auto Unresolved = MDTuple::getTemporary(Context, None);
633*9880d681SAndroid Build Coastguard Worker     Metadata *Ops[] = {Unresolved.get()};
634*9880d681SAndroid Build Coastguard Worker     auto Temp = MDTuple::getTemporary(Context, Ops);
635*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Temp->isTemporary());
636*9880d681SAndroid Build Coastguard Worker 
637*9880d681SAndroid Build Coastguard Worker     // Shouldn't be resolved.
638*9880d681SAndroid Build Coastguard Worker     auto *Uniqued = MDNode::replaceWithUniqued(std::move(Temp));
639*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Uniqued->isUniqued());
640*9880d681SAndroid Build Coastguard Worker     EXPECT_FALSE(Uniqued->isResolved());
641*9880d681SAndroid Build Coastguard Worker 
642*9880d681SAndroid Build Coastguard Worker     // Should be a different node.
643*9880d681SAndroid Build Coastguard Worker     EXPECT_NE(FirstUniqued, Uniqued);
644*9880d681SAndroid Build Coastguard Worker 
645*9880d681SAndroid Build Coastguard Worker     // Should resolve when we update its node (note: be careful to avoid a
646*9880d681SAndroid Build Coastguard Worker     // collision with any other nodes above).
647*9880d681SAndroid Build Coastguard Worker     Uniqued->replaceOperandWith(0, nullptr);
648*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Uniqued->isResolved());
649*9880d681SAndroid Build Coastguard Worker   }
650*9880d681SAndroid Build Coastguard Worker }
651*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,replaceWithUniquedResolvingOperand)652*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, replaceWithUniquedResolvingOperand) {
653*9880d681SAndroid Build Coastguard Worker   // temp !{}
654*9880d681SAndroid Build Coastguard Worker   MDTuple *Op = MDTuple::getTemporary(Context, None).release();
655*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(Op->isResolved());
656*9880d681SAndroid Build Coastguard Worker 
657*9880d681SAndroid Build Coastguard Worker   // temp !{temp !{}}
658*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {Op};
659*9880d681SAndroid Build Coastguard Worker   MDTuple *N = MDTuple::getTemporary(Context, Ops).release();
660*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(N->isResolved());
661*9880d681SAndroid Build Coastguard Worker 
662*9880d681SAndroid Build Coastguard Worker   // temp !{temp !{}} => !{temp !{}}
663*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(N, MDNode::replaceWithUniqued(TempMDTuple(N)));
664*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(N->isResolved());
665*9880d681SAndroid Build Coastguard Worker 
666*9880d681SAndroid Build Coastguard Worker   // !{temp !{}} => !{!{}}
667*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(Op, MDNode::replaceWithUniqued(TempMDTuple(Op)));
668*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Op->isResolved());
669*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(N->isResolved());
670*9880d681SAndroid Build Coastguard Worker }
671*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,replaceWithUniquedChangingOperand)672*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, replaceWithUniquedChangingOperand) {
673*9880d681SAndroid Build Coastguard Worker   // i1* @GV
674*9880d681SAndroid Build Coastguard Worker   Type *Ty = Type::getInt1PtrTy(Context);
675*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<GlobalVariable> GV(
676*9880d681SAndroid Build Coastguard Worker       new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage));
677*9880d681SAndroid Build Coastguard Worker   ConstantAsMetadata *Op = ConstantAsMetadata::get(GV.get());
678*9880d681SAndroid Build Coastguard Worker 
679*9880d681SAndroid Build Coastguard Worker   // temp !{i1* @GV}
680*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {Op};
681*9880d681SAndroid Build Coastguard Worker   MDTuple *N = MDTuple::getTemporary(Context, Ops).release();
682*9880d681SAndroid Build Coastguard Worker 
683*9880d681SAndroid Build Coastguard Worker   // temp !{i1* @GV} => !{i1* @GV}
684*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(N, MDNode::replaceWithUniqued(TempMDTuple(N)));
685*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(N->isUniqued());
686*9880d681SAndroid Build Coastguard Worker 
687*9880d681SAndroid Build Coastguard Worker   // !{i1* @GV} => !{null}
688*9880d681SAndroid Build Coastguard Worker   GV.reset();
689*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(N->isUniqued());
690*9880d681SAndroid Build Coastguard Worker   Metadata *NullOps[] = {nullptr};
691*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(N, MDTuple::get(Context, NullOps));
692*9880d681SAndroid Build Coastguard Worker }
693*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,replaceWithDistinct)694*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, replaceWithDistinct) {
695*9880d681SAndroid Build Coastguard Worker   {
696*9880d681SAndroid Build Coastguard Worker     auto *Empty = MDTuple::get(Context, None);
697*9880d681SAndroid Build Coastguard Worker     Metadata *Ops[] = {Empty};
698*9880d681SAndroid Build Coastguard Worker     auto Temp = MDTuple::getTemporary(Context, Ops);
699*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Temp->isTemporary());
700*9880d681SAndroid Build Coastguard Worker 
701*9880d681SAndroid Build Coastguard Worker     // Don't expect a collision.
702*9880d681SAndroid Build Coastguard Worker     auto *Current = Temp.get();
703*9880d681SAndroid Build Coastguard Worker     auto *Distinct = MDNode::replaceWithDistinct(std::move(Temp));
704*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Distinct->isDistinct());
705*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Distinct->isResolved());
706*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Current, Distinct);
707*9880d681SAndroid Build Coastguard Worker   }
708*9880d681SAndroid Build Coastguard Worker   {
709*9880d681SAndroid Build Coastguard Worker     auto Unresolved = MDTuple::getTemporary(Context, None);
710*9880d681SAndroid Build Coastguard Worker     Metadata *Ops[] = {Unresolved.get()};
711*9880d681SAndroid Build Coastguard Worker     auto Temp = MDTuple::getTemporary(Context, Ops);
712*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Temp->isTemporary());
713*9880d681SAndroid Build Coastguard Worker 
714*9880d681SAndroid Build Coastguard Worker     // Don't expect a collision.
715*9880d681SAndroid Build Coastguard Worker     auto *Current = Temp.get();
716*9880d681SAndroid Build Coastguard Worker     auto *Distinct = MDNode::replaceWithDistinct(std::move(Temp));
717*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Distinct->isDistinct());
718*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(Distinct->isResolved());
719*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Current, Distinct);
720*9880d681SAndroid Build Coastguard Worker 
721*9880d681SAndroid Build Coastguard Worker     // Cleanup; required for teardown.
722*9880d681SAndroid Build Coastguard Worker     Unresolved->replaceAllUsesWith(nullptr);
723*9880d681SAndroid Build Coastguard Worker   }
724*9880d681SAndroid Build Coastguard Worker }
725*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,replaceWithPermanent)726*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, replaceWithPermanent) {
727*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {nullptr};
728*9880d681SAndroid Build Coastguard Worker   auto Temp = MDTuple::getTemporary(Context, Ops);
729*9880d681SAndroid Build Coastguard Worker   auto *T = Temp.get();
730*9880d681SAndroid Build Coastguard Worker 
731*9880d681SAndroid Build Coastguard Worker   // U is a normal, uniqued node that references T.
732*9880d681SAndroid Build Coastguard Worker   auto *U = MDTuple::get(Context, T);
733*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(U->isUniqued());
734*9880d681SAndroid Build Coastguard Worker 
735*9880d681SAndroid Build Coastguard Worker   // Make Temp self-referencing.
736*9880d681SAndroid Build Coastguard Worker   Temp->replaceOperandWith(0, T);
737*9880d681SAndroid Build Coastguard Worker 
738*9880d681SAndroid Build Coastguard Worker   // Try to uniquify Temp.  This should, despite the name in the API, give a
739*9880d681SAndroid Build Coastguard Worker   // 'distinct' node, since self-references aren't allowed to be uniqued.
740*9880d681SAndroid Build Coastguard Worker   //
741*9880d681SAndroid Build Coastguard Worker   // Since it's distinct, N should have the same address as when it was a
742*9880d681SAndroid Build Coastguard Worker   // temporary (i.e., be equal to T not U).
743*9880d681SAndroid Build Coastguard Worker   auto *N = MDNode::replaceWithPermanent(std::move(Temp));
744*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, T);
745*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(N->isDistinct());
746*9880d681SAndroid Build Coastguard Worker 
747*9880d681SAndroid Build Coastguard Worker   // U should be the canonical unique node with N as the argument.
748*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(U, MDTuple::get(Context, N));
749*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(U->isUniqued());
750*9880d681SAndroid Build Coastguard Worker 
751*9880d681SAndroid Build Coastguard Worker   // This temporary should collide with U when replaced, but it should still be
752*9880d681SAndroid Build Coastguard Worker   // uniqued.
753*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(U, MDNode::replaceWithPermanent(MDTuple::getTemporary(Context, N)));
754*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(U->isUniqued());
755*9880d681SAndroid Build Coastguard Worker 
756*9880d681SAndroid Build Coastguard Worker   // This temporary should become a new uniqued node.
757*9880d681SAndroid Build Coastguard Worker   auto Temp2 = MDTuple::getTemporary(Context, U);
758*9880d681SAndroid Build Coastguard Worker   auto *V = Temp2.get();
759*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(V, MDNode::replaceWithPermanent(std::move(Temp2)));
760*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(V->isUniqued());
761*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(U, V->getOperand(0));
762*9880d681SAndroid Build Coastguard Worker }
763*9880d681SAndroid Build Coastguard Worker 
TEST_F(MDNodeTest,deleteTemporaryWithTrackingRef)764*9880d681SAndroid Build Coastguard Worker TEST_F(MDNodeTest, deleteTemporaryWithTrackingRef) {
765*9880d681SAndroid Build Coastguard Worker   TrackingMDRef Ref;
766*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, Ref.get());
767*9880d681SAndroid Build Coastguard Worker   {
768*9880d681SAndroid Build Coastguard Worker     auto Temp = MDTuple::getTemporary(Context, None);
769*9880d681SAndroid Build Coastguard Worker     Ref.reset(Temp.get());
770*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Temp.get(), Ref.get());
771*9880d681SAndroid Build Coastguard Worker   }
772*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, Ref.get());
773*9880d681SAndroid Build Coastguard Worker }
774*9880d681SAndroid Build Coastguard Worker 
775*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DILocationTest;
776*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILocationTest,Overflow)777*9880d681SAndroid Build Coastguard Worker TEST_F(DILocationTest, Overflow) {
778*9880d681SAndroid Build Coastguard Worker   DISubprogram *N = getSubprogram();
779*9880d681SAndroid Build Coastguard Worker   {
780*9880d681SAndroid Build Coastguard Worker     DILocation *L = DILocation::get(Context, 2, 7, N);
781*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(2u, L->getLine());
782*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(7u, L->getColumn());
783*9880d681SAndroid Build Coastguard Worker   }
784*9880d681SAndroid Build Coastguard Worker   unsigned U16 = 1u << 16;
785*9880d681SAndroid Build Coastguard Worker   {
786*9880d681SAndroid Build Coastguard Worker     DILocation *L = DILocation::get(Context, UINT32_MAX, U16 - 1, N);
787*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(UINT32_MAX, L->getLine());
788*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(U16 - 1, L->getColumn());
789*9880d681SAndroid Build Coastguard Worker   }
790*9880d681SAndroid Build Coastguard Worker   {
791*9880d681SAndroid Build Coastguard Worker     DILocation *L = DILocation::get(Context, UINT32_MAX, U16, N);
792*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(UINT32_MAX, L->getLine());
793*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(0u, L->getColumn());
794*9880d681SAndroid Build Coastguard Worker   }
795*9880d681SAndroid Build Coastguard Worker   {
796*9880d681SAndroid Build Coastguard Worker     DILocation *L = DILocation::get(Context, UINT32_MAX, U16 + 1, N);
797*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(UINT32_MAX, L->getLine());
798*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(0u, L->getColumn());
799*9880d681SAndroid Build Coastguard Worker   }
800*9880d681SAndroid Build Coastguard Worker }
801*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILocationTest,getDistinct)802*9880d681SAndroid Build Coastguard Worker TEST_F(DILocationTest, getDistinct) {
803*9880d681SAndroid Build Coastguard Worker   MDNode *N = getSubprogram();
804*9880d681SAndroid Build Coastguard Worker   DILocation *L0 = DILocation::getDistinct(Context, 2, 7, N);
805*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(L0->isDistinct());
806*9880d681SAndroid Build Coastguard Worker   DILocation *L1 = DILocation::get(Context, 2, 7, N);
807*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(L1->isDistinct());
808*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L1, DILocation::get(Context, 2, 7, N));
809*9880d681SAndroid Build Coastguard Worker }
810*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILocationTest,getTemporary)811*9880d681SAndroid Build Coastguard Worker TEST_F(DILocationTest, getTemporary) {
812*9880d681SAndroid Build Coastguard Worker   MDNode *N = MDNode::get(Context, None);
813*9880d681SAndroid Build Coastguard Worker   auto L = DILocation::getTemporary(Context, 2, 7, N);
814*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(L->isTemporary());
815*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(L->isResolved());
816*9880d681SAndroid Build Coastguard Worker }
817*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILocationTest,cloneTemporary)818*9880d681SAndroid Build Coastguard Worker TEST_F(DILocationTest, cloneTemporary) {
819*9880d681SAndroid Build Coastguard Worker   MDNode *N = MDNode::get(Context, None);
820*9880d681SAndroid Build Coastguard Worker   auto L = DILocation::getTemporary(Context, 2, 7, N);
821*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(L->isTemporary());
822*9880d681SAndroid Build Coastguard Worker   auto L2 = L->clone();
823*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(L2->isTemporary());
824*9880d681SAndroid Build Coastguard Worker }
825*9880d681SAndroid Build Coastguard Worker 
826*9880d681SAndroid Build Coastguard Worker typedef MetadataTest GenericDINodeTest;
827*9880d681SAndroid Build Coastguard Worker 
TEST_F(GenericDINodeTest,get)828*9880d681SAndroid Build Coastguard Worker TEST_F(GenericDINodeTest, get) {
829*9880d681SAndroid Build Coastguard Worker   StringRef Header = "header";
830*9880d681SAndroid Build Coastguard Worker   auto *Empty = MDNode::get(Context, None);
831*9880d681SAndroid Build Coastguard Worker   Metadata *Ops1[] = {Empty};
832*9880d681SAndroid Build Coastguard Worker   auto *N = GenericDINode::get(Context, 15, Header, Ops1);
833*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(15u, N->getTag());
834*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, N->getNumOperands());
835*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Header, N->getHeader());
836*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(MDString::get(Context, Header), N->getOperand(0));
837*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(1u, N->getNumDwarfOperands());
838*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Empty, N->getDwarfOperand(0));
839*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Empty, N->getOperand(1));
840*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(N->isUniqued());
841*9880d681SAndroid Build Coastguard Worker 
842*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops1));
843*9880d681SAndroid Build Coastguard Worker 
844*9880d681SAndroid Build Coastguard Worker   N->replaceOperandWith(1, nullptr);
845*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(15u, N->getTag());
846*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Header, N->getHeader());
847*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getDwarfOperand(0));
848*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(N->isUniqued());
849*9880d681SAndroid Build Coastguard Worker 
850*9880d681SAndroid Build Coastguard Worker   Metadata *Ops2[] = {nullptr};
851*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops2));
852*9880d681SAndroid Build Coastguard Worker 
853*9880d681SAndroid Build Coastguard Worker   N->replaceDwarfOperandWith(0, Empty);
854*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(15u, N->getTag());
855*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Header, N->getHeader());
856*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Empty, N->getDwarfOperand(0));
857*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(N->isUniqued());
858*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, GenericDINode::get(Context, 15, Header, Ops1));
859*9880d681SAndroid Build Coastguard Worker 
860*9880d681SAndroid Build Coastguard Worker   TempGenericDINode Temp = N->clone();
861*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
862*9880d681SAndroid Build Coastguard Worker }
863*9880d681SAndroid Build Coastguard Worker 
TEST_F(GenericDINodeTest,getEmptyHeader)864*9880d681SAndroid Build Coastguard Worker TEST_F(GenericDINodeTest, getEmptyHeader) {
865*9880d681SAndroid Build Coastguard Worker   // Canonicalize !"" to null.
866*9880d681SAndroid Build Coastguard Worker   auto *N = GenericDINode::get(Context, 15, StringRef(), None);
867*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(StringRef(), N->getHeader());
868*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getOperand(0));
869*9880d681SAndroid Build Coastguard Worker }
870*9880d681SAndroid Build Coastguard Worker 
871*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DISubrangeTest;
872*9880d681SAndroid Build Coastguard Worker 
TEST_F(DISubrangeTest,get)873*9880d681SAndroid Build Coastguard Worker TEST_F(DISubrangeTest, get) {
874*9880d681SAndroid Build Coastguard Worker   auto *N = DISubrange::get(Context, 5, 7);
875*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_subrange_type, N->getTag());
876*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(5, N->getCount());
877*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(7, N->getLowerBound());
878*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DISubrange::get(Context, 5, 7));
879*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DISubrange::get(Context, 5, 0), DISubrange::get(Context, 5));
880*9880d681SAndroid Build Coastguard Worker 
881*9880d681SAndroid Build Coastguard Worker   TempDISubrange Temp = N->clone();
882*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
883*9880d681SAndroid Build Coastguard Worker }
884*9880d681SAndroid Build Coastguard Worker 
TEST_F(DISubrangeTest,getEmptyArray)885*9880d681SAndroid Build Coastguard Worker TEST_F(DISubrangeTest, getEmptyArray) {
886*9880d681SAndroid Build Coastguard Worker   auto *N = DISubrange::get(Context, -1, 0);
887*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_subrange_type, N->getTag());
888*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(-1, N->getCount());
889*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0, N->getLowerBound());
890*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DISubrange::get(Context, -1, 0));
891*9880d681SAndroid Build Coastguard Worker }
892*9880d681SAndroid Build Coastguard Worker 
893*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIEnumeratorTest;
894*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIEnumeratorTest,get)895*9880d681SAndroid Build Coastguard Worker TEST_F(DIEnumeratorTest, get) {
896*9880d681SAndroid Build Coastguard Worker   auto *N = DIEnumerator::get(Context, 7, "name");
897*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_enumerator, N->getTag());
898*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(7, N->getValue());
899*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("name", N->getName());
900*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIEnumerator::get(Context, 7, "name"));
901*9880d681SAndroid Build Coastguard Worker 
902*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIEnumerator::get(Context, 8, "name"));
903*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIEnumerator::get(Context, 7, "nam"));
904*9880d681SAndroid Build Coastguard Worker 
905*9880d681SAndroid Build Coastguard Worker   TempDIEnumerator Temp = N->clone();
906*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
907*9880d681SAndroid Build Coastguard Worker }
908*9880d681SAndroid Build Coastguard Worker 
909*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIBasicTypeTest;
910*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIBasicTypeTest,get)911*9880d681SAndroid Build Coastguard Worker TEST_F(DIBasicTypeTest, get) {
912*9880d681SAndroid Build Coastguard Worker   auto *N =
913*9880d681SAndroid Build Coastguard Worker       DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33, 26, 7);
914*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_base_type, N->getTag());
915*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("special", N->getName());
916*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(33u, N->getSizeInBits());
917*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(26u, N->getAlignInBits());
918*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(7u, N->getEncoding());
919*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, N->getLine());
920*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33,
921*9880d681SAndroid Build Coastguard Worker                                 26, 7));
922*9880d681SAndroid Build Coastguard Worker 
923*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type,
924*9880d681SAndroid Build Coastguard Worker                                 "special", 33, 26, 7));
925*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
926*9880d681SAndroid Build Coastguard Worker             DIBasicType::get(Context, dwarf::DW_TAG_base_type, "s", 33, 26, 7));
927*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 32,
928*9880d681SAndroid Build Coastguard Worker                                 26, 7));
929*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33,
930*9880d681SAndroid Build Coastguard Worker                                 25, 7));
931*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special", 33,
932*9880d681SAndroid Build Coastguard Worker                                 26, 6));
933*9880d681SAndroid Build Coastguard Worker 
934*9880d681SAndroid Build Coastguard Worker   TempDIBasicType Temp = N->clone();
935*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
936*9880d681SAndroid Build Coastguard Worker }
937*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIBasicTypeTest,getWithLargeValues)938*9880d681SAndroid Build Coastguard Worker TEST_F(DIBasicTypeTest, getWithLargeValues) {
939*9880d681SAndroid Build Coastguard Worker   auto *N = DIBasicType::get(Context, dwarf::DW_TAG_base_type, "special",
940*9880d681SAndroid Build Coastguard Worker                              UINT64_MAX, UINT64_MAX - 1, 7);
941*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(UINT64_MAX, N->getSizeInBits());
942*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(UINT64_MAX - 1, N->getAlignInBits());
943*9880d681SAndroid Build Coastguard Worker }
944*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIBasicTypeTest,getUnspecified)945*9880d681SAndroid Build Coastguard Worker TEST_F(DIBasicTypeTest, getUnspecified) {
946*9880d681SAndroid Build Coastguard Worker   auto *N =
947*9880d681SAndroid Build Coastguard Worker       DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, "unspecified");
948*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_unspecified_type, N->getTag());
949*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("unspecified", N->getName());
950*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, N->getSizeInBits());
951*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, N->getAlignInBits());
952*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, N->getEncoding());
953*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, N->getLine());
954*9880d681SAndroid Build Coastguard Worker }
955*9880d681SAndroid Build Coastguard Worker 
956*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DITypeTest;
957*9880d681SAndroid Build Coastguard Worker 
TEST_F(DITypeTest,clone)958*9880d681SAndroid Build Coastguard Worker TEST_F(DITypeTest, clone) {
959*9880d681SAndroid Build Coastguard Worker   // Check that DIType has a specialized clone that returns TempDIType.
960*9880d681SAndroid Build Coastguard Worker   DIType *N = DIBasicType::get(Context, dwarf::DW_TAG_base_type, "int", 32, 32,
961*9880d681SAndroid Build Coastguard Worker                                dwarf::DW_ATE_signed);
962*9880d681SAndroid Build Coastguard Worker 
963*9880d681SAndroid Build Coastguard Worker   TempDIType Temp = N->clone();
964*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
965*9880d681SAndroid Build Coastguard Worker }
966*9880d681SAndroid Build Coastguard Worker 
TEST_F(DITypeTest,setFlags)967*9880d681SAndroid Build Coastguard Worker TEST_F(DITypeTest, setFlags) {
968*9880d681SAndroid Build Coastguard Worker   // void (void)
969*9880d681SAndroid Build Coastguard Worker   Metadata *TypesOps[] = {nullptr};
970*9880d681SAndroid Build Coastguard Worker   Metadata *Types = MDTuple::get(Context, TypesOps);
971*9880d681SAndroid Build Coastguard Worker 
972*9880d681SAndroid Build Coastguard Worker   DIType *D = DISubroutineType::getDistinct(Context, 0u, 0, Types);
973*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, D->getFlags());
974*9880d681SAndroid Build Coastguard Worker   D->setFlags(DINode::FlagRValueReference);
975*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DINode::FlagRValueReference, D->getFlags());
976*9880d681SAndroid Build Coastguard Worker   D->setFlags(0u);
977*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, D->getFlags());
978*9880d681SAndroid Build Coastguard Worker 
979*9880d681SAndroid Build Coastguard Worker   TempDIType T = DISubroutineType::getTemporary(Context, 0u, 0, Types);
980*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, T->getFlags());
981*9880d681SAndroid Build Coastguard Worker   T->setFlags(DINode::FlagRValueReference);
982*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DINode::FlagRValueReference, T->getFlags());
983*9880d681SAndroid Build Coastguard Worker   T->setFlags(0u);
984*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, T->getFlags());
985*9880d681SAndroid Build Coastguard Worker }
986*9880d681SAndroid Build Coastguard Worker 
987*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIDerivedTypeTest;
988*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIDerivedTypeTest,get)989*9880d681SAndroid Build Coastguard Worker TEST_F(DIDerivedTypeTest, get) {
990*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
991*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getSubprogram();
992*9880d681SAndroid Build Coastguard Worker   DIType *BaseType = getBasicType("basic");
993*9880d681SAndroid Build Coastguard Worker   MDTuple *ExtraData = getTuple();
994*9880d681SAndroid Build Coastguard Worker 
995*9880d681SAndroid Build Coastguard Worker   auto *N = DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something",
996*9880d681SAndroid Build Coastguard Worker                                File, 1, Scope, BaseType, 2, 3, 4, 5, ExtraData);
997*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_pointer_type, N->getTag());
998*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("something", N->getName());
999*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1000*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(1u, N->getLine());
1001*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1002*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(BaseType, N->getBaseType());
1003*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, N->getSizeInBits());
1004*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(3u, N->getAlignInBits());
1005*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(4u, N->getOffsetInBits());
1006*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(5u, N->getFlags());
1007*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ExtraData, N->getExtraData());
1008*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1009*9880d681SAndroid Build Coastguard Worker                                   "something", File, 1, Scope, BaseType, 2, 3,
1010*9880d681SAndroid Build Coastguard Worker                                   4, 5, ExtraData));
1011*9880d681SAndroid Build Coastguard Worker 
1012*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_reference_type,
1013*9880d681SAndroid Build Coastguard Worker                                   "something", File, 1, Scope, BaseType, 2, 3,
1014*9880d681SAndroid Build Coastguard Worker                                   4, 5, ExtraData));
1015*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "else",
1016*9880d681SAndroid Build Coastguard Worker                                   File, 1, Scope, BaseType, 2, 3, 4, 5,
1017*9880d681SAndroid Build Coastguard Worker                                   ExtraData));
1018*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1019*9880d681SAndroid Build Coastguard Worker                                   "something", getFile(), 1, Scope, BaseType, 2,
1020*9880d681SAndroid Build Coastguard Worker                                   3, 4, 5, ExtraData));
1021*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1022*9880d681SAndroid Build Coastguard Worker                                   "something", File, 2, Scope, BaseType, 2, 3,
1023*9880d681SAndroid Build Coastguard Worker                                   4, 5, ExtraData));
1024*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1025*9880d681SAndroid Build Coastguard Worker                                   "something", File, 1, getSubprogram(),
1026*9880d681SAndroid Build Coastguard Worker                                   BaseType, 2, 3, 4, 5, ExtraData));
1027*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(
1028*9880d681SAndroid Build Coastguard Worker                    Context, dwarf::DW_TAG_pointer_type, "something", File, 1,
1029*9880d681SAndroid Build Coastguard Worker                    Scope, getBasicType("basic2"), 2, 3, 4, 5, ExtraData));
1030*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1031*9880d681SAndroid Build Coastguard Worker                                   "something", File, 1, Scope, BaseType, 3, 3,
1032*9880d681SAndroid Build Coastguard Worker                                   4, 5, ExtraData));
1033*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1034*9880d681SAndroid Build Coastguard Worker                                   "something", File, 1, Scope, BaseType, 2, 2,
1035*9880d681SAndroid Build Coastguard Worker                                   4, 5, ExtraData));
1036*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1037*9880d681SAndroid Build Coastguard Worker                                   "something", File, 1, Scope, BaseType, 2, 3,
1038*9880d681SAndroid Build Coastguard Worker                                   5, 5, ExtraData));
1039*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1040*9880d681SAndroid Build Coastguard Worker                                   "something", File, 1, Scope, BaseType, 2, 3,
1041*9880d681SAndroid Build Coastguard Worker                                   4, 4, ExtraData));
1042*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type,
1043*9880d681SAndroid Build Coastguard Worker                                   "something", File, 1, Scope, BaseType, 2, 3,
1044*9880d681SAndroid Build Coastguard Worker                                   4, 5, getTuple()));
1045*9880d681SAndroid Build Coastguard Worker 
1046*9880d681SAndroid Build Coastguard Worker   TempDIDerivedType Temp = N->clone();
1047*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1048*9880d681SAndroid Build Coastguard Worker }
1049*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIDerivedTypeTest,getWithLargeValues)1050*9880d681SAndroid Build Coastguard Worker TEST_F(DIDerivedTypeTest, getWithLargeValues) {
1051*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1052*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getSubprogram();
1053*9880d681SAndroid Build Coastguard Worker   DIType *BaseType = getBasicType("basic");
1054*9880d681SAndroid Build Coastguard Worker   MDTuple *ExtraData = getTuple();
1055*9880d681SAndroid Build Coastguard Worker 
1056*9880d681SAndroid Build Coastguard Worker   auto *N = DIDerivedType::get(Context, dwarf::DW_TAG_pointer_type, "something",
1057*9880d681SAndroid Build Coastguard Worker                                File, 1, Scope, BaseType, UINT64_MAX,
1058*9880d681SAndroid Build Coastguard Worker                                UINT64_MAX - 1, UINT64_MAX - 2, 5, ExtraData);
1059*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(UINT64_MAX, N->getSizeInBits());
1060*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(UINT64_MAX - 1, N->getAlignInBits());
1061*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(UINT64_MAX - 2, N->getOffsetInBits());
1062*9880d681SAndroid Build Coastguard Worker }
1063*9880d681SAndroid Build Coastguard Worker 
1064*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DICompositeTypeTest;
1065*9880d681SAndroid Build Coastguard Worker 
TEST_F(DICompositeTypeTest,get)1066*9880d681SAndroid Build Coastguard Worker TEST_F(DICompositeTypeTest, get) {
1067*9880d681SAndroid Build Coastguard Worker   unsigned Tag = dwarf::DW_TAG_structure_type;
1068*9880d681SAndroid Build Coastguard Worker   StringRef Name = "some name";
1069*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1070*9880d681SAndroid Build Coastguard Worker   unsigned Line = 1;
1071*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getSubprogram();
1072*9880d681SAndroid Build Coastguard Worker   DIType *BaseType = getCompositeType();
1073*9880d681SAndroid Build Coastguard Worker   uint64_t SizeInBits = 2;
1074*9880d681SAndroid Build Coastguard Worker   uint64_t AlignInBits = 3;
1075*9880d681SAndroid Build Coastguard Worker   uint64_t OffsetInBits = 4;
1076*9880d681SAndroid Build Coastguard Worker   unsigned Flags = 5;
1077*9880d681SAndroid Build Coastguard Worker   MDTuple *Elements = getTuple();
1078*9880d681SAndroid Build Coastguard Worker   unsigned RuntimeLang = 6;
1079*9880d681SAndroid Build Coastguard Worker   DIType *VTableHolder = getCompositeType();
1080*9880d681SAndroid Build Coastguard Worker   MDTuple *TemplateParams = getTuple();
1081*9880d681SAndroid Build Coastguard Worker   StringRef Identifier = "some id";
1082*9880d681SAndroid Build Coastguard Worker 
1083*9880d681SAndroid Build Coastguard Worker   auto *N = DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1084*9880d681SAndroid Build Coastguard Worker                                  BaseType, SizeInBits, AlignInBits,
1085*9880d681SAndroid Build Coastguard Worker                                  OffsetInBits, Flags, Elements, RuntimeLang,
1086*9880d681SAndroid Build Coastguard Worker                                  VTableHolder, TemplateParams, Identifier);
1087*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Tag, N->getTag());
1088*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1089*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1090*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Line, N->getLine());
1091*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1092*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(BaseType, N->getBaseType());
1093*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SizeInBits, N->getSizeInBits());
1094*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(AlignInBits, N->getAlignInBits());
1095*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(OffsetInBits, N->getOffsetInBits());
1096*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Flags, N->getFlags());
1097*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Elements, N->getElements().get());
1098*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(RuntimeLang, N->getRuntimeLang());
1099*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(VTableHolder, N->getVTableHolder());
1100*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(TemplateParams, N->getTemplateParams().get());
1101*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Identifier, N->getIdentifier());
1102*9880d681SAndroid Build Coastguard Worker 
1103*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1104*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1105*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1106*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, Identifier));
1107*9880d681SAndroid Build Coastguard Worker 
1108*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(Context, Tag + 1, Name, File, Line, Scope,
1109*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1110*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1111*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, Identifier));
1112*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(Context, Tag, "abc", File, Line, Scope,
1113*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1114*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1115*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, Identifier));
1116*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, getFile(), Line, Scope,
1117*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1118*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1119*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, Identifier));
1120*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line + 1, Scope,
1121*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1122*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1123*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, Identifier));
1124*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(
1125*9880d681SAndroid Build Coastguard Worker                    Context, Tag, Name, File, Line, getSubprogram(), BaseType,
1126*9880d681SAndroid Build Coastguard Worker                    SizeInBits, AlignInBits, OffsetInBits, Flags, Elements,
1127*9880d681SAndroid Build Coastguard Worker                    RuntimeLang, VTableHolder, TemplateParams, Identifier));
1128*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(
1129*9880d681SAndroid Build Coastguard Worker                    Context, Tag, Name, File, Line, Scope, getBasicType("other"),
1130*9880d681SAndroid Build Coastguard Worker                    SizeInBits, AlignInBits, OffsetInBits, Flags, Elements,
1131*9880d681SAndroid Build Coastguard Worker                    RuntimeLang, VTableHolder, TemplateParams, Identifier));
1132*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1133*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits + 1, AlignInBits,
1134*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1135*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, Identifier));
1136*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1137*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits + 1,
1138*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1139*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, Identifier));
1140*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(
1141*9880d681SAndroid Build Coastguard Worker                    Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1142*9880d681SAndroid Build Coastguard Worker                    AlignInBits, OffsetInBits + 1, Flags, Elements, RuntimeLang,
1143*9880d681SAndroid Build Coastguard Worker                    VTableHolder, TemplateParams, Identifier));
1144*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(
1145*9880d681SAndroid Build Coastguard Worker                    Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1146*9880d681SAndroid Build Coastguard Worker                    AlignInBits, OffsetInBits, Flags + 1, Elements, RuntimeLang,
1147*9880d681SAndroid Build Coastguard Worker                    VTableHolder, TemplateParams, Identifier));
1148*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(
1149*9880d681SAndroid Build Coastguard Worker                    Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1150*9880d681SAndroid Build Coastguard Worker                    AlignInBits, OffsetInBits, Flags, getTuple(), RuntimeLang,
1151*9880d681SAndroid Build Coastguard Worker                    VTableHolder, TemplateParams, Identifier));
1152*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(
1153*9880d681SAndroid Build Coastguard Worker                    Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1154*9880d681SAndroid Build Coastguard Worker                    AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang + 1,
1155*9880d681SAndroid Build Coastguard Worker                    VTableHolder, TemplateParams, Identifier));
1156*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(
1157*9880d681SAndroid Build Coastguard Worker                    Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1158*9880d681SAndroid Build Coastguard Worker                    AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
1159*9880d681SAndroid Build Coastguard Worker                    getCompositeType(), TemplateParams, Identifier));
1160*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1161*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1162*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1163*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, getTuple(), Identifier));
1164*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1165*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1166*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1167*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, "other"));
1168*9880d681SAndroid Build Coastguard Worker 
1169*9880d681SAndroid Build Coastguard Worker   // Be sure that missing identifiers get null pointers.
1170*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1171*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1172*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1173*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams, "")
1174*9880d681SAndroid Build Coastguard Worker                    ->getRawIdentifier());
1175*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1176*9880d681SAndroid Build Coastguard Worker                                     BaseType, SizeInBits, AlignInBits,
1177*9880d681SAndroid Build Coastguard Worker                                     OffsetInBits, Flags, Elements, RuntimeLang,
1178*9880d681SAndroid Build Coastguard Worker                                     VTableHolder, TemplateParams)
1179*9880d681SAndroid Build Coastguard Worker                    ->getRawIdentifier());
1180*9880d681SAndroid Build Coastguard Worker 
1181*9880d681SAndroid Build Coastguard Worker   TempDICompositeType Temp = N->clone();
1182*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1183*9880d681SAndroid Build Coastguard Worker }
1184*9880d681SAndroid Build Coastguard Worker 
TEST_F(DICompositeTypeTest,getWithLargeValues)1185*9880d681SAndroid Build Coastguard Worker TEST_F(DICompositeTypeTest, getWithLargeValues) {
1186*9880d681SAndroid Build Coastguard Worker   unsigned Tag = dwarf::DW_TAG_structure_type;
1187*9880d681SAndroid Build Coastguard Worker   StringRef Name = "some name";
1188*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1189*9880d681SAndroid Build Coastguard Worker   unsigned Line = 1;
1190*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getSubprogram();
1191*9880d681SAndroid Build Coastguard Worker   DIType *BaseType = getCompositeType();
1192*9880d681SAndroid Build Coastguard Worker   uint64_t SizeInBits = UINT64_MAX;
1193*9880d681SAndroid Build Coastguard Worker   uint64_t AlignInBits = UINT64_MAX - 1;
1194*9880d681SAndroid Build Coastguard Worker   uint64_t OffsetInBits = UINT64_MAX - 2;
1195*9880d681SAndroid Build Coastguard Worker   unsigned Flags = 5;
1196*9880d681SAndroid Build Coastguard Worker   MDTuple *Elements = getTuple();
1197*9880d681SAndroid Build Coastguard Worker   unsigned RuntimeLang = 6;
1198*9880d681SAndroid Build Coastguard Worker   DIType *VTableHolder = getCompositeType();
1199*9880d681SAndroid Build Coastguard Worker   MDTuple *TemplateParams = getTuple();
1200*9880d681SAndroid Build Coastguard Worker   StringRef Identifier = "some id";
1201*9880d681SAndroid Build Coastguard Worker 
1202*9880d681SAndroid Build Coastguard Worker   auto *N = DICompositeType::get(Context, Tag, Name, File, Line, Scope,
1203*9880d681SAndroid Build Coastguard Worker                                  BaseType, SizeInBits, AlignInBits,
1204*9880d681SAndroid Build Coastguard Worker                                  OffsetInBits, Flags, Elements, RuntimeLang,
1205*9880d681SAndroid Build Coastguard Worker                                  VTableHolder, TemplateParams, Identifier);
1206*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SizeInBits, N->getSizeInBits());
1207*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(AlignInBits, N->getAlignInBits());
1208*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(OffsetInBits, N->getOffsetInBits());
1209*9880d681SAndroid Build Coastguard Worker }
1210*9880d681SAndroid Build Coastguard Worker 
TEST_F(DICompositeTypeTest,replaceOperands)1211*9880d681SAndroid Build Coastguard Worker TEST_F(DICompositeTypeTest, replaceOperands) {
1212*9880d681SAndroid Build Coastguard Worker   unsigned Tag = dwarf::DW_TAG_structure_type;
1213*9880d681SAndroid Build Coastguard Worker   StringRef Name = "some name";
1214*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1215*9880d681SAndroid Build Coastguard Worker   unsigned Line = 1;
1216*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getSubprogram();
1217*9880d681SAndroid Build Coastguard Worker   DIType *BaseType = getCompositeType();
1218*9880d681SAndroid Build Coastguard Worker   uint64_t SizeInBits = 2;
1219*9880d681SAndroid Build Coastguard Worker   uint64_t AlignInBits = 3;
1220*9880d681SAndroid Build Coastguard Worker   uint64_t OffsetInBits = 4;
1221*9880d681SAndroid Build Coastguard Worker   unsigned Flags = 5;
1222*9880d681SAndroid Build Coastguard Worker   unsigned RuntimeLang = 6;
1223*9880d681SAndroid Build Coastguard Worker   StringRef Identifier = "some id";
1224*9880d681SAndroid Build Coastguard Worker 
1225*9880d681SAndroid Build Coastguard Worker   auto *N = DICompositeType::get(
1226*9880d681SAndroid Build Coastguard Worker       Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
1227*9880d681SAndroid Build Coastguard Worker       OffsetInBits, Flags, nullptr, RuntimeLang, nullptr, nullptr, Identifier);
1228*9880d681SAndroid Build Coastguard Worker 
1229*9880d681SAndroid Build Coastguard Worker   auto *Elements = MDTuple::getDistinct(Context, None);
1230*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getElements().get());
1231*9880d681SAndroid Build Coastguard Worker   N->replaceElements(Elements);
1232*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Elements, N->getElements().get());
1233*9880d681SAndroid Build Coastguard Worker   N->replaceElements(nullptr);
1234*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getElements().get());
1235*9880d681SAndroid Build Coastguard Worker 
1236*9880d681SAndroid Build Coastguard Worker   DIType *VTableHolder = getCompositeType();
1237*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getVTableHolder());
1238*9880d681SAndroid Build Coastguard Worker   N->replaceVTableHolder(VTableHolder);
1239*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(VTableHolder, N->getVTableHolder());
1240*9880d681SAndroid Build Coastguard Worker   N->replaceVTableHolder(nullptr);
1241*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getVTableHolder());
1242*9880d681SAndroid Build Coastguard Worker 
1243*9880d681SAndroid Build Coastguard Worker   auto *TemplateParams = MDTuple::getDistinct(Context, None);
1244*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getTemplateParams().get());
1245*9880d681SAndroid Build Coastguard Worker   N->replaceTemplateParams(TemplateParams);
1246*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(TemplateParams, N->getTemplateParams().get());
1247*9880d681SAndroid Build Coastguard Worker   N->replaceTemplateParams(nullptr);
1248*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getTemplateParams().get());
1249*9880d681SAndroid Build Coastguard Worker }
1250*9880d681SAndroid Build Coastguard Worker 
1251*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DISubroutineTypeTest;
1252*9880d681SAndroid Build Coastguard Worker 
TEST_F(DISubroutineTypeTest,get)1253*9880d681SAndroid Build Coastguard Worker TEST_F(DISubroutineTypeTest, get) {
1254*9880d681SAndroid Build Coastguard Worker   unsigned Flags = 1;
1255*9880d681SAndroid Build Coastguard Worker   MDTuple *TypeArray = getTuple();
1256*9880d681SAndroid Build Coastguard Worker 
1257*9880d681SAndroid Build Coastguard Worker   auto *N = DISubroutineType::get(Context, Flags, 0, TypeArray);
1258*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_subroutine_type, N->getTag());
1259*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Flags, N->getFlags());
1260*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(TypeArray, N->getTypeArray().get());
1261*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DISubroutineType::get(Context, Flags, 0, TypeArray));
1262*9880d681SAndroid Build Coastguard Worker 
1263*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubroutineType::get(Context, Flags + 1, 0, TypeArray));
1264*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubroutineType::get(Context, Flags, 0, getTuple()));
1265*9880d681SAndroid Build Coastguard Worker 
1266*9880d681SAndroid Build Coastguard Worker   // Test the hashing of calling conventions.
1267*9880d681SAndroid Build Coastguard Worker   auto *Fast = DISubroutineType::get(
1268*9880d681SAndroid Build Coastguard Worker       Context, Flags, dwarf::DW_CC_BORLAND_msfastcall, TypeArray);
1269*9880d681SAndroid Build Coastguard Worker   auto *Std = DISubroutineType::get(Context, Flags,
1270*9880d681SAndroid Build Coastguard Worker                                     dwarf::DW_CC_BORLAND_stdcall, TypeArray);
1271*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Fast,
1272*9880d681SAndroid Build Coastguard Worker             DISubroutineType::get(Context, Flags,
1273*9880d681SAndroid Build Coastguard Worker                                   dwarf::DW_CC_BORLAND_msfastcall, TypeArray));
1274*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Std, DISubroutineType::get(
1275*9880d681SAndroid Build Coastguard Worker                      Context, Flags, dwarf::DW_CC_BORLAND_stdcall, TypeArray));
1276*9880d681SAndroid Build Coastguard Worker 
1277*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, Fast);
1278*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, Std);
1279*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(Fast, Std);
1280*9880d681SAndroid Build Coastguard Worker 
1281*9880d681SAndroid Build Coastguard Worker   TempDISubroutineType Temp = N->clone();
1282*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1283*9880d681SAndroid Build Coastguard Worker 
1284*9880d681SAndroid Build Coastguard Worker   // Test always-empty operands.
1285*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getScope());
1286*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getFile());
1287*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ("", N->getName());
1288*9880d681SAndroid Build Coastguard Worker }
1289*9880d681SAndroid Build Coastguard Worker 
1290*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIFileTest;
1291*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIFileTest,get)1292*9880d681SAndroid Build Coastguard Worker TEST_F(DIFileTest, get) {
1293*9880d681SAndroid Build Coastguard Worker   StringRef Filename = "file";
1294*9880d681SAndroid Build Coastguard Worker   StringRef Directory = "dir";
1295*9880d681SAndroid Build Coastguard Worker   auto *N = DIFile::get(Context, Filename, Directory);
1296*9880d681SAndroid Build Coastguard Worker 
1297*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_file_type, N->getTag());
1298*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Filename, N->getFilename());
1299*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Directory, N->getDirectory());
1300*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIFile::get(Context, Filename, Directory));
1301*9880d681SAndroid Build Coastguard Worker 
1302*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIFile::get(Context, "other", Directory));
1303*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIFile::get(Context, Filename, "other"));
1304*9880d681SAndroid Build Coastguard Worker 
1305*9880d681SAndroid Build Coastguard Worker   TempDIFile Temp = N->clone();
1306*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1307*9880d681SAndroid Build Coastguard Worker }
1308*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIFileTest,ScopeGetFile)1309*9880d681SAndroid Build Coastguard Worker TEST_F(DIFileTest, ScopeGetFile) {
1310*9880d681SAndroid Build Coastguard Worker   // Ensure that DIScope::getFile() returns itself.
1311*9880d681SAndroid Build Coastguard Worker   DIScope *N = DIFile::get(Context, "file", "dir");
1312*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, N->getFile());
1313*9880d681SAndroid Build Coastguard Worker }
1314*9880d681SAndroid Build Coastguard Worker 
1315*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DICompileUnitTest;
1316*9880d681SAndroid Build Coastguard Worker 
TEST_F(DICompileUnitTest,get)1317*9880d681SAndroid Build Coastguard Worker TEST_F(DICompileUnitTest, get) {
1318*9880d681SAndroid Build Coastguard Worker   unsigned SourceLanguage = 1;
1319*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1320*9880d681SAndroid Build Coastguard Worker   StringRef Producer = "some producer";
1321*9880d681SAndroid Build Coastguard Worker   bool IsOptimized = false;
1322*9880d681SAndroid Build Coastguard Worker   StringRef Flags = "flag after flag";
1323*9880d681SAndroid Build Coastguard Worker   unsigned RuntimeVersion = 2;
1324*9880d681SAndroid Build Coastguard Worker   StringRef SplitDebugFilename = "another/file";
1325*9880d681SAndroid Build Coastguard Worker   auto EmissionKind = DICompileUnit::FullDebug;
1326*9880d681SAndroid Build Coastguard Worker   MDTuple *EnumTypes = getTuple();
1327*9880d681SAndroid Build Coastguard Worker   MDTuple *RetainedTypes = getTuple();
1328*9880d681SAndroid Build Coastguard Worker   MDTuple *GlobalVariables = getTuple();
1329*9880d681SAndroid Build Coastguard Worker   MDTuple *ImportedEntities = getTuple();
1330*9880d681SAndroid Build Coastguard Worker   uint64_t DWOId = 0x10000000c0ffee;
1331*9880d681SAndroid Build Coastguard Worker   MDTuple *Macros = getTuple();
1332*9880d681SAndroid Build Coastguard Worker   auto *N = DICompileUnit::getDistinct(
1333*9880d681SAndroid Build Coastguard Worker       Context, SourceLanguage, File, Producer, IsOptimized, Flags,
1334*9880d681SAndroid Build Coastguard Worker       RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
1335*9880d681SAndroid Build Coastguard Worker       RetainedTypes, GlobalVariables, ImportedEntities, Macros,
1336*9880d681SAndroid Build Coastguard Worker       DWOId);
1337*9880d681SAndroid Build Coastguard Worker 
1338*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag());
1339*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SourceLanguage, N->getSourceLanguage());
1340*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1341*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Producer, N->getProducer());
1342*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(IsOptimized, N->isOptimized());
1343*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Flags, N->getFlags());
1344*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(RuntimeVersion, N->getRuntimeVersion());
1345*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SplitDebugFilename, N->getSplitDebugFilename());
1346*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(EmissionKind, N->getEmissionKind());
1347*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(EnumTypes, N->getEnumTypes().get());
1348*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(RetainedTypes, N->getRetainedTypes().get());
1349*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(GlobalVariables, N->getGlobalVariables().get());
1350*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ImportedEntities, N->getImportedEntities().get());
1351*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Macros, N->getMacros().get());
1352*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DWOId, N->getDWOId());
1353*9880d681SAndroid Build Coastguard Worker 
1354*9880d681SAndroid Build Coastguard Worker   TempDICompileUnit Temp = N->clone();
1355*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_compile_unit, Temp->getTag());
1356*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SourceLanguage, Temp->getSourceLanguage());
1357*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, Temp->getFile());
1358*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Producer, Temp->getProducer());
1359*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(IsOptimized, Temp->isOptimized());
1360*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Flags, Temp->getFlags());
1361*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(RuntimeVersion, Temp->getRuntimeVersion());
1362*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SplitDebugFilename, Temp->getSplitDebugFilename());
1363*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(EmissionKind, Temp->getEmissionKind());
1364*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(EnumTypes, Temp->getEnumTypes().get());
1365*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(RetainedTypes, Temp->getRetainedTypes().get());
1366*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(GlobalVariables, Temp->getGlobalVariables().get());
1367*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ImportedEntities, Temp->getImportedEntities().get());
1368*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Macros, Temp->getMacros().get());
1369*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(DWOId, Temp->getDWOId());
1370*9880d681SAndroid Build Coastguard Worker 
1371*9880d681SAndroid Build Coastguard Worker   auto *TempAddress = Temp.get();
1372*9880d681SAndroid Build Coastguard Worker   auto *Clone = MDNode::replaceWithPermanent(std::move(Temp));
1373*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(Clone->isDistinct());
1374*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(TempAddress, Clone);
1375*9880d681SAndroid Build Coastguard Worker }
1376*9880d681SAndroid Build Coastguard Worker 
TEST_F(DICompileUnitTest,replaceArrays)1377*9880d681SAndroid Build Coastguard Worker TEST_F(DICompileUnitTest, replaceArrays) {
1378*9880d681SAndroid Build Coastguard Worker   unsigned SourceLanguage = 1;
1379*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1380*9880d681SAndroid Build Coastguard Worker   StringRef Producer = "some producer";
1381*9880d681SAndroid Build Coastguard Worker   bool IsOptimized = false;
1382*9880d681SAndroid Build Coastguard Worker   StringRef Flags = "flag after flag";
1383*9880d681SAndroid Build Coastguard Worker   unsigned RuntimeVersion = 2;
1384*9880d681SAndroid Build Coastguard Worker   StringRef SplitDebugFilename = "another/file";
1385*9880d681SAndroid Build Coastguard Worker   auto EmissionKind = DICompileUnit::FullDebug;
1386*9880d681SAndroid Build Coastguard Worker   MDTuple *EnumTypes = MDTuple::getDistinct(Context, None);
1387*9880d681SAndroid Build Coastguard Worker   MDTuple *RetainedTypes = MDTuple::getDistinct(Context, None);
1388*9880d681SAndroid Build Coastguard Worker   MDTuple *ImportedEntities = MDTuple::getDistinct(Context, None);
1389*9880d681SAndroid Build Coastguard Worker   uint64_t DWOId = 0xc0ffee;
1390*9880d681SAndroid Build Coastguard Worker   auto *N = DICompileUnit::getDistinct(
1391*9880d681SAndroid Build Coastguard Worker       Context, SourceLanguage, File, Producer, IsOptimized, Flags,
1392*9880d681SAndroid Build Coastguard Worker       RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
1393*9880d681SAndroid Build Coastguard Worker       RetainedTypes, nullptr, ImportedEntities, nullptr, DWOId);
1394*9880d681SAndroid Build Coastguard Worker 
1395*9880d681SAndroid Build Coastguard Worker   auto *GlobalVariables = MDTuple::getDistinct(Context, None);
1396*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getGlobalVariables().get());
1397*9880d681SAndroid Build Coastguard Worker   N->replaceGlobalVariables(GlobalVariables);
1398*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(GlobalVariables, N->getGlobalVariables().get());
1399*9880d681SAndroid Build Coastguard Worker   N->replaceGlobalVariables(nullptr);
1400*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getGlobalVariables().get());
1401*9880d681SAndroid Build Coastguard Worker 
1402*9880d681SAndroid Build Coastguard Worker   auto *Macros = MDTuple::getDistinct(Context, None);
1403*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getMacros().get());
1404*9880d681SAndroid Build Coastguard Worker   N->replaceMacros(Macros);
1405*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Macros, N->getMacros().get());
1406*9880d681SAndroid Build Coastguard Worker   N->replaceMacros(nullptr);
1407*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N->getMacros().get());
1408*9880d681SAndroid Build Coastguard Worker }
1409*9880d681SAndroid Build Coastguard Worker 
1410*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DISubprogramTest;
1411*9880d681SAndroid Build Coastguard Worker 
TEST_F(DISubprogramTest,get)1412*9880d681SAndroid Build Coastguard Worker TEST_F(DISubprogramTest, get) {
1413*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getCompositeType();
1414*9880d681SAndroid Build Coastguard Worker   StringRef Name = "name";
1415*9880d681SAndroid Build Coastguard Worker   StringRef LinkageName = "linkage";
1416*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1417*9880d681SAndroid Build Coastguard Worker   unsigned Line = 2;
1418*9880d681SAndroid Build Coastguard Worker   DISubroutineType *Type = getSubroutineType();
1419*9880d681SAndroid Build Coastguard Worker   bool IsLocalToUnit = false;
1420*9880d681SAndroid Build Coastguard Worker   bool IsDefinition = true;
1421*9880d681SAndroid Build Coastguard Worker   unsigned ScopeLine = 3;
1422*9880d681SAndroid Build Coastguard Worker   DIType *ContainingType = getCompositeType();
1423*9880d681SAndroid Build Coastguard Worker   unsigned Virtuality = 2;
1424*9880d681SAndroid Build Coastguard Worker   unsigned VirtualIndex = 5;
1425*9880d681SAndroid Build Coastguard Worker   int ThisAdjustment = -3;
1426*9880d681SAndroid Build Coastguard Worker   unsigned Flags = 6;
1427*9880d681SAndroid Build Coastguard Worker   unsigned NotFlags = (~Flags) & ((1 << 27) - 1);
1428*9880d681SAndroid Build Coastguard Worker   bool IsOptimized = false;
1429*9880d681SAndroid Build Coastguard Worker   MDTuple *TemplateParams = getTuple();
1430*9880d681SAndroid Build Coastguard Worker   DISubprogram *Declaration = getSubprogram();
1431*9880d681SAndroid Build Coastguard Worker   MDTuple *Variables = getTuple();
1432*9880d681SAndroid Build Coastguard Worker   DICompileUnit *Unit = getUnit();
1433*9880d681SAndroid Build Coastguard Worker 
1434*9880d681SAndroid Build Coastguard Worker   auto *N = DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1435*9880d681SAndroid Build Coastguard Worker                               Type, IsLocalToUnit, IsDefinition, ScopeLine,
1436*9880d681SAndroid Build Coastguard Worker                               ContainingType, Virtuality, VirtualIndex,
1437*9880d681SAndroid Build Coastguard Worker                               ThisAdjustment, Flags, IsOptimized, Unit,
1438*9880d681SAndroid Build Coastguard Worker                               TemplateParams, Declaration, Variables);
1439*9880d681SAndroid Build Coastguard Worker 
1440*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_subprogram, N->getTag());
1441*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1442*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1443*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(LinkageName, N->getLinkageName());
1444*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1445*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Line, N->getLine());
1446*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Type, N->getType());
1447*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(IsLocalToUnit, N->isLocalToUnit());
1448*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(IsDefinition, N->isDefinition());
1449*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ScopeLine, N->getScopeLine());
1450*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ContainingType, N->getContainingType());
1451*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Virtuality, N->getVirtuality());
1452*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(VirtualIndex, N->getVirtualIndex());
1453*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ThisAdjustment, N->getThisAdjustment());
1454*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Flags, N->getFlags());
1455*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(IsOptimized, N->isOptimized());
1456*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Unit, N->getUnit());
1457*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(TemplateParams, N->getTemplateParams().get());
1458*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Declaration, N->getDeclaration());
1459*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Variables, N->getVariables().get());
1460*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1461*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1462*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1463*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1464*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1465*9880d681SAndroid Build Coastguard Worker 
1466*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(
1467*9880d681SAndroid Build Coastguard Worker                    Context, getCompositeType(), Name, LinkageName, File, Line,
1468*9880d681SAndroid Build Coastguard Worker                    Type, IsLocalToUnit, IsDefinition, ScopeLine, ContainingType,
1469*9880d681SAndroid Build Coastguard Worker                    Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized,
1470*9880d681SAndroid Build Coastguard Worker                    Unit, TemplateParams, Declaration, Variables));
1471*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(
1472*9880d681SAndroid Build Coastguard Worker                    Context, Scope, "other", LinkageName, File, Line, Type,
1473*9880d681SAndroid Build Coastguard Worker                    IsLocalToUnit, IsDefinition, ScopeLine, ContainingType,
1474*9880d681SAndroid Build Coastguard Worker                    Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized,
1475*9880d681SAndroid Build Coastguard Worker                    Unit, TemplateParams, Declaration, Variables));
1476*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, "other", File, Line,
1477*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1478*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1479*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1480*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1481*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(
1482*9880d681SAndroid Build Coastguard Worker                    Context, Scope, Name, LinkageName, getFile(), Line, Type,
1483*9880d681SAndroid Build Coastguard Worker                    IsLocalToUnit, IsDefinition, ScopeLine, ContainingType,
1484*9880d681SAndroid Build Coastguard Worker                    Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized,
1485*9880d681SAndroid Build Coastguard Worker                    Unit, TemplateParams, Declaration, Variables));
1486*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(
1487*9880d681SAndroid Build Coastguard Worker                    Context, Scope, Name, LinkageName, File, Line + 1, Type,
1488*9880d681SAndroid Build Coastguard Worker                    IsLocalToUnit, IsDefinition, ScopeLine, ContainingType,
1489*9880d681SAndroid Build Coastguard Worker                    Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized,
1490*9880d681SAndroid Build Coastguard Worker                    Unit, TemplateParams, Declaration, Variables));
1491*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1492*9880d681SAndroid Build Coastguard Worker             DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1493*9880d681SAndroid Build Coastguard Worker                               getSubroutineType(), IsLocalToUnit, IsDefinition,
1494*9880d681SAndroid Build Coastguard Worker                               ScopeLine, ContainingType, Virtuality,
1495*9880d681SAndroid Build Coastguard Worker                               VirtualIndex, ThisAdjustment, Flags, IsOptimized,
1496*9880d681SAndroid Build Coastguard Worker                               Unit, TemplateParams, Declaration, Variables));
1497*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1498*9880d681SAndroid Build Coastguard Worker                                  Type, !IsLocalToUnit, IsDefinition, ScopeLine,
1499*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1500*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1501*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1502*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1503*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, !IsDefinition, ScopeLine,
1504*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1505*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1506*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1507*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(
1508*9880d681SAndroid Build Coastguard Worker                    Context, Scope, Name, LinkageName, File, Line, Type,
1509*9880d681SAndroid Build Coastguard Worker                    IsLocalToUnit, IsDefinition, ScopeLine + 1, ContainingType,
1510*9880d681SAndroid Build Coastguard Worker                    Virtuality, VirtualIndex, ThisAdjustment, Flags, IsOptimized,
1511*9880d681SAndroid Build Coastguard Worker                    Unit, TemplateParams, Declaration, Variables));
1512*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1513*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1514*9880d681SAndroid Build Coastguard Worker                                  getCompositeType(), Virtuality, VirtualIndex,
1515*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1516*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1517*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1518*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1519*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality + 1, VirtualIndex,
1520*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1521*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1522*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1523*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1524*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex + 1,
1525*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1526*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1527*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1528*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1529*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1530*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, NotFlags, IsOptimized, Unit,
1531*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1532*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1533*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1534*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1535*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, !IsOptimized, Unit,
1536*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1537*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1538*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1539*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1540*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, nullptr,
1541*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, Variables));
1542*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1543*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1544*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1545*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1546*9880d681SAndroid Build Coastguard Worker                                  getTuple(), Declaration, Variables));
1547*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1548*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1549*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1550*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1551*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, getSubprogram(), Variables));
1552*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DISubprogram::get(Context, Scope, Name, LinkageName, File, Line,
1553*9880d681SAndroid Build Coastguard Worker                                  Type, IsLocalToUnit, IsDefinition, ScopeLine,
1554*9880d681SAndroid Build Coastguard Worker                                  ContainingType, Virtuality, VirtualIndex,
1555*9880d681SAndroid Build Coastguard Worker                                  ThisAdjustment, Flags, IsOptimized, Unit,
1556*9880d681SAndroid Build Coastguard Worker                                  TemplateParams, Declaration, getTuple()));
1557*9880d681SAndroid Build Coastguard Worker 
1558*9880d681SAndroid Build Coastguard Worker   TempDISubprogram Temp = N->clone();
1559*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1560*9880d681SAndroid Build Coastguard Worker }
1561*9880d681SAndroid Build Coastguard Worker 
1562*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DILexicalBlockTest;
1563*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILexicalBlockTest,get)1564*9880d681SAndroid Build Coastguard Worker TEST_F(DILexicalBlockTest, get) {
1565*9880d681SAndroid Build Coastguard Worker   DILocalScope *Scope = getSubprogram();
1566*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1567*9880d681SAndroid Build Coastguard Worker   unsigned Line = 5;
1568*9880d681SAndroid Build Coastguard Worker   unsigned Column = 8;
1569*9880d681SAndroid Build Coastguard Worker 
1570*9880d681SAndroid Build Coastguard Worker   auto *N = DILexicalBlock::get(Context, Scope, File, Line, Column);
1571*9880d681SAndroid Build Coastguard Worker 
1572*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_lexical_block, N->getTag());
1573*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1574*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1575*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Line, N->getLine());
1576*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Column, N->getColumn());
1577*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DILexicalBlock::get(Context, Scope, File, Line, Column));
1578*9880d681SAndroid Build Coastguard Worker 
1579*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1580*9880d681SAndroid Build Coastguard Worker             DILexicalBlock::get(Context, getSubprogram(), File, Line, Column));
1581*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILexicalBlock::get(Context, Scope, getFile(), Line, Column));
1582*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILexicalBlock::get(Context, Scope, File, Line + 1, Column));
1583*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILexicalBlock::get(Context, Scope, File, Line, Column + 1));
1584*9880d681SAndroid Build Coastguard Worker 
1585*9880d681SAndroid Build Coastguard Worker   TempDILexicalBlock Temp = N->clone();
1586*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1587*9880d681SAndroid Build Coastguard Worker }
1588*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILexicalBlockTest,Overflow)1589*9880d681SAndroid Build Coastguard Worker TEST_F(DILexicalBlockTest, Overflow) {
1590*9880d681SAndroid Build Coastguard Worker   DISubprogram *SP = getSubprogram();
1591*9880d681SAndroid Build Coastguard Worker   DIFile *F = getFile();
1592*9880d681SAndroid Build Coastguard Worker   {
1593*9880d681SAndroid Build Coastguard Worker     auto *LB = DILexicalBlock::get(Context, SP, F, 2, 7);
1594*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(2u, LB->getLine());
1595*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(7u, LB->getColumn());
1596*9880d681SAndroid Build Coastguard Worker   }
1597*9880d681SAndroid Build Coastguard Worker   unsigned U16 = 1u << 16;
1598*9880d681SAndroid Build Coastguard Worker   {
1599*9880d681SAndroid Build Coastguard Worker     auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16 - 1);
1600*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(UINT32_MAX, LB->getLine());
1601*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(U16 - 1, LB->getColumn());
1602*9880d681SAndroid Build Coastguard Worker   }
1603*9880d681SAndroid Build Coastguard Worker   {
1604*9880d681SAndroid Build Coastguard Worker     auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16);
1605*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(UINT32_MAX, LB->getLine());
1606*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(0u, LB->getColumn());
1607*9880d681SAndroid Build Coastguard Worker   }
1608*9880d681SAndroid Build Coastguard Worker   {
1609*9880d681SAndroid Build Coastguard Worker     auto *LB = DILexicalBlock::get(Context, SP, F, UINT32_MAX, U16 + 1);
1610*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(UINT32_MAX, LB->getLine());
1611*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(0u, LB->getColumn());
1612*9880d681SAndroid Build Coastguard Worker   }
1613*9880d681SAndroid Build Coastguard Worker }
1614*9880d681SAndroid Build Coastguard Worker 
1615*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DILexicalBlockFileTest;
1616*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILexicalBlockFileTest,get)1617*9880d681SAndroid Build Coastguard Worker TEST_F(DILexicalBlockFileTest, get) {
1618*9880d681SAndroid Build Coastguard Worker   DILocalScope *Scope = getSubprogram();
1619*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1620*9880d681SAndroid Build Coastguard Worker   unsigned Discriminator = 5;
1621*9880d681SAndroid Build Coastguard Worker 
1622*9880d681SAndroid Build Coastguard Worker   auto *N = DILexicalBlockFile::get(Context, Scope, File, Discriminator);
1623*9880d681SAndroid Build Coastguard Worker 
1624*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_lexical_block, N->getTag());
1625*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1626*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1627*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Discriminator, N->getDiscriminator());
1628*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DILexicalBlockFile::get(Context, Scope, File, Discriminator));
1629*9880d681SAndroid Build Coastguard Worker 
1630*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILexicalBlockFile::get(Context, getSubprogram(), File,
1631*9880d681SAndroid Build Coastguard Worker                                        Discriminator));
1632*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1633*9880d681SAndroid Build Coastguard Worker             DILexicalBlockFile::get(Context, Scope, getFile(), Discriminator));
1634*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1635*9880d681SAndroid Build Coastguard Worker             DILexicalBlockFile::get(Context, Scope, File, Discriminator + 1));
1636*9880d681SAndroid Build Coastguard Worker 
1637*9880d681SAndroid Build Coastguard Worker   TempDILexicalBlockFile Temp = N->clone();
1638*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1639*9880d681SAndroid Build Coastguard Worker }
1640*9880d681SAndroid Build Coastguard Worker 
1641*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DINamespaceTest;
1642*9880d681SAndroid Build Coastguard Worker 
TEST_F(DINamespaceTest,get)1643*9880d681SAndroid Build Coastguard Worker TEST_F(DINamespaceTest, get) {
1644*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getFile();
1645*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1646*9880d681SAndroid Build Coastguard Worker   StringRef Name = "namespace";
1647*9880d681SAndroid Build Coastguard Worker   unsigned Line = 5;
1648*9880d681SAndroid Build Coastguard Worker 
1649*9880d681SAndroid Build Coastguard Worker   auto *N = DINamespace::get(Context, Scope, File, Name, Line);
1650*9880d681SAndroid Build Coastguard Worker 
1651*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_namespace, N->getTag());
1652*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1653*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1654*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1655*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Line, N->getLine());
1656*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DINamespace::get(Context, Scope, File, Name, Line));
1657*9880d681SAndroid Build Coastguard Worker 
1658*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DINamespace::get(Context, getFile(), File, Name, Line));
1659*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DINamespace::get(Context, Scope, getFile(), Name, Line));
1660*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DINamespace::get(Context, Scope, File, "other", Line));
1661*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DINamespace::get(Context, Scope, File, Name, Line + 1));
1662*9880d681SAndroid Build Coastguard Worker 
1663*9880d681SAndroid Build Coastguard Worker   TempDINamespace Temp = N->clone();
1664*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1665*9880d681SAndroid Build Coastguard Worker }
1666*9880d681SAndroid Build Coastguard Worker 
1667*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIModuleTest;
1668*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIModuleTest,get)1669*9880d681SAndroid Build Coastguard Worker TEST_F(DIModuleTest, get) {
1670*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getFile();
1671*9880d681SAndroid Build Coastguard Worker   StringRef Name = "module";
1672*9880d681SAndroid Build Coastguard Worker   StringRef ConfigMacro = "-DNDEBUG";
1673*9880d681SAndroid Build Coastguard Worker   StringRef Includes = "-I.";
1674*9880d681SAndroid Build Coastguard Worker   StringRef Sysroot = "/";
1675*9880d681SAndroid Build Coastguard Worker 
1676*9880d681SAndroid Build Coastguard Worker   auto *N = DIModule::get(Context, Scope, Name, ConfigMacro, Includes, Sysroot);
1677*9880d681SAndroid Build Coastguard Worker 
1678*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_module, N->getTag());
1679*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1680*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1681*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(ConfigMacro, N->getConfigurationMacros());
1682*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Includes, N->getIncludePath());
1683*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Sysroot, N->getISysRoot());
1684*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIModule::get(Context, Scope, Name,
1685*9880d681SAndroid Build Coastguard Worker                              ConfigMacro, Includes, Sysroot));
1686*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIModule::get(Context, getFile(), Name,
1687*9880d681SAndroid Build Coastguard Worker                              ConfigMacro, Includes, Sysroot));
1688*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIModule::get(Context, Scope, "other",
1689*9880d681SAndroid Build Coastguard Worker                              ConfigMacro, Includes, Sysroot));
1690*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIModule::get(Context, Scope, Name,
1691*9880d681SAndroid Build Coastguard Worker                              "other", Includes, Sysroot));
1692*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIModule::get(Context, Scope, Name,
1693*9880d681SAndroid Build Coastguard Worker                              ConfigMacro, "other", Sysroot));
1694*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIModule::get(Context, Scope, Name,
1695*9880d681SAndroid Build Coastguard Worker                              ConfigMacro, Includes, "other"));
1696*9880d681SAndroid Build Coastguard Worker 
1697*9880d681SAndroid Build Coastguard Worker   TempDIModule Temp = N->clone();
1698*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1699*9880d681SAndroid Build Coastguard Worker }
1700*9880d681SAndroid Build Coastguard Worker 
1701*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DITemplateTypeParameterTest;
1702*9880d681SAndroid Build Coastguard Worker 
TEST_F(DITemplateTypeParameterTest,get)1703*9880d681SAndroid Build Coastguard Worker TEST_F(DITemplateTypeParameterTest, get) {
1704*9880d681SAndroid Build Coastguard Worker   StringRef Name = "template";
1705*9880d681SAndroid Build Coastguard Worker   DIType *Type = getBasicType("basic");
1706*9880d681SAndroid Build Coastguard Worker 
1707*9880d681SAndroid Build Coastguard Worker   auto *N = DITemplateTypeParameter::get(Context, Name, Type);
1708*9880d681SAndroid Build Coastguard Worker 
1709*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_template_type_parameter, N->getTag());
1710*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1711*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Type, N->getType());
1712*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DITemplateTypeParameter::get(Context, Name, Type));
1713*9880d681SAndroid Build Coastguard Worker 
1714*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DITemplateTypeParameter::get(Context, "other", Type));
1715*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1716*9880d681SAndroid Build Coastguard Worker             DITemplateTypeParameter::get(Context, Name, getBasicType("other")));
1717*9880d681SAndroid Build Coastguard Worker 
1718*9880d681SAndroid Build Coastguard Worker   TempDITemplateTypeParameter Temp = N->clone();
1719*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1720*9880d681SAndroid Build Coastguard Worker }
1721*9880d681SAndroid Build Coastguard Worker 
1722*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DITemplateValueParameterTest;
1723*9880d681SAndroid Build Coastguard Worker 
TEST_F(DITemplateValueParameterTest,get)1724*9880d681SAndroid Build Coastguard Worker TEST_F(DITemplateValueParameterTest, get) {
1725*9880d681SAndroid Build Coastguard Worker   unsigned Tag = dwarf::DW_TAG_template_value_parameter;
1726*9880d681SAndroid Build Coastguard Worker   StringRef Name = "template";
1727*9880d681SAndroid Build Coastguard Worker   DIType *Type = getBasicType("basic");
1728*9880d681SAndroid Build Coastguard Worker   Metadata *Value = getConstantAsMetadata();
1729*9880d681SAndroid Build Coastguard Worker 
1730*9880d681SAndroid Build Coastguard Worker   auto *N = DITemplateValueParameter::get(Context, Tag, Name, Type, Value);
1731*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Tag, N->getTag());
1732*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1733*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Type, N->getType());
1734*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Value, N->getValue());
1735*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DITemplateValueParameter::get(Context, Tag, Name, Type, Value));
1736*9880d681SAndroid Build Coastguard Worker 
1737*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DITemplateValueParameter::get(
1738*9880d681SAndroid Build Coastguard Worker                    Context, dwarf::DW_TAG_GNU_template_template_param, Name,
1739*9880d681SAndroid Build Coastguard Worker                    Type, Value));
1740*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1741*9880d681SAndroid Build Coastguard Worker             DITemplateValueParameter::get(Context, Tag, "other", Type, Value));
1742*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DITemplateValueParameter::get(Context, Tag, Name,
1743*9880d681SAndroid Build Coastguard Worker                                              getBasicType("other"), Value));
1744*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DITemplateValueParameter::get(Context, Tag, Name, Type,
1745*9880d681SAndroid Build Coastguard Worker                                              getConstantAsMetadata()));
1746*9880d681SAndroid Build Coastguard Worker 
1747*9880d681SAndroid Build Coastguard Worker   TempDITemplateValueParameter Temp = N->clone();
1748*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1749*9880d681SAndroid Build Coastguard Worker }
1750*9880d681SAndroid Build Coastguard Worker 
1751*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIGlobalVariableTest;
1752*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIGlobalVariableTest,get)1753*9880d681SAndroid Build Coastguard Worker TEST_F(DIGlobalVariableTest, get) {
1754*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getSubprogram();
1755*9880d681SAndroid Build Coastguard Worker   StringRef Name = "name";
1756*9880d681SAndroid Build Coastguard Worker   StringRef LinkageName = "linkage";
1757*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1758*9880d681SAndroid Build Coastguard Worker   unsigned Line = 5;
1759*9880d681SAndroid Build Coastguard Worker   DIType *Type = getDerivedType();
1760*9880d681SAndroid Build Coastguard Worker   bool IsLocalToUnit = false;
1761*9880d681SAndroid Build Coastguard Worker   bool IsDefinition = true;
1762*9880d681SAndroid Build Coastguard Worker   Constant *Variable = getConstant();
1763*9880d681SAndroid Build Coastguard Worker   DIDerivedType *StaticDataMemberDeclaration =
1764*9880d681SAndroid Build Coastguard Worker       cast<DIDerivedType>(getDerivedType());
1765*9880d681SAndroid Build Coastguard Worker 
1766*9880d681SAndroid Build Coastguard Worker   auto *N = DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, Line,
1767*9880d681SAndroid Build Coastguard Worker                                   Type, IsLocalToUnit, IsDefinition, Variable,
1768*9880d681SAndroid Build Coastguard Worker                                   StaticDataMemberDeclaration);
1769*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_variable, N->getTag());
1770*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1771*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1772*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(LinkageName, N->getLinkageName());
1773*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1774*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Line, N->getLine());
1775*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Type, N->getType());
1776*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(IsLocalToUnit, N->isLocalToUnit());
1777*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(IsDefinition, N->isDefinition());
1778*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Variable, N->getVariable());
1779*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(StaticDataMemberDeclaration, N->getStaticDataMemberDeclaration());
1780*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
1781*9880d681SAndroid Build Coastguard Worker                                      Line, Type, IsLocalToUnit, IsDefinition,
1782*9880d681SAndroid Build Coastguard Worker                                      Variable, StaticDataMemberDeclaration));
1783*9880d681SAndroid Build Coastguard Worker 
1784*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1785*9880d681SAndroid Build Coastguard Worker             DIGlobalVariable::get(Context, getSubprogram(), Name, LinkageName,
1786*9880d681SAndroid Build Coastguard Worker                                   File, Line, Type, IsLocalToUnit, IsDefinition,
1787*9880d681SAndroid Build Coastguard Worker                                   Variable, StaticDataMemberDeclaration));
1788*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, "other", LinkageName, File,
1789*9880d681SAndroid Build Coastguard Worker                                      Line, Type, IsLocalToUnit, IsDefinition,
1790*9880d681SAndroid Build Coastguard Worker                                      Variable, StaticDataMemberDeclaration));
1791*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, "other", File, Line,
1792*9880d681SAndroid Build Coastguard Worker                                      Type, IsLocalToUnit, IsDefinition,
1793*9880d681SAndroid Build Coastguard Worker                                      Variable, StaticDataMemberDeclaration));
1794*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1795*9880d681SAndroid Build Coastguard Worker             DIGlobalVariable::get(Context, Scope, Name, LinkageName, getFile(),
1796*9880d681SAndroid Build Coastguard Worker                                   Line, Type, IsLocalToUnit, IsDefinition,
1797*9880d681SAndroid Build Coastguard Worker                                   Variable, StaticDataMemberDeclaration));
1798*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1799*9880d681SAndroid Build Coastguard Worker             DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
1800*9880d681SAndroid Build Coastguard Worker                                   Line + 1, Type, IsLocalToUnit, IsDefinition,
1801*9880d681SAndroid Build Coastguard Worker                                   Variable, StaticDataMemberDeclaration));
1802*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1803*9880d681SAndroid Build Coastguard Worker             DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, Line,
1804*9880d681SAndroid Build Coastguard Worker                                   getDerivedType(), IsLocalToUnit, IsDefinition,
1805*9880d681SAndroid Build Coastguard Worker                                   Variable, StaticDataMemberDeclaration));
1806*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
1807*9880d681SAndroid Build Coastguard Worker                                      Line, Type, !IsLocalToUnit, IsDefinition,
1808*9880d681SAndroid Build Coastguard Worker                                      Variable, StaticDataMemberDeclaration));
1809*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIGlobalVariable::get(Context, Scope, Name, LinkageName, File,
1810*9880d681SAndroid Build Coastguard Worker                                      Line, Type, IsLocalToUnit, !IsDefinition,
1811*9880d681SAndroid Build Coastguard Worker                                      Variable, StaticDataMemberDeclaration));
1812*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1813*9880d681SAndroid Build Coastguard Worker             DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, Line,
1814*9880d681SAndroid Build Coastguard Worker                                   Type, IsLocalToUnit, IsDefinition,
1815*9880d681SAndroid Build Coastguard Worker                                   getConstant(), StaticDataMemberDeclaration));
1816*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
1817*9880d681SAndroid Build Coastguard Worker             DIGlobalVariable::get(Context, Scope, Name, LinkageName, File, Line,
1818*9880d681SAndroid Build Coastguard Worker                                   Type, IsLocalToUnit, IsDefinition, Variable,
1819*9880d681SAndroid Build Coastguard Worker                                   cast<DIDerivedType>(getDerivedType())));
1820*9880d681SAndroid Build Coastguard Worker 
1821*9880d681SAndroid Build Coastguard Worker   TempDIGlobalVariable Temp = N->clone();
1822*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1823*9880d681SAndroid Build Coastguard Worker }
1824*9880d681SAndroid Build Coastguard Worker 
1825*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DILocalVariableTest;
1826*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILocalVariableTest,get)1827*9880d681SAndroid Build Coastguard Worker TEST_F(DILocalVariableTest, get) {
1828*9880d681SAndroid Build Coastguard Worker   DILocalScope *Scope = getSubprogram();
1829*9880d681SAndroid Build Coastguard Worker   StringRef Name = "name";
1830*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1831*9880d681SAndroid Build Coastguard Worker   unsigned Line = 5;
1832*9880d681SAndroid Build Coastguard Worker   DIType *Type = getDerivedType();
1833*9880d681SAndroid Build Coastguard Worker   unsigned Arg = 6;
1834*9880d681SAndroid Build Coastguard Worker   unsigned Flags = 7;
1835*9880d681SAndroid Build Coastguard Worker   unsigned NotFlags = (~Flags) & ((1 << 16) - 1);
1836*9880d681SAndroid Build Coastguard Worker 
1837*9880d681SAndroid Build Coastguard Worker   auto *N =
1838*9880d681SAndroid Build Coastguard Worker       DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg, Flags);
1839*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(N->isParameter());
1840*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
1841*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1842*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1843*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Line, N->getLine());
1844*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Type, N->getType());
1845*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Arg, N->getArg());
1846*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Flags, N->getFlags());
1847*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
1848*9880d681SAndroid Build Coastguard Worker                                     Flags));
1849*9880d681SAndroid Build Coastguard Worker 
1850*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(
1851*9880d681SAndroid Build Coastguard Worker       DILocalVariable::get(Context, Scope, Name, File, Line, Type, 0, Flags)
1852*9880d681SAndroid Build Coastguard Worker           ->isParameter());
1853*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILocalVariable::get(Context, getSubprogram(), Name, File, Line,
1854*9880d681SAndroid Build Coastguard Worker                                     Type, Arg, Flags));
1855*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILocalVariable::get(Context, Scope, "other", File, Line, Type,
1856*9880d681SAndroid Build Coastguard Worker                                     Arg, Flags));
1857*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, getFile(), Line, Type,
1858*9880d681SAndroid Build Coastguard Worker                                     Arg, Flags));
1859*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line + 1, Type,
1860*9880d681SAndroid Build Coastguard Worker                                     Arg, Flags));
1861*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line,
1862*9880d681SAndroid Build Coastguard Worker                                     getDerivedType(), Arg, Flags));
1863*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type,
1864*9880d681SAndroid Build Coastguard Worker                                     Arg + 1, Flags));
1865*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DILocalVariable::get(Context, Scope, Name, File, Line, Type, Arg,
1866*9880d681SAndroid Build Coastguard Worker                                     NotFlags));
1867*9880d681SAndroid Build Coastguard Worker 
1868*9880d681SAndroid Build Coastguard Worker   TempDILocalVariable Temp = N->clone();
1869*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1870*9880d681SAndroid Build Coastguard Worker }
1871*9880d681SAndroid Build Coastguard Worker 
TEST_F(DILocalVariableTest,getArg256)1872*9880d681SAndroid Build Coastguard Worker TEST_F(DILocalVariableTest, getArg256) {
1873*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(255u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
1874*9880d681SAndroid Build Coastguard Worker                                        0, nullptr, 255, 0)
1875*9880d681SAndroid Build Coastguard Worker                       ->getArg());
1876*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(256u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
1877*9880d681SAndroid Build Coastguard Worker                                        0, nullptr, 256, 0)
1878*9880d681SAndroid Build Coastguard Worker                       ->getArg());
1879*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(257u, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
1880*9880d681SAndroid Build Coastguard Worker                                        0, nullptr, 257, 0)
1881*9880d681SAndroid Build Coastguard Worker                       ->getArg());
1882*9880d681SAndroid Build Coastguard Worker   unsigned Max = UINT16_MAX;
1883*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Max, DILocalVariable::get(Context, getSubprogram(), "", getFile(),
1884*9880d681SAndroid Build Coastguard Worker                                       0, nullptr, Max, 0)
1885*9880d681SAndroid Build Coastguard Worker                      ->getArg());
1886*9880d681SAndroid Build Coastguard Worker }
1887*9880d681SAndroid Build Coastguard Worker 
1888*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIExpressionTest;
1889*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIExpressionTest,get)1890*9880d681SAndroid Build Coastguard Worker TEST_F(DIExpressionTest, get) {
1891*9880d681SAndroid Build Coastguard Worker   uint64_t Elements[] = {2, 6, 9, 78, 0};
1892*9880d681SAndroid Build Coastguard Worker   auto *N = DIExpression::get(Context, Elements);
1893*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(makeArrayRef(Elements), N->getElements());
1894*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIExpression::get(Context, Elements));
1895*9880d681SAndroid Build Coastguard Worker 
1896*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(5u, N->getNumElements());
1897*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, N->getElement(0));
1898*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(6u, N->getElement(1));
1899*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(9u, N->getElement(2));
1900*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(78u, N->getElement(3));
1901*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(0u, N->getElement(4));
1902*9880d681SAndroid Build Coastguard Worker 
1903*9880d681SAndroid Build Coastguard Worker   TempDIExpression Temp = N->clone();
1904*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1905*9880d681SAndroid Build Coastguard Worker }
1906*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIExpressionTest,isValid)1907*9880d681SAndroid Build Coastguard Worker TEST_F(DIExpressionTest, isValid) {
1908*9880d681SAndroid Build Coastguard Worker #define EXPECT_VALID(...)                                                      \
1909*9880d681SAndroid Build Coastguard Worker   do {                                                                         \
1910*9880d681SAndroid Build Coastguard Worker     uint64_t Elements[] = {__VA_ARGS__};                                       \
1911*9880d681SAndroid Build Coastguard Worker     EXPECT_TRUE(DIExpression::get(Context, Elements)->isValid());              \
1912*9880d681SAndroid Build Coastguard Worker   } while (false)
1913*9880d681SAndroid Build Coastguard Worker #define EXPECT_INVALID(...)                                                    \
1914*9880d681SAndroid Build Coastguard Worker   do {                                                                         \
1915*9880d681SAndroid Build Coastguard Worker     uint64_t Elements[] = {__VA_ARGS__};                                       \
1916*9880d681SAndroid Build Coastguard Worker     EXPECT_FALSE(DIExpression::get(Context, Elements)->isValid());             \
1917*9880d681SAndroid Build Coastguard Worker   } while (false)
1918*9880d681SAndroid Build Coastguard Worker 
1919*9880d681SAndroid Build Coastguard Worker   // Empty expression should be valid.
1920*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(DIExpression::get(Context, None));
1921*9880d681SAndroid Build Coastguard Worker 
1922*9880d681SAndroid Build Coastguard Worker   // Valid constructions.
1923*9880d681SAndroid Build Coastguard Worker   EXPECT_VALID(dwarf::DW_OP_plus, 6);
1924*9880d681SAndroid Build Coastguard Worker   EXPECT_VALID(dwarf::DW_OP_deref);
1925*9880d681SAndroid Build Coastguard Worker   EXPECT_VALID(dwarf::DW_OP_bit_piece, 3, 7);
1926*9880d681SAndroid Build Coastguard Worker   EXPECT_VALID(dwarf::DW_OP_plus, 6, dwarf::DW_OP_deref);
1927*9880d681SAndroid Build Coastguard Worker   EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_plus, 6);
1928*9880d681SAndroid Build Coastguard Worker   EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_bit_piece, 3, 7);
1929*9880d681SAndroid Build Coastguard Worker   EXPECT_VALID(dwarf::DW_OP_deref, dwarf::DW_OP_plus, 6, dwarf::DW_OP_bit_piece, 3, 7);
1930*9880d681SAndroid Build Coastguard Worker 
1931*9880d681SAndroid Build Coastguard Worker   // Invalid constructions.
1932*9880d681SAndroid Build Coastguard Worker   EXPECT_INVALID(~0u);
1933*9880d681SAndroid Build Coastguard Worker   EXPECT_INVALID(dwarf::DW_OP_plus);
1934*9880d681SAndroid Build Coastguard Worker   EXPECT_INVALID(dwarf::DW_OP_bit_piece);
1935*9880d681SAndroid Build Coastguard Worker   EXPECT_INVALID(dwarf::DW_OP_bit_piece, 3);
1936*9880d681SAndroid Build Coastguard Worker   EXPECT_INVALID(dwarf::DW_OP_bit_piece, 3, 7, dwarf::DW_OP_plus, 3);
1937*9880d681SAndroid Build Coastguard Worker   EXPECT_INVALID(dwarf::DW_OP_bit_piece, 3, 7, dwarf::DW_OP_deref);
1938*9880d681SAndroid Build Coastguard Worker 
1939*9880d681SAndroid Build Coastguard Worker #undef EXPECT_VALID
1940*9880d681SAndroid Build Coastguard Worker #undef EXPECT_INVALID
1941*9880d681SAndroid Build Coastguard Worker }
1942*9880d681SAndroid Build Coastguard Worker 
1943*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIObjCPropertyTest;
1944*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIObjCPropertyTest,get)1945*9880d681SAndroid Build Coastguard Worker TEST_F(DIObjCPropertyTest, get) {
1946*9880d681SAndroid Build Coastguard Worker   StringRef Name = "name";
1947*9880d681SAndroid Build Coastguard Worker   DIFile *File = getFile();
1948*9880d681SAndroid Build Coastguard Worker   unsigned Line = 5;
1949*9880d681SAndroid Build Coastguard Worker   StringRef GetterName = "getter";
1950*9880d681SAndroid Build Coastguard Worker   StringRef SetterName = "setter";
1951*9880d681SAndroid Build Coastguard Worker   unsigned Attributes = 7;
1952*9880d681SAndroid Build Coastguard Worker   DIType *Type = getBasicType("basic");
1953*9880d681SAndroid Build Coastguard Worker 
1954*9880d681SAndroid Build Coastguard Worker   auto *N = DIObjCProperty::get(Context, Name, File, Line, GetterName,
1955*9880d681SAndroid Build Coastguard Worker                                 SetterName, Attributes, Type);
1956*9880d681SAndroid Build Coastguard Worker 
1957*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(dwarf::DW_TAG_APPLE_property, N->getTag());
1958*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
1959*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(File, N->getFile());
1960*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Line, N->getLine());
1961*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(GetterName, N->getGetterName());
1962*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SetterName, N->getSetterName());
1963*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Attributes, N->getAttributes());
1964*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Type, N->getType());
1965*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIObjCProperty::get(Context, Name, File, Line, GetterName,
1966*9880d681SAndroid Build Coastguard Worker                                    SetterName, Attributes, Type));
1967*9880d681SAndroid Build Coastguard Worker 
1968*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIObjCProperty::get(Context, "other", File, Line, GetterName,
1969*9880d681SAndroid Build Coastguard Worker                                    SetterName, Attributes, Type));
1970*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIObjCProperty::get(Context, Name, getFile(), Line, GetterName,
1971*9880d681SAndroid Build Coastguard Worker                                    SetterName, Attributes, Type));
1972*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line + 1, GetterName,
1973*9880d681SAndroid Build Coastguard Worker                                    SetterName, Attributes, Type));
1974*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, "other",
1975*9880d681SAndroid Build Coastguard Worker                                    SetterName, Attributes, Type));
1976*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName,
1977*9880d681SAndroid Build Coastguard Worker                                    "other", Attributes, Type));
1978*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName,
1979*9880d681SAndroid Build Coastguard Worker                                    SetterName, Attributes + 1, Type));
1980*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIObjCProperty::get(Context, Name, File, Line, GetterName,
1981*9880d681SAndroid Build Coastguard Worker                                    SetterName, Attributes,
1982*9880d681SAndroid Build Coastguard Worker                                    getBasicType("other")));
1983*9880d681SAndroid Build Coastguard Worker 
1984*9880d681SAndroid Build Coastguard Worker   TempDIObjCProperty Temp = N->clone();
1985*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
1986*9880d681SAndroid Build Coastguard Worker }
1987*9880d681SAndroid Build Coastguard Worker 
1988*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DIImportedEntityTest;
1989*9880d681SAndroid Build Coastguard Worker 
TEST_F(DIImportedEntityTest,get)1990*9880d681SAndroid Build Coastguard Worker TEST_F(DIImportedEntityTest, get) {
1991*9880d681SAndroid Build Coastguard Worker   unsigned Tag = dwarf::DW_TAG_imported_module;
1992*9880d681SAndroid Build Coastguard Worker   DIScope *Scope = getSubprogram();
1993*9880d681SAndroid Build Coastguard Worker   DINode *Entity = getCompositeType();
1994*9880d681SAndroid Build Coastguard Worker   unsigned Line = 5;
1995*9880d681SAndroid Build Coastguard Worker   StringRef Name = "name";
1996*9880d681SAndroid Build Coastguard Worker 
1997*9880d681SAndroid Build Coastguard Worker   auto *N = DIImportedEntity::get(Context, Tag, Scope, Entity, Line, Name);
1998*9880d681SAndroid Build Coastguard Worker 
1999*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Tag, N->getTag());
2000*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Scope, N->getScope());
2001*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Entity, N->getEntity());
2002*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Line, N->getLine());
2003*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Name, N->getName());
2004*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, DIImportedEntity::get(Context, Tag, Scope, Entity, Line, Name));
2005*9880d681SAndroid Build Coastguard Worker 
2006*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
2007*9880d681SAndroid Build Coastguard Worker             DIImportedEntity::get(Context, dwarf::DW_TAG_imported_declaration,
2008*9880d681SAndroid Build Coastguard Worker                                   Scope, Entity, Line, Name));
2009*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIImportedEntity::get(Context, Tag, getSubprogram(), Entity,
2010*9880d681SAndroid Build Coastguard Worker                                      Line, Name));
2011*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N, DIImportedEntity::get(Context, Tag, Scope, getCompositeType(),
2012*9880d681SAndroid Build Coastguard Worker                                      Line, Name));
2013*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
2014*9880d681SAndroid Build Coastguard Worker             DIImportedEntity::get(Context, Tag, Scope, Entity, Line + 1, Name));
2015*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(N,
2016*9880d681SAndroid Build Coastguard Worker             DIImportedEntity::get(Context, Tag, Scope, Entity, Line, "other"));
2017*9880d681SAndroid Build Coastguard Worker 
2018*9880d681SAndroid Build Coastguard Worker   TempDIImportedEntity Temp = N->clone();
2019*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
2020*9880d681SAndroid Build Coastguard Worker }
2021*9880d681SAndroid Build Coastguard Worker 
2022*9880d681SAndroid Build Coastguard Worker typedef MetadataTest MetadataAsValueTest;
2023*9880d681SAndroid Build Coastguard Worker 
TEST_F(MetadataAsValueTest,MDNode)2024*9880d681SAndroid Build Coastguard Worker TEST_F(MetadataAsValueTest, MDNode) {
2025*9880d681SAndroid Build Coastguard Worker   MDNode *N = MDNode::get(Context, None);
2026*9880d681SAndroid Build Coastguard Worker   auto *V = MetadataAsValue::get(Context, N);
2027*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(V->getType()->isMetadataTy());
2028*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, V->getMetadata());
2029*9880d681SAndroid Build Coastguard Worker 
2030*9880d681SAndroid Build Coastguard Worker   auto *V2 = MetadataAsValue::get(Context, N);
2031*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(V, V2);
2032*9880d681SAndroid Build Coastguard Worker }
2033*9880d681SAndroid Build Coastguard Worker 
TEST_F(MetadataAsValueTest,MDNodeMDNode)2034*9880d681SAndroid Build Coastguard Worker TEST_F(MetadataAsValueTest, MDNodeMDNode) {
2035*9880d681SAndroid Build Coastguard Worker   MDNode *N = MDNode::get(Context, None);
2036*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {N};
2037*9880d681SAndroid Build Coastguard Worker   MDNode *N2 = MDNode::get(Context, Ops);
2038*9880d681SAndroid Build Coastguard Worker   auto *V = MetadataAsValue::get(Context, N2);
2039*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(V->getType()->isMetadataTy());
2040*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N2, V->getMetadata());
2041*9880d681SAndroid Build Coastguard Worker 
2042*9880d681SAndroid Build Coastguard Worker   auto *V2 = MetadataAsValue::get(Context, N2);
2043*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(V, V2);
2044*9880d681SAndroid Build Coastguard Worker 
2045*9880d681SAndroid Build Coastguard Worker   auto *V3 = MetadataAsValue::get(Context, N);
2046*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(V3->getType()->isMetadataTy());
2047*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(V, V3);
2048*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N, V3->getMetadata());
2049*9880d681SAndroid Build Coastguard Worker }
2050*9880d681SAndroid Build Coastguard Worker 
TEST_F(MetadataAsValueTest,MDNodeConstant)2051*9880d681SAndroid Build Coastguard Worker TEST_F(MetadataAsValueTest, MDNodeConstant) {
2052*9880d681SAndroid Build Coastguard Worker   auto *C = ConstantInt::getTrue(Context);
2053*9880d681SAndroid Build Coastguard Worker   auto *MD = ConstantAsMetadata::get(C);
2054*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {MD};
2055*9880d681SAndroid Build Coastguard Worker   auto *N = MDNode::get(Context, Ops);
2056*9880d681SAndroid Build Coastguard Worker 
2057*9880d681SAndroid Build Coastguard Worker   auto *V = MetadataAsValue::get(Context, MD);
2058*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(V->getType()->isMetadataTy());
2059*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(MD, V->getMetadata());
2060*9880d681SAndroid Build Coastguard Worker 
2061*9880d681SAndroid Build Coastguard Worker   auto *V2 = MetadataAsValue::get(Context, N);
2062*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(MD, V2->getMetadata());
2063*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(V, V2);
2064*9880d681SAndroid Build Coastguard Worker }
2065*9880d681SAndroid Build Coastguard Worker 
2066*9880d681SAndroid Build Coastguard Worker typedef MetadataTest ValueAsMetadataTest;
2067*9880d681SAndroid Build Coastguard Worker 
TEST_F(ValueAsMetadataTest,UpdatesOnRAUW)2068*9880d681SAndroid Build Coastguard Worker TEST_F(ValueAsMetadataTest, UpdatesOnRAUW) {
2069*9880d681SAndroid Build Coastguard Worker   Type *Ty = Type::getInt1PtrTy(Context);
2070*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<GlobalVariable> GV0(
2071*9880d681SAndroid Build Coastguard Worker       new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage));
2072*9880d681SAndroid Build Coastguard Worker   auto *MD = ValueAsMetadata::get(GV0.get());
2073*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(MD->getValue() == GV0.get());
2074*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(GV0->use_empty());
2075*9880d681SAndroid Build Coastguard Worker 
2076*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<GlobalVariable> GV1(
2077*9880d681SAndroid Build Coastguard Worker       new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage));
2078*9880d681SAndroid Build Coastguard Worker   GV0->replaceAllUsesWith(GV1.get());
2079*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(MD->getValue() == GV1.get());
2080*9880d681SAndroid Build Coastguard Worker }
2081*9880d681SAndroid Build Coastguard Worker 
TEST_F(ValueAsMetadataTest,TempTempReplacement)2082*9880d681SAndroid Build Coastguard Worker TEST_F(ValueAsMetadataTest, TempTempReplacement) {
2083*9880d681SAndroid Build Coastguard Worker   // Create a constant.
2084*9880d681SAndroid Build Coastguard Worker   ConstantAsMetadata *CI =
2085*9880d681SAndroid Build Coastguard Worker       ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0)));
2086*9880d681SAndroid Build Coastguard Worker 
2087*9880d681SAndroid Build Coastguard Worker   auto Temp1 = MDTuple::getTemporary(Context, None);
2088*9880d681SAndroid Build Coastguard Worker   auto Temp2 = MDTuple::getTemporary(Context, {CI});
2089*9880d681SAndroid Build Coastguard Worker   auto *N = MDTuple::get(Context, {Temp1.get()});
2090*9880d681SAndroid Build Coastguard Worker 
2091*9880d681SAndroid Build Coastguard Worker   // Test replacing a temporary node with another temporary node.
2092*9880d681SAndroid Build Coastguard Worker   Temp1->replaceAllUsesWith(Temp2.get());
2093*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N->getOperand(0), Temp2.get());
2094*9880d681SAndroid Build Coastguard Worker 
2095*9880d681SAndroid Build Coastguard Worker   // Clean up Temp2 for teardown.
2096*9880d681SAndroid Build Coastguard Worker   Temp2->replaceAllUsesWith(nullptr);
2097*9880d681SAndroid Build Coastguard Worker }
2098*9880d681SAndroid Build Coastguard Worker 
TEST_F(ValueAsMetadataTest,CollidingDoubleUpdates)2099*9880d681SAndroid Build Coastguard Worker TEST_F(ValueAsMetadataTest, CollidingDoubleUpdates) {
2100*9880d681SAndroid Build Coastguard Worker   // Create a constant.
2101*9880d681SAndroid Build Coastguard Worker   ConstantAsMetadata *CI =
2102*9880d681SAndroid Build Coastguard Worker       ConstantAsMetadata::get(ConstantInt::get(Context, APInt(8, 0)));
2103*9880d681SAndroid Build Coastguard Worker 
2104*9880d681SAndroid Build Coastguard Worker   // Create a temporary to prevent nodes from resolving.
2105*9880d681SAndroid Build Coastguard Worker   auto Temp = MDTuple::getTemporary(Context, None);
2106*9880d681SAndroid Build Coastguard Worker 
2107*9880d681SAndroid Build Coastguard Worker   // When the first operand of N1 gets reset to nullptr, it'll collide with N2.
2108*9880d681SAndroid Build Coastguard Worker   Metadata *Ops1[] = {CI, CI, Temp.get()};
2109*9880d681SAndroid Build Coastguard Worker   Metadata *Ops2[] = {nullptr, CI, Temp.get()};
2110*9880d681SAndroid Build Coastguard Worker 
2111*9880d681SAndroid Build Coastguard Worker   auto *N1 = MDTuple::get(Context, Ops1);
2112*9880d681SAndroid Build Coastguard Worker   auto *N2 = MDTuple::get(Context, Ops2);
2113*9880d681SAndroid Build Coastguard Worker   ASSERT_NE(N1, N2);
2114*9880d681SAndroid Build Coastguard Worker 
2115*9880d681SAndroid Build Coastguard Worker   // Tell metadata that the constant is getting deleted.
2116*9880d681SAndroid Build Coastguard Worker   //
2117*9880d681SAndroid Build Coastguard Worker   // After this, N1 will be invalid, so don't touch it.
2118*9880d681SAndroid Build Coastguard Worker   ValueAsMetadata::handleDeletion(CI->getValue());
2119*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N2->getOperand(0));
2120*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, N2->getOperand(1));
2121*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Temp.get(), N2->getOperand(2));
2122*9880d681SAndroid Build Coastguard Worker 
2123*9880d681SAndroid Build Coastguard Worker   // Clean up Temp for teardown.
2124*9880d681SAndroid Build Coastguard Worker   Temp->replaceAllUsesWith(nullptr);
2125*9880d681SAndroid Build Coastguard Worker }
2126*9880d681SAndroid Build Coastguard Worker 
2127*9880d681SAndroid Build Coastguard Worker typedef MetadataTest TrackingMDRefTest;
2128*9880d681SAndroid Build Coastguard Worker 
TEST_F(TrackingMDRefTest,UpdatesOnRAUW)2129*9880d681SAndroid Build Coastguard Worker TEST_F(TrackingMDRefTest, UpdatesOnRAUW) {
2130*9880d681SAndroid Build Coastguard Worker   Type *Ty = Type::getInt1PtrTy(Context);
2131*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<GlobalVariable> GV0(
2132*9880d681SAndroid Build Coastguard Worker       new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage));
2133*9880d681SAndroid Build Coastguard Worker   TypedTrackingMDRef<ValueAsMetadata> MD(ValueAsMetadata::get(GV0.get()));
2134*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(MD->getValue() == GV0.get());
2135*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(GV0->use_empty());
2136*9880d681SAndroid Build Coastguard Worker 
2137*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<GlobalVariable> GV1(
2138*9880d681SAndroid Build Coastguard Worker       new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage));
2139*9880d681SAndroid Build Coastguard Worker   GV0->replaceAllUsesWith(GV1.get());
2140*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(MD->getValue() == GV1.get());
2141*9880d681SAndroid Build Coastguard Worker 
2142*9880d681SAndroid Build Coastguard Worker   // Reset it, so we don't inadvertently test deletion.
2143*9880d681SAndroid Build Coastguard Worker   MD.reset();
2144*9880d681SAndroid Build Coastguard Worker }
2145*9880d681SAndroid Build Coastguard Worker 
TEST_F(TrackingMDRefTest,UpdatesOnDeletion)2146*9880d681SAndroid Build Coastguard Worker TEST_F(TrackingMDRefTest, UpdatesOnDeletion) {
2147*9880d681SAndroid Build Coastguard Worker   Type *Ty = Type::getInt1PtrTy(Context);
2148*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<GlobalVariable> GV(
2149*9880d681SAndroid Build Coastguard Worker       new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage));
2150*9880d681SAndroid Build Coastguard Worker   TypedTrackingMDRef<ValueAsMetadata> MD(ValueAsMetadata::get(GV.get()));
2151*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(MD->getValue() == GV.get());
2152*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(GV->use_empty());
2153*9880d681SAndroid Build Coastguard Worker 
2154*9880d681SAndroid Build Coastguard Worker   GV.reset();
2155*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(!MD);
2156*9880d681SAndroid Build Coastguard Worker }
2157*9880d681SAndroid Build Coastguard Worker 
TEST(NamedMDNodeTest,Search)2158*9880d681SAndroid Build Coastguard Worker TEST(NamedMDNodeTest, Search) {
2159*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
2160*9880d681SAndroid Build Coastguard Worker   ConstantAsMetadata *C =
2161*9880d681SAndroid Build Coastguard Worker       ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context), 1));
2162*9880d681SAndroid Build Coastguard Worker   ConstantAsMetadata *C2 =
2163*9880d681SAndroid Build Coastguard Worker       ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context), 2));
2164*9880d681SAndroid Build Coastguard Worker 
2165*9880d681SAndroid Build Coastguard Worker   Metadata *const V = C;
2166*9880d681SAndroid Build Coastguard Worker   Metadata *const V2 = C2;
2167*9880d681SAndroid Build Coastguard Worker   MDNode *n = MDNode::get(Context, V);
2168*9880d681SAndroid Build Coastguard Worker   MDNode *n2 = MDNode::get(Context, V2);
2169*9880d681SAndroid Build Coastguard Worker 
2170*9880d681SAndroid Build Coastguard Worker   Module M("MyModule", Context);
2171*9880d681SAndroid Build Coastguard Worker   const char *Name = "llvm.NMD1";
2172*9880d681SAndroid Build Coastguard Worker   NamedMDNode *NMD = M.getOrInsertNamedMetadata(Name);
2173*9880d681SAndroid Build Coastguard Worker   NMD->addOperand(n);
2174*9880d681SAndroid Build Coastguard Worker   NMD->addOperand(n2);
2175*9880d681SAndroid Build Coastguard Worker 
2176*9880d681SAndroid Build Coastguard Worker   std::string Str;
2177*9880d681SAndroid Build Coastguard Worker   raw_string_ostream oss(Str);
2178*9880d681SAndroid Build Coastguard Worker   NMD->print(oss);
2179*9880d681SAndroid Build Coastguard Worker   EXPECT_STREQ("!llvm.NMD1 = !{!0, !1}\n",
2180*9880d681SAndroid Build Coastguard Worker                oss.str().c_str());
2181*9880d681SAndroid Build Coastguard Worker }
2182*9880d681SAndroid Build Coastguard Worker 
2183*9880d681SAndroid Build Coastguard Worker typedef MetadataTest FunctionAttachmentTest;
TEST_F(FunctionAttachmentTest,setMetadata)2184*9880d681SAndroid Build Coastguard Worker TEST_F(FunctionAttachmentTest, setMetadata) {
2185*9880d681SAndroid Build Coastguard Worker   Function *F = getFunction("foo");
2186*9880d681SAndroid Build Coastguard Worker   ASSERT_FALSE(F->hasMetadata());
2187*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata(LLVMContext::MD_dbg));
2188*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("dbg"));
2189*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("other"));
2190*9880d681SAndroid Build Coastguard Worker 
2191*9880d681SAndroid Build Coastguard Worker   DISubprogram *SP1 = getSubprogram();
2192*9880d681SAndroid Build Coastguard Worker   DISubprogram *SP2 = getSubprogram();
2193*9880d681SAndroid Build Coastguard Worker   ASSERT_NE(SP1, SP2);
2194*9880d681SAndroid Build Coastguard Worker 
2195*9880d681SAndroid Build Coastguard Worker   F->setMetadata("dbg", SP1);
2196*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->hasMetadata());
2197*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SP1, F->getMetadata(LLVMContext::MD_dbg));
2198*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SP1, F->getMetadata("dbg"));
2199*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("other"));
2200*9880d681SAndroid Build Coastguard Worker 
2201*9880d681SAndroid Build Coastguard Worker   F->setMetadata(LLVMContext::MD_dbg, SP2);
2202*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->hasMetadata());
2203*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SP2, F->getMetadata(LLVMContext::MD_dbg));
2204*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SP2, F->getMetadata("dbg"));
2205*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("other"));
2206*9880d681SAndroid Build Coastguard Worker 
2207*9880d681SAndroid Build Coastguard Worker   F->setMetadata("dbg", nullptr);
2208*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F->hasMetadata());
2209*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata(LLVMContext::MD_dbg));
2210*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("dbg"));
2211*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("other"));
2212*9880d681SAndroid Build Coastguard Worker 
2213*9880d681SAndroid Build Coastguard Worker   MDTuple *T1 = getTuple();
2214*9880d681SAndroid Build Coastguard Worker   MDTuple *T2 = getTuple();
2215*9880d681SAndroid Build Coastguard Worker   ASSERT_NE(T1, T2);
2216*9880d681SAndroid Build Coastguard Worker 
2217*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other1", T1);
2218*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other2", T2);
2219*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->hasMetadata());
2220*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(T1, F->getMetadata("other1"));
2221*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(T2, F->getMetadata("other2"));
2222*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("dbg"));
2223*9880d681SAndroid Build Coastguard Worker 
2224*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other1", T2);
2225*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other2", T1);
2226*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(T2, F->getMetadata("other1"));
2227*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(T1, F->getMetadata("other2"));
2228*9880d681SAndroid Build Coastguard Worker 
2229*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other1", nullptr);
2230*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other2", nullptr);
2231*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F->hasMetadata());
2232*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("other1"));
2233*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, F->getMetadata("other2"));
2234*9880d681SAndroid Build Coastguard Worker }
2235*9880d681SAndroid Build Coastguard Worker 
TEST_F(FunctionAttachmentTest,getAll)2236*9880d681SAndroid Build Coastguard Worker TEST_F(FunctionAttachmentTest, getAll) {
2237*9880d681SAndroid Build Coastguard Worker   Function *F = getFunction("foo");
2238*9880d681SAndroid Build Coastguard Worker 
2239*9880d681SAndroid Build Coastguard Worker   MDTuple *T1 = getTuple();
2240*9880d681SAndroid Build Coastguard Worker   MDTuple *T2 = getTuple();
2241*9880d681SAndroid Build Coastguard Worker   MDTuple *P = getTuple();
2242*9880d681SAndroid Build Coastguard Worker   DISubprogram *SP = getSubprogram();
2243*9880d681SAndroid Build Coastguard Worker 
2244*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other1", T2);
2245*9880d681SAndroid Build Coastguard Worker   F->setMetadata(LLVMContext::MD_dbg, SP);
2246*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other2", T1);
2247*9880d681SAndroid Build Coastguard Worker   F->setMetadata(LLVMContext::MD_prof, P);
2248*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other2", T2);
2249*9880d681SAndroid Build Coastguard Worker   F->setMetadata("other1", T1);
2250*9880d681SAndroid Build Coastguard Worker 
2251*9880d681SAndroid Build Coastguard Worker   SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
2252*9880d681SAndroid Build Coastguard Worker   F->getAllMetadata(MDs);
2253*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(4u, MDs.size());
2254*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(LLVMContext::MD_dbg, MDs[0].first);
2255*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(LLVMContext::MD_prof, MDs[1].first);
2256*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Context.getMDKindID("other1"), MDs[2].first);
2257*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(Context.getMDKindID("other2"), MDs[3].first);
2258*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SP, MDs[0].second);
2259*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(P, MDs[1].second);
2260*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(T1, MDs[2].second);
2261*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(T2, MDs[3].second);
2262*9880d681SAndroid Build Coastguard Worker }
2263*9880d681SAndroid Build Coastguard Worker 
TEST_F(FunctionAttachmentTest,Verifier)2264*9880d681SAndroid Build Coastguard Worker TEST_F(FunctionAttachmentTest, Verifier) {
2265*9880d681SAndroid Build Coastguard Worker   Function *F = getFunction("foo");
2266*9880d681SAndroid Build Coastguard Worker   F->setMetadata("attach", getTuple());
2267*9880d681SAndroid Build Coastguard Worker   F->setIsMaterializable(true);
2268*9880d681SAndroid Build Coastguard Worker 
2269*9880d681SAndroid Build Coastguard Worker   // Confirm this is materializable.
2270*9880d681SAndroid Build Coastguard Worker   ASSERT_TRUE(F->isMaterializable());
2271*9880d681SAndroid Build Coastguard Worker 
2272*9880d681SAndroid Build Coastguard Worker   // Materializable functions cannot have metadata attachments.
2273*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(verifyFunction(*F));
2274*9880d681SAndroid Build Coastguard Worker 
2275*9880d681SAndroid Build Coastguard Worker   // Function declarations can.
2276*9880d681SAndroid Build Coastguard Worker   F->setIsMaterializable(false);
2277*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*F->getParent()));
2278*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyFunction(*F));
2279*9880d681SAndroid Build Coastguard Worker 
2280*9880d681SAndroid Build Coastguard Worker   // So can definitions.
2281*9880d681SAndroid Build Coastguard Worker   (void)new UnreachableInst(Context, BasicBlock::Create(Context, "bb", F));
2282*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyModule(*F->getParent()));
2283*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(verifyFunction(*F));
2284*9880d681SAndroid Build Coastguard Worker }
2285*9880d681SAndroid Build Coastguard Worker 
TEST_F(FunctionAttachmentTest,EntryCount)2286*9880d681SAndroid Build Coastguard Worker TEST_F(FunctionAttachmentTest, EntryCount) {
2287*9880d681SAndroid Build Coastguard Worker   Function *F = getFunction("foo");
2288*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F->getEntryCount().hasValue());
2289*9880d681SAndroid Build Coastguard Worker   F->setEntryCount(12304);
2290*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->getEntryCount().hasValue());
2291*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(12304u, *F->getEntryCount());
2292*9880d681SAndroid Build Coastguard Worker }
2293*9880d681SAndroid Build Coastguard Worker 
TEST_F(FunctionAttachmentTest,SubprogramAttachment)2294*9880d681SAndroid Build Coastguard Worker TEST_F(FunctionAttachmentTest, SubprogramAttachment) {
2295*9880d681SAndroid Build Coastguard Worker   Function *F = getFunction("foo");
2296*9880d681SAndroid Build Coastguard Worker   DISubprogram *SP = getSubprogram();
2297*9880d681SAndroid Build Coastguard Worker   F->setSubprogram(SP);
2298*9880d681SAndroid Build Coastguard Worker 
2299*9880d681SAndroid Build Coastguard Worker   // Note that the static_cast confirms that F->getSubprogram() actually
2300*9880d681SAndroid Build Coastguard Worker   // returns an DISubprogram.
2301*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SP, static_cast<DISubprogram *>(F->getSubprogram()));
2302*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SP, F->getMetadata("dbg"));
2303*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(SP, F->getMetadata(LLVMContext::MD_dbg));
2304*9880d681SAndroid Build Coastguard Worker }
2305*9880d681SAndroid Build Coastguard Worker 
2306*9880d681SAndroid Build Coastguard Worker typedef MetadataTest DistinctMDOperandPlaceholderTest;
TEST_F(DistinctMDOperandPlaceholderTest,getID)2307*9880d681SAndroid Build Coastguard Worker TEST_F(DistinctMDOperandPlaceholderTest, getID) {
2308*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(7u, DistinctMDOperandPlaceholder(7).getID());
2309*9880d681SAndroid Build Coastguard Worker }
2310*9880d681SAndroid Build Coastguard Worker 
TEST_F(DistinctMDOperandPlaceholderTest,replaceUseWith)2311*9880d681SAndroid Build Coastguard Worker TEST_F(DistinctMDOperandPlaceholderTest, replaceUseWith) {
2312*9880d681SAndroid Build Coastguard Worker   // Set up some placeholders.
2313*9880d681SAndroid Build Coastguard Worker   DistinctMDOperandPlaceholder PH0(7);
2314*9880d681SAndroid Build Coastguard Worker   DistinctMDOperandPlaceholder PH1(3);
2315*9880d681SAndroid Build Coastguard Worker   DistinctMDOperandPlaceholder PH2(0);
2316*9880d681SAndroid Build Coastguard Worker   Metadata *Ops[] = {&PH0, &PH1, &PH2};
2317*9880d681SAndroid Build Coastguard Worker   auto *D = MDTuple::getDistinct(Context, Ops);
2318*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(&PH0, D->getOperand(0));
2319*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(&PH1, D->getOperand(1));
2320*9880d681SAndroid Build Coastguard Worker   ASSERT_EQ(&PH2, D->getOperand(2));
2321*9880d681SAndroid Build Coastguard Worker 
2322*9880d681SAndroid Build Coastguard Worker   // Replace them.
2323*9880d681SAndroid Build Coastguard Worker   auto *N0 = MDTuple::get(Context, None);
2324*9880d681SAndroid Build Coastguard Worker   auto *N1 = MDTuple::get(Context, N0);
2325*9880d681SAndroid Build Coastguard Worker   PH0.replaceUseWith(N0);
2326*9880d681SAndroid Build Coastguard Worker   PH1.replaceUseWith(N1);
2327*9880d681SAndroid Build Coastguard Worker   PH2.replaceUseWith(nullptr);
2328*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N0, D->getOperand(0));
2329*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(N1, D->getOperand(1));
2330*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, D->getOperand(2));
2331*9880d681SAndroid Build Coastguard Worker }
2332*9880d681SAndroid Build Coastguard Worker 
TEST_F(DistinctMDOperandPlaceholderTest,replaceUseWithNoUser)2333*9880d681SAndroid Build Coastguard Worker TEST_F(DistinctMDOperandPlaceholderTest, replaceUseWithNoUser) {
2334*9880d681SAndroid Build Coastguard Worker   // There is no user, but we can still call replace.
2335*9880d681SAndroid Build Coastguard Worker   DistinctMDOperandPlaceholder(7).replaceUseWith(MDTuple::get(Context, None));
2336*9880d681SAndroid Build Coastguard Worker }
2337*9880d681SAndroid Build Coastguard Worker 
2338*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
2339*9880d681SAndroid Build Coastguard Worker #ifdef GTEST_HAS_DEATH_TEST
TEST_F(DistinctMDOperandPlaceholderTest,MetadataAsValue)2340*9880d681SAndroid Build Coastguard Worker TEST_F(DistinctMDOperandPlaceholderTest, MetadataAsValue) {
2341*9880d681SAndroid Build Coastguard Worker   // This shouldn't crash.
2342*9880d681SAndroid Build Coastguard Worker   DistinctMDOperandPlaceholder PH(7);
2343*9880d681SAndroid Build Coastguard Worker   EXPECT_DEATH(MetadataAsValue::get(Context, &PH),
2344*9880d681SAndroid Build Coastguard Worker                "Unexpected callback to owner");
2345*9880d681SAndroid Build Coastguard Worker }
2346*9880d681SAndroid Build Coastguard Worker 
TEST_F(DistinctMDOperandPlaceholderTest,UniquedMDNode)2347*9880d681SAndroid Build Coastguard Worker TEST_F(DistinctMDOperandPlaceholderTest, UniquedMDNode) {
2348*9880d681SAndroid Build Coastguard Worker   // This shouldn't crash.
2349*9880d681SAndroid Build Coastguard Worker   DistinctMDOperandPlaceholder PH(7);
2350*9880d681SAndroid Build Coastguard Worker   EXPECT_DEATH(MDTuple::get(Context, &PH), "Unexpected callback to owner");
2351*9880d681SAndroid Build Coastguard Worker }
2352*9880d681SAndroid Build Coastguard Worker 
TEST_F(DistinctMDOperandPlaceholderTest,SecondDistinctMDNode)2353*9880d681SAndroid Build Coastguard Worker TEST_F(DistinctMDOperandPlaceholderTest, SecondDistinctMDNode) {
2354*9880d681SAndroid Build Coastguard Worker   // This shouldn't crash.
2355*9880d681SAndroid Build Coastguard Worker   DistinctMDOperandPlaceholder PH(7);
2356*9880d681SAndroid Build Coastguard Worker   MDTuple::getDistinct(Context, &PH);
2357*9880d681SAndroid Build Coastguard Worker   EXPECT_DEATH(MDTuple::getDistinct(Context, &PH),
2358*9880d681SAndroid Build Coastguard Worker                "Placeholders can only be used once");
2359*9880d681SAndroid Build Coastguard Worker }
2360*9880d681SAndroid Build Coastguard Worker 
TEST_F(DistinctMDOperandPlaceholderTest,TrackingMDRefAndDistinctMDNode)2361*9880d681SAndroid Build Coastguard Worker TEST_F(DistinctMDOperandPlaceholderTest, TrackingMDRefAndDistinctMDNode) {
2362*9880d681SAndroid Build Coastguard Worker   // TrackingMDRef doesn't install an owner callback, so it can't be detected
2363*9880d681SAndroid Build Coastguard Worker   // as an invalid use.  However, using a placeholder in a TrackingMDRef *and*
2364*9880d681SAndroid Build Coastguard Worker   // a distinct node isn't possible and we should assert.
2365*9880d681SAndroid Build Coastguard Worker   //
2366*9880d681SAndroid Build Coastguard Worker   // (There's no positive test for using TrackingMDRef because it's not a
2367*9880d681SAndroid Build Coastguard Worker   // useful thing to do.)
2368*9880d681SAndroid Build Coastguard Worker   {
2369*9880d681SAndroid Build Coastguard Worker     DistinctMDOperandPlaceholder PH(7);
2370*9880d681SAndroid Build Coastguard Worker     MDTuple::getDistinct(Context, &PH);
2371*9880d681SAndroid Build Coastguard Worker     EXPECT_DEATH(TrackingMDRef Ref(&PH), "Placeholders can only be used once");
2372*9880d681SAndroid Build Coastguard Worker   }
2373*9880d681SAndroid Build Coastguard Worker   {
2374*9880d681SAndroid Build Coastguard Worker     DistinctMDOperandPlaceholder PH(7);
2375*9880d681SAndroid Build Coastguard Worker     TrackingMDRef Ref(&PH);
2376*9880d681SAndroid Build Coastguard Worker     EXPECT_DEATH(MDTuple::getDistinct(Context, &PH),
2377*9880d681SAndroid Build Coastguard Worker                  "Placeholders can only be used once");
2378*9880d681SAndroid Build Coastguard Worker   }
2379*9880d681SAndroid Build Coastguard Worker }
2380*9880d681SAndroid Build Coastguard Worker #endif
2381*9880d681SAndroid Build Coastguard Worker #endif
2382*9880d681SAndroid Build Coastguard Worker 
2383*9880d681SAndroid Build Coastguard Worker } // end namespace
2384