MetadataTest.cpp revision f83264b423af49533c5c19de03c3fa82827878fd
13565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//===- llvm/unittest/VMCore/Metadata.cpp - Metadata unit tests ------------===// 23565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// 33565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// The LLVM Compiler Infrastructure 43565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// 53565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// This file is distributed under the University of Illinois Open Source 63565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// License. See LICENSE.TXT for details. 73565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// 83565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming//===----------------------------------------------------------------------===// 93565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 103565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "gtest/gtest.h" 113565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Constants.h" 123565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Instructions.h" 133565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming#include "llvm/Metadata.h" 142ddfd95d40e07f5fdf179a16e15a5d7c131837d8Jan Sjödin#include "llvm/Type.h" 15f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola#include "llvm/Support/ValueHandle.h" 16f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola#include <sstream> 173565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 18f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindolausing namespace llvm; 19f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 20f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindolanamespace { 213565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 223565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// Test that construction of MDString with different value produces different 233565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// MDString objects, even with the same string pointer and nulls in the string. 24f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael EspindolaTEST(MDStringTest, CreateDifferent) { 253565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming char x[3] = { 'f', 0, 'A' }; 263565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming MDString *s1 = getGlobalContext().getMDString(StringRef(&x[0], 3)); 27484291c27319668ad99cb87def000254357736fbRafael Espindola x[2] = 'B'; 2878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MDString *s2 = getGlobalContext().getMDString(StringRef(&x[0], 3)); 293565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming EXPECT_NE(s1, s2); 303565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming} 313565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming 323565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// Test that creation of MDStrings with the same string contents produces the 333565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming// same MDString object, even with different pointers. 343565a06ebf44a193a8b333cbeff2ee154298d450Matt FlemingTEST(MDStringTest, CreateSame) { 353565a06ebf44a193a8b333cbeff2ee154298d450Matt Fleming char x[4] = { 'a', 'b', 'c', 'X' }; 36f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola char y[4] = { 'a', 'b', 'c', 'Y' }; 37f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 38f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDString *s1 = getGlobalContext().getMDString(StringRef(&x[0], 3)); 39f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDString *s2 = getGlobalContext().getMDString(StringRef(&y[0], 3)); 40f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(s1, s2); 41f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola} 42f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 43f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola// Test that MDString prints out the string we fed it. 44f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael EspindolaTEST(MDStringTest, PrintingSimple) { 45f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola char *str = new char[13]; 46f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola strncpy(str, "testing 1 2 3", 13); 47f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDString *s = getGlobalContext().getMDString(StringRef(str, 13)); 48f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola strncpy(str, "aaaaaaaaaaaaa", 13); 49f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola delete[] str; 50f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 51f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola std::ostringstream oss; 52f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola s->print(oss); 53f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_STREQ("metadata !\"testing 1 2 3\"", oss.str().c_str()); 54f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola} 55f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 56f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola// Test printing of MDString with non-printable characters. 57f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael EspindolaTEST(MDStringTest, PrintingComplex) { 58f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola char str[5] = {0, '\n', '"', '\\', -1}; 59f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDString *s = getGlobalContext().getMDString(StringRef(str+0, 5)); 60f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola std::ostringstream oss; 61f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola s->print(oss); 62f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_STREQ("metadata !\"\\00\\0A\\22\\5C\\FF\"", oss.str().c_str()); 63858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper} 64f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 65f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola// Test the two constructors, and containing other Constants. 66f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael EspindolaTEST(MDNodeTest, Simple) { 67f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola char x[3] = { 'a', 'b', 'c' }; 68858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper char y[3] = { '1', '2', '3' }; 69f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 70f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDString *s1 = getGlobalContext().getMDString(StringRef(&x[0], 3)); 71f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDString *s2 = getGlobalContext().getMDString(StringRef(&y[0], 3)); 72858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper ConstantInt *CI = ConstantInt::get(getGlobalContext(), APInt(8, 0)); 73f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 74f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola std::vector<Value *> V; 75f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola V.push_back(s1); 76858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper V.push_back(CI); 77f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola V.push_back(s2); 78f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 79f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDNode *n1 = getGlobalContext().getMDNode(&V[0], 3); 80858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper Value *const c1 = n1; 81f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDNode *n2 = getGlobalContext().getMDNode(&c1, 1); 82f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDNode *n3 = getGlobalContext().getMDNode(&V[0], 3); 83f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_NE(n1, n2); 84f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(n1, n3); 85f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 86f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(3u, n1->getNumElements()); 87f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(s1, n1->getElement(0)); 88f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(CI, n1->getElement(1)); 89f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(s2, n1->getElement(2)); 90f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 91f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(1u, n2->getNumElements()); 92f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(n1, n2->getElement(0)); 93858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper 94f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola std::ostringstream oss1, oss2; 95f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola n1->print(oss1); 96f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola n2->print(oss2); 97858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper EXPECT_STREQ("!0 = metadata !{metadata !\"abc\", i8 0, metadata !\"123\"}\n", 98f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola oss1.str().c_str()); 99f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_STREQ("!0 = metadata !{metadata !1}\n" 100f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola "!1 = metadata !{metadata !\"abc\", i8 0, metadata !\"123\"}\n", 101f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola oss2.str().c_str()); 102f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola} 103f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 104f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael EspindolaTEST(MDNodeTest, Delete) { 1055f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer Constant *C = ConstantInt::get(Type::Int32Ty, 1); 1065f7692604d44192206fbaf390085a95c9fb1a40bDavid Meyer Instruction *I = new BitCastInst(C, Type::Int32Ty); 107f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 108f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola Value *const V = I; 109f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola MDNode *n = getGlobalContext().getMDNode(&V, 1); 110f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola WeakVH wvh = n; 111f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 112f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_EQ(n, wvh); 113f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 114f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola delete I; 115f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola 116f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola std::ostringstream oss; 117f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola wvh->print(oss); 118f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola EXPECT_STREQ("!0 = metadata !{null}\n", oss.str().c_str()); 119f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola} 120f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola} 121f340a29e7ae88f3443cef72f8007a78c3ce3ec83Rafael Espindola