MetadataTest.cpp 91 KB

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