Skip to content

Commit c09f8d2

Browse files
Merge conflict llvm-main Pull (#74)
Merge remote-tracking branch 'upstream/main' into sync-upstream Conflicts: lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp ParseSymtab
1 parent 27b41f8 commit c09f8d2

File tree

1,101 files changed

+39728
-20330
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,101 files changed

+39728
-20330
lines changed

.github/new-prs-labeler.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,10 @@ backend:NVPTX:
777777
- 'llvm/**/*nvptx*/**'
778778
- 'llvm/**/*NVPTX*/**'
779779

780+
backend:MIPS:
781+
- '**/*mips*'
782+
- '**/*Mips*'
783+
780784
backend:RISC-V:
781785
- clang/**/*riscv*
782786
- clang/**/*RISCV*

bolt/include/bolt/Profile/DataAggregator.h

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -99,24 +99,28 @@ class DataAggregator : public DataReader {
9999
uint64_t Addr;
100100
};
101101

102+
/// Container for the unit of branch data.
103+
/// Backwards compatible with legacy use for branches and fall-throughs:
104+
/// - if \p Branch is FT_ONLY or FT_EXTERNAL_ORIGIN, the trace only
105+
/// contains fall-through data,
106+
/// - if \p To is BR_ONLY, the trace only contains branch data.
102107
struct Trace {
108+
static constexpr const uint64_t EXTERNAL = 0ULL;
109+
static constexpr const uint64_t BR_ONLY = -1ULL;
110+
static constexpr const uint64_t FT_ONLY = -1ULL;
111+
static constexpr const uint64_t FT_EXTERNAL_ORIGIN = -2ULL;
112+
113+
uint64_t Branch;
103114
uint64_t From;
104115
uint64_t To;
105-
Trace(uint64_t From, uint64_t To) : From(From), To(To) {}
106-
bool operator==(const Trace &Other) const {
107-
return From == Other.From && To == Other.To;
108-
}
116+
auto tie() const { return std::tie(Branch, From, To); }
117+
bool operator==(const Trace &Other) const { return tie() == Other.tie(); }
118+
bool operator<(const Trace &Other) const { return tie() < Other.tie(); }
109119
};
120+
friend raw_ostream &operator<<(raw_ostream &OS, const Trace &);
110121

111122
struct TraceHash {
112-
size_t operator()(const Trace &L) const {
113-
return std::hash<uint64_t>()(L.From << 32 | L.To);
114-
}
115-
};
116-
117-
struct FTInfo {
118-
uint64_t InternCount{0};
119-
uint64_t ExternCount{0};
123+
size_t operator()(const Trace &L) const { return hash_combine(L.tie()); }
120124
};
121125

122126
struct TakenBranchInfo {
@@ -126,8 +130,11 @@ class DataAggregator : public DataReader {
126130

127131
/// Intermediate storage for profile data. We save the results of parsing
128132
/// and use them later for processing and assigning profile.
129-
std::unordered_map<Trace, TakenBranchInfo, TraceHash> BranchLBRs;
130-
std::unordered_map<Trace, FTInfo, TraceHash> FallthroughLBRs;
133+
std::unordered_map<Trace, TakenBranchInfo, TraceHash> TraceMap;
134+
std::vector<std::pair<Trace, TakenBranchInfo>> Traces;
135+
/// Pre-populated addresses of returns, coming from pre-aggregated data or
136+
/// disassembly. Used to disambiguate call-continuation fall-throughs.
137+
std::unordered_set<uint64_t> Returns;
131138
std::unordered_map<uint64_t, uint64_t> BasicSamples;
132139
std::vector<PerfMemSample> MemSamples;
133140

@@ -200,8 +207,8 @@ class DataAggregator : public DataReader {
200207
/// Return a vector of offsets corresponding to a trace in a function
201208
/// if the trace is valid, std::nullopt otherwise.
202209
std::optional<SmallVector<std::pair<uint64_t, uint64_t>, 16>>
203-
getFallthroughsInTrace(BinaryFunction &BF, const LBREntry &First,
204-
const LBREntry &Second, uint64_t Count = 1) const;
210+
getFallthroughsInTrace(BinaryFunction &BF, const Trace &Trace, uint64_t Count,
211+
bool IsReturn) const;
205212

206213
/// Record external entry into the function \p BF.
207214
///
@@ -261,12 +268,14 @@ class DataAggregator : public DataReader {
261268
uint64_t From, uint64_t To, uint64_t Count,
262269
uint64_t Mispreds);
263270

271+
/// Checks if \p Addr corresponds to a return instruction.
272+
bool checkReturn(uint64_t Addr);
273+
264274
/// Register a \p Branch.
265275
bool doBranch(uint64_t From, uint64_t To, uint64_t Count, uint64_t Mispreds);
266276

267277
/// Register a trace between two LBR entries supplied in execution order.
268-
bool doTrace(const LBREntry &First, const LBREntry &Second,
269-
uint64_t Count = 1);
278+
bool doTrace(const Trace &Trace, uint64_t Count, bool IsReturn);
270279

271280
/// Parser helpers
272281
/// Return false if we exhausted our parser buffer and finished parsing
@@ -516,6 +525,21 @@ inline raw_ostream &operator<<(raw_ostream &OS,
516525
OS << formatv("{0:x} -> {1:x}/{2}", L.From, L.To, L.Mispred ? 'M' : 'P');
517526
return OS;
518527
}
528+
529+
inline raw_ostream &operator<<(raw_ostream &OS,
530+
const DataAggregator::Trace &T) {
531+
switch (T.Branch) {
532+
case DataAggregator::Trace::FT_ONLY:
533+
case DataAggregator::Trace::FT_EXTERNAL_ORIGIN:
534+
break;
535+
default:
536+
OS << Twine::utohexstr(T.Branch) << " -> ";
537+
}
538+
OS << Twine::utohexstr(T.From);
539+
if (T.To != DataAggregator::Trace::BR_ONLY)
540+
OS << " ... " << Twine::utohexstr(T.To);
541+
return OS;
542+
}
519543
} // namespace bolt
520544
} // namespace llvm
521545

0 commit comments

Comments
 (0)