X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=unittests%2FVMCore%2FMetadataTest.cpp;h=08927a2ff526bca6778acd69280e09de701d1f14;hb=b21d9aebba7e45ddcbce61dd501000049cefb335;hp=c92bb139b43324de5a90966f0d153c2e7e673fd8;hpb=9adc0abad3c3ed40a268ccbcee0c74cb9e1359fe;p=oota-llvm.git diff --git a/unittests/VMCore/MetadataTest.cpp b/unittests/VMCore/MetadataTest.cpp index c92bb139b43..08927a2ff52 100644 --- a/unittests/VMCore/MetadataTest.cpp +++ b/unittests/VMCore/MetadataTest.cpp @@ -10,130 +10,143 @@ #include "gtest/gtest.h" #include "llvm/Constants.h" #include "llvm/Instructions.h" -#include "llvm/MDNode.h" +#include "llvm/LLVMContext.h" +#include "llvm/Metadata.h" +#include "llvm/Module.h" #include "llvm/Type.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/Support/ValueHandle.h" -#include - using namespace llvm; namespace { +class MetadataTest : public testing::Test { +protected: + LLVMContext Context; +}; +typedef MetadataTest MDStringTest; + // Test that construction of MDString with different value produces different // MDString objects, even with the same string pointer and nulls in the string. -TEST(MDStringTest, CreateDifferent) { +TEST_F(MDStringTest, CreateDifferent) { char x[3] = { 'f', 0, 'A' }; - MDString *s1 = getGlobalContext().getMDString(&x[0], &x[3]); + MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); x[2] = 'B'; - MDString *s2 = getGlobalContext().getMDString(&x[0], &x[3]); + MDString *s2 = MDString::get(Context, StringRef(&x[0], 3)); EXPECT_NE(s1, s2); } // Test that creation of MDStrings with the same string contents produces the // same MDString object, even with different pointers. -TEST(MDStringTest, CreateSame) { +TEST_F(MDStringTest, CreateSame) { char x[4] = { 'a', 'b', 'c', 'X' }; char y[4] = { 'a', 'b', 'c', 'Y' }; - MDString *s1 = getGlobalContext().getMDString(&x[0], &x[3]); - MDString *s2 = getGlobalContext().getMDString(&y[0], &y[3]); + MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); + MDString *s2 = MDString::get(Context, StringRef(&y[0], 3)); EXPECT_EQ(s1, s2); } // Test that MDString prints out the string we fed it. -TEST(MDStringTest, PrintingSimple) { +TEST_F(MDStringTest, PrintingSimple) { char *str = new char[13]; strncpy(str, "testing 1 2 3", 13); - MDString *s = getGlobalContext().getMDString(str, str+13); + MDString *s = MDString::get(Context, StringRef(str, 13)); strncpy(str, "aaaaaaaaaaaaa", 13); delete[] str; - std::ostringstream oss; + std::string Str; + raw_string_ostream oss(Str); s->print(oss); EXPECT_STREQ("metadata !\"testing 1 2 3\"", oss.str().c_str()); } // Test printing of MDString with non-printable characters. -TEST(MDStringTest, PrintingComplex) { - char str[5] = {0, '\n', '"', '\\', -1}; - MDString *s = getGlobalContext().getMDString(str+0, str+5); - std::ostringstream oss; +TEST_F(MDStringTest, PrintingComplex) { + char str[5] = {0, '\n', '"', '\\', (char)-1}; + MDString *s = MDString::get(Context, StringRef(str+0, 5)); + std::string Str; + raw_string_ostream oss(Str); s->print(oss); EXPECT_STREQ("metadata !\"\\00\\0A\\22\\5C\\FF\"", oss.str().c_str()); } +typedef MetadataTest MDNodeTest; + // Test the two constructors, and containing other Constants. -TEST(MDNodeTest, Simple) { +TEST_F(MDNodeTest, Simple) { char x[3] = { 'a', 'b', 'c' }; char y[3] = { '1', '2', '3' }; - MDString *s1 = getGlobalContext().getMDString(&x[0], &x[3]); - MDString *s2 = getGlobalContext().getMDString(&y[0], &y[3]); - ConstantInt *CI = getGlobalContext().getConstantInt(APInt(8, 0)); + MDString *s1 = MDString::get(Context, StringRef(&x[0], 3)); + MDString *s2 = MDString::get(Context, StringRef(&y[0], 3)); + ConstantInt *CI = ConstantInt::get(getGlobalContext(), APInt(8, 0)); std::vector V; V.push_back(s1); V.push_back(CI); V.push_back(s2); - MDNode *n1 = getGlobalContext().getMDNode(&V[0], 3); + MDNode *n1 = MDNode::get(Context, V); Value *const c1 = n1; - MDNode *n2 = getGlobalContext().getMDNode(&c1, 1); - MDNode *n3 = getGlobalContext().getMDNode(&V[0], 3); + MDNode *n2 = MDNode::get(Context, c1); + Value *const c2 = n2; + MDNode *n3 = MDNode::get(Context, V); + MDNode *n4 = MDNode::getIfExists(Context, V); + MDNode *n5 = MDNode::getIfExists(Context, c1); + MDNode *n6 = MDNode::getIfExists(Context, c2); EXPECT_NE(n1, n2); +#ifdef ENABLE_MDNODE_UNIQUING EXPECT_EQ(n1, n3); - - EXPECT_EQ(3u, n1->getNumElements()); - EXPECT_EQ(s1, n1->getElement(0)); - EXPECT_EQ(CI, n1->getElement(1)); - EXPECT_EQ(s2, n1->getElement(2)); - - EXPECT_EQ(1u, n2->getNumElements()); - EXPECT_EQ(n1, n2->getElement(0)); - - std::ostringstream oss1, oss2; - n1->print(oss1); - n2->print(oss2); - EXPECT_STREQ("!0 = metadata !{metadata !\"abc\", i8 0, metadata !\"123\"}\n", - oss1.str().c_str()); - EXPECT_STREQ("!0 = metadata !{metadata !1}\n" - "!1 = metadata !{metadata !\"abc\", i8 0, metadata !\"123\"}\n", - oss2.str().c_str()); -} - -TEST(MDNodeTest, RAUW) { - Constant *C = getGlobalContext().getConstantInt(Type::Int32Ty, 1); - Instruction *I = new BitCastInst(C, Type::Int32Ty); - - Value *const V1 = I; - MDNode *n1 = getGlobalContext().getMDNode(&V1, 1); - WeakVH wn1 = n1; - - Value *const V2 = C; - MDNode *n2 = getGlobalContext().getMDNode(&V2, 1); - WeakVH wn2 = n2; - - EXPECT_NE(wn1, wn2); - - I->replaceAllUsesWith(C); - - EXPECT_EQ(wn1, wn2); +#else + (void) n3; +#endif + EXPECT_EQ(n4, n1); + EXPECT_EQ(n5, n2); + EXPECT_EQ(n6, (Value*)0); + + EXPECT_EQ(3u, n1->getNumOperands()); + EXPECT_EQ(s1, n1->getOperand(0)); + EXPECT_EQ(CI, n1->getOperand(1)); + EXPECT_EQ(s2, n1->getOperand(2)); + + EXPECT_EQ(1u, n2->getNumOperands()); + EXPECT_EQ(n1, n2->getOperand(0)); } -TEST(MDNodeTest, Delete) { - Constant *C = getGlobalContext().getConstantInt(Type::Int32Ty, 1); - Instruction *I = new BitCastInst(C, Type::Int32Ty); +TEST_F(MDNodeTest, Delete) { + Constant *C = ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 1); + Instruction *I = new BitCastInst(C, Type::getInt32Ty(getGlobalContext())); Value *const V = I; - MDNode *n = getGlobalContext().getMDNode(&V, 1); + MDNode *n = MDNode::get(Context, V); WeakVH wvh = n; EXPECT_EQ(n, wvh); delete I; +} - std::ostringstream oss; - wvh->print(oss); - EXPECT_STREQ("!0 = metadata !{null}\n", oss.str().c_str()); +TEST(NamedMDNodeTest, Search) { + LLVMContext Context; + Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 1); + Constant *C2 = ConstantInt::get(Type::getInt32Ty(Context), 2); + + Value *const V = C; + Value *const V2 = C2; + MDNode *n = MDNode::get(Context, V); + MDNode *n2 = MDNode::get(Context, V2); + + Module M("MyModule", Context); + const char *Name = "llvm.NMD1"; + NamedMDNode *NMD = M.getOrInsertNamedMetadata(Name); + NMD->addOperand(n); + NMD->addOperand(n2); + + std::string Str; + raw_string_ostream oss(Str); + NMD->print(oss); + EXPECT_STREQ("!llvm.NMD1 = !{!0, !1}\n", + oss.str().c_str()); } }