1 //===- unittests/IR/MetadataTest.cpp - Metadata unit tests ----------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/IR/Metadata.h"
11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/IR/Constants.h"
13 #include "llvm/IR/DebugInfo.h"
14 #include "llvm/IR/DebugInfoMetadata.h"
15 #include "llvm/IR/Function.h"
16 #include "llvm/IR/Instructions.h"
17 #include "llvm/IR/LLVMContext.h"
18 #include "llvm/IR/Module.h"
19 #include "llvm/IR/ModuleSlotTracker.h"
20 #include "llvm/IR/Type.h"
21 #include "llvm/IR/Verifier.h"
22 #include "llvm/Support/raw_ostream.h"
23 #include "gtest/gtest.h"
28 TEST(ContextAndReplaceableUsesTest
, FromContext
) {
30 ContextAndReplaceableUses
CRU(Context
);
31 EXPECT_EQ(&Context
, &CRU
.getContext());
32 EXPECT_FALSE(CRU
.hasReplaceableUses());
33 EXPECT_FALSE(CRU
.getReplaceableUses());
36 TEST(ContextAndReplaceableUsesTest
, FromReplaceableUses
) {
38 ContextAndReplaceableUses
CRU(make_unique
<ReplaceableMetadataImpl
>(Context
));
39 EXPECT_EQ(&Context
, &CRU
.getContext());
40 EXPECT_TRUE(CRU
.hasReplaceableUses());
41 EXPECT_TRUE(CRU
.getReplaceableUses());
44 TEST(ContextAndReplaceableUsesTest
, makeReplaceable
) {
46 ContextAndReplaceableUses
CRU(Context
);
47 CRU
.makeReplaceable(make_unique
<ReplaceableMetadataImpl
>(Context
));
48 EXPECT_EQ(&Context
, &CRU
.getContext());
49 EXPECT_TRUE(CRU
.hasReplaceableUses());
50 EXPECT_TRUE(CRU
.getReplaceableUses());
53 TEST(ContextAndReplaceableUsesTest
, takeReplaceableUses
) {
55 auto ReplaceableUses
= make_unique
<ReplaceableMetadataImpl
>(Context
);
56 auto *Ptr
= ReplaceableUses
.get();
57 ContextAndReplaceableUses
CRU(std::move(ReplaceableUses
));
58 ReplaceableUses
= CRU
.takeReplaceableUses();
59 EXPECT_EQ(&Context
, &CRU
.getContext());
60 EXPECT_FALSE(CRU
.hasReplaceableUses());
61 EXPECT_FALSE(CRU
.getReplaceableUses());
62 EXPECT_EQ(Ptr
, ReplaceableUses
.get());
65 class MetadataTest
: public testing::Test
{
67 MetadataTest() : M("test", Context
), Counter(0) {}
74 MDNode
*getNode() { return MDNode::get(Context
, None
); }
75 MDNode
*getNode(Metadata
*MD
) { return MDNode::get(Context
, MD
); }
76 MDNode
*getNode(Metadata
*MD1
, Metadata
*MD2
) {
77 Metadata
*MDs
[] = {MD1
, MD2
};
78 return MDNode::get(Context
, MDs
);
81 MDTuple
*getTuple() { return MDTuple::getDistinct(Context
, None
); }
82 DISubroutineType
*getSubroutineType() {
83 return DISubroutineType::getDistinct(Context
, DINode::FlagZero
, 0,
86 DISubprogram
*getSubprogram() {
87 return DISubprogram::getDistinct(Context
, nullptr, "", "", nullptr, 0,
88 nullptr, false, false, 0, nullptr, 0, 0, 0,
89 DINode::FlagZero
, false, nullptr);
92 return DIFile::getDistinct(Context
, "file.c", "/path/to/dir");
94 DICompileUnit
*getUnit() {
95 return DICompileUnit::getDistinct(
96 Context
, 1, getFile(), "clang", false, "-g", 2, "",
97 DICompileUnit::FullDebug
, getTuple(), getTuple(), getTuple(),
98 getTuple(), getTuple(), 0, true, false,
99 DICompileUnit::DebugNameTableKind::Default
);
101 DIType
*getBasicType(StringRef Name
) {
102 return DIBasicType::get(Context
, dwarf::DW_TAG_unspecified_type
, Name
);
104 DIType
*getDerivedType() {
105 return DIDerivedType::getDistinct(
106 Context
, dwarf::DW_TAG_pointer_type
, "", nullptr, 0, nullptr,
107 getBasicType("basictype"), 1, 2, 0, None
, DINode::FlagZero
);
109 Constant
*getConstant() {
110 return ConstantInt::get(Type::getInt32Ty(Context
), Counter
++);
112 ConstantAsMetadata
*getConstantAsMetadata() {
113 return ConstantAsMetadata::get(getConstant());
115 DIType
*getCompositeType() {
116 return DICompositeType::getDistinct(
117 Context
, dwarf::DW_TAG_structure_type
, "", nullptr, 0, nullptr, nullptr,
118 32, 32, 0, DINode::FlagZero
, nullptr, 0, nullptr, nullptr, "");
120 Function
*getFunction(StringRef Name
) {
121 return cast
<Function
>(M
.getOrInsertFunction(
122 Name
, FunctionType::get(Type::getVoidTy(Context
), None
, false)));
125 typedef MetadataTest MDStringTest
;
127 // Test that construction of MDString with different value produces different
128 // MDString objects, even with the same string pointer and nulls in the string.
129 TEST_F(MDStringTest
, CreateDifferent
) {
130 char x
[3] = { 'f', 0, 'A' };
131 MDString
*s1
= MDString::get(Context
, StringRef(&x
[0], 3));
133 MDString
*s2
= MDString::get(Context
, StringRef(&x
[0], 3));
137 // Test that creation of MDStrings with the same string contents produces the
138 // same MDString object, even with different pointers.
139 TEST_F(MDStringTest
, CreateSame
) {
140 char x
[4] = { 'a', 'b', 'c', 'X' };
141 char y
[4] = { 'a', 'b', 'c', 'Y' };
143 MDString
*s1
= MDString::get(Context
, StringRef(&x
[0], 3));
144 MDString
*s2
= MDString::get(Context
, StringRef(&y
[0], 3));
148 // Test that MDString prints out the string we fed it.
149 TEST_F(MDStringTest
, PrintingSimple
) {
150 char *str
= new char[13];
151 strncpy(str
, "testing 1 2 3", 13);
152 MDString
*s
= MDString::get(Context
, StringRef(str
, 13));
153 strncpy(str
, "aaaaaaaaaaaaa", 13);
157 raw_string_ostream
oss(Str
);
159 EXPECT_STREQ("!\"testing 1 2 3\"", oss
.str().c_str());
162 // Test printing of MDString with non-printable characters.
163 TEST_F(MDStringTest
, PrintingComplex
) {
164 char str
[5] = {0, '\n', '"', '\\', (char)-1};
165 MDString
*s
= MDString::get(Context
, StringRef(str
+0, 5));
167 raw_string_ostream
oss(Str
);
169 EXPECT_STREQ("!\"\\00\\0A\\22\\5C\\FF\"", oss
.str().c_str());
172 typedef MetadataTest MDNodeTest
;
174 // Test the two constructors, and containing other Constants.
175 TEST_F(MDNodeTest
, Simple
) {
176 char x
[3] = { 'a', 'b', 'c' };
177 char y
[3] = { '1', '2', '3' };
179 MDString
*s1
= MDString::get(Context
, StringRef(&x
[0], 3));
180 MDString
*s2
= MDString::get(Context
, StringRef(&y
[0], 3));
181 ConstantAsMetadata
*CI
=
182 ConstantAsMetadata::get(ConstantInt::get(Context
, APInt(8, 0)));
184 std::vector
<Metadata
*> V
;
189 MDNode
*n1
= MDNode::get(Context
, V
);
190 Metadata
*const c1
= n1
;
191 MDNode
*n2
= MDNode::get(Context
, c1
);
192 Metadata
*const c2
= n2
;
193 MDNode
*n3
= MDNode::get(Context
, V
);
194 MDNode
*n4
= MDNode::getIfExists(Context
, V
);
195 MDNode
*n5
= MDNode::getIfExists(Context
, c1
);
196 MDNode
*n6
= MDNode::getIfExists(Context
, c2
);
201 EXPECT_EQ(n6
, (Metadata
*)nullptr);
203 EXPECT_EQ(3u, n1
->getNumOperands());
204 EXPECT_EQ(s1
, n1
->getOperand(0));
205 EXPECT_EQ(CI
, n1
->getOperand(1));
206 EXPECT_EQ(s2
, n1
->getOperand(2));
208 EXPECT_EQ(1u, n2
->getNumOperands());
209 EXPECT_EQ(n1
, n2
->getOperand(0));
212 TEST_F(MDNodeTest
, Delete
) {
213 Constant
*C
= ConstantInt::get(Type::getInt32Ty(Context
), 1);
214 Instruction
*I
= new BitCastInst(C
, Type::getInt32Ty(Context
));
216 Metadata
*const V
= LocalAsMetadata::get(I
);
217 MDNode
*n
= MDNode::get(Context
, V
);
218 TrackingMDRef
wvh(n
);
225 TEST_F(MDNodeTest
, SelfReference
) {
229 auto Temp
= MDNode::getTemporary(Context
, None
);
230 Metadata
*Args
[] = {Temp
.get()};
231 MDNode
*Self
= MDNode::get(Context
, Args
);
232 Self
->replaceOperandWith(0, Self
);
233 ASSERT_EQ(Self
, Self
->getOperand(0));
235 // Self-references should be distinct, so MDNode::get() should grab a
236 // uniqued node that references Self, not Self.
238 MDNode
*Ref1
= MDNode::get(Context
, Args
);
239 MDNode
*Ref2
= MDNode::get(Context
, Args
);
240 EXPECT_NE(Self
, Ref1
);
241 EXPECT_EQ(Ref1
, Ref2
);
247 auto Temp
= MDNode::getTemporary(Context
, None
);
248 Metadata
*Args
[] = {Temp
.get(), MDNode::get(Context
, None
)};
249 MDNode
*Self
= MDNode::get(Context
, Args
);
250 Self
->replaceOperandWith(0, Self
);
251 ASSERT_EQ(Self
, Self
->getOperand(0));
253 // Self-references should be distinct, so MDNode::get() should grab a
254 // uniqued node that references Self, not Self itself.
256 MDNode
*Ref1
= MDNode::get(Context
, Args
);
257 MDNode
*Ref2
= MDNode::get(Context
, Args
);
258 EXPECT_NE(Self
, Ref1
);
259 EXPECT_EQ(Ref1
, Ref2
);
263 TEST_F(MDNodeTest
, Print
) {
264 Constant
*C
= ConstantInt::get(Type::getInt32Ty(Context
), 7);
265 MDString
*S
= MDString::get(Context
, "foo");
266 MDNode
*N0
= getNode();
267 MDNode
*N1
= getNode(N0
);
268 MDNode
*N2
= getNode(N0
, N1
);
270 Metadata
*Args
[] = {ConstantAsMetadata::get(C
), S
, nullptr, N0
, N1
, N2
};
271 MDNode
*N
= MDNode::get(Context
, Args
);
273 std::string Expected
;
275 raw_string_ostream
OS(Expected
);
276 OS
<< "<" << (void *)N
<< "> = !{";
277 C
->printAsOperand(OS
);
279 S
->printAsOperand(OS
);
281 MDNode
*Nodes
[] = {N0
, N1
, N2
};
282 for (auto *Node
: Nodes
)
283 OS
<< ", <" << (void *)Node
<< ">";
289 raw_string_ostream
OS(Actual
);
293 EXPECT_EQ(Expected
, Actual
);
296 #define EXPECT_PRINTER_EQ(EXPECTED, PRINT) \
298 std::string Actual_; \
299 raw_string_ostream OS(Actual_); \
302 std::string Expected_(EXPECTED); \
303 EXPECT_EQ(Expected_, Actual_); \
306 TEST_F(MDNodeTest
, PrintTemporary
) {
307 MDNode
*Arg
= getNode();
308 TempMDNode Temp
= MDNode::getTemporary(Context
, Arg
);
309 MDNode
*N
= getNode(Temp
.get());
310 Module
M("test", Context
);
311 NamedMDNode
*NMD
= M
.getOrInsertNamedMetadata("named");
314 EXPECT_PRINTER_EQ("!0 = !{!1}", N
->print(OS
, &M
));
315 EXPECT_PRINTER_EQ("!1 = <temporary!> !{!2}", Temp
->print(OS
, &M
));
316 EXPECT_PRINTER_EQ("!2 = !{}", Arg
->print(OS
, &M
));
319 Temp
->replaceAllUsesWith(Arg
);
322 TEST_F(MDNodeTest
, PrintFromModule
) {
323 Constant
*C
= ConstantInt::get(Type::getInt32Ty(Context
), 7);
324 MDString
*S
= MDString::get(Context
, "foo");
325 MDNode
*N0
= getNode();
326 MDNode
*N1
= getNode(N0
);
327 MDNode
*N2
= getNode(N0
, N1
);
329 Metadata
*Args
[] = {ConstantAsMetadata::get(C
), S
, nullptr, N0
, N1
, N2
};
330 MDNode
*N
= MDNode::get(Context
, Args
);
331 Module
M("test", Context
);
332 NamedMDNode
*NMD
= M
.getOrInsertNamedMetadata("named");
335 std::string Expected
;
337 raw_string_ostream
OS(Expected
);
339 C
->printAsOperand(OS
);
341 S
->printAsOperand(OS
);
342 OS
<< ", null, !1, !2, !3}";
345 EXPECT_PRINTER_EQ(Expected
, N
->print(OS
, &M
));
348 TEST_F(MDNodeTest
, PrintFromFunction
) {
349 Module
M("test", Context
);
350 auto *FTy
= FunctionType::get(Type::getVoidTy(Context
), false);
351 auto *F0
= Function::Create(FTy
, GlobalValue::ExternalLinkage
, "F0", &M
);
352 auto *F1
= Function::Create(FTy
, GlobalValue::ExternalLinkage
, "F1", &M
);
353 auto *BB0
= BasicBlock::Create(Context
, "entry", F0
);
354 auto *BB1
= BasicBlock::Create(Context
, "entry", F1
);
355 auto *R0
= ReturnInst::Create(Context
, BB0
);
356 auto *R1
= ReturnInst::Create(Context
, BB1
);
357 auto *N0
= MDNode::getDistinct(Context
, None
);
358 auto *N1
= MDNode::getDistinct(Context
, None
);
359 R0
->setMetadata("md", N0
);
360 R1
->setMetadata("md", N1
);
362 EXPECT_PRINTER_EQ("!0 = distinct !{}", N0
->print(OS
, &M
));
363 EXPECT_PRINTER_EQ("!1 = distinct !{}", N1
->print(OS
, &M
));
365 ModuleSlotTracker
MST(&M
);
366 EXPECT_PRINTER_EQ("!0 = distinct !{}", N0
->print(OS
, MST
));
367 EXPECT_PRINTER_EQ("!1 = distinct !{}", N1
->print(OS
, MST
));
370 TEST_F(MDNodeTest
, PrintFromMetadataAsValue
) {
371 Module
M("test", Context
);
374 Function::Create(FunctionType::get(Type::getVoidTy(Context
),
375 Type::getMetadataTy(Context
), false),
376 GlobalValue::ExternalLinkage
, "llvm.intrinsic", &M
);
378 auto *FTy
= FunctionType::get(Type::getVoidTy(Context
), false);
379 auto *F0
= Function::Create(FTy
, GlobalValue::ExternalLinkage
, "F0", &M
);
380 auto *F1
= Function::Create(FTy
, GlobalValue::ExternalLinkage
, "F1", &M
);
381 auto *BB0
= BasicBlock::Create(Context
, "entry", F0
);
382 auto *BB1
= BasicBlock::Create(Context
, "entry", F1
);
383 auto *N0
= MDNode::getDistinct(Context
, None
);
384 auto *N1
= MDNode::getDistinct(Context
, None
);
385 auto *MAV0
= MetadataAsValue::get(Context
, N0
);
386 auto *MAV1
= MetadataAsValue::get(Context
, N1
);
387 CallInst::Create(Intrinsic
, MAV0
, "", BB0
);
388 CallInst::Create(Intrinsic
, MAV1
, "", BB1
);
390 EXPECT_PRINTER_EQ("!0 = distinct !{}", MAV0
->print(OS
));
391 EXPECT_PRINTER_EQ("!1 = distinct !{}", MAV1
->print(OS
));
392 EXPECT_PRINTER_EQ("!0", MAV0
->printAsOperand(OS
, false));
393 EXPECT_PRINTER_EQ("!1", MAV1
->printAsOperand(OS
, false));
394 EXPECT_PRINTER_EQ("metadata !0", MAV0
->printAsOperand(OS
, true));
395 EXPECT_PRINTER_EQ("metadata !1", MAV1
->printAsOperand(OS
, true));
397 ModuleSlotTracker
MST(&M
);
398 EXPECT_PRINTER_EQ("!0 = distinct !{}", MAV0
->print(OS
, MST
));
399 EXPECT_PRINTER_EQ("!1 = distinct !{}", MAV1
->print(OS
, MST
));
400 EXPECT_PRINTER_EQ("!0", MAV0
->printAsOperand(OS
, false, MST
));
401 EXPECT_PRINTER_EQ("!1", MAV1
->printAsOperand(OS
, false, MST
));
402 EXPECT_PRINTER_EQ("metadata !0", MAV0
->printAsOperand(OS
, true, MST
));
403 EXPECT_PRINTER_EQ("metadata !1", MAV1
->printAsOperand(OS
, true, MST
));
405 #undef EXPECT_PRINTER_EQ
407 TEST_F(MDNodeTest
, NullOperand
) {
409 MDNode
*Empty
= MDNode::get(Context
, None
);
411 // metadata !{metadata !{}}
412 Metadata
*Ops
[] = {Empty
};
413 MDNode
*N
= MDNode::get(Context
, Ops
);
414 ASSERT_EQ(Empty
, N
->getOperand(0));
416 // metadata !{metadata !{}} => metadata !{null}
417 N
->replaceOperandWith(0, nullptr);
418 ASSERT_EQ(nullptr, N
->getOperand(0));
422 MDNode
*NullOp
= MDNode::get(Context
, Ops
);
423 ASSERT_EQ(nullptr, NullOp
->getOperand(0));
424 EXPECT_EQ(N
, NullOp
);
427 TEST_F(MDNodeTest
, DistinctOnUniquingCollision
) {
429 MDNode
*Empty
= MDNode::get(Context
, None
);
430 ASSERT_TRUE(Empty
->isResolved());
431 EXPECT_FALSE(Empty
->isDistinct());
434 Metadata
*Wrapped1Ops
[] = {Empty
};
435 MDNode
*Wrapped1
= MDNode::get(Context
, Wrapped1Ops
);
436 ASSERT_EQ(Empty
, Wrapped1
->getOperand(0));
437 ASSERT_TRUE(Wrapped1
->isResolved());
438 EXPECT_FALSE(Wrapped1
->isDistinct());
441 Metadata
*Wrapped2Ops
[] = {Wrapped1
};
442 MDNode
*Wrapped2
= MDNode::get(Context
, Wrapped2Ops
);
443 ASSERT_EQ(Wrapped1
, Wrapped2
->getOperand(0));
444 ASSERT_TRUE(Wrapped2
->isResolved());
445 EXPECT_FALSE(Wrapped2
->isDistinct());
447 // !{!{!{}}} => !{!{}}
448 Wrapped2
->replaceOperandWith(0, Empty
);
449 ASSERT_EQ(Empty
, Wrapped2
->getOperand(0));
450 EXPECT_TRUE(Wrapped2
->isDistinct());
451 EXPECT_FALSE(Wrapped1
->isDistinct());
454 TEST_F(MDNodeTest
, UniquedOnDeletedOperand
) {
456 TempMDTuple T
= MDTuple::getTemporary(Context
, None
);
459 Metadata
*Ops
[] = {T
.get()};
460 MDTuple
*N
= MDTuple::get(Context
, Ops
);
462 // !{temp !{}} => !{null}
464 ASSERT_TRUE(N
->isUniqued());
465 Metadata
*NullOps
[] = {nullptr};
466 ASSERT_EQ(N
, MDTuple::get(Context
, NullOps
));
469 TEST_F(MDNodeTest
, DistinctOnDeletedValueOperand
) {
471 Type
*Ty
= Type::getInt1PtrTy(Context
);
472 std::unique_ptr
<GlobalVariable
> GV(
473 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
474 ConstantAsMetadata
*Op
= ConstantAsMetadata::get(GV
.get());
477 Metadata
*Ops
[] = {Op
};
478 MDTuple
*N
= MDTuple::get(Context
, Ops
);
480 // !{i1* @GV} => !{null}
482 ASSERT_TRUE(N
->isDistinct());
483 ASSERT_EQ(nullptr, N
->getOperand(0));
484 Metadata
*NullOps
[] = {nullptr};
485 ASSERT_NE(N
, MDTuple::get(Context
, NullOps
));
488 TEST_F(MDNodeTest
, getDistinct
) {
490 MDNode
*Empty
= MDNode::get(Context
, None
);
491 ASSERT_TRUE(Empty
->isResolved());
492 ASSERT_FALSE(Empty
->isDistinct());
493 ASSERT_EQ(Empty
, MDNode::get(Context
, None
));
496 MDNode
*Distinct1
= MDNode::getDistinct(Context
, None
);
497 MDNode
*Distinct2
= MDNode::getDistinct(Context
, None
);
498 EXPECT_TRUE(Distinct1
->isResolved());
499 EXPECT_TRUE(Distinct2
->isDistinct());
500 EXPECT_NE(Empty
, Distinct1
);
501 EXPECT_NE(Empty
, Distinct2
);
502 EXPECT_NE(Distinct1
, Distinct2
);
505 ASSERT_EQ(Empty
, MDNode::get(Context
, None
));
508 TEST_F(MDNodeTest
, isUniqued
) {
509 MDNode
*U
= MDTuple::get(Context
, None
);
510 MDNode
*D
= MDTuple::getDistinct(Context
, None
);
511 auto T
= MDTuple::getTemporary(Context
, None
);
512 EXPECT_TRUE(U
->isUniqued());
513 EXPECT_FALSE(D
->isUniqued());
514 EXPECT_FALSE(T
->isUniqued());
517 TEST_F(MDNodeTest
, isDistinct
) {
518 MDNode
*U
= MDTuple::get(Context
, None
);
519 MDNode
*D
= MDTuple::getDistinct(Context
, None
);
520 auto T
= MDTuple::getTemporary(Context
, None
);
521 EXPECT_FALSE(U
->isDistinct());
522 EXPECT_TRUE(D
->isDistinct());
523 EXPECT_FALSE(T
->isDistinct());
526 TEST_F(MDNodeTest
, isTemporary
) {
527 MDNode
*U
= MDTuple::get(Context
, None
);
528 MDNode
*D
= MDTuple::getDistinct(Context
, None
);
529 auto T
= MDTuple::getTemporary(Context
, None
);
530 EXPECT_FALSE(U
->isTemporary());
531 EXPECT_FALSE(D
->isTemporary());
532 EXPECT_TRUE(T
->isTemporary());
535 TEST_F(MDNodeTest
, getDistinctWithUnresolvedOperands
) {
537 auto Temp
= MDTuple::getTemporary(Context
, None
);
538 ASSERT_FALSE(Temp
->isResolved());
540 // distinct !{temporary !{}}
541 Metadata
*Ops
[] = {Temp
.get()};
542 MDNode
*Distinct
= MDNode::getDistinct(Context
, Ops
);
543 EXPECT_TRUE(Distinct
->isResolved());
544 EXPECT_EQ(Temp
.get(), Distinct
->getOperand(0));
546 // temporary !{} => !{}
547 MDNode
*Empty
= MDNode::get(Context
, None
);
548 Temp
->replaceAllUsesWith(Empty
);
549 EXPECT_EQ(Empty
, Distinct
->getOperand(0));
552 TEST_F(MDNodeTest
, handleChangedOperandRecursion
) {
554 MDNode
*N0
= MDNode::get(Context
, None
);
557 auto Temp3
= MDTuple::getTemporary(Context
, None
);
558 Metadata
*Ops1
[] = {Temp3
.get(), nullptr};
559 MDNode
*N1
= MDNode::get(Context
, Ops1
);
562 Metadata
*Ops2
[] = {Temp3
.get(), N0
};
563 MDNode
*N2
= MDNode::get(Context
, Ops2
);
566 Metadata
*Ops3
[] = {N2
};
567 MDNode
*N3
= MDNode::get(Context
, Ops3
);
568 Temp3
->replaceAllUsesWith(N3
);
571 Metadata
*Ops4
[] = {N1
};
572 MDNode
*N4
= MDNode::get(Context
, Ops4
);
574 // Confirm that the cycle prevented RAUW from getting dropped.
575 EXPECT_TRUE(N0
->isResolved());
576 EXPECT_FALSE(N1
->isResolved());
577 EXPECT_FALSE(N2
->isResolved());
578 EXPECT_FALSE(N3
->isResolved());
579 EXPECT_FALSE(N4
->isResolved());
581 // Create a couple of distinct nodes to observe what's going on.
583 // !5 = distinct !{!2}
584 // !6 = distinct !{!3}
585 Metadata
*Ops5
[] = {N2
};
586 MDNode
*N5
= MDNode::getDistinct(Context
, Ops5
);
587 Metadata
*Ops6
[] = {N3
};
588 MDNode
*N6
= MDNode::getDistinct(Context
, Ops6
);
590 // Mutate !2 to look like !1, causing a uniquing collision (and an RAUW).
591 // This will ripple up, with !3 colliding with !4, and RAUWing. Since !2
592 // references !3, this can cause a re-entry of handleChangedOperand() when !3
593 // is not ready for it.
595 // !2->replaceOperandWith(1, nullptr)
596 // !2: !{!3, !0} => !{!3, null}
597 // !2->replaceAllUsesWith(!1)
598 // !3: !{!2] => !{!1}
599 // !3->replaceAllUsesWith(!4)
600 N2
->replaceOperandWith(1, nullptr);
602 // If all has gone well, N2 and N3 will have been RAUW'ed and deleted from
603 // under us. Just check that the other nodes are sane.
607 // !5 = distinct !{!1}
608 // !6 = distinct !{!4}
609 EXPECT_EQ(N4
, N1
->getOperand(0));
610 EXPECT_EQ(N1
, N4
->getOperand(0));
611 EXPECT_EQ(N1
, N5
->getOperand(0));
612 EXPECT_EQ(N4
, N6
->getOperand(0));
615 TEST_F(MDNodeTest
, replaceResolvedOperand
) {
616 // Check code for replacing one resolved operand with another. If doing this
617 // directly (via replaceOperandWith()) becomes illegal, change the operand to
618 // a global value that gets RAUW'ed.
620 // Use a temporary node to keep N from being resolved.
621 auto Temp
= MDTuple::getTemporary(Context
, None
);
622 Metadata
*Ops
[] = {nullptr, Temp
.get()};
624 MDNode
*Empty
= MDTuple::get(Context
, ArrayRef
<Metadata
*>());
625 MDNode
*N
= MDTuple::get(Context
, Ops
);
626 EXPECT_EQ(nullptr, N
->getOperand(0));
627 ASSERT_FALSE(N
->isResolved());
629 // Check code for replacing resolved nodes.
630 N
->replaceOperandWith(0, Empty
);
631 EXPECT_EQ(Empty
, N
->getOperand(0));
633 // Check code for adding another unresolved operand.
634 N
->replaceOperandWith(0, Temp
.get());
635 EXPECT_EQ(Temp
.get(), N
->getOperand(0));
637 // Remove the references to Temp; required for teardown.
638 Temp
->replaceAllUsesWith(nullptr);
641 TEST_F(MDNodeTest
, replaceWithUniqued
) {
642 auto *Empty
= MDTuple::get(Context
, None
);
643 MDTuple
*FirstUniqued
;
645 Metadata
*Ops
[] = {Empty
};
646 auto Temp
= MDTuple::getTemporary(Context
, Ops
);
647 EXPECT_TRUE(Temp
->isTemporary());
649 // Don't expect a collision.
650 auto *Current
= Temp
.get();
651 FirstUniqued
= MDNode::replaceWithUniqued(std::move(Temp
));
652 EXPECT_TRUE(FirstUniqued
->isUniqued());
653 EXPECT_TRUE(FirstUniqued
->isResolved());
654 EXPECT_EQ(Current
, FirstUniqued
);
657 Metadata
*Ops
[] = {Empty
};
658 auto Temp
= MDTuple::getTemporary(Context
, Ops
);
659 EXPECT_TRUE(Temp
->isTemporary());
661 // Should collide with Uniqued above this time.
662 auto *Uniqued
= MDNode::replaceWithUniqued(std::move(Temp
));
663 EXPECT_TRUE(Uniqued
->isUniqued());
664 EXPECT_TRUE(Uniqued
->isResolved());
665 EXPECT_EQ(FirstUniqued
, Uniqued
);
668 auto Unresolved
= MDTuple::getTemporary(Context
, None
);
669 Metadata
*Ops
[] = {Unresolved
.get()};
670 auto Temp
= MDTuple::getTemporary(Context
, Ops
);
671 EXPECT_TRUE(Temp
->isTemporary());
673 // Shouldn't be resolved.
674 auto *Uniqued
= MDNode::replaceWithUniqued(std::move(Temp
));
675 EXPECT_TRUE(Uniqued
->isUniqued());
676 EXPECT_FALSE(Uniqued
->isResolved());
678 // Should be a different node.
679 EXPECT_NE(FirstUniqued
, Uniqued
);
681 // Should resolve when we update its node (note: be careful to avoid a
682 // collision with any other nodes above).
683 Uniqued
->replaceOperandWith(0, nullptr);
684 EXPECT_TRUE(Uniqued
->isResolved());
688 TEST_F(MDNodeTest
, replaceWithUniquedResolvingOperand
) {
690 MDTuple
*Op
= MDTuple::getTemporary(Context
, None
).release();
691 EXPECT_FALSE(Op
->isResolved());
694 Metadata
*Ops
[] = {Op
};
695 MDTuple
*N
= MDTuple::getTemporary(Context
, Ops
).release();
696 EXPECT_FALSE(N
->isResolved());
698 // temp !{temp !{}} => !{temp !{}}
699 ASSERT_EQ(N
, MDNode::replaceWithUniqued(TempMDTuple(N
)));
700 EXPECT_FALSE(N
->isResolved());
702 // !{temp !{}} => !{!{}}
703 ASSERT_EQ(Op
, MDNode::replaceWithUniqued(TempMDTuple(Op
)));
704 EXPECT_TRUE(Op
->isResolved());
705 EXPECT_TRUE(N
->isResolved());
708 TEST_F(MDNodeTest
, replaceWithUniquedDeletedOperand
) {
710 Type
*Ty
= Type::getInt1PtrTy(Context
);
711 std::unique_ptr
<GlobalVariable
> GV(
712 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
713 ConstantAsMetadata
*Op
= ConstantAsMetadata::get(GV
.get());
716 Metadata
*Ops
[] = {Op
};
717 MDTuple
*N
= MDTuple::getTemporary(Context
, Ops
).release();
719 // temp !{i1* @GV} => !{i1* @GV}
720 ASSERT_EQ(N
, MDNode::replaceWithUniqued(TempMDTuple(N
)));
721 ASSERT_TRUE(N
->isUniqued());
723 // !{i1* @GV} => !{null}
725 ASSERT_TRUE(N
->isDistinct());
726 ASSERT_EQ(nullptr, N
->getOperand(0));
727 Metadata
*NullOps
[] = {nullptr};
728 ASSERT_NE(N
, MDTuple::get(Context
, NullOps
));
731 TEST_F(MDNodeTest
, replaceWithUniquedChangedOperand
) {
733 Type
*Ty
= Type::getInt1PtrTy(Context
);
734 std::unique_ptr
<GlobalVariable
> GV(
735 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
736 ConstantAsMetadata
*Op
= ConstantAsMetadata::get(GV
.get());
739 Metadata
*Ops
[] = {Op
};
740 MDTuple
*N
= MDTuple::getTemporary(Context
, Ops
).release();
742 // temp !{i1* @GV} => !{i1* @GV}
743 ASSERT_EQ(N
, MDNode::replaceWithUniqued(TempMDTuple(N
)));
744 ASSERT_TRUE(N
->isUniqued());
746 // !{i1* @GV} => !{i1* @GV2}
747 std::unique_ptr
<GlobalVariable
> GV2(
748 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
749 GV
->replaceAllUsesWith(GV2
.get());
750 ASSERT_TRUE(N
->isUniqued());
751 Metadata
*NullOps
[] = {ConstantAsMetadata::get(GV2
.get())};
752 ASSERT_EQ(N
, MDTuple::get(Context
, NullOps
));
755 TEST_F(MDNodeTest
, replaceWithDistinct
) {
757 auto *Empty
= MDTuple::get(Context
, None
);
758 Metadata
*Ops
[] = {Empty
};
759 auto Temp
= MDTuple::getTemporary(Context
, Ops
);
760 EXPECT_TRUE(Temp
->isTemporary());
762 // Don't expect a collision.
763 auto *Current
= Temp
.get();
764 auto *Distinct
= MDNode::replaceWithDistinct(std::move(Temp
));
765 EXPECT_TRUE(Distinct
->isDistinct());
766 EXPECT_TRUE(Distinct
->isResolved());
767 EXPECT_EQ(Current
, Distinct
);
770 auto Unresolved
= MDTuple::getTemporary(Context
, None
);
771 Metadata
*Ops
[] = {Unresolved
.get()};
772 auto Temp
= MDTuple::getTemporary(Context
, Ops
);
773 EXPECT_TRUE(Temp
->isTemporary());
775 // Don't expect a collision.
776 auto *Current
= Temp
.get();
777 auto *Distinct
= MDNode::replaceWithDistinct(std::move(Temp
));
778 EXPECT_TRUE(Distinct
->isDistinct());
779 EXPECT_TRUE(Distinct
->isResolved());
780 EXPECT_EQ(Current
, Distinct
);
782 // Cleanup; required for teardown.
783 Unresolved
->replaceAllUsesWith(nullptr);
787 TEST_F(MDNodeTest
, replaceWithPermanent
) {
788 Metadata
*Ops
[] = {nullptr};
789 auto Temp
= MDTuple::getTemporary(Context
, Ops
);
790 auto *T
= Temp
.get();
792 // U is a normal, uniqued node that references T.
793 auto *U
= MDTuple::get(Context
, T
);
794 EXPECT_TRUE(U
->isUniqued());
796 // Make Temp self-referencing.
797 Temp
->replaceOperandWith(0, T
);
799 // Try to uniquify Temp. This should, despite the name in the API, give a
800 // 'distinct' node, since self-references aren't allowed to be uniqued.
802 // Since it's distinct, N should have the same address as when it was a
803 // temporary (i.e., be equal to T not U).
804 auto *N
= MDNode::replaceWithPermanent(std::move(Temp
));
806 EXPECT_TRUE(N
->isDistinct());
808 // U should be the canonical unique node with N as the argument.
809 EXPECT_EQ(U
, MDTuple::get(Context
, N
));
810 EXPECT_TRUE(U
->isUniqued());
812 // This temporary should collide with U when replaced, but it should still be
814 EXPECT_EQ(U
, MDNode::replaceWithPermanent(MDTuple::getTemporary(Context
, N
)));
815 EXPECT_TRUE(U
->isUniqued());
817 // This temporary should become a new uniqued node.
818 auto Temp2
= MDTuple::getTemporary(Context
, U
);
819 auto *V
= Temp2
.get();
820 EXPECT_EQ(V
, MDNode::replaceWithPermanent(std::move(Temp2
)));
821 EXPECT_TRUE(V
->isUniqued());
822 EXPECT_EQ(U
, V
->getOperand(0));
825 TEST_F(MDNodeTest
, deleteTemporaryWithTrackingRef
) {
827 EXPECT_EQ(nullptr, Ref
.get());
829 auto Temp
= MDTuple::getTemporary(Context
, None
);
830 Ref
.reset(Temp
.get());
831 EXPECT_EQ(Temp
.get(), Ref
.get());
833 EXPECT_EQ(nullptr, Ref
.get());
836 typedef MetadataTest DILocationTest
;
838 TEST_F(DILocationTest
, Overflow
) {
839 DISubprogram
*N
= getSubprogram();
841 DILocation
*L
= DILocation::get(Context
, 2, 7, N
);
842 EXPECT_EQ(2u, L
->getLine());
843 EXPECT_EQ(7u, L
->getColumn());
845 unsigned U16
= 1u << 16;
847 DILocation
*L
= DILocation::get(Context
, UINT32_MAX
, U16
- 1, N
);
848 EXPECT_EQ(UINT32_MAX
, L
->getLine());
849 EXPECT_EQ(U16
- 1, L
->getColumn());
852 DILocation
*L
= DILocation::get(Context
, UINT32_MAX
, U16
, N
);
853 EXPECT_EQ(UINT32_MAX
, L
->getLine());
854 EXPECT_EQ(0u, L
->getColumn());
857 DILocation
*L
= DILocation::get(Context
, UINT32_MAX
, U16
+ 1, N
);
858 EXPECT_EQ(UINT32_MAX
, L
->getLine());
859 EXPECT_EQ(0u, L
->getColumn());
863 TEST_F(DILocationTest
, Merge
) {
864 DISubprogram
*N
= getSubprogram();
865 DIScope
*S
= DILexicalBlock::get(Context
, N
, getFile(), 3, 4);
869 auto *A
= DILocation::get(Context
, 2, 7, N
);
870 auto *B
= DILocation::get(Context
, 2, 7, N
);
871 auto *M
= DILocation::getMergedLocation(A
, B
);
872 EXPECT_EQ(2u, M
->getLine());
873 EXPECT_EQ(7u, M
->getColumn());
874 EXPECT_EQ(N
, M
->getScope());
878 // Identical, different scopes.
879 auto *A
= DILocation::get(Context
, 2, 7, N
);
880 auto *B
= DILocation::get(Context
, 2, 7, S
);
881 auto *M
= DILocation::getMergedLocation(A
, B
);
882 EXPECT_EQ(0u, M
->getLine()); // FIXME: Should this be 2?
883 EXPECT_EQ(0u, M
->getColumn()); // FIXME: Should this be 7?
884 EXPECT_EQ(N
, M
->getScope());
888 // Different lines, same scopes.
889 auto *A
= DILocation::get(Context
, 1, 6, N
);
890 auto *B
= DILocation::get(Context
, 2, 7, N
);
891 auto *M
= DILocation::getMergedLocation(A
, B
);
892 EXPECT_EQ(0u, M
->getLine());
893 EXPECT_EQ(0u, M
->getColumn());
894 EXPECT_EQ(N
, M
->getScope());
898 // Twisty locations, all different, same function.
899 auto *A
= DILocation::get(Context
, 1, 6, N
);
900 auto *B
= DILocation::get(Context
, 2, 7, S
);
901 auto *M
= DILocation::getMergedLocation(A
, B
);
902 EXPECT_EQ(0u, M
->getLine());
903 EXPECT_EQ(0u, M
->getColumn());
904 EXPECT_EQ(N
, M
->getScope());
908 // Different function, same inlined-at.
910 auto *SP1
= DISubprogram::getDistinct(Context
, F
, "a", "a", F
, 0, nullptr,
911 false, false, 0, nullptr, 0, 0, 0,
912 DINode::FlagZero
, false, nullptr);
913 auto *SP2
= DISubprogram::getDistinct(Context
, F
, "b", "b", F
, 0, nullptr,
914 false, false, 0, nullptr, 0, 0, 0,
915 DINode::FlagZero
, false, nullptr);
917 auto *I
= DILocation::get(Context
, 2, 7, N
);
918 auto *A
= DILocation::get(Context
, 1, 6, SP1
, I
);
919 auto *B
= DILocation::get(Context
, 2, 7, SP2
, I
);
920 auto *M
= DILocation::getMergedLocation(A
, B
);
921 EXPECT_EQ(0u, M
->getLine());
922 EXPECT_EQ(0u, M
->getColumn());
923 EXPECT_TRUE(isa
<DILocalScope
>(M
->getScope()));
924 EXPECT_EQ(I
, M
->getInlinedAt());
928 // Completely different.
929 auto *I
= DILocation::get(Context
, 2, 7, N
);
930 auto *A
= DILocation::get(Context
, 1, 6, S
, I
);
931 auto *B
= DILocation::get(Context
, 2, 7, getSubprogram());
932 auto *M
= DILocation::getMergedLocation(A
, B
);
933 EXPECT_EQ(0u, M
->getLine());
934 EXPECT_EQ(0u, M
->getColumn());
935 EXPECT_TRUE(isa
<DILocalScope
>(M
->getScope()));
936 EXPECT_EQ(S
, M
->getScope());
937 EXPECT_EQ(nullptr, M
->getInlinedAt());
941 TEST_F(DILocationTest
, getDistinct
) {
942 MDNode
*N
= getSubprogram();
943 DILocation
*L0
= DILocation::getDistinct(Context
, 2, 7, N
);
944 EXPECT_TRUE(L0
->isDistinct());
945 DILocation
*L1
= DILocation::get(Context
, 2, 7, N
);
946 EXPECT_FALSE(L1
->isDistinct());
947 EXPECT_EQ(L1
, DILocation::get(Context
, 2, 7, N
));
950 TEST_F(DILocationTest
, getTemporary
) {
951 MDNode
*N
= MDNode::get(Context
, None
);
952 auto L
= DILocation::getTemporary(Context
, 2, 7, N
);
953 EXPECT_TRUE(L
->isTemporary());
954 EXPECT_FALSE(L
->isResolved());
957 TEST_F(DILocationTest
, cloneTemporary
) {
958 MDNode
*N
= MDNode::get(Context
, None
);
959 auto L
= DILocation::getTemporary(Context
, 2, 7, N
);
960 EXPECT_TRUE(L
->isTemporary());
961 auto L2
= L
->clone();
962 EXPECT_TRUE(L2
->isTemporary());
965 typedef MetadataTest GenericDINodeTest
;
967 TEST_F(GenericDINodeTest
, get
) {
968 StringRef Header
= "header";
969 auto *Empty
= MDNode::get(Context
, None
);
970 Metadata
*Ops1
[] = {Empty
};
971 auto *N
= GenericDINode::get(Context
, 15, Header
, Ops1
);
972 EXPECT_EQ(15u, N
->getTag());
973 EXPECT_EQ(2u, N
->getNumOperands());
974 EXPECT_EQ(Header
, N
->getHeader());
975 EXPECT_EQ(MDString::get(Context
, Header
), N
->getOperand(0));
976 EXPECT_EQ(1u, N
->getNumDwarfOperands());
977 EXPECT_EQ(Empty
, N
->getDwarfOperand(0));
978 EXPECT_EQ(Empty
, N
->getOperand(1));
979 ASSERT_TRUE(N
->isUniqued());
981 EXPECT_EQ(N
, GenericDINode::get(Context
, 15, Header
, Ops1
));
983 N
->replaceOperandWith(1, nullptr);
984 EXPECT_EQ(15u, N
->getTag());
985 EXPECT_EQ(Header
, N
->getHeader());
986 EXPECT_EQ(nullptr, N
->getDwarfOperand(0));
987 ASSERT_TRUE(N
->isUniqued());
989 Metadata
*Ops2
[] = {nullptr};
990 EXPECT_EQ(N
, GenericDINode::get(Context
, 15, Header
, Ops2
));
992 N
->replaceDwarfOperandWith(0, Empty
);
993 EXPECT_EQ(15u, N
->getTag());
994 EXPECT_EQ(Header
, N
->getHeader());
995 EXPECT_EQ(Empty
, N
->getDwarfOperand(0));
996 ASSERT_TRUE(N
->isUniqued());
997 EXPECT_EQ(N
, GenericDINode::get(Context
, 15, Header
, Ops1
));
999 TempGenericDINode Temp
= N
->clone();
1000 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1003 TEST_F(GenericDINodeTest
, getEmptyHeader
) {
1004 // Canonicalize !"" to null.
1005 auto *N
= GenericDINode::get(Context
, 15, StringRef(), None
);
1006 EXPECT_EQ(StringRef(), N
->getHeader());
1007 EXPECT_EQ(nullptr, N
->getOperand(0));
1010 typedef MetadataTest DISubrangeTest
;
1012 TEST_F(DISubrangeTest
, get
) {
1013 auto *N
= DISubrange::get(Context
, 5, 7);
1014 auto Count
= N
->getCount();
1015 EXPECT_EQ(dwarf::DW_TAG_subrange_type
, N
->getTag());
1017 ASSERT_TRUE(Count
.is
<ConstantInt
*>());
1018 EXPECT_EQ(5, Count
.get
<ConstantInt
*>()->getSExtValue());
1019 EXPECT_EQ(7, N
->getLowerBound());
1020 EXPECT_EQ(N
, DISubrange::get(Context
, 5, 7));
1021 EXPECT_EQ(DISubrange::get(Context
, 5, 0), DISubrange::get(Context
, 5));
1023 TempDISubrange Temp
= N
->clone();
1024 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1027 TEST_F(DISubrangeTest
, getEmptyArray
) {
1028 auto *N
= DISubrange::get(Context
, -1, 0);
1029 auto Count
= N
->getCount();
1030 EXPECT_EQ(dwarf::DW_TAG_subrange_type
, N
->getTag());
1032 ASSERT_TRUE(Count
.is
<ConstantInt
*>());
1033 EXPECT_EQ(-1, Count
.get
<ConstantInt
*>()->getSExtValue());
1034 EXPECT_EQ(0, N
->getLowerBound());
1035 EXPECT_EQ(N
, DISubrange::get(Context
, -1, 0));
1038 TEST_F(DISubrangeTest
, getVariableCount
) {
1039 DILocalScope
*Scope
= getSubprogram();
1040 DIFile
*File
= getFile();
1041 DIType
*Type
= getDerivedType();
1042 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(7);
1043 auto *VlaExpr
= DILocalVariable::get(Context
, Scope
, "vla_expr", File
, 8,
1046 auto *N
= DISubrange::get(Context
, VlaExpr
, 0);
1047 auto Count
= N
->getCount();
1049 ASSERT_TRUE(Count
.is
<DIVariable
*>());
1050 EXPECT_EQ(VlaExpr
, Count
.get
<DIVariable
*>());
1051 ASSERT_TRUE(isa
<DIVariable
>(N
->getRawCountNode()));
1052 EXPECT_EQ(0, N
->getLowerBound());
1053 EXPECT_EQ("vla_expr", Count
.get
<DIVariable
*>()->getName());
1054 EXPECT_EQ(N
, DISubrange::get(Context
, VlaExpr
, 0));
1057 typedef MetadataTest DIEnumeratorTest
;
1059 TEST_F(DIEnumeratorTest
, get
) {
1060 auto *N
= DIEnumerator::get(Context
, 7, false, "name");
1061 EXPECT_EQ(dwarf::DW_TAG_enumerator
, N
->getTag());
1062 EXPECT_EQ(7, N
->getValue());
1063 EXPECT_FALSE(N
->isUnsigned());
1064 EXPECT_EQ("name", N
->getName());
1065 EXPECT_EQ(N
, DIEnumerator::get(Context
, 7, false, "name"));
1067 EXPECT_NE(N
, DIEnumerator::get(Context
, 7, true, "name"));
1068 EXPECT_NE(N
, DIEnumerator::get(Context
, 8, false, "name"));
1069 EXPECT_NE(N
, DIEnumerator::get(Context
, 7, false, "nam"));
1071 TempDIEnumerator Temp
= N
->clone();
1072 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1075 typedef MetadataTest DIBasicTypeTest
;
1077 TEST_F(DIBasicTypeTest
, get
) {
1079 DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "special", 33, 26, 7,
1081 EXPECT_EQ(dwarf::DW_TAG_base_type
, N
->getTag());
1082 EXPECT_EQ("special", N
->getName());
1083 EXPECT_EQ(33u, N
->getSizeInBits());
1084 EXPECT_EQ(26u, N
->getAlignInBits());
1085 EXPECT_EQ(7u, N
->getEncoding());
1086 EXPECT_EQ(0u, N
->getLine());
1087 EXPECT_EQ(DINode::FlagZero
, N
->getFlags());
1088 EXPECT_EQ(N
, DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "special", 33,
1089 26, 7, DINode::FlagZero
));
1091 EXPECT_NE(N
, DIBasicType::get(Context
, dwarf::DW_TAG_unspecified_type
,
1092 "special", 33, 26, 7, DINode::FlagZero
));
1094 DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "s", 33, 26, 7,
1096 EXPECT_NE(N
, DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "special", 32,
1097 26, 7, DINode::FlagZero
));
1098 EXPECT_NE(N
, DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "special", 33,
1099 25, 7, DINode::FlagZero
));
1100 EXPECT_NE(N
, DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "special", 33,
1101 26, 6, DINode::FlagZero
));
1102 EXPECT_NE(N
, DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "special", 33,
1103 26, 7, DINode::FlagBigEndian
));
1104 EXPECT_NE(N
, DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "special", 33,
1105 26, 7, DINode::FlagLittleEndian
));
1107 TempDIBasicType Temp
= N
->clone();
1108 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1111 TEST_F(DIBasicTypeTest
, getWithLargeValues
) {
1112 auto *N
= DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "special",
1113 UINT64_MAX
, UINT32_MAX
- 1, 7, DINode::FlagZero
);
1114 EXPECT_EQ(UINT64_MAX
, N
->getSizeInBits());
1115 EXPECT_EQ(UINT32_MAX
- 1, N
->getAlignInBits());
1118 TEST_F(DIBasicTypeTest
, getUnspecified
) {
1120 DIBasicType::get(Context
, dwarf::DW_TAG_unspecified_type
, "unspecified");
1121 EXPECT_EQ(dwarf::DW_TAG_unspecified_type
, N
->getTag());
1122 EXPECT_EQ("unspecified", N
->getName());
1123 EXPECT_EQ(0u, N
->getSizeInBits());
1124 EXPECT_EQ(0u, N
->getAlignInBits());
1125 EXPECT_EQ(0u, N
->getEncoding());
1126 EXPECT_EQ(0u, N
->getLine());
1127 EXPECT_EQ(DINode::FlagZero
, N
->getFlags());
1130 typedef MetadataTest DITypeTest
;
1132 TEST_F(DITypeTest
, clone
) {
1133 // Check that DIType has a specialized clone that returns TempDIType.
1134 DIType
*N
= DIBasicType::get(Context
, dwarf::DW_TAG_base_type
, "int", 32, 32,
1135 dwarf::DW_ATE_signed
, DINode::FlagZero
);
1137 TempDIType Temp
= N
->clone();
1138 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1141 TEST_F(DITypeTest
, cloneWithFlags
) {
1143 Metadata
*TypesOps
[] = {nullptr};
1144 Metadata
*Types
= MDTuple::get(Context
, TypesOps
);
1147 DISubroutineType::getDistinct(Context
, DINode::FlagZero
, 0, Types
);
1148 EXPECT_EQ(DINode::FlagZero
, D
->getFlags());
1149 TempDIType D2
= D
->cloneWithFlags(DINode::FlagRValueReference
);
1150 EXPECT_EQ(DINode::FlagRValueReference
, D2
->getFlags());
1151 EXPECT_EQ(DINode::FlagZero
, D
->getFlags());
1154 DISubroutineType::getTemporary(Context
, DINode::FlagZero
, 0, Types
);
1155 EXPECT_EQ(DINode::FlagZero
, T
->getFlags());
1156 TempDIType T2
= T
->cloneWithFlags(DINode::FlagRValueReference
);
1157 EXPECT_EQ(DINode::FlagRValueReference
, T2
->getFlags());
1158 EXPECT_EQ(DINode::FlagZero
, T
->getFlags());
1161 typedef MetadataTest DIDerivedTypeTest
;
1163 TEST_F(DIDerivedTypeTest
, get
) {
1164 DIFile
*File
= getFile();
1165 DIScope
*Scope
= getSubprogram();
1166 DIType
*BaseType
= getBasicType("basic");
1167 MDTuple
*ExtraData
= getTuple();
1168 unsigned DWARFAddressSpace
= 8;
1169 DINode::DIFlags Flags5
= static_cast<DINode::DIFlags
>(5);
1170 DINode::DIFlags Flags4
= static_cast<DINode::DIFlags
>(4);
1173 DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
, "something", File
,
1174 1, Scope
, BaseType
, 2, 3, 4, DWARFAddressSpace
, Flags5
,
1176 EXPECT_EQ(dwarf::DW_TAG_pointer_type
, N
->getTag());
1177 EXPECT_EQ("something", N
->getName());
1178 EXPECT_EQ(File
, N
->getFile());
1179 EXPECT_EQ(1u, N
->getLine());
1180 EXPECT_EQ(Scope
, N
->getScope());
1181 EXPECT_EQ(BaseType
, N
->getBaseType());
1182 EXPECT_EQ(2u, N
->getSizeInBits());
1183 EXPECT_EQ(3u, N
->getAlignInBits());
1184 EXPECT_EQ(4u, N
->getOffsetInBits());
1185 EXPECT_EQ(DWARFAddressSpace
, N
->getDWARFAddressSpace().getValue());
1186 EXPECT_EQ(5u, N
->getFlags());
1187 EXPECT_EQ(ExtraData
, N
->getExtraData());
1188 EXPECT_EQ(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1189 "something", File
, 1, Scope
, BaseType
, 2, 3,
1190 4, DWARFAddressSpace
, Flags5
, ExtraData
));
1192 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_reference_type
,
1193 "something", File
, 1, Scope
, BaseType
, 2, 3,
1194 4, DWARFAddressSpace
, Flags5
, ExtraData
));
1195 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
, "else",
1196 File
, 1, Scope
, BaseType
, 2, 3,
1197 4, DWARFAddressSpace
, Flags5
, ExtraData
));
1198 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1199 "something", getFile(), 1, Scope
, BaseType
, 2,
1200 3, 4, DWARFAddressSpace
, Flags5
, ExtraData
));
1201 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1202 "something", File
, 2, Scope
, BaseType
, 2, 3,
1203 4, DWARFAddressSpace
, Flags5
, ExtraData
));
1204 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1205 "something", File
, 1, getSubprogram(),
1206 BaseType
, 2, 3, 4, DWARFAddressSpace
, Flags5
,
1208 EXPECT_NE(N
, DIDerivedType::get(
1209 Context
, dwarf::DW_TAG_pointer_type
, "something", File
, 1,
1210 Scope
, getBasicType("basic2"), 2, 3, 4, DWARFAddressSpace
,
1211 Flags5
, ExtraData
));
1212 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1213 "something", File
, 1, Scope
, BaseType
, 3, 3,
1214 4, DWARFAddressSpace
, Flags5
, ExtraData
));
1215 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1216 "something", File
, 1, Scope
, BaseType
, 2, 2,
1217 4, DWARFAddressSpace
, Flags5
, ExtraData
));
1218 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1219 "something", File
, 1, Scope
, BaseType
, 2, 3,
1220 5, DWARFAddressSpace
, Flags5
, ExtraData
));
1221 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1222 "something", File
, 1, Scope
, BaseType
, 2, 3,
1223 4, DWARFAddressSpace
+ 1, Flags5
, ExtraData
));
1224 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1225 "something", File
, 1, Scope
, BaseType
, 2, 3,
1226 4, DWARFAddressSpace
, Flags4
, ExtraData
));
1227 EXPECT_NE(N
, DIDerivedType::get(Context
, dwarf::DW_TAG_pointer_type
,
1228 "something", File
, 1, Scope
, BaseType
, 2, 3,
1229 4, DWARFAddressSpace
, Flags5
, getTuple()));
1231 TempDIDerivedType Temp
= N
->clone();
1232 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1235 TEST_F(DIDerivedTypeTest
, getWithLargeValues
) {
1236 DIFile
*File
= getFile();
1237 DIScope
*Scope
= getSubprogram();
1238 DIType
*BaseType
= getBasicType("basic");
1239 MDTuple
*ExtraData
= getTuple();
1240 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(5);
1242 auto *N
= DIDerivedType::get(
1243 Context
, dwarf::DW_TAG_pointer_type
, "something", File
, 1, Scope
,
1244 BaseType
, UINT64_MAX
, UINT32_MAX
- 1, UINT64_MAX
- 2, UINT32_MAX
- 3,
1246 EXPECT_EQ(UINT64_MAX
, N
->getSizeInBits());
1247 EXPECT_EQ(UINT32_MAX
- 1, N
->getAlignInBits());
1248 EXPECT_EQ(UINT64_MAX
- 2, N
->getOffsetInBits());
1249 EXPECT_EQ(UINT32_MAX
- 3, N
->getDWARFAddressSpace().getValue());
1252 typedef MetadataTest DICompositeTypeTest
;
1254 TEST_F(DICompositeTypeTest
, get
) {
1255 unsigned Tag
= dwarf::DW_TAG_structure_type
;
1256 StringRef Name
= "some name";
1257 DIFile
*File
= getFile();
1259 DIScope
*Scope
= getSubprogram();
1260 DIType
*BaseType
= getCompositeType();
1261 uint64_t SizeInBits
= 2;
1262 uint32_t AlignInBits
= 3;
1263 uint64_t OffsetInBits
= 4;
1264 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(5);
1265 MDTuple
*Elements
= getTuple();
1266 unsigned RuntimeLang
= 6;
1267 DIType
*VTableHolder
= getCompositeType();
1268 MDTuple
*TemplateParams
= getTuple();
1269 StringRef Identifier
= "some id";
1271 auto *N
= DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1272 BaseType
, SizeInBits
, AlignInBits
,
1273 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1274 VTableHolder
, TemplateParams
, Identifier
);
1275 EXPECT_EQ(Tag
, N
->getTag());
1276 EXPECT_EQ(Name
, N
->getName());
1277 EXPECT_EQ(File
, N
->getFile());
1278 EXPECT_EQ(Line
, N
->getLine());
1279 EXPECT_EQ(Scope
, N
->getScope());
1280 EXPECT_EQ(BaseType
, N
->getBaseType());
1281 EXPECT_EQ(SizeInBits
, N
->getSizeInBits());
1282 EXPECT_EQ(AlignInBits
, N
->getAlignInBits());
1283 EXPECT_EQ(OffsetInBits
, N
->getOffsetInBits());
1284 EXPECT_EQ(Flags
, N
->getFlags());
1285 EXPECT_EQ(Elements
, N
->getElements().get());
1286 EXPECT_EQ(RuntimeLang
, N
->getRuntimeLang());
1287 EXPECT_EQ(VTableHolder
, N
->getVTableHolder());
1288 EXPECT_EQ(TemplateParams
, N
->getTemplateParams().get());
1289 EXPECT_EQ(Identifier
, N
->getIdentifier());
1291 EXPECT_EQ(N
, DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1292 BaseType
, SizeInBits
, AlignInBits
,
1293 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1294 VTableHolder
, TemplateParams
, Identifier
));
1296 EXPECT_NE(N
, DICompositeType::get(Context
, Tag
+ 1, Name
, File
, Line
, Scope
,
1297 BaseType
, SizeInBits
, AlignInBits
,
1298 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1299 VTableHolder
, TemplateParams
, Identifier
));
1300 EXPECT_NE(N
, DICompositeType::get(Context
, Tag
, "abc", File
, Line
, Scope
,
1301 BaseType
, SizeInBits
, AlignInBits
,
1302 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1303 VTableHolder
, TemplateParams
, Identifier
));
1304 EXPECT_NE(N
, DICompositeType::get(Context
, Tag
, Name
, getFile(), Line
, Scope
,
1305 BaseType
, SizeInBits
, AlignInBits
,
1306 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1307 VTableHolder
, TemplateParams
, Identifier
));
1308 EXPECT_NE(N
, DICompositeType::get(Context
, Tag
, Name
, File
, Line
+ 1, Scope
,
1309 BaseType
, SizeInBits
, AlignInBits
,
1310 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1311 VTableHolder
, TemplateParams
, Identifier
));
1312 EXPECT_NE(N
, DICompositeType::get(
1313 Context
, Tag
, Name
, File
, Line
, getSubprogram(), BaseType
,
1314 SizeInBits
, AlignInBits
, OffsetInBits
, Flags
, Elements
,
1315 RuntimeLang
, VTableHolder
, TemplateParams
, Identifier
));
1316 EXPECT_NE(N
, DICompositeType::get(
1317 Context
, Tag
, Name
, File
, Line
, Scope
, getBasicType("other"),
1318 SizeInBits
, AlignInBits
, OffsetInBits
, Flags
, Elements
,
1319 RuntimeLang
, VTableHolder
, TemplateParams
, Identifier
));
1320 EXPECT_NE(N
, DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1321 BaseType
, SizeInBits
+ 1, AlignInBits
,
1322 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1323 VTableHolder
, TemplateParams
, Identifier
));
1324 EXPECT_NE(N
, DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1325 BaseType
, SizeInBits
, AlignInBits
+ 1,
1326 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1327 VTableHolder
, TemplateParams
, Identifier
));
1328 EXPECT_NE(N
, DICompositeType::get(
1329 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
,
1330 AlignInBits
, OffsetInBits
+ 1, Flags
, Elements
, RuntimeLang
,
1331 VTableHolder
, TemplateParams
, Identifier
));
1332 DINode::DIFlags FlagsPOne
= static_cast<DINode::DIFlags
>(Flags
+ 1);
1333 EXPECT_NE(N
, DICompositeType::get(
1334 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
,
1335 AlignInBits
, OffsetInBits
, FlagsPOne
, Elements
, RuntimeLang
,
1336 VTableHolder
, TemplateParams
, Identifier
));
1337 EXPECT_NE(N
, DICompositeType::get(
1338 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
,
1339 AlignInBits
, OffsetInBits
, Flags
, getTuple(), RuntimeLang
,
1340 VTableHolder
, TemplateParams
, Identifier
));
1341 EXPECT_NE(N
, DICompositeType::get(
1342 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
,
1343 AlignInBits
, OffsetInBits
, Flags
, Elements
, RuntimeLang
+ 1,
1344 VTableHolder
, TemplateParams
, Identifier
));
1345 EXPECT_NE(N
, DICompositeType::get(
1346 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
,
1347 AlignInBits
, OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1348 getCompositeType(), TemplateParams
, Identifier
));
1349 EXPECT_NE(N
, DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1350 BaseType
, SizeInBits
, AlignInBits
,
1351 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1352 VTableHolder
, getTuple(), Identifier
));
1353 EXPECT_NE(N
, DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1354 BaseType
, SizeInBits
, AlignInBits
,
1355 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1356 VTableHolder
, TemplateParams
, "other"));
1358 // Be sure that missing identifiers get null pointers.
1359 EXPECT_FALSE(DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1360 BaseType
, SizeInBits
, AlignInBits
,
1361 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1362 VTableHolder
, TemplateParams
, "")
1363 ->getRawIdentifier());
1364 EXPECT_FALSE(DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1365 BaseType
, SizeInBits
, AlignInBits
,
1366 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1367 VTableHolder
, TemplateParams
)
1368 ->getRawIdentifier());
1370 TempDICompositeType Temp
= N
->clone();
1371 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1374 TEST_F(DICompositeTypeTest
, getWithLargeValues
) {
1375 unsigned Tag
= dwarf::DW_TAG_structure_type
;
1376 StringRef Name
= "some name";
1377 DIFile
*File
= getFile();
1379 DIScope
*Scope
= getSubprogram();
1380 DIType
*BaseType
= getCompositeType();
1381 uint64_t SizeInBits
= UINT64_MAX
;
1382 uint32_t AlignInBits
= UINT32_MAX
- 1;
1383 uint64_t OffsetInBits
= UINT64_MAX
- 2;
1384 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(5);
1385 MDTuple
*Elements
= getTuple();
1386 unsigned RuntimeLang
= 6;
1387 DIType
*VTableHolder
= getCompositeType();
1388 MDTuple
*TemplateParams
= getTuple();
1389 StringRef Identifier
= "some id";
1391 auto *N
= DICompositeType::get(Context
, Tag
, Name
, File
, Line
, Scope
,
1392 BaseType
, SizeInBits
, AlignInBits
,
1393 OffsetInBits
, Flags
, Elements
, RuntimeLang
,
1394 VTableHolder
, TemplateParams
, Identifier
);
1395 EXPECT_EQ(SizeInBits
, N
->getSizeInBits());
1396 EXPECT_EQ(AlignInBits
, N
->getAlignInBits());
1397 EXPECT_EQ(OffsetInBits
, N
->getOffsetInBits());
1400 TEST_F(DICompositeTypeTest
, replaceOperands
) {
1401 unsigned Tag
= dwarf::DW_TAG_structure_type
;
1402 StringRef Name
= "some name";
1403 DIFile
*File
= getFile();
1405 DIScope
*Scope
= getSubprogram();
1406 DIType
*BaseType
= getCompositeType();
1407 uint64_t SizeInBits
= 2;
1408 uint32_t AlignInBits
= 3;
1409 uint64_t OffsetInBits
= 4;
1410 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(5);
1411 unsigned RuntimeLang
= 6;
1412 StringRef Identifier
= "some id";
1414 auto *N
= DICompositeType::get(
1415 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
, AlignInBits
,
1416 OffsetInBits
, Flags
, nullptr, RuntimeLang
, nullptr, nullptr, Identifier
);
1418 auto *Elements
= MDTuple::getDistinct(Context
, None
);
1419 EXPECT_EQ(nullptr, N
->getElements().get());
1420 N
->replaceElements(Elements
);
1421 EXPECT_EQ(Elements
, N
->getElements().get());
1422 N
->replaceElements(nullptr);
1423 EXPECT_EQ(nullptr, N
->getElements().get());
1425 DIType
*VTableHolder
= getCompositeType();
1426 EXPECT_EQ(nullptr, N
->getVTableHolder());
1427 N
->replaceVTableHolder(VTableHolder
);
1428 EXPECT_EQ(VTableHolder
, N
->getVTableHolder());
1429 // As an extension, the containing type can be anything. This is
1430 // used by Rust to associate vtables with their concrete type.
1431 DIType
*BasicType
= getBasicType("basic");
1432 N
->replaceVTableHolder(BasicType
);
1433 EXPECT_EQ(BasicType
, N
->getVTableHolder());
1434 N
->replaceVTableHolder(nullptr);
1435 EXPECT_EQ(nullptr, N
->getVTableHolder());
1437 auto *TemplateParams
= MDTuple::getDistinct(Context
, None
);
1438 EXPECT_EQ(nullptr, N
->getTemplateParams().get());
1439 N
->replaceTemplateParams(TemplateParams
);
1440 EXPECT_EQ(TemplateParams
, N
->getTemplateParams().get());
1441 N
->replaceTemplateParams(nullptr);
1442 EXPECT_EQ(nullptr, N
->getTemplateParams().get());
1445 TEST_F(DICompositeTypeTest
, variant_part
) {
1446 unsigned Tag
= dwarf::DW_TAG_variant_part
;
1447 StringRef Name
= "some name";
1448 DIFile
*File
= getFile();
1450 DIScope
*Scope
= getSubprogram();
1451 DIType
*BaseType
= getCompositeType();
1452 uint64_t SizeInBits
= 2;
1453 uint32_t AlignInBits
= 3;
1454 uint64_t OffsetInBits
= 4;
1455 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(5);
1456 unsigned RuntimeLang
= 6;
1457 StringRef Identifier
= "some id";
1458 DIDerivedType
*Discriminator
= cast
<DIDerivedType
>(getDerivedType());
1459 DIDerivedType
*Discriminator2
= cast
<DIDerivedType
>(getDerivedType());
1461 EXPECT_NE(Discriminator
, Discriminator2
);
1463 auto *N
= DICompositeType::get(
1464 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
, AlignInBits
,
1465 OffsetInBits
, Flags
, nullptr, RuntimeLang
, nullptr, nullptr, Identifier
,
1468 // Test the hashing.
1469 auto *Same
= DICompositeType::get(
1470 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
, AlignInBits
,
1471 OffsetInBits
, Flags
, nullptr, RuntimeLang
, nullptr, nullptr, Identifier
,
1473 auto *Other
= DICompositeType::get(
1474 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
, AlignInBits
,
1475 OffsetInBits
, Flags
, nullptr, RuntimeLang
, nullptr, nullptr, Identifier
,
1477 auto *NoDisc
= DICompositeType::get(
1478 Context
, Tag
, Name
, File
, Line
, Scope
, BaseType
, SizeInBits
, AlignInBits
,
1479 OffsetInBits
, Flags
, nullptr, RuntimeLang
, nullptr, nullptr, Identifier
,
1483 EXPECT_NE(Same
, Other
);
1484 EXPECT_NE(Same
, NoDisc
);
1485 EXPECT_NE(Other
, NoDisc
);
1487 EXPECT_EQ(N
->getDiscriminator(), Discriminator
);
1490 typedef MetadataTest DISubroutineTypeTest
;
1492 TEST_F(DISubroutineTypeTest
, get
) {
1493 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(1);
1494 DINode::DIFlags FlagsPOne
= static_cast<DINode::DIFlags
>(Flags
+ 1);
1495 MDTuple
*TypeArray
= getTuple();
1497 auto *N
= DISubroutineType::get(Context
, Flags
, 0, TypeArray
);
1498 EXPECT_EQ(dwarf::DW_TAG_subroutine_type
, N
->getTag());
1499 EXPECT_EQ(Flags
, N
->getFlags());
1500 EXPECT_EQ(TypeArray
, N
->getTypeArray().get());
1501 EXPECT_EQ(N
, DISubroutineType::get(Context
, Flags
, 0, TypeArray
));
1503 EXPECT_NE(N
, DISubroutineType::get(Context
, FlagsPOne
, 0, TypeArray
));
1504 EXPECT_NE(N
, DISubroutineType::get(Context
, Flags
, 0, getTuple()));
1506 // Test the hashing of calling conventions.
1507 auto *Fast
= DISubroutineType::get(
1508 Context
, Flags
, dwarf::DW_CC_BORLAND_msfastcall
, TypeArray
);
1509 auto *Std
= DISubroutineType::get(Context
, Flags
,
1510 dwarf::DW_CC_BORLAND_stdcall
, TypeArray
);
1512 DISubroutineType::get(Context
, Flags
,
1513 dwarf::DW_CC_BORLAND_msfastcall
, TypeArray
));
1514 EXPECT_EQ(Std
, DISubroutineType::get(
1515 Context
, Flags
, dwarf::DW_CC_BORLAND_stdcall
, TypeArray
));
1519 EXPECT_NE(Fast
, Std
);
1521 TempDISubroutineType Temp
= N
->clone();
1522 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1524 // Test always-empty operands.
1525 EXPECT_EQ(nullptr, N
->getScope());
1526 EXPECT_EQ(nullptr, N
->getFile());
1527 EXPECT_EQ("", N
->getName());
1530 typedef MetadataTest DIFileTest
;
1532 TEST_F(DIFileTest
, get
) {
1533 StringRef Filename
= "file";
1534 StringRef Directory
= "dir";
1535 DIFile::ChecksumKind CSKind
= DIFile::ChecksumKind::CSK_MD5
;
1536 StringRef ChecksumString
= "000102030405060708090a0b0c0d0e0f";
1537 DIFile::ChecksumInfo
<StringRef
> Checksum(CSKind
, ChecksumString
);
1538 StringRef Source
= "source";
1539 auto *N
= DIFile::get(Context
, Filename
, Directory
, Checksum
, Source
);
1541 EXPECT_EQ(dwarf::DW_TAG_file_type
, N
->getTag());
1542 EXPECT_EQ(Filename
, N
->getFilename());
1543 EXPECT_EQ(Directory
, N
->getDirectory());
1544 EXPECT_EQ(Checksum
, N
->getChecksum());
1545 EXPECT_EQ(Source
, N
->getSource());
1546 EXPECT_EQ(N
, DIFile::get(Context
, Filename
, Directory
, Checksum
, Source
));
1548 EXPECT_NE(N
, DIFile::get(Context
, "other", Directory
, Checksum
, Source
));
1549 EXPECT_NE(N
, DIFile::get(Context
, Filename
, "other", Checksum
, Source
));
1550 DIFile::ChecksumInfo
<StringRef
> OtherChecksum(DIFile::ChecksumKind::CSK_SHA1
, ChecksumString
);
1552 N
, DIFile::get(Context
, Filename
, Directory
, OtherChecksum
));
1553 StringRef OtherSource
= "other";
1554 EXPECT_NE(N
, DIFile::get(Context
, Filename
, Directory
, Checksum
, OtherSource
));
1555 EXPECT_NE(N
, DIFile::get(Context
, Filename
, Directory
, Checksum
));
1556 EXPECT_NE(N
, DIFile::get(Context
, Filename
, Directory
));
1558 TempDIFile Temp
= N
->clone();
1559 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1562 TEST_F(DIFileTest
, ScopeGetFile
) {
1563 // Ensure that DIScope::getFile() returns itself.
1564 DIScope
*N
= DIFile::get(Context
, "file", "dir");
1565 EXPECT_EQ(N
, N
->getFile());
1568 typedef MetadataTest DICompileUnitTest
;
1570 TEST_F(DICompileUnitTest
, get
) {
1571 unsigned SourceLanguage
= 1;
1572 DIFile
*File
= getFile();
1573 StringRef Producer
= "some producer";
1574 bool IsOptimized
= false;
1575 StringRef Flags
= "flag after flag";
1576 unsigned RuntimeVersion
= 2;
1577 StringRef SplitDebugFilename
= "another/file";
1578 auto EmissionKind
= DICompileUnit::FullDebug
;
1579 MDTuple
*EnumTypes
= getTuple();
1580 MDTuple
*RetainedTypes
= getTuple();
1581 MDTuple
*GlobalVariables
= getTuple();
1582 MDTuple
*ImportedEntities
= getTuple();
1583 uint64_t DWOId
= 0x10000000c0ffee;
1584 MDTuple
*Macros
= getTuple();
1585 auto *N
= DICompileUnit::getDistinct(
1586 Context
, SourceLanguage
, File
, Producer
, IsOptimized
, Flags
,
1587 RuntimeVersion
, SplitDebugFilename
, EmissionKind
, EnumTypes
,
1588 RetainedTypes
, GlobalVariables
, ImportedEntities
, Macros
, DWOId
, true,
1589 false, DICompileUnit::DebugNameTableKind::Default
);
1591 EXPECT_EQ(dwarf::DW_TAG_compile_unit
, N
->getTag());
1592 EXPECT_EQ(SourceLanguage
, N
->getSourceLanguage());
1593 EXPECT_EQ(File
, N
->getFile());
1594 EXPECT_EQ(Producer
, N
->getProducer());
1595 EXPECT_EQ(IsOptimized
, N
->isOptimized());
1596 EXPECT_EQ(Flags
, N
->getFlags());
1597 EXPECT_EQ(RuntimeVersion
, N
->getRuntimeVersion());
1598 EXPECT_EQ(SplitDebugFilename
, N
->getSplitDebugFilename());
1599 EXPECT_EQ(EmissionKind
, N
->getEmissionKind());
1600 EXPECT_EQ(EnumTypes
, N
->getEnumTypes().get());
1601 EXPECT_EQ(RetainedTypes
, N
->getRetainedTypes().get());
1602 EXPECT_EQ(GlobalVariables
, N
->getGlobalVariables().get());
1603 EXPECT_EQ(ImportedEntities
, N
->getImportedEntities().get());
1604 EXPECT_EQ(Macros
, N
->getMacros().get());
1605 EXPECT_EQ(DWOId
, N
->getDWOId());
1607 TempDICompileUnit Temp
= N
->clone();
1608 EXPECT_EQ(dwarf::DW_TAG_compile_unit
, Temp
->getTag());
1609 EXPECT_EQ(SourceLanguage
, Temp
->getSourceLanguage());
1610 EXPECT_EQ(File
, Temp
->getFile());
1611 EXPECT_EQ(Producer
, Temp
->getProducer());
1612 EXPECT_EQ(IsOptimized
, Temp
->isOptimized());
1613 EXPECT_EQ(Flags
, Temp
->getFlags());
1614 EXPECT_EQ(RuntimeVersion
, Temp
->getRuntimeVersion());
1615 EXPECT_EQ(SplitDebugFilename
, Temp
->getSplitDebugFilename());
1616 EXPECT_EQ(EmissionKind
, Temp
->getEmissionKind());
1617 EXPECT_EQ(EnumTypes
, Temp
->getEnumTypes().get());
1618 EXPECT_EQ(RetainedTypes
, Temp
->getRetainedTypes().get());
1619 EXPECT_EQ(GlobalVariables
, Temp
->getGlobalVariables().get());
1620 EXPECT_EQ(ImportedEntities
, Temp
->getImportedEntities().get());
1621 EXPECT_EQ(Macros
, Temp
->getMacros().get());
1622 EXPECT_EQ(DWOId
, Temp
->getDWOId());
1624 auto *TempAddress
= Temp
.get();
1625 auto *Clone
= MDNode::replaceWithPermanent(std::move(Temp
));
1626 EXPECT_TRUE(Clone
->isDistinct());
1627 EXPECT_EQ(TempAddress
, Clone
);
1630 TEST_F(DICompileUnitTest
, replaceArrays
) {
1631 unsigned SourceLanguage
= 1;
1632 DIFile
*File
= getFile();
1633 StringRef Producer
= "some producer";
1634 bool IsOptimized
= false;
1635 StringRef Flags
= "flag after flag";
1636 unsigned RuntimeVersion
= 2;
1637 StringRef SplitDebugFilename
= "another/file";
1638 auto EmissionKind
= DICompileUnit::FullDebug
;
1639 MDTuple
*EnumTypes
= MDTuple::getDistinct(Context
, None
);
1640 MDTuple
*RetainedTypes
= MDTuple::getDistinct(Context
, None
);
1641 MDTuple
*ImportedEntities
= MDTuple::getDistinct(Context
, None
);
1642 uint64_t DWOId
= 0xc0ffee;
1643 auto *N
= DICompileUnit::getDistinct(
1644 Context
, SourceLanguage
, File
, Producer
, IsOptimized
, Flags
,
1645 RuntimeVersion
, SplitDebugFilename
, EmissionKind
, EnumTypes
,
1646 RetainedTypes
, nullptr, ImportedEntities
, nullptr, DWOId
, true, false,
1647 DICompileUnit::DebugNameTableKind::Default
);
1649 auto *GlobalVariables
= MDTuple::getDistinct(Context
, None
);
1650 EXPECT_EQ(nullptr, N
->getGlobalVariables().get());
1651 N
->replaceGlobalVariables(GlobalVariables
);
1652 EXPECT_EQ(GlobalVariables
, N
->getGlobalVariables().get());
1653 N
->replaceGlobalVariables(nullptr);
1654 EXPECT_EQ(nullptr, N
->getGlobalVariables().get());
1656 auto *Macros
= MDTuple::getDistinct(Context
, None
);
1657 EXPECT_EQ(nullptr, N
->getMacros().get());
1658 N
->replaceMacros(Macros
);
1659 EXPECT_EQ(Macros
, N
->getMacros().get());
1660 N
->replaceMacros(nullptr);
1661 EXPECT_EQ(nullptr, N
->getMacros().get());
1664 typedef MetadataTest DISubprogramTest
;
1666 TEST_F(DISubprogramTest
, get
) {
1667 DIScope
*Scope
= getCompositeType();
1668 StringRef Name
= "name";
1669 StringRef LinkageName
= "linkage";
1670 DIFile
*File
= getFile();
1672 DISubroutineType
*Type
= getSubroutineType();
1673 bool IsLocalToUnit
= false;
1674 bool IsDefinition
= true;
1675 unsigned ScopeLine
= 3;
1676 DIType
*ContainingType
= getCompositeType();
1677 unsigned Virtuality
= 2;
1678 unsigned VirtualIndex
= 5;
1679 int ThisAdjustment
= -3;
1680 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(6);
1681 bool IsOptimized
= false;
1682 MDTuple
*TemplateParams
= getTuple();
1683 DISubprogram
*Declaration
= getSubprogram();
1684 MDTuple
*RetainedNodes
= getTuple();
1685 MDTuple
*ThrownTypes
= getTuple();
1686 DICompileUnit
*Unit
= getUnit();
1688 auto *N
= DISubprogram::get(
1689 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
, IsLocalToUnit
,
1690 IsDefinition
, ScopeLine
, ContainingType
, Virtuality
, VirtualIndex
,
1691 ThisAdjustment
, Flags
, IsOptimized
, Unit
, TemplateParams
, Declaration
,
1692 RetainedNodes
, ThrownTypes
);
1694 EXPECT_EQ(dwarf::DW_TAG_subprogram
, N
->getTag());
1695 EXPECT_EQ(Scope
, N
->getScope());
1696 EXPECT_EQ(Name
, N
->getName());
1697 EXPECT_EQ(LinkageName
, N
->getLinkageName());
1698 EXPECT_EQ(File
, N
->getFile());
1699 EXPECT_EQ(Line
, N
->getLine());
1700 EXPECT_EQ(Type
, N
->getType());
1701 EXPECT_EQ(IsLocalToUnit
, N
->isLocalToUnit());
1702 EXPECT_EQ(IsDefinition
, N
->isDefinition());
1703 EXPECT_EQ(ScopeLine
, N
->getScopeLine());
1704 EXPECT_EQ(ContainingType
, N
->getContainingType());
1705 EXPECT_EQ(Virtuality
, N
->getVirtuality());
1706 EXPECT_EQ(VirtualIndex
, N
->getVirtualIndex());
1707 EXPECT_EQ(ThisAdjustment
, N
->getThisAdjustment());
1708 EXPECT_EQ(Flags
, N
->getFlags());
1709 EXPECT_EQ(IsOptimized
, N
->isOptimized());
1710 EXPECT_EQ(Unit
, N
->getUnit());
1711 EXPECT_EQ(TemplateParams
, N
->getTemplateParams().get());
1712 EXPECT_EQ(Declaration
, N
->getDeclaration());
1713 EXPECT_EQ(RetainedNodes
, N
->getRetainedNodes().get());
1714 EXPECT_EQ(ThrownTypes
, N
->getThrownTypes().get());
1715 EXPECT_EQ(N
, DISubprogram::get(
1716 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
,
1717 IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1718 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1719 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1721 EXPECT_NE(N
, DISubprogram::get(
1722 Context
, getCompositeType(), Name
, LinkageName
, File
, Line
,
1723 Type
, IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1724 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1725 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1726 EXPECT_NE(N
, DISubprogram::get(
1727 Context
, Scope
, "other", LinkageName
, File
, Line
, Type
,
1728 IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1729 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1730 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1731 EXPECT_NE(N
, DISubprogram::get(
1732 Context
, Scope
, Name
, "other", File
, Line
, Type
,
1733 IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1734 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1735 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1736 EXPECT_NE(N
, DISubprogram::get(
1737 Context
, Scope
, Name
, LinkageName
, getFile(), Line
, Type
,
1738 IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1739 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1740 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1741 EXPECT_NE(N
, DISubprogram::get(
1742 Context
, Scope
, Name
, LinkageName
, File
, Line
+ 1, Type
,
1743 IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1744 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1745 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1746 EXPECT_NE(N
, DISubprogram::get(Context
, Scope
, Name
, LinkageName
, File
, Line
,
1747 getSubroutineType(), IsLocalToUnit
,
1748 IsDefinition
, ScopeLine
, ContainingType
,
1749 Virtuality
, VirtualIndex
, ThisAdjustment
,
1750 Flags
, IsOptimized
, Unit
, TemplateParams
,
1751 Declaration
, RetainedNodes
, ThrownTypes
));
1752 EXPECT_NE(N
, DISubprogram::get(
1753 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
,
1754 !IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1755 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1756 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1757 EXPECT_NE(N
, DISubprogram::get(
1758 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
,
1759 IsLocalToUnit
, !IsDefinition
, ScopeLine
, ContainingType
,
1760 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1761 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1762 EXPECT_NE(N
, DISubprogram::get(
1763 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
,
1764 IsLocalToUnit
, IsDefinition
, ScopeLine
+ 1, ContainingType
,
1765 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1766 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1767 EXPECT_NE(N
, DISubprogram::get(
1768 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
,
1769 IsLocalToUnit
, IsDefinition
, ScopeLine
, getCompositeType(),
1770 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1771 Unit
, TemplateParams
, Declaration
, RetainedNodes
, ThrownTypes
));
1772 EXPECT_NE(N
, DISubprogram::get(Context
, Scope
, Name
, LinkageName
, File
, Line
,
1773 Type
, IsLocalToUnit
, IsDefinition
, ScopeLine
,
1774 ContainingType
, Virtuality
+ 1, VirtualIndex
,
1775 ThisAdjustment
, Flags
, IsOptimized
, Unit
,
1776 TemplateParams
, Declaration
, RetainedNodes
,
1778 EXPECT_NE(N
, DISubprogram::get(Context
, Scope
, Name
, LinkageName
, File
, Line
,
1779 Type
, IsLocalToUnit
, IsDefinition
, ScopeLine
,
1780 ContainingType
, Virtuality
, VirtualIndex
+ 1,
1781 ThisAdjustment
, Flags
, IsOptimized
, Unit
,
1782 TemplateParams
, Declaration
, RetainedNodes
,
1784 EXPECT_NE(N
, DISubprogram::get(Context
, Scope
, Name
, LinkageName
, File
, Line
,
1785 Type
, IsLocalToUnit
, IsDefinition
, ScopeLine
,
1786 ContainingType
, Virtuality
, VirtualIndex
,
1787 ThisAdjustment
, Flags
, !IsOptimized
, Unit
,
1788 TemplateParams
, Declaration
, RetainedNodes
,
1790 EXPECT_NE(N
, DISubprogram::get(Context
, Scope
, Name
, LinkageName
, File
, Line
,
1791 Type
, IsLocalToUnit
, IsDefinition
, ScopeLine
,
1792 ContainingType
, Virtuality
, VirtualIndex
,
1793 ThisAdjustment
, Flags
, IsOptimized
, nullptr,
1794 TemplateParams
, Declaration
, RetainedNodes
,
1796 EXPECT_NE(N
, DISubprogram::get(
1797 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
,
1798 IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1799 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1800 Unit
, getTuple(), Declaration
, RetainedNodes
, ThrownTypes
));
1801 EXPECT_NE(N
, DISubprogram::get(Context
, Scope
, Name
, LinkageName
, File
, Line
,
1802 Type
, IsLocalToUnit
, IsDefinition
, ScopeLine
,
1803 ContainingType
, Virtuality
, VirtualIndex
,
1804 ThisAdjustment
, Flags
, IsOptimized
, Unit
,
1805 TemplateParams
, getSubprogram(), RetainedNodes
,
1807 EXPECT_NE(N
, DISubprogram::get(Context
, Scope
, Name
, LinkageName
, File
, Line
,
1808 Type
, IsLocalToUnit
, IsDefinition
, ScopeLine
,
1809 ContainingType
, Virtuality
, VirtualIndex
,
1810 ThisAdjustment
, Flags
, IsOptimized
, Unit
,
1811 TemplateParams
, Declaration
, getTuple()));
1812 EXPECT_NE(N
, DISubprogram::get(
1813 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
,
1814 IsLocalToUnit
, IsDefinition
, ScopeLine
, ContainingType
,
1815 Virtuality
, VirtualIndex
, ThisAdjustment
, Flags
, IsOptimized
,
1816 Unit
, TemplateParams
, Declaration
, RetainedNodes
, getTuple()));
1818 TempDISubprogram Temp
= N
->clone();
1819 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1822 typedef MetadataTest DILexicalBlockTest
;
1824 TEST_F(DILexicalBlockTest
, get
) {
1825 DILocalScope
*Scope
= getSubprogram();
1826 DIFile
*File
= getFile();
1828 unsigned Column
= 8;
1830 auto *N
= DILexicalBlock::get(Context
, Scope
, File
, Line
, Column
);
1832 EXPECT_EQ(dwarf::DW_TAG_lexical_block
, N
->getTag());
1833 EXPECT_EQ(Scope
, N
->getScope());
1834 EXPECT_EQ(File
, N
->getFile());
1835 EXPECT_EQ(Line
, N
->getLine());
1836 EXPECT_EQ(Column
, N
->getColumn());
1837 EXPECT_EQ(N
, DILexicalBlock::get(Context
, Scope
, File
, Line
, Column
));
1840 DILexicalBlock::get(Context
, getSubprogram(), File
, Line
, Column
));
1841 EXPECT_NE(N
, DILexicalBlock::get(Context
, Scope
, getFile(), Line
, Column
));
1842 EXPECT_NE(N
, DILexicalBlock::get(Context
, Scope
, File
, Line
+ 1, Column
));
1843 EXPECT_NE(N
, DILexicalBlock::get(Context
, Scope
, File
, Line
, Column
+ 1));
1845 TempDILexicalBlock Temp
= N
->clone();
1846 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1849 TEST_F(DILexicalBlockTest
, Overflow
) {
1850 DISubprogram
*SP
= getSubprogram();
1851 DIFile
*F
= getFile();
1853 auto *LB
= DILexicalBlock::get(Context
, SP
, F
, 2, 7);
1854 EXPECT_EQ(2u, LB
->getLine());
1855 EXPECT_EQ(7u, LB
->getColumn());
1857 unsigned U16
= 1u << 16;
1859 auto *LB
= DILexicalBlock::get(Context
, SP
, F
, UINT32_MAX
, U16
- 1);
1860 EXPECT_EQ(UINT32_MAX
, LB
->getLine());
1861 EXPECT_EQ(U16
- 1, LB
->getColumn());
1864 auto *LB
= DILexicalBlock::get(Context
, SP
, F
, UINT32_MAX
, U16
);
1865 EXPECT_EQ(UINT32_MAX
, LB
->getLine());
1866 EXPECT_EQ(0u, LB
->getColumn());
1869 auto *LB
= DILexicalBlock::get(Context
, SP
, F
, UINT32_MAX
, U16
+ 1);
1870 EXPECT_EQ(UINT32_MAX
, LB
->getLine());
1871 EXPECT_EQ(0u, LB
->getColumn());
1875 typedef MetadataTest DILexicalBlockFileTest
;
1877 TEST_F(DILexicalBlockFileTest
, get
) {
1878 DILocalScope
*Scope
= getSubprogram();
1879 DIFile
*File
= getFile();
1880 unsigned Discriminator
= 5;
1882 auto *N
= DILexicalBlockFile::get(Context
, Scope
, File
, Discriminator
);
1884 EXPECT_EQ(dwarf::DW_TAG_lexical_block
, N
->getTag());
1885 EXPECT_EQ(Scope
, N
->getScope());
1886 EXPECT_EQ(File
, N
->getFile());
1887 EXPECT_EQ(Discriminator
, N
->getDiscriminator());
1888 EXPECT_EQ(N
, DILexicalBlockFile::get(Context
, Scope
, File
, Discriminator
));
1890 EXPECT_NE(N
, DILexicalBlockFile::get(Context
, getSubprogram(), File
,
1893 DILexicalBlockFile::get(Context
, Scope
, getFile(), Discriminator
));
1895 DILexicalBlockFile::get(Context
, Scope
, File
, Discriminator
+ 1));
1897 TempDILexicalBlockFile Temp
= N
->clone();
1898 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1901 typedef MetadataTest DINamespaceTest
;
1903 TEST_F(DINamespaceTest
, get
) {
1904 DIScope
*Scope
= getFile();
1905 StringRef Name
= "namespace";
1906 bool ExportSymbols
= true;
1908 auto *N
= DINamespace::get(Context
, Scope
, Name
, ExportSymbols
);
1910 EXPECT_EQ(dwarf::DW_TAG_namespace
, N
->getTag());
1911 EXPECT_EQ(Scope
, N
->getScope());
1912 EXPECT_EQ(Name
, N
->getName());
1913 EXPECT_EQ(N
, DINamespace::get(Context
, Scope
, Name
, ExportSymbols
));
1914 EXPECT_NE(N
, DINamespace::get(Context
, getFile(), Name
, ExportSymbols
));
1915 EXPECT_NE(N
, DINamespace::get(Context
, Scope
, "other", ExportSymbols
));
1916 EXPECT_NE(N
, DINamespace::get(Context
, Scope
, Name
, !ExportSymbols
));
1918 TempDINamespace Temp
= N
->clone();
1919 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1922 typedef MetadataTest DIModuleTest
;
1924 TEST_F(DIModuleTest
, get
) {
1925 DIScope
*Scope
= getFile();
1926 StringRef Name
= "module";
1927 StringRef ConfigMacro
= "-DNDEBUG";
1928 StringRef Includes
= "-I.";
1929 StringRef Sysroot
= "/";
1931 auto *N
= DIModule::get(Context
, Scope
, Name
, ConfigMacro
, Includes
, Sysroot
);
1933 EXPECT_EQ(dwarf::DW_TAG_module
, N
->getTag());
1934 EXPECT_EQ(Scope
, N
->getScope());
1935 EXPECT_EQ(Name
, N
->getName());
1936 EXPECT_EQ(ConfigMacro
, N
->getConfigurationMacros());
1937 EXPECT_EQ(Includes
, N
->getIncludePath());
1938 EXPECT_EQ(Sysroot
, N
->getISysRoot());
1939 EXPECT_EQ(N
, DIModule::get(Context
, Scope
, Name
,
1940 ConfigMacro
, Includes
, Sysroot
));
1941 EXPECT_NE(N
, DIModule::get(Context
, getFile(), Name
,
1942 ConfigMacro
, Includes
, Sysroot
));
1943 EXPECT_NE(N
, DIModule::get(Context
, Scope
, "other",
1944 ConfigMacro
, Includes
, Sysroot
));
1945 EXPECT_NE(N
, DIModule::get(Context
, Scope
, Name
,
1946 "other", Includes
, Sysroot
));
1947 EXPECT_NE(N
, DIModule::get(Context
, Scope
, Name
,
1948 ConfigMacro
, "other", Sysroot
));
1949 EXPECT_NE(N
, DIModule::get(Context
, Scope
, Name
,
1950 ConfigMacro
, Includes
, "other"));
1952 TempDIModule Temp
= N
->clone();
1953 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1956 typedef MetadataTest DITemplateTypeParameterTest
;
1958 TEST_F(DITemplateTypeParameterTest
, get
) {
1959 StringRef Name
= "template";
1960 DIType
*Type
= getBasicType("basic");
1962 auto *N
= DITemplateTypeParameter::get(Context
, Name
, Type
);
1964 EXPECT_EQ(dwarf::DW_TAG_template_type_parameter
, N
->getTag());
1965 EXPECT_EQ(Name
, N
->getName());
1966 EXPECT_EQ(Type
, N
->getType());
1967 EXPECT_EQ(N
, DITemplateTypeParameter::get(Context
, Name
, Type
));
1969 EXPECT_NE(N
, DITemplateTypeParameter::get(Context
, "other", Type
));
1971 DITemplateTypeParameter::get(Context
, Name
, getBasicType("other")));
1973 TempDITemplateTypeParameter Temp
= N
->clone();
1974 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
1977 typedef MetadataTest DITemplateValueParameterTest
;
1979 TEST_F(DITemplateValueParameterTest
, get
) {
1980 unsigned Tag
= dwarf::DW_TAG_template_value_parameter
;
1981 StringRef Name
= "template";
1982 DIType
*Type
= getBasicType("basic");
1983 Metadata
*Value
= getConstantAsMetadata();
1985 auto *N
= DITemplateValueParameter::get(Context
, Tag
, Name
, Type
, Value
);
1986 EXPECT_EQ(Tag
, N
->getTag());
1987 EXPECT_EQ(Name
, N
->getName());
1988 EXPECT_EQ(Type
, N
->getType());
1989 EXPECT_EQ(Value
, N
->getValue());
1990 EXPECT_EQ(N
, DITemplateValueParameter::get(Context
, Tag
, Name
, Type
, Value
));
1992 EXPECT_NE(N
, DITemplateValueParameter::get(
1993 Context
, dwarf::DW_TAG_GNU_template_template_param
, Name
,
1996 DITemplateValueParameter::get(Context
, Tag
, "other", Type
, Value
));
1997 EXPECT_NE(N
, DITemplateValueParameter::get(Context
, Tag
, Name
,
1998 getBasicType("other"), Value
));
1999 EXPECT_NE(N
, DITemplateValueParameter::get(Context
, Tag
, Name
, Type
,
2000 getConstantAsMetadata()));
2002 TempDITemplateValueParameter Temp
= N
->clone();
2003 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
2006 typedef MetadataTest DIGlobalVariableTest
;
2008 TEST_F(DIGlobalVariableTest
, get
) {
2009 DIScope
*Scope
= getSubprogram();
2010 StringRef Name
= "name";
2011 StringRef LinkageName
= "linkage";
2012 DIFile
*File
= getFile();
2014 DIType
*Type
= getDerivedType();
2015 bool IsLocalToUnit
= false;
2016 bool IsDefinition
= true;
2017 MDTuple
*templateParams
= getTuple();
2018 DIDerivedType
*StaticDataMemberDeclaration
=
2019 cast
<DIDerivedType
>(getDerivedType());
2021 uint32_t AlignInBits
= 8;
2023 auto *N
= DIGlobalVariable::get(
2024 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
, IsLocalToUnit
,
2025 IsDefinition
, StaticDataMemberDeclaration
, templateParams
, AlignInBits
);
2027 EXPECT_EQ(dwarf::DW_TAG_variable
, N
->getTag());
2028 EXPECT_EQ(Scope
, N
->getScope());
2029 EXPECT_EQ(Name
, N
->getName());
2030 EXPECT_EQ(LinkageName
, N
->getLinkageName());
2031 EXPECT_EQ(File
, N
->getFile());
2032 EXPECT_EQ(Line
, N
->getLine());
2033 EXPECT_EQ(Type
, N
->getType());
2034 EXPECT_EQ(IsLocalToUnit
, N
->isLocalToUnit());
2035 EXPECT_EQ(IsDefinition
, N
->isDefinition());
2036 EXPECT_EQ(StaticDataMemberDeclaration
, N
->getStaticDataMemberDeclaration());
2037 EXPECT_EQ(templateParams
, N
->getTemplateParams());
2038 EXPECT_EQ(AlignInBits
, N
->getAlignInBits());
2039 EXPECT_EQ(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
, File
,
2040 Line
, Type
, IsLocalToUnit
, IsDefinition
,
2041 StaticDataMemberDeclaration
,
2042 templateParams
, AlignInBits
));
2044 EXPECT_NE(N
, DIGlobalVariable::get(
2045 Context
, getSubprogram(), Name
, LinkageName
, File
, Line
,
2046 Type
, IsLocalToUnit
, IsDefinition
,
2047 StaticDataMemberDeclaration
, templateParams
, AlignInBits
));
2048 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, "other", LinkageName
, File
,
2049 Line
, Type
, IsLocalToUnit
, IsDefinition
,
2050 StaticDataMemberDeclaration
,
2051 templateParams
, AlignInBits
));
2052 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, "other", File
, Line
,
2053 Type
, IsLocalToUnit
, IsDefinition
,
2054 StaticDataMemberDeclaration
,
2055 templateParams
, AlignInBits
));
2056 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
,
2057 getFile(), Line
, Type
, IsLocalToUnit
,
2058 IsDefinition
, StaticDataMemberDeclaration
,
2059 templateParams
, AlignInBits
));
2060 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
, File
,
2061 Line
+ 1, Type
, IsLocalToUnit
,
2062 IsDefinition
, StaticDataMemberDeclaration
,
2063 templateParams
, AlignInBits
));
2064 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
, File
,
2065 Line
, getDerivedType(), IsLocalToUnit
,
2066 IsDefinition
, StaticDataMemberDeclaration
,
2067 templateParams
, AlignInBits
));
2068 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
, File
,
2069 Line
, Type
, !IsLocalToUnit
, IsDefinition
,
2070 StaticDataMemberDeclaration
,
2071 templateParams
, AlignInBits
));
2072 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
, File
,
2073 Line
, Type
, IsLocalToUnit
, !IsDefinition
,
2074 StaticDataMemberDeclaration
,
2075 templateParams
, AlignInBits
));
2076 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
, File
,
2077 Line
, Type
, IsLocalToUnit
, IsDefinition
,
2078 cast
<DIDerivedType
>(getDerivedType()),
2079 templateParams
, AlignInBits
));
2080 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
, File
,
2081 Line
, Type
, IsLocalToUnit
, IsDefinition
,
2082 StaticDataMemberDeclaration
, nullptr,
2084 EXPECT_NE(N
, DIGlobalVariable::get(Context
, Scope
, Name
, LinkageName
, File
,
2085 Line
, Type
, IsLocalToUnit
, IsDefinition
,
2086 StaticDataMemberDeclaration
,
2087 templateParams
, (AlignInBits
<< 1)));
2089 TempDIGlobalVariable Temp
= N
->clone();
2090 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
2093 typedef MetadataTest DIGlobalVariableExpressionTest
;
2095 TEST_F(DIGlobalVariableExpressionTest
, get
) {
2096 DIScope
*Scope
= getSubprogram();
2097 StringRef Name
= "name";
2098 StringRef LinkageName
= "linkage";
2099 DIFile
*File
= getFile();
2101 DIType
*Type
= getDerivedType();
2102 bool IsLocalToUnit
= false;
2103 bool IsDefinition
= true;
2104 MDTuple
*templateParams
= getTuple();
2105 auto *Expr
= DIExpression::get(Context
, {1, 2});
2106 auto *Expr2
= DIExpression::get(Context
, {1, 2, 3});
2107 DIDerivedType
*StaticDataMemberDeclaration
=
2108 cast
<DIDerivedType
>(getDerivedType());
2109 uint32_t AlignInBits
= 8;
2111 auto *Var
= DIGlobalVariable::get(
2112 Context
, Scope
, Name
, LinkageName
, File
, Line
, Type
, IsLocalToUnit
,
2113 IsDefinition
, StaticDataMemberDeclaration
, templateParams
, AlignInBits
);
2114 auto *Var2
= DIGlobalVariable::get(
2115 Context
, Scope
, "other", LinkageName
, File
, Line
, Type
, IsLocalToUnit
,
2116 IsDefinition
, StaticDataMemberDeclaration
, templateParams
, AlignInBits
);
2117 auto *N
= DIGlobalVariableExpression::get(Context
, Var
, Expr
);
2119 EXPECT_EQ(Var
, N
->getVariable());
2120 EXPECT_EQ(Expr
, N
->getExpression());
2121 EXPECT_EQ(N
, DIGlobalVariableExpression::get(Context
, Var
, Expr
));
2122 EXPECT_NE(N
, DIGlobalVariableExpression::get(Context
, Var2
, Expr
));
2123 EXPECT_NE(N
, DIGlobalVariableExpression::get(Context
, Var
, Expr2
));
2125 TempDIGlobalVariableExpression Temp
= N
->clone();
2126 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
2129 typedef MetadataTest DILocalVariableTest
;
2131 TEST_F(DILocalVariableTest
, get
) {
2132 DILocalScope
*Scope
= getSubprogram();
2133 StringRef Name
= "name";
2134 DIFile
*File
= getFile();
2136 DIType
*Type
= getDerivedType();
2138 DINode::DIFlags Flags
= static_cast<DINode::DIFlags
>(7);
2139 uint32_t AlignInBits
= 8;
2142 DILocalVariable::get(Context
, Scope
, Name
, File
, Line
, Type
, Arg
, Flags
,
2144 EXPECT_TRUE(N
->isParameter());
2145 EXPECT_EQ(Scope
, N
->getScope());
2146 EXPECT_EQ(Name
, N
->getName());
2147 EXPECT_EQ(File
, N
->getFile());
2148 EXPECT_EQ(Line
, N
->getLine());
2149 EXPECT_EQ(Type
, N
->getType());
2150 EXPECT_EQ(Arg
, N
->getArg());
2151 EXPECT_EQ(Flags
, N
->getFlags());
2152 EXPECT_EQ(AlignInBits
, N
->getAlignInBits());
2153 EXPECT_EQ(N
, DILocalVariable::get(Context
, Scope
, Name
, File
, Line
, Type
, Arg
,
2154 Flags
, AlignInBits
));
2157 DILocalVariable::get(Context
, Scope
, Name
, File
, Line
, Type
, 0, Flags
,
2158 AlignInBits
)->isParameter());
2159 EXPECT_NE(N
, DILocalVariable::get(Context
, getSubprogram(), Name
, File
, Line
,
2160 Type
, Arg
, Flags
, AlignInBits
));
2161 EXPECT_NE(N
, DILocalVariable::get(Context
, Scope
, "other", File
, Line
, Type
,
2162 Arg
, Flags
, AlignInBits
));
2163 EXPECT_NE(N
, DILocalVariable::get(Context
, Scope
, Name
, getFile(), Line
, Type
,
2164 Arg
, Flags
, AlignInBits
));
2165 EXPECT_NE(N
, DILocalVariable::get(Context
, Scope
, Name
, File
, Line
+ 1, Type
,
2166 Arg
, Flags
, AlignInBits
));
2167 EXPECT_NE(N
, DILocalVariable::get(Context
, Scope
, Name
, File
, Line
,
2168 getDerivedType(), Arg
, Flags
, AlignInBits
));
2169 EXPECT_NE(N
, DILocalVariable::get(Context
, Scope
, Name
, File
, Line
, Type
,
2170 Arg
+ 1, Flags
, AlignInBits
));
2171 EXPECT_NE(N
, DILocalVariable::get(Context
, Scope
, Name
, File
, Line
, Type
,
2172 Arg
, Flags
, (AlignInBits
<< 1)));
2174 TempDILocalVariable Temp
= N
->clone();
2175 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
2178 TEST_F(DILocalVariableTest
, getArg256
) {
2179 EXPECT_EQ(255u, DILocalVariable::get(Context
, getSubprogram(), "", getFile(),
2180 0, nullptr, 255, DINode::FlagZero
, 0)
2182 EXPECT_EQ(256u, DILocalVariable::get(Context
, getSubprogram(), "", getFile(),
2183 0, nullptr, 256, DINode::FlagZero
, 0)
2185 EXPECT_EQ(257u, DILocalVariable::get(Context
, getSubprogram(), "", getFile(),
2186 0, nullptr, 257, DINode::FlagZero
, 0)
2188 unsigned Max
= UINT16_MAX
;
2189 EXPECT_EQ(Max
, DILocalVariable::get(Context
, getSubprogram(), "", getFile(),
2190 0, nullptr, Max
, DINode::FlagZero
, 0)
2194 typedef MetadataTest DIExpressionTest
;
2196 TEST_F(DIExpressionTest
, get
) {
2197 uint64_t Elements
[] = {2, 6, 9, 78, 0};
2198 auto *N
= DIExpression::get(Context
, Elements
);
2199 EXPECT_EQ(makeArrayRef(Elements
), N
->getElements());
2200 EXPECT_EQ(N
, DIExpression::get(Context
, Elements
));
2202 EXPECT_EQ(5u, N
->getNumElements());
2203 EXPECT_EQ(2u, N
->getElement(0));
2204 EXPECT_EQ(6u, N
->getElement(1));
2205 EXPECT_EQ(9u, N
->getElement(2));
2206 EXPECT_EQ(78u, N
->getElement(3));
2207 EXPECT_EQ(0u, N
->getElement(4));
2209 TempDIExpression Temp
= N
->clone();
2210 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
2212 // Test DIExpression::prepend().
2213 uint64_t Elts0
[] = {dwarf::DW_OP_LLVM_fragment
, 0, 32};
2214 auto *N0
= DIExpression::get(Context
, Elts0
);
2215 auto *N0WithPrependedOps
= DIExpression::prepend(N0
, true, 64, true, true);
2216 uint64_t Elts1
[] = {dwarf::DW_OP_deref
,
2217 dwarf::DW_OP_plus_uconst
, 64,
2219 dwarf::DW_OP_stack_value
,
2220 dwarf::DW_OP_LLVM_fragment
, 0, 32};
2221 auto *N1
= DIExpression::get(Context
, Elts1
);
2222 EXPECT_EQ(N0WithPrependedOps
, N1
);
2224 // Test DIExpression::append().
2225 uint64_t Elts2
[] = {dwarf::DW_OP_deref
, dwarf::DW_OP_plus_uconst
, 64,
2226 dwarf::DW_OP_deref
, dwarf::DW_OP_stack_value
};
2227 auto *N2
= DIExpression::append(N0
, Elts2
);
2228 EXPECT_EQ(N0WithPrependedOps
, N2
);
2231 TEST_F(DIExpressionTest
, isValid
) {
2232 #define EXPECT_VALID(...) \
2234 uint64_t Elements[] = {__VA_ARGS__}; \
2235 EXPECT_TRUE(DIExpression::get(Context, Elements)->isValid()); \
2237 #define EXPECT_INVALID(...) \
2239 uint64_t Elements[] = {__VA_ARGS__}; \
2240 EXPECT_FALSE(DIExpression::get(Context, Elements)->isValid()); \
2243 // Empty expression should be valid.
2244 EXPECT_TRUE(DIExpression::get(Context
, None
));
2246 // Valid constructions.
2247 EXPECT_VALID(dwarf::DW_OP_plus_uconst
, 6);
2248 EXPECT_VALID(dwarf::DW_OP_constu
, 6, dwarf::DW_OP_plus
);
2249 EXPECT_VALID(dwarf::DW_OP_deref
);
2250 EXPECT_VALID(dwarf::DW_OP_LLVM_fragment
, 3, 7);
2251 EXPECT_VALID(dwarf::DW_OP_plus_uconst
, 6, dwarf::DW_OP_deref
);
2252 EXPECT_VALID(dwarf::DW_OP_deref
, dwarf::DW_OP_plus_uconst
, 6);
2253 EXPECT_VALID(dwarf::DW_OP_deref
, dwarf::DW_OP_LLVM_fragment
, 3, 7);
2254 EXPECT_VALID(dwarf::DW_OP_deref
, dwarf::DW_OP_plus_uconst
, 6,
2255 dwarf::DW_OP_LLVM_fragment
, 3, 7);
2257 // Invalid constructions.
2258 EXPECT_INVALID(~0u);
2259 EXPECT_INVALID(dwarf::DW_OP_plus
, 0);
2260 EXPECT_INVALID(dwarf::DW_OP_plus_uconst
);
2261 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment
);
2262 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment
, 3);
2263 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment
, 3, 7, dwarf::DW_OP_plus_uconst
, 3);
2264 EXPECT_INVALID(dwarf::DW_OP_LLVM_fragment
, 3, 7, dwarf::DW_OP_deref
);
2267 #undef EXPECT_INVALID
2270 typedef MetadataTest DIObjCPropertyTest
;
2272 TEST_F(DIObjCPropertyTest
, get
) {
2273 StringRef Name
= "name";
2274 DIFile
*File
= getFile();
2276 StringRef GetterName
= "getter";
2277 StringRef SetterName
= "setter";
2278 unsigned Attributes
= 7;
2279 DIType
*Type
= getBasicType("basic");
2281 auto *N
= DIObjCProperty::get(Context
, Name
, File
, Line
, GetterName
,
2282 SetterName
, Attributes
, Type
);
2284 EXPECT_EQ(dwarf::DW_TAG_APPLE_property
, N
->getTag());
2285 EXPECT_EQ(Name
, N
->getName());
2286 EXPECT_EQ(File
, N
->getFile());
2287 EXPECT_EQ(Line
, N
->getLine());
2288 EXPECT_EQ(GetterName
, N
->getGetterName());
2289 EXPECT_EQ(SetterName
, N
->getSetterName());
2290 EXPECT_EQ(Attributes
, N
->getAttributes());
2291 EXPECT_EQ(Type
, N
->getType());
2292 EXPECT_EQ(N
, DIObjCProperty::get(Context
, Name
, File
, Line
, GetterName
,
2293 SetterName
, Attributes
, Type
));
2295 EXPECT_NE(N
, DIObjCProperty::get(Context
, "other", File
, Line
, GetterName
,
2296 SetterName
, Attributes
, Type
));
2297 EXPECT_NE(N
, DIObjCProperty::get(Context
, Name
, getFile(), Line
, GetterName
,
2298 SetterName
, Attributes
, Type
));
2299 EXPECT_NE(N
, DIObjCProperty::get(Context
, Name
, File
, Line
+ 1, GetterName
,
2300 SetterName
, Attributes
, Type
));
2301 EXPECT_NE(N
, DIObjCProperty::get(Context
, Name
, File
, Line
, "other",
2302 SetterName
, Attributes
, Type
));
2303 EXPECT_NE(N
, DIObjCProperty::get(Context
, Name
, File
, Line
, GetterName
,
2304 "other", Attributes
, Type
));
2305 EXPECT_NE(N
, DIObjCProperty::get(Context
, Name
, File
, Line
, GetterName
,
2306 SetterName
, Attributes
+ 1, Type
));
2307 EXPECT_NE(N
, DIObjCProperty::get(Context
, Name
, File
, Line
, GetterName
,
2308 SetterName
, Attributes
,
2309 getBasicType("other")));
2311 TempDIObjCProperty Temp
= N
->clone();
2312 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
2315 typedef MetadataTest DIImportedEntityTest
;
2317 TEST_F(DIImportedEntityTest
, get
) {
2318 unsigned Tag
= dwarf::DW_TAG_imported_module
;
2319 DIScope
*Scope
= getSubprogram();
2320 DINode
*Entity
= getCompositeType();
2321 DIFile
*File
= getFile();
2323 StringRef Name
= "name";
2326 DIImportedEntity::get(Context
, Tag
, Scope
, Entity
, File
, Line
, Name
);
2328 EXPECT_EQ(Tag
, N
->getTag());
2329 EXPECT_EQ(Scope
, N
->getScope());
2330 EXPECT_EQ(Entity
, N
->getEntity());
2331 EXPECT_EQ(File
, N
->getFile());
2332 EXPECT_EQ(Line
, N
->getLine());
2333 EXPECT_EQ(Name
, N
->getName());
2335 N
, DIImportedEntity::get(Context
, Tag
, Scope
, Entity
, File
, Line
, Name
));
2338 DIImportedEntity::get(Context
, dwarf::DW_TAG_imported_declaration
,
2339 Scope
, Entity
, File
, Line
, Name
));
2340 EXPECT_NE(N
, DIImportedEntity::get(Context
, Tag
, getSubprogram(), Entity
,
2342 EXPECT_NE(N
, DIImportedEntity::get(Context
, Tag
, Scope
, getCompositeType(),
2344 EXPECT_NE(N
, DIImportedEntity::get(Context
, Tag
, Scope
, Entity
, nullptr, Line
,
2346 EXPECT_NE(N
, DIImportedEntity::get(Context
, Tag
, Scope
, Entity
, File
,
2348 EXPECT_NE(N
, DIImportedEntity::get(Context
, Tag
, Scope
, Entity
, File
, Line
,
2351 TempDIImportedEntity Temp
= N
->clone();
2352 EXPECT_EQ(N
, MDNode::replaceWithUniqued(std::move(Temp
)));
2355 typedef MetadataTest MetadataAsValueTest
;
2357 TEST_F(MetadataAsValueTest
, MDNode
) {
2358 MDNode
*N
= MDNode::get(Context
, None
);
2359 auto *V
= MetadataAsValue::get(Context
, N
);
2360 EXPECT_TRUE(V
->getType()->isMetadataTy());
2361 EXPECT_EQ(N
, V
->getMetadata());
2363 auto *V2
= MetadataAsValue::get(Context
, N
);
2367 TEST_F(MetadataAsValueTest
, MDNodeMDNode
) {
2368 MDNode
*N
= MDNode::get(Context
, None
);
2369 Metadata
*Ops
[] = {N
};
2370 MDNode
*N2
= MDNode::get(Context
, Ops
);
2371 auto *V
= MetadataAsValue::get(Context
, N2
);
2372 EXPECT_TRUE(V
->getType()->isMetadataTy());
2373 EXPECT_EQ(N2
, V
->getMetadata());
2375 auto *V2
= MetadataAsValue::get(Context
, N2
);
2378 auto *V3
= MetadataAsValue::get(Context
, N
);
2379 EXPECT_TRUE(V3
->getType()->isMetadataTy());
2381 EXPECT_EQ(N
, V3
->getMetadata());
2384 TEST_F(MetadataAsValueTest
, MDNodeConstant
) {
2385 auto *C
= ConstantInt::getTrue(Context
);
2386 auto *MD
= ConstantAsMetadata::get(C
);
2387 Metadata
*Ops
[] = {MD
};
2388 auto *N
= MDNode::get(Context
, Ops
);
2390 auto *V
= MetadataAsValue::get(Context
, MD
);
2391 EXPECT_TRUE(V
->getType()->isMetadataTy());
2392 EXPECT_EQ(MD
, V
->getMetadata());
2394 auto *V2
= MetadataAsValue::get(Context
, N
);
2395 EXPECT_EQ(MD
, V2
->getMetadata());
2399 typedef MetadataTest ValueAsMetadataTest
;
2401 TEST_F(ValueAsMetadataTest
, UpdatesOnRAUW
) {
2402 Type
*Ty
= Type::getInt1PtrTy(Context
);
2403 std::unique_ptr
<GlobalVariable
> GV0(
2404 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
2405 auto *MD
= ValueAsMetadata::get(GV0
.get());
2406 EXPECT_TRUE(MD
->getValue() == GV0
.get());
2407 ASSERT_TRUE(GV0
->use_empty());
2409 std::unique_ptr
<GlobalVariable
> GV1(
2410 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
2411 GV0
->replaceAllUsesWith(GV1
.get());
2412 EXPECT_TRUE(MD
->getValue() == GV1
.get());
2415 TEST_F(ValueAsMetadataTest
, TempTempReplacement
) {
2416 // Create a constant.
2417 ConstantAsMetadata
*CI
=
2418 ConstantAsMetadata::get(ConstantInt::get(Context
, APInt(8, 0)));
2420 auto Temp1
= MDTuple::getTemporary(Context
, None
);
2421 auto Temp2
= MDTuple::getTemporary(Context
, {CI
});
2422 auto *N
= MDTuple::get(Context
, {Temp1
.get()});
2424 // Test replacing a temporary node with another temporary node.
2425 Temp1
->replaceAllUsesWith(Temp2
.get());
2426 EXPECT_EQ(N
->getOperand(0), Temp2
.get());
2428 // Clean up Temp2 for teardown.
2429 Temp2
->replaceAllUsesWith(nullptr);
2432 TEST_F(ValueAsMetadataTest
, CollidingDoubleUpdates
) {
2433 // Create a constant.
2434 ConstantAsMetadata
*CI
=
2435 ConstantAsMetadata::get(ConstantInt::get(Context
, APInt(8, 0)));
2437 // Create a temporary to prevent nodes from resolving.
2438 auto Temp
= MDTuple::getTemporary(Context
, None
);
2440 // When the first operand of N1 gets reset to nullptr, it'll collide with N2.
2441 Metadata
*Ops1
[] = {CI
, CI
, Temp
.get()};
2442 Metadata
*Ops2
[] = {nullptr, CI
, Temp
.get()};
2444 auto *N1
= MDTuple::get(Context
, Ops1
);
2445 auto *N2
= MDTuple::get(Context
, Ops2
);
2448 // Tell metadata that the constant is getting deleted.
2450 // After this, N1 will be invalid, so don't touch it.
2451 ValueAsMetadata::handleDeletion(CI
->getValue());
2452 EXPECT_EQ(nullptr, N2
->getOperand(0));
2453 EXPECT_EQ(nullptr, N2
->getOperand(1));
2454 EXPECT_EQ(Temp
.get(), N2
->getOperand(2));
2456 // Clean up Temp for teardown.
2457 Temp
->replaceAllUsesWith(nullptr);
2460 typedef MetadataTest TrackingMDRefTest
;
2462 TEST_F(TrackingMDRefTest
, UpdatesOnRAUW
) {
2463 Type
*Ty
= Type::getInt1PtrTy(Context
);
2464 std::unique_ptr
<GlobalVariable
> GV0(
2465 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
2466 TypedTrackingMDRef
<ValueAsMetadata
> MD(ValueAsMetadata::get(GV0
.get()));
2467 EXPECT_TRUE(MD
->getValue() == GV0
.get());
2468 ASSERT_TRUE(GV0
->use_empty());
2470 std::unique_ptr
<GlobalVariable
> GV1(
2471 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
2472 GV0
->replaceAllUsesWith(GV1
.get());
2473 EXPECT_TRUE(MD
->getValue() == GV1
.get());
2475 // Reset it, so we don't inadvertently test deletion.
2479 TEST_F(TrackingMDRefTest
, UpdatesOnDeletion
) {
2480 Type
*Ty
= Type::getInt1PtrTy(Context
);
2481 std::unique_ptr
<GlobalVariable
> GV(
2482 new GlobalVariable(Ty
, false, GlobalValue::ExternalLinkage
));
2483 TypedTrackingMDRef
<ValueAsMetadata
> MD(ValueAsMetadata::get(GV
.get()));
2484 EXPECT_TRUE(MD
->getValue() == GV
.get());
2485 ASSERT_TRUE(GV
->use_empty());
2491 TEST(NamedMDNodeTest
, Search
) {
2492 LLVMContext Context
;
2493 ConstantAsMetadata
*C
=
2494 ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context
), 1));
2495 ConstantAsMetadata
*C2
=
2496 ConstantAsMetadata::get(ConstantInt::get(Type::getInt32Ty(Context
), 2));
2498 Metadata
*const V
= C
;
2499 Metadata
*const V2
= C2
;
2500 MDNode
*n
= MDNode::get(Context
, V
);
2501 MDNode
*n2
= MDNode::get(Context
, V2
);
2503 Module
M("MyModule", Context
);
2504 const char *Name
= "llvm.NMD1";
2505 NamedMDNode
*NMD
= M
.getOrInsertNamedMetadata(Name
);
2507 NMD
->addOperand(n2
);
2510 raw_string_ostream
oss(Str
);
2512 EXPECT_STREQ("!llvm.NMD1 = !{!0, !1}\n",
2516 typedef MetadataTest FunctionAttachmentTest
;
2517 TEST_F(FunctionAttachmentTest
, setMetadata
) {
2518 Function
*F
= getFunction("foo");
2519 ASSERT_FALSE(F
->hasMetadata());
2520 EXPECT_EQ(nullptr, F
->getMetadata(LLVMContext::MD_dbg
));
2521 EXPECT_EQ(nullptr, F
->getMetadata("dbg"));
2522 EXPECT_EQ(nullptr, F
->getMetadata("other"));
2524 DISubprogram
*SP1
= getSubprogram();
2525 DISubprogram
*SP2
= getSubprogram();
2526 ASSERT_NE(SP1
, SP2
);
2528 F
->setMetadata("dbg", SP1
);
2529 EXPECT_TRUE(F
->hasMetadata());
2530 EXPECT_EQ(SP1
, F
->getMetadata(LLVMContext::MD_dbg
));
2531 EXPECT_EQ(SP1
, F
->getMetadata("dbg"));
2532 EXPECT_EQ(nullptr, F
->getMetadata("other"));
2534 F
->setMetadata(LLVMContext::MD_dbg
, SP2
);
2535 EXPECT_TRUE(F
->hasMetadata());
2536 EXPECT_EQ(SP2
, F
->getMetadata(LLVMContext::MD_dbg
));
2537 EXPECT_EQ(SP2
, F
->getMetadata("dbg"));
2538 EXPECT_EQ(nullptr, F
->getMetadata("other"));
2540 F
->setMetadata("dbg", nullptr);
2541 EXPECT_FALSE(F
->hasMetadata());
2542 EXPECT_EQ(nullptr, F
->getMetadata(LLVMContext::MD_dbg
));
2543 EXPECT_EQ(nullptr, F
->getMetadata("dbg"));
2544 EXPECT_EQ(nullptr, F
->getMetadata("other"));
2546 MDTuple
*T1
= getTuple();
2547 MDTuple
*T2
= getTuple();
2550 F
->setMetadata("other1", T1
);
2551 F
->setMetadata("other2", T2
);
2552 EXPECT_TRUE(F
->hasMetadata());
2553 EXPECT_EQ(T1
, F
->getMetadata("other1"));
2554 EXPECT_EQ(T2
, F
->getMetadata("other2"));
2555 EXPECT_EQ(nullptr, F
->getMetadata("dbg"));
2557 F
->setMetadata("other1", T2
);
2558 F
->setMetadata("other2", T1
);
2559 EXPECT_EQ(T2
, F
->getMetadata("other1"));
2560 EXPECT_EQ(T1
, F
->getMetadata("other2"));
2562 F
->setMetadata("other1", nullptr);
2563 F
->setMetadata("other2", nullptr);
2564 EXPECT_FALSE(F
->hasMetadata());
2565 EXPECT_EQ(nullptr, F
->getMetadata("other1"));
2566 EXPECT_EQ(nullptr, F
->getMetadata("other2"));
2569 TEST_F(FunctionAttachmentTest
, getAll
) {
2570 Function
*F
= getFunction("foo");
2572 MDTuple
*T1
= getTuple();
2573 MDTuple
*T2
= getTuple();
2574 MDTuple
*P
= getTuple();
2575 DISubprogram
*SP
= getSubprogram();
2577 F
->setMetadata("other1", T2
);
2578 F
->setMetadata(LLVMContext::MD_dbg
, SP
);
2579 F
->setMetadata("other2", T1
);
2580 F
->setMetadata(LLVMContext::MD_prof
, P
);
2581 F
->setMetadata("other2", T2
);
2582 F
->setMetadata("other1", T1
);
2584 SmallVector
<std::pair
<unsigned, MDNode
*>, 4> MDs
;
2585 F
->getAllMetadata(MDs
);
2586 ASSERT_EQ(4u, MDs
.size());
2587 EXPECT_EQ(LLVMContext::MD_dbg
, MDs
[0].first
);
2588 EXPECT_EQ(LLVMContext::MD_prof
, MDs
[1].first
);
2589 EXPECT_EQ(Context
.getMDKindID("other1"), MDs
[2].first
);
2590 EXPECT_EQ(Context
.getMDKindID("other2"), MDs
[3].first
);
2591 EXPECT_EQ(SP
, MDs
[0].second
);
2592 EXPECT_EQ(P
, MDs
[1].second
);
2593 EXPECT_EQ(T1
, MDs
[2].second
);
2594 EXPECT_EQ(T2
, MDs
[3].second
);
2597 TEST_F(FunctionAttachmentTest
, Verifier
) {
2598 Function
*F
= getFunction("foo");
2599 F
->setMetadata("attach", getTuple());
2600 F
->setIsMaterializable(true);
2602 // Confirm this is materializable.
2603 ASSERT_TRUE(F
->isMaterializable());
2605 // Materializable functions cannot have metadata attachments.
2606 EXPECT_TRUE(verifyFunction(*F
));
2608 // Function declarations can.
2609 F
->setIsMaterializable(false);
2610 EXPECT_FALSE(verifyModule(*F
->getParent()));
2611 EXPECT_FALSE(verifyFunction(*F
));
2613 // So can definitions.
2614 (void)new UnreachableInst(Context
, BasicBlock::Create(Context
, "bb", F
));
2615 EXPECT_FALSE(verifyModule(*F
->getParent()));
2616 EXPECT_FALSE(verifyFunction(*F
));
2619 TEST_F(FunctionAttachmentTest
, EntryCount
) {
2620 Function
*F
= getFunction("foo");
2621 EXPECT_FALSE(F
->getEntryCount().hasValue());
2622 F
->setEntryCount(12304, Function::PCT_Real
);
2623 auto Count
= F
->getEntryCount();
2624 EXPECT_TRUE(Count
.hasValue());
2625 EXPECT_EQ(12304u, Count
.getCount());
2626 EXPECT_EQ(Function::PCT_Real
, Count
.getType());
2628 // Repeat the same for synthetic counts.
2629 F
= getFunction("bar");
2630 EXPECT_FALSE(F
->getEntryCount().hasValue());
2631 F
->setEntryCount(123, Function::PCT_Synthetic
);
2632 Count
= F
->getEntryCount();
2633 EXPECT_TRUE(Count
.hasValue());
2634 EXPECT_EQ(123u, Count
.getCount());
2635 EXPECT_EQ(Function::PCT_Synthetic
, Count
.getType());
2638 TEST_F(FunctionAttachmentTest
, SubprogramAttachment
) {
2639 Function
*F
= getFunction("foo");
2640 DISubprogram
*SP
= getSubprogram();
2641 F
->setSubprogram(SP
);
2643 // Note that the static_cast confirms that F->getSubprogram() actually
2644 // returns an DISubprogram.
2645 EXPECT_EQ(SP
, static_cast<DISubprogram
*>(F
->getSubprogram()));
2646 EXPECT_EQ(SP
, F
->getMetadata("dbg"));
2647 EXPECT_EQ(SP
, F
->getMetadata(LLVMContext::MD_dbg
));
2650 typedef MetadataTest DistinctMDOperandPlaceholderTest
;
2651 TEST_F(DistinctMDOperandPlaceholderTest
, getID
) {
2652 EXPECT_EQ(7u, DistinctMDOperandPlaceholder(7).getID());
2655 TEST_F(DistinctMDOperandPlaceholderTest
, replaceUseWith
) {
2656 // Set up some placeholders.
2657 DistinctMDOperandPlaceholder
PH0(7);
2658 DistinctMDOperandPlaceholder
PH1(3);
2659 DistinctMDOperandPlaceholder
PH2(0);
2660 Metadata
*Ops
[] = {&PH0
, &PH1
, &PH2
};
2661 auto *D
= MDTuple::getDistinct(Context
, Ops
);
2662 ASSERT_EQ(&PH0
, D
->getOperand(0));
2663 ASSERT_EQ(&PH1
, D
->getOperand(1));
2664 ASSERT_EQ(&PH2
, D
->getOperand(2));
2667 auto *N0
= MDTuple::get(Context
, None
);
2668 auto *N1
= MDTuple::get(Context
, N0
);
2669 PH0
.replaceUseWith(N0
);
2670 PH1
.replaceUseWith(N1
);
2671 PH2
.replaceUseWith(nullptr);
2672 EXPECT_EQ(N0
, D
->getOperand(0));
2673 EXPECT_EQ(N1
, D
->getOperand(1));
2674 EXPECT_EQ(nullptr, D
->getOperand(2));
2677 TEST_F(DistinctMDOperandPlaceholderTest
, replaceUseWithNoUser
) {
2678 // There is no user, but we can still call replace.
2679 DistinctMDOperandPlaceholder(7).replaceUseWith(MDTuple::get(Context
, None
));
2682 // Test various assertions in metadata tracking. Don't run these tests if gtest
2683 // will use SEH to recover from them. Two of these tests get halfway through
2684 // inserting metadata into DenseMaps for tracking purposes, and then they
2685 // assert, and we attempt to destroy an LLVMContext with broken invariants,
2686 // leading to infinite loops.
2687 #if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG) && !defined(GTEST_HAS_SEH)
2688 TEST_F(DistinctMDOperandPlaceholderTest
, MetadataAsValue
) {
2689 // This shouldn't crash.
2690 DistinctMDOperandPlaceholder
PH(7);
2691 EXPECT_DEATH(MetadataAsValue::get(Context
, &PH
),
2692 "Unexpected callback to owner");
2695 TEST_F(DistinctMDOperandPlaceholderTest
, UniquedMDNode
) {
2696 // This shouldn't crash.
2697 DistinctMDOperandPlaceholder
PH(7);
2698 EXPECT_DEATH(MDTuple::get(Context
, &PH
), "Unexpected callback to owner");
2701 TEST_F(DistinctMDOperandPlaceholderTest
, SecondDistinctMDNode
) {
2702 // This shouldn't crash.
2703 DistinctMDOperandPlaceholder
PH(7);
2704 MDTuple::getDistinct(Context
, &PH
);
2705 EXPECT_DEATH(MDTuple::getDistinct(Context
, &PH
),
2706 "Placeholders can only be used once");
2709 TEST_F(DistinctMDOperandPlaceholderTest
, TrackingMDRefAndDistinctMDNode
) {
2710 // TrackingMDRef doesn't install an owner callback, so it can't be detected
2711 // as an invalid use. However, using a placeholder in a TrackingMDRef *and*
2712 // a distinct node isn't possible and we should assert.
2714 // (There's no positive test for using TrackingMDRef because it's not a
2715 // useful thing to do.)
2717 DistinctMDOperandPlaceholder
PH(7);
2718 MDTuple::getDistinct(Context
, &PH
);
2719 EXPECT_DEATH(TrackingMDRef
Ref(&PH
), "Placeholders can only be used once");
2722 DistinctMDOperandPlaceholder
PH(7);
2723 TrackingMDRef
Ref(&PH
);
2724 EXPECT_DEATH(MDTuple::getDistinct(Context
, &PH
),
2725 "Placeholders can only be used once");