mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 22:20:37 +00:00
eb3d76da81
Move the test for this class into the IR unittests as well. This uncovers that ValueMap too is in the IR library. Ironically, the unittest for ValueMap is useless in the Support library (honestly, so was the ValueHandle test) and so it already lives in the IR unittests. Mmmm, tasty layering. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202821 91177308-0d34-0410-b5e6-96231b3b80d8
153 lines
4.3 KiB
C++
153 lines
4.3 KiB
C++
//===- llvm/unittest/IR/Metadata.cpp - Metadata unit tests ----------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/IR/Metadata.h"
|
|
#include "llvm/IR/Constants.h"
|
|
#include "llvm/IR/Instructions.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/IR/Type.h"
|
|
#include "llvm/IR/ValueHandle.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "gtest/gtest.h"
|
|
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_F(MDStringTest, CreateDifferent) {
|
|
char x[3] = { 'f', 0, 'A' };
|
|
MDString *s1 = MDString::get(Context, StringRef(&x[0], 3));
|
|
x[2] = 'B';
|
|
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_F(MDStringTest, CreateSame) {
|
|
char x[4] = { 'a', 'b', 'c', 'X' };
|
|
char y[4] = { 'a', 'b', 'c', 'Y' };
|
|
|
|
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_F(MDStringTest, PrintingSimple) {
|
|
char *str = new char[13];
|
|
strncpy(str, "testing 1 2 3", 13);
|
|
MDString *s = MDString::get(Context, StringRef(str, 13));
|
|
strncpy(str, "aaaaaaaaaaaaa", 13);
|
|
delete[] str;
|
|
|
|
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_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_F(MDNodeTest, Simple) {
|
|
char x[3] = { 'a', 'b', 'c' };
|
|
char y[3] = { '1', '2', '3' };
|
|
|
|
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<Value *> V;
|
|
V.push_back(s1);
|
|
V.push_back(CI);
|
|
V.push_back(s2);
|
|
|
|
MDNode *n1 = MDNode::get(Context, V);
|
|
Value *const c1 = n1;
|
|
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);
|
|
#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_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 = MDNode::get(Context, V);
|
|
WeakVH wvh = n;
|
|
|
|
EXPECT_EQ(n, wvh);
|
|
|
|
delete I;
|
|
}
|
|
|
|
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());
|
|
}
|
|
}
|