Skip to content

Commit 2cee777

Browse files
committed
Merge remote-tracking branch 'origin/main' into laa-nonconst-dist-forward
2 parents 0accad1 + db8e182 commit 2cee777

File tree

785 files changed

+22860
-8789
lines changed

Some content is hidden

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

785 files changed

+22860
-8789
lines changed

.github/workflows/pr-code-format.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
name: "Check code formatting"
2+
3+
permissions:
4+
contents: read
5+
26
on:
37
pull_request:
48
branches:

bolt/include/bolt/Core/BinaryFunction.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1402,7 +1402,8 @@ class BinaryFunction {
14021402

14031403
/// Return true if the function has CFI instructions
14041404
bool hasCFI() const {
1405-
return !FrameInstructions.empty() || !CIEFrameInstructions.empty();
1405+
return !FrameInstructions.empty() || !CIEFrameInstructions.empty() ||
1406+
IsInjected;
14061407
}
14071408

14081409
/// Return unique number associated with the function.

bolt/include/bolt/Profile/BoltAddressTranslation.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,6 @@ class BoltAddressTranslation {
119119
/// True if a given \p Address is a function with translation table entry.
120120
bool isBATFunction(uint64_t Address) const { return Maps.count(Address); }
121121

122-
/// Returns branch offsets grouped by containing basic block in a given
123-
/// function.
124-
std::unordered_map<uint32_t, std::vector<uint32_t>>
125-
getBFBranches(uint64_t FuncOutputAddress) const;
126-
127122
/// For a given \p Symbol in the output binary and known \p InputOffset
128123
/// return a corresponding pair of parent BinaryFunction and secondary entry
129124
/// point in it.
@@ -193,7 +188,7 @@ class BoltAddressTranslation {
193188
EntryTy(unsigned Index, size_t Hash) : Index(Index), Hash(Hash) {}
194189
};
195190

196-
std::unordered_map<uint32_t, EntryTy> Map;
191+
std::map<uint32_t, EntryTy> Map;
197192
const EntryTy &getEntry(uint32_t BBInputOffset) const {
198193
auto It = Map.find(BBInputOffset);
199194
assert(It != Map.end());
@@ -218,6 +213,10 @@ class BoltAddressTranslation {
218213
}
219214

220215
size_t getNumBasicBlocks() const { return Map.size(); }
216+
217+
auto begin() const { return Map.begin(); }
218+
auto end() const { return Map.end(); }
219+
auto upper_bound(uint32_t Offset) const { return Map.upper_bound(Offset); }
221220
};
222221

223222
/// Map function output address to its hash and basic blocks hash map.

bolt/include/bolt/Profile/DataAggregator.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ class DataAggregator : public DataReader {
225225
/// Aggregation statistics
226226
uint64_t NumInvalidTraces{0};
227227
uint64_t NumLongRangeTraces{0};
228+
/// Specifies how many samples were recorded in cold areas if we are dealing
229+
/// with profiling data collected in a bolted binary. For LBRs, incremented
230+
/// for the source of the branch to avoid counting cold activity twice (one
231+
/// for source and another for destination).
228232
uint64_t NumColdSamples{0};
229233

230234
/// Looks into system PATH for Linux Perf and set up the aggregator to use it
@@ -245,14 +249,12 @@ class DataAggregator : public DataReader {
245249
/// disassembled BinaryFunctions
246250
BinaryFunction *getBinaryFunctionContainingAddress(uint64_t Address) const;
247251

252+
/// Perform BAT translation for a given \p Func and return the parent
253+
/// BinaryFunction or nullptr.
254+
BinaryFunction *getBATParentFunction(const BinaryFunction &Func) const;
255+
248256
/// Retrieve the location name to be used for samples recorded in \p Func.
249-
/// If doing BAT translation, link cold parts to the hot part names (used by
250-
/// the original binary). \p Count specifies how many samples were recorded
251-
/// at that location, so we can tally total activity in cold areas if we are
252-
/// dealing with profiling data collected in a bolted binary. For LBRs,
253-
/// \p Count should only be used for the source of the branch to avoid
254-
/// counting cold activity twice (one for source and another for destination).
255-
StringRef getLocationName(BinaryFunction &Func, uint64_t Count);
257+
StringRef getLocationName(const BinaryFunction &Func) const;
256258

257259
/// Semantic actions - parser hooks to interpret parsed perf samples
258260
/// Register a sample (non-LBR mode), i.e. a new hit at \p Address
@@ -467,9 +469,6 @@ class DataAggregator : public DataReader {
467469
std::error_code writeBATYAML(BinaryContext &BC,
468470
StringRef OutputFilename) const;
469471

470-
/// Fixup profile collected on BOLTed binary, namely handle split functions.
471-
void fixupBATProfile(BinaryContext &BC);
472-
473472
/// Filter out binaries based on PID
474473
void filterBinaryMMapInfo();
475474

bolt/lib/Core/BinaryContext.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,9 @@ bool BinaryContext::analyzeJumpTable(const uint64_t Address,
555555
const uint64_t NextJTAddress,
556556
JumpTable::AddressesType *EntriesAsAddress,
557557
bool *HasEntryInFragment) const {
558+
// Target address of __builtin_unreachable.
559+
const uint64_t UnreachableAddress = BF.getAddress() + BF.getSize();
560+
558561
// Is one of the targets __builtin_unreachable?
559562
bool HasUnreachable = false;
560563

@@ -564,9 +567,15 @@ bool BinaryContext::analyzeJumpTable(const uint64_t Address,
564567
// Number of targets other than __builtin_unreachable.
565568
uint64_t NumRealEntries = 0;
566569

567-
auto addEntryAddress = [&](uint64_t EntryAddress) {
568-
if (EntriesAsAddress)
569-
EntriesAsAddress->emplace_back(EntryAddress);
570+
// Size of the jump table without trailing __builtin_unreachable entries.
571+
size_t TrimmedSize = 0;
572+
573+
auto addEntryAddress = [&](uint64_t EntryAddress, bool Unreachable = false) {
574+
if (!EntriesAsAddress)
575+
return;
576+
EntriesAsAddress->emplace_back(EntryAddress);
577+
if (!Unreachable)
578+
TrimmedSize = EntriesAsAddress->size();
570579
};
571580

572581
ErrorOr<const BinarySection &> Section = getSectionForAddress(Address);
@@ -618,8 +627,8 @@ bool BinaryContext::analyzeJumpTable(const uint64_t Address,
618627
: *getPointerAtAddress(EntryAddress);
619628

620629
// __builtin_unreachable() case.
621-
if (Value == BF.getAddress() + BF.getSize()) {
622-
addEntryAddress(Value);
630+
if (Value == UnreachableAddress) {
631+
addEntryAddress(Value, /*Unreachable*/ true);
623632
HasUnreachable = true;
624633
LLVM_DEBUG(dbgs() << formatv("OK: {0:x} __builtin_unreachable\n", Value));
625634
continue;
@@ -673,6 +682,13 @@ bool BinaryContext::analyzeJumpTable(const uint64_t Address,
673682
addEntryAddress(Value);
674683
}
675684

685+
// Trim direct/normal jump table to exclude trailing unreachable entries that
686+
// can collide with a function address.
687+
if (Type == JumpTable::JTT_NORMAL && EntriesAsAddress &&
688+
TrimmedSize != EntriesAsAddress->size() &&
689+
getBinaryFunctionAtAddress(UnreachableAddress))
690+
EntriesAsAddress->resize(TrimmedSize);
691+
676692
// It's a jump table if the number of real entries is more than 1, or there's
677693
// one real entry and one or more special targets. If there are only multiple
678694
// special targets, then it's not a jump table.

bolt/lib/Profile/BoltAddressTranslation.cpp

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -582,26 +582,6 @@ void BoltAddressTranslation::saveMetadata(BinaryContext &BC) {
582582
}
583583
}
584584

585-
std::unordered_map<uint32_t, std::vector<uint32_t>>
586-
BoltAddressTranslation::getBFBranches(uint64_t OutputAddress) const {
587-
std::unordered_map<uint32_t, std::vector<uint32_t>> Branches;
588-
auto FuncIt = Maps.find(OutputAddress);
589-
assert(FuncIt != Maps.end());
590-
std::vector<uint32_t> InputOffsets;
591-
for (const auto &KV : FuncIt->second)
592-
InputOffsets.emplace_back(KV.second);
593-
// Sort with LSB BRANCHENTRY bit.
594-
llvm::sort(InputOffsets);
595-
uint32_t BBOffset{0};
596-
for (uint32_t InOffset : InputOffsets) {
597-
if (InOffset & BRANCHENTRY)
598-
Branches[BBOffset].push_back(InOffset >> 1);
599-
else
600-
BBOffset = InOffset >> 1;
601-
}
602-
return Branches;
603-
}
604-
605585
unsigned
606586
BoltAddressTranslation::getSecondaryEntryPointId(uint64_t Address,
607587
uint32_t Offset) const {

0 commit comments

Comments
 (0)