| 323 | } |
| 324 | |
| 325 | std::set<RDNode> RDAnalyzer::traceCaller(RDNode &Node, llvm::Function &F) { |
| 326 | |
| 327 | auto &Target = Node.getTarget().getIR(); |
| 328 | if (!isa<GlobalVariable>(&Target) && !isa<Argument>(&Target)) { |
| 329 | return {Node}; |
| 330 | } |
| 331 | |
| 332 | std::set<RDNode> Result; |
| 333 | for (auto *Caller : Space.nextInCaller(F)) { |
| 334 | if (isa<GlobalVariable>(&Target)) { |
| 335 | RDNode NewNode(Target, *Caller, &Node); |
| 336 | for (auto &Found : |
| 337 | traverseFunction(NewNode, *Caller->getFunction(), true, false)) |
| 338 | mergeRDNode(Result, Found); |
| 339 | continue; |
| 340 | } |
| 341 | |
| 342 | if (isa<Argument>(&Target)) { |
| 343 | auto &Arg = *dyn_cast<Argument>(&Target); |
| 344 | assert(Arg.getParent() == &F && "Unexpected Program State"); |
| 345 | |
| 346 | RDNode NewNode(Arg.getArgNo(), *Caller, &Node); |
| 347 | |
| 348 | for (auto &Found : |
| 349 | traverseFunction(NewNode, *Caller->getFunction(), true, false)) |
| 350 | mergeRDNode(Result, Found); |
| 351 | continue; |
| 352 | } |
| 353 | |
| 354 | assert(false && "Unexpected Program State"); |
| 355 | } |
| 356 | |
| 357 | return Result; |
| 358 | } |
| 359 | |
| 360 | std::set<RDNode> RDAnalyzer::traceLink(RDNode &Node, Function &F) { |
| 361 | auto &Target = Node.getTarget().getIR(); |
nothing calls this directly
no test coverage detected