| 179 | }; |
| 180 | |
| 181 | TEST_F(TestDefMapGenerator, generate_ArrayGroupP) { |
| 182 | const std::string Code = "extern \"C\" {\n" |
| 183 | "void API1(int *, int);\n" |
| 184 | "int API2();\n" |
| 185 | "void test() {\n" |
| 186 | " int Var1[128] = { 0, };\n" |
| 187 | " int Var2[128] = { 0, };\n" |
| 188 | " int Var3[128] = { 0, };\n" |
| 189 | " int Var4[128] = { 0, };\n" |
| 190 | " int Var5 = API2();\n" |
| 191 | " int Var6 = API2();\n" |
| 192 | " API1(Var1, Var5);\n" |
| 193 | " API1(Var2, Var5);\n" |
| 194 | " API1(Var3, Var6);\n" |
| 195 | " API1(Var4, Var6);\n" |
| 196 | "}}"; |
| 197 | SourceFileManager SFM; |
| 198 | SFM.createFile("test.cpp", Code); |
| 199 | std::vector<std::string> Srcs = {SFM.getFilePath("test.cpp")}; |
| 200 | ASSERT_TRUE(init(SFM.getSrcDirPath(), Srcs)); |
| 201 | |
| 202 | ArrayAnalysisReport ArrayReport; |
| 203 | ArrayReport.set("API1", 0, 1); |
| 204 | Loader->setArrayReport(ArrayReport); |
| 205 | |
| 206 | auto Node1 = generateRDNode("test", 0, 8, -1); |
| 207 | auto Node2 = generateRDNode("test", 0, 11, -1); |
| 208 | auto Node3 = generateRDNode("test", 0, 14, -1); |
| 209 | auto Node4 = generateRDNode("test", 0, 17, -1); |
| 210 | auto Node5 = generateRDNode("test", 0, 19, -1); |
| 211 | auto Node6 = generateRDNode("test", 0, 22, -1); |
| 212 | ASSERT_TRUE(Node1 && Node2 && Node3 && Node4 && Node5 && Node6); |
| 213 | |
| 214 | auto *API1_1 = llvm::dyn_cast_or_null<llvm::CallBase>( |
| 215 | IRAccess->getInstruction("test", 0, 26)); |
| 216 | auto *API1_2 = llvm::dyn_cast_or_null<llvm::CallBase>( |
| 217 | IRAccess->getInstruction("test", 0, 29)); |
| 218 | auto *API1_3 = llvm::dyn_cast_or_null<llvm::CallBase>( |
| 219 | IRAccess->getInstruction("test", 0, 32)); |
| 220 | auto *API1_4 = llvm::dyn_cast_or_null<llvm::CallBase>( |
| 221 | IRAccess->getInstruction("test", 0, 35)); |
| 222 | ASSERT_TRUE(API1_1 && API1_2 && API1_3 && API1_4); |
| 223 | |
| 224 | Node1->setFirstUse(*API1_1, 0); |
| 225 | Node2->setFirstUse(*API1_2, 0); |
| 226 | Node3->setFirstUse(*API1_3, 0); |
| 227 | Node4->setFirstUse(*API1_4, 0); |
| 228 | Node5->setFirstUse(*API1_1, 1); |
| 229 | Node5->addFirstUse(*API1_2, 1); |
| 230 | Node6->setFirstUse(*API1_3, 1); |
| 231 | Node6->addFirstUse(*API1_4, 1); |
| 232 | |
| 233 | std::vector<RDNode> Nodes = {*Node1, *Node2, *Node3, *Node4, *Node5, *Node6}; |
| 234 | auto Defs = generateDefinitions(Nodes); |
| 235 | ASSERT_EQ(Defs.size(), 6); |
| 236 | |
| 237 | for (const auto &Iter : Defs) { |
| 238 | ASSERT_NE(Iter.Filters.find(ArrayGroupFilter::FilterName), |
nothing calls this directly
no test coverage detected