summaryrefslogtreecommitdiff
path: root/unittests/Transforms/Utils/SpecialCaseList.cpp
blob: 1c10317e6af158d63466f27be2cedc961ac61b6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//===- SpecialCaseList.cpp - Unit tests for SpecialCaseList ---------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/IR/Function.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Transforms/Utils/SpecialCaseList.h"
#include "gtest/gtest.h"

using namespace llvm;

namespace {

class SpecialCaseListTest : public ::testing::Test {
protected:
  Function *makeFunction(StringRef Name, Module &M) {
    return Function::Create(FunctionType::get(Type::getVoidTy(Ctx), false),
                            GlobalValue::ExternalLinkage,
                            Name,
                            &M);
  }

  GlobalVariable *makeGlobal(StringRef Name, StringRef StructName, Module &M) {
    StructType *ST =
        StructType::create(StructName, Type::getInt32Ty(Ctx), (Type*)0);
    return new GlobalVariable(
        M, ST, false, GlobalValue::ExternalLinkage, 0, Name);
  }

  SpecialCaseList *makeSpecialCaseList(StringRef List) {
    OwningPtr<MemoryBuffer> MB(MemoryBuffer::getMemBuffer(List));
    return new SpecialCaseList(MB.get());
  }

  LLVMContext Ctx;
};

TEST_F(SpecialCaseListTest, ModuleIsIn) {
  Module M("hello", Ctx);
  Function *F = makeFunction("foo", M);
  GlobalVariable *GV = makeGlobal("bar", "t", M);

  OwningPtr<SpecialCaseList> SCL(makeSpecialCaseList("# This is a comment.\n"
                                                     "\n"
                                                     "src:hello\n"));
  EXPECT_TRUE(SCL->isIn(M));
  EXPECT_TRUE(SCL->isIn(*F));
  EXPECT_TRUE(SCL->isIn(*GV));

  SCL.reset(makeSpecialCaseList("src:he*o\n"));
  EXPECT_TRUE(SCL->isIn(M));
  EXPECT_TRUE(SCL->isIn(*F));
  EXPECT_TRUE(SCL->isIn(*GV));

  SCL.reset(makeSpecialCaseList("src:hi\n"));
  EXPECT_FALSE(SCL->isIn(M));
  EXPECT_FALSE(SCL->isIn(*F));
  EXPECT_FALSE(SCL->isIn(*GV));
}

TEST_F(SpecialCaseListTest, FunctionIsIn) {
  Module M("hello", Ctx);
  Function *Foo = makeFunction("foo", M);
  Function *Bar = makeFunction("bar", M);

  OwningPtr<SpecialCaseList> SCL(makeSpecialCaseList("fun:foo\n"));
  EXPECT_TRUE(SCL->isIn(*Foo));
  EXPECT_FALSE(SCL->isIn(*Bar));

  SCL.reset(makeSpecialCaseList("fun:b*\n"));
  EXPECT_FALSE(SCL->isIn(*Foo));
  EXPECT_TRUE(SCL->isIn(*Bar));

  SCL.reset(makeSpecialCaseList("fun:f*\n"
                                "fun:bar\n"));
  EXPECT_TRUE(SCL->isIn(*Foo));
  EXPECT_TRUE(SCL->isIn(*Bar));
}

TEST_F(SpecialCaseListTest, GlobalIsIn) {
  Module M("hello", Ctx);
  GlobalVariable *Foo = makeGlobal("foo", "t1", M);
  GlobalVariable *Bar = makeGlobal("bar", "t2", M);

  OwningPtr<SpecialCaseList> SCL(makeSpecialCaseList("global:foo\n"));
  EXPECT_TRUE(SCL->isIn(*Foo));
  EXPECT_FALSE(SCL->isIn(*Bar));
  EXPECT_FALSE(SCL->isInInit(*Foo));
  EXPECT_FALSE(SCL->isInInit(*Bar));

  SCL.reset(makeSpecialCaseList("global-init:foo\n"));
  EXPECT_FALSE(SCL->isIn(*Foo));
  EXPECT_FALSE(SCL->isIn(*Bar));
  EXPECT_TRUE(SCL->isInInit(*Foo));
  EXPECT_FALSE(SCL->isInInit(*Bar));

  SCL.reset(makeSpecialCaseList("global-init-type:t2\n"));
  EXPECT_FALSE(SCL->isIn(*Foo));
  EXPECT_FALSE(SCL->isIn(*Bar));
  EXPECT_FALSE(SCL->isInInit(*Foo));
  EXPECT_TRUE(SCL->isInInit(*Bar));

  SCL.reset(makeSpecialCaseList("global-init-src:hello\n"));
  EXPECT_FALSE(SCL->isIn(*Foo));
  EXPECT_FALSE(SCL->isIn(*Bar));
  EXPECT_TRUE(SCL->isInInit(*Foo));
  EXPECT_TRUE(SCL->isInInit(*Bar));
}

}