|
26 | 26 | #include "phasar/DataFlow/IfdsIde/IDETabulationProblem.h" |
27 | 27 | #include "phasar/DataFlow/IfdsIde/IFDSTabulationProblem.h" |
28 | 28 | #include "phasar/DataFlow/IfdsIde/InitialSeeds.h" |
| 29 | +#include "phasar/DataFlow/IfdsIde/Solver/ESGEdgeKind.h" |
29 | 30 | #include "phasar/DataFlow/IfdsIde/Solver/FlowEdgeFunctionCache.h" |
30 | 31 | #include "phasar/DataFlow/IfdsIde/Solver/IDESolverAPIMixin.h" |
31 | 32 | #include "phasar/DataFlow/IfdsIde/Solver/JumpFunctions.h" |
@@ -297,20 +298,25 @@ class IDESolver |
297 | 298 | } |
298 | 299 | }); |
299 | 300 |
|
| 301 | + bool HasNoCalleeInformation = true; |
| 302 | + |
300 | 303 | // for each possible callee |
301 | 304 | for (f_t SCalledProcN : Callees) { // still line 14 |
302 | 305 | // check if a special summary for the called procedure exists |
303 | 306 | FlowFunctionPtrType SpecialSum = |
304 | 307 | CachedFlowEdgeFunctions.getSummaryFlowFunction(n, SCalledProcN); |
| 308 | + |
305 | 309 | // if a special summary is available, treat this as a normal flow |
306 | 310 | // and use the summary flow and edge functions |
| 311 | + |
307 | 312 | if (SpecialSum) { |
| 313 | + HasNoCalleeInformation = false; |
308 | 314 | PHASAR_LOG_LEVEL(DEBUG, "Found and process special summary"); |
309 | 315 | for (n_t ReturnSiteN : ReturnSiteNs) { |
310 | 316 | container_type Res = computeSummaryFlowFunction(SpecialSum, d1, d2); |
311 | 317 | INC_COUNTER("SpecialSummary-FF Application", 1, Full); |
312 | 318 | ADD_TO_HISTOGRAM("Data-flow facts", Res.size(), 1, Full); |
313 | | - saveEdges(n, ReturnSiteN, d2, Res, false); |
| 319 | + saveEdges(n, ReturnSiteN, d2, Res, ESGEdgeKind::Summary); |
314 | 320 | for (d_t d3 : Res) { |
315 | 321 | EdgeFunction<l_t> SumEdgFnE = |
316 | 322 | CachedFlowEdgeFunctions.getSummaryEdgeFunction(n, d2, |
@@ -341,7 +347,8 @@ class IDESolver |
341 | 347 | } |
342 | 348 | // if startPointsOf is empty, the called function is a declaration |
343 | 349 | for (n_t SP : StartPointsOf) { |
344 | | - saveEdges(n, SP, d2, Res, true); |
| 350 | + HasNoCalleeInformation = false; |
| 351 | + saveEdges(n, SP, d2, Res, ESGEdgeKind::Call); |
345 | 352 | // for each result node of the call-flow function |
346 | 353 | for (d_t d3 : Res) { |
347 | 354 | using TableCell = typename Table<n_t, d_t, EdgeFunction<l_t>>::Cell; |
@@ -382,7 +389,7 @@ class IDESolver |
382 | 389 | RetFunction, d3, d4, n, Container{d2}); |
383 | 390 | ADD_TO_HISTOGRAM("Data-flow facts", ReturnedFacts.size(), 1, |
384 | 391 | Full); |
385 | | - saveEdges(eP, RetSiteN, d4, ReturnedFacts, true); |
| 392 | + saveEdges(eP, RetSiteN, d4, ReturnedFacts, ESGEdgeKind::Ret); |
386 | 393 | // for each target value of the function |
387 | 394 | for (d_t d5 : ReturnedFacts) { |
388 | 395 | // update the caller-side summary function |
@@ -439,7 +446,9 @@ class IDESolver |
439 | 446 | container_type ReturnFacts = |
440 | 447 | computeCallToReturnFlowFunction(CallToReturnFF, d1, d2); |
441 | 448 | ADD_TO_HISTOGRAM("Data-flow facts", ReturnFacts.size(), 1, Full); |
442 | | - saveEdges(n, ReturnSiteN, d2, ReturnFacts, false); |
| 449 | + saveEdges(n, ReturnSiteN, d2, ReturnFacts, |
| 450 | + HasNoCalleeInformation ? ESGEdgeKind::SkipUnknownFn |
| 451 | + : ESGEdgeKind::CallToRet); |
443 | 452 | for (d_t d3 : ReturnFacts) { |
444 | 453 | EdgeFunction<l_t> EdgeFnE = |
445 | 454 | CachedFlowEdgeFunctions.getCallToRetEdgeFunction(n, d2, ReturnSiteN, |
@@ -478,7 +487,7 @@ class IDESolver |
478 | 487 | INC_COUNTER("FF Queries", 1, Full); |
479 | 488 | const container_type Res = computeNormalFlowFunction(FlowFunc, d1, d2); |
480 | 489 | ADD_TO_HISTOGRAM("Data-flow facts", Res.size(), 1, Full); |
481 | | - saveEdges(n, nPrime, d2, Res, false); |
| 490 | + saveEdges(n, nPrime, d2, Res, ESGEdgeKind::Normal); |
482 | 491 | for (d_t d3 : Res) { |
483 | 492 | EdgeFunction<l_t> g = |
484 | 493 | CachedFlowEdgeFunctions.getNormalEdgeFunction(n, d2, nPrime, d3); |
@@ -690,12 +699,12 @@ class IDESolver |
690 | 699 | } |
691 | 700 |
|
692 | 701 | virtual void saveEdges(n_t SourceNode, n_t SinkStmt, d_t SourceVal, |
693 | | - const container_type &DestVals, bool InterP) { |
| 702 | + const container_type &DestVals, ESGEdgeKind Kind) { |
694 | 703 | if (!SolverConfig.recordEdges()) { |
695 | 704 | return; |
696 | 705 | } |
697 | 706 | Table<n_t, n_t, std::map<d_t, container_type>> &TgtMap = |
698 | | - (InterP) ? ComputedInterPathEdges : ComputedIntraPathEdges; |
| 707 | + (isInterProc(Kind)) ? ComputedInterPathEdges : ComputedIntraPathEdges; |
699 | 708 | TgtMap.get(SourceNode, SinkStmt)[SourceVal].insert(DestVals.begin(), |
700 | 709 | DestVals.end()); |
701 | 710 | } |
@@ -833,7 +842,7 @@ class IDESolver |
833 | 842 | const container_type Targets = |
834 | 843 | computeReturnFlowFunction(RetFunction, d1, d2, c, Entry.second); |
835 | 844 | ADD_TO_HISTOGRAM("Data-flow facts", Targets.size(), 1, Full); |
836 | | - saveEdges(n, RetSiteC, d2, Targets, true); |
| 845 | + saveEdges(n, RetSiteC, d2, Targets, ESGEdgeKind::Ret); |
837 | 846 | // for each target value at the return site |
838 | 847 | // line 23 |
839 | 848 | for (d_t d5 : Targets) { |
@@ -902,7 +911,7 @@ class IDESolver |
902 | 911 | const container_type Targets = computeReturnFlowFunction( |
903 | 912 | RetFunction, d1, d2, Caller, Container{ZeroValue}); |
904 | 913 | ADD_TO_HISTOGRAM("Data-flow facts", Targets.size(), 1, Full); |
905 | | - saveEdges(n, RetSiteC, d2, Targets, true); |
| 914 | + saveEdges(n, RetSiteC, d2, Targets, ESGEdgeKind::Ret); |
906 | 915 | for (d_t d5 : Targets) { |
907 | 916 | EdgeFunction<l_t> f5 = |
908 | 917 | CachedFlowEdgeFunctions.getReturnEdgeFunction( |
|
0 commit comments