|
1 | 1 | #ifndef LLVM_PROFILEDATA_MEMPROF_H_
|
2 | 2 | #define LLVM_PROFILEDATA_MEMPROF_H_
|
3 | 3 |
|
| 4 | +#include "llvm/ADT/BitVector.h" |
4 | 5 | #include "llvm/ADT/MapVector.h"
|
5 | 6 | #include "llvm/ADT/STLForwardCompat.h"
|
6 | 7 | #include "llvm/ADT/STLFunctionalExtras.h"
|
@@ -971,11 +972,16 @@ struct CallerCalleePairExtractor {
|
971 | 972 | // A map from caller GUIDs to lists of call sites in respective callers.
|
972 | 973 | DenseMap<uint64_t, SmallVector<CallEdgeTy, 0>> CallerCalleePairs;
|
973 | 974 |
|
| 975 | + // The set of linear call stack IDs that we've visited. |
| 976 | + BitVector Visited; |
| 977 | + |
974 | 978 | CallerCalleePairExtractor() = delete;
|
975 | 979 | CallerCalleePairExtractor(
|
976 | 980 | const unsigned char *CallStackBase,
|
977 |
| - llvm::function_ref<Frame(LinearFrameId)> FrameIdToFrame) |
978 |
| - : CallStackBase(CallStackBase), FrameIdToFrame(FrameIdToFrame) {} |
| 981 | + llvm::function_ref<Frame(LinearFrameId)> FrameIdToFrame, |
| 982 | + unsigned RadixTreeSize) |
| 983 | + : CallStackBase(CallStackBase), FrameIdToFrame(FrameIdToFrame), |
| 984 | + Visited(RadixTreeSize) {} |
979 | 985 |
|
980 | 986 | void operator()(LinearCallStackId LinearCSId) {
|
981 | 987 | const unsigned char *Ptr =
|
@@ -1004,6 +1010,15 @@ struct CallerCalleePairExtractor {
|
1004 | 1010 | LineLocation Loc(F.LineOffset, F.Column);
|
1005 | 1011 | CallerCalleePairs[CallerGUID].emplace_back(Loc, CalleeGUID);
|
1006 | 1012 |
|
| 1013 | + // Keep track of the indices we've visited. If we've already visited the |
| 1014 | + // current one, terminate the traversal. We will not discover any new |
| 1015 | + // caller-callee pair by continuing the traversal. |
| 1016 | + unsigned Offset = |
| 1017 | + std::distance(CallStackBase, Ptr) / sizeof(LinearFrameId); |
| 1018 | + if (Visited.test(Offset)) |
| 1019 | + break; |
| 1020 | + Visited.set(Offset); |
| 1021 | + |
1007 | 1022 | Ptr += sizeof(LinearFrameId);
|
1008 | 1023 | CalleeGUID = CallerGUID;
|
1009 | 1024 | }
|
|
0 commit comments