Skip to content

Commit 09d8f6b

Browse files
Merge branch 'llvm:main' into gh-101657
2 parents 613eb45 + 2cacf71 commit 09d8f6b

File tree

1,146 files changed

+113844
-69257
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,146 files changed

+113844
-69257
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@ jobs:
4747
echo "Changed files:"
4848
echo "$CHANGED_FILES"
4949
50+
# The clang tidy version should always be upgraded to the first version
51+
# of a release cycle (x.1.0) or the last version of a release cycle, or
52+
# if there have been relevant clang-format backports.
5053
- name: Install clang-tidy
5154
uses: aminya/setup-cpp@17c11551771948abc5752bbf3183482567c7caf0 # v1.1.1
5255
with:
53-
clang-tidy: 20.1.8
56+
clang-tidy: 21.1.0
5457

5558
- name: Setup Python env
5659
uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0

bolt/include/bolt/Core/BinaryFunction.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,6 @@ class BinaryFunction {
192192

193193
mutable MCSymbol *FunctionConstantIslandLabel{nullptr};
194194
mutable MCSymbol *FunctionColdConstantIslandLabel{nullptr};
195-
196-
// Returns constant island alignment
197-
uint16_t getAlignment() const { return sizeof(uint64_t); }
198195
};
199196

200197
static constexpr uint64_t COUNT_NO_PROFILE =
@@ -2114,9 +2111,7 @@ class BinaryFunction {
21142111
return *std::prev(CodeIter) <= *DataIter;
21152112
}
21162113

2117-
uint16_t getConstantIslandAlignment() const {
2118-
return Islands ? Islands->getAlignment() : 1;
2119-
}
2114+
uint16_t getConstantIslandAlignment() const;
21202115

21212116
/// If there is a constant island in the range [StartOffset, EndOffset),
21222117
/// return its address.
@@ -2168,6 +2163,11 @@ class BinaryFunction {
21682163
return Islands && !Islands->DataOffsets.empty();
21692164
}
21702165

2166+
/// Return true if the whole function is a constant island.
2167+
bool isDataObject() const {
2168+
return Islands && Islands->CodeOffsets.size() == 0;
2169+
}
2170+
21712171
bool isStartOfConstantIsland(uint64_t Offset) const {
21722172
return hasConstantIsland() && Islands->DataOffsets.count(Offset);
21732173
}

bolt/include/bolt/Core/MCPlusBuilder.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class raw_ostream;
5151

5252
namespace bolt {
5353
class BinaryBasicBlock;
54+
class BinaryContext;
5455
class BinaryFunction;
5556

5657
/// Different types of indirect branches encountered during disassembly.
@@ -530,10 +531,15 @@ class MCPlusBuilder {
530531
return 0;
531532
}
532533

534+
/// Create a helper function to increment counter for Instrumentation
535+
virtual void createInstrCounterIncrFunc(BinaryContext &BC) {
536+
llvm_unreachable("not implemented");
537+
}
538+
533539
/// Create increment contents of target by 1 for Instrumentation
534-
virtual InstructionListType
535-
createInstrIncMemory(const MCSymbol *Target, MCContext *Ctx, bool IsLeaf,
536-
unsigned CodePointerSize) const {
540+
virtual InstructionListType createInstrIncMemory(const MCSymbol *Target,
541+
MCContext *Ctx, bool IsLeaf,
542+
unsigned CodePointerSize) {
537543
llvm_unreachable("not implemented");
538544
return InstructionListType();
539545
}

bolt/lib/Core/BinaryFunction.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,33 @@ BinaryFunction::getBasicBlockContainingOffset(uint64_t Offset) {
284284
return (Offset < BB->getOffset() + BB->getOriginalSize()) ? BB : nullptr;
285285
}
286286

287+
uint16_t BinaryFunction::getConstantIslandAlignment() const {
288+
if (Islands == nullptr)
289+
return 1;
290+
291+
// For constant island inside a function, the default 8-byte alignment is
292+
// probably good enough.
293+
const uint16_t DefaultAlignment = sizeof(uint64_t);
294+
if (!isDataObject())
295+
return DefaultAlignment;
296+
297+
// If the constant island itself is a binary function, get its alignment
298+
// based on its size, original address, and its owning section's alignment.
299+
const uint64_t MaxAlignment =
300+
std::min(uint64_t(1) << llvm::countr_zero(getAddress()),
301+
OriginSection->getAlignment());
302+
const uint64_t MinAlignment =
303+
std::max((uint64_t)DefaultAlignment,
304+
uint64_t(1) << (63 - llvm::countl_zero(getSize())));
305+
uint64_t Alignment = std::min(MinAlignment, MaxAlignment);
306+
if (Alignment >> 16) {
307+
BC.errs() << "BOLT-ERROR: the constant island's alignment is too big: 0x"
308+
<< Twine::utohexstr(Alignment) << "\n";
309+
exit(1);
310+
}
311+
return (uint16_t)Alignment;
312+
}
313+
287314
void BinaryFunction::markUnreachableBlocks() {
288315
std::stack<BinaryBasicBlock *> Stack;
289316

bolt/lib/Core/GDBIndex.cpp

Lines changed: 95 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ void GDBIndex::updateGdbIndexSection(
7777
exit(1);
7878
}
7979
DenseSet<uint64_t> OriginalOffsets;
80-
for (unsigned Index = 0, Units = BC.DwCtx->getNumCompileUnits();
80+
for (unsigned Index = 0, PresentUnitsIndex = 0,
81+
Units = BC.DwCtx->getNumCompileUnits();
8182
Index < Units; ++Index) {
8283
const DWARFUnit *CU = BC.DwCtx->getUnitAtIndex(Index);
8384
if (SkipTypeUnits && CU->isTypeUnit())
@@ -90,7 +91,7 @@ void GDBIndex::updateGdbIndexSection(
9091
}
9192

9293
OriginalOffsets.insert(Offset);
93-
OffsetToIndexMap[Offset] = Index;
94+
OffsetToIndexMap[Offset] = PresentUnitsIndex++;
9495
}
9596

9697
// Ignore old address table.
@@ -125,16 +126,52 @@ void GDBIndex::updateGdbIndexSection(
125126

126127
using MapEntry = std::pair<uint32_t, CUInfo>;
127128
std::vector<MapEntry> CUVector(CUMap.begin(), CUMap.end());
129+
// Remove the CUs we won't emit anyway.
130+
CUVector.erase(std::remove_if(CUVector.begin(), CUVector.end(),
131+
[&OriginalOffsets](const MapEntry &It) {
132+
// Skipping TU for DWARF5 when they are not
133+
// included in CU list.
134+
return OriginalOffsets.count(It.first) == 0;
135+
}),
136+
CUVector.end());
128137
// Need to sort since we write out all of TUs in .debug_info before CUs.
129138
std::sort(CUVector.begin(), CUVector.end(),
130139
[](const MapEntry &E1, const MapEntry &E2) -> bool {
131140
return E1.second.Offset < E2.second.Offset;
132141
});
142+
// Create the original CU index -> updated CU index mapping,
143+
// as the sort above could've changed the order and we have to update
144+
// indices correspondingly in address map and constant pool.
145+
std::unordered_map<uint32_t, uint32_t> OriginalCUIndexToUpdatedCUIndexMap;
146+
OriginalCUIndexToUpdatedCUIndexMap.reserve(CUVector.size());
147+
for (uint32_t I = 0; I < CUVector.size(); ++I) {
148+
OriginalCUIndexToUpdatedCUIndexMap[OffsetToIndexMap.at(CUVector[I].first)] =
149+
I;
150+
}
151+
const auto RemapCUIndex = [&OriginalCUIndexToUpdatedCUIndexMap,
152+
CUVectorSize = CUVector.size(),
153+
TUVectorSize = getGDBIndexTUEntryVector().size()](
154+
uint32_t OriginalIndex) {
155+
if (OriginalIndex >= CUVectorSize) {
156+
if (OriginalIndex >= CUVectorSize + TUVectorSize) {
157+
errs() << "BOLT-ERROR: .gdb_index unknown CU index\n";
158+
exit(1);
159+
}
160+
// The index is into TU CU List, which we don't reorder, so return as is.
161+
return OriginalIndex;
162+
}
163+
164+
const auto It = OriginalCUIndexToUpdatedCUIndexMap.find(OriginalIndex);
165+
if (It == OriginalCUIndexToUpdatedCUIndexMap.end()) {
166+
errs() << "BOLT-ERROR: .gdb_index unknown CU index\n";
167+
exit(1);
168+
}
169+
170+
return It->second;
171+
};
172+
133173
// Writing out CU List <Offset, Size>
134174
for (auto &CUInfo : CUVector) {
135-
// Skipping TU for DWARF5 when they are not included in CU list.
136-
if (!OriginalOffsets.count(CUInfo.first))
137-
continue;
138175
write64le(Buffer, CUInfo.second.Offset);
139176
// Length encoded in CU doesn't contain first 4 bytes that encode length.
140177
write64le(Buffer + 8, CUInfo.second.Length + 4);
@@ -160,12 +197,13 @@ void GDBIndex::updateGdbIndexSection(
160197
// Generate new address table.
161198
for (const std::pair<const uint64_t, DebugAddressRangesVector> &CURangesPair :
162199
ARangesSectionWriter.getCUAddressRanges()) {
163-
const uint32_t CUIndex = OffsetToIndexMap[CURangesPair.first];
200+
const uint32_t OriginalCUIndex = OffsetToIndexMap[CURangesPair.first];
201+
const uint32_t UpdatedCUIndex = RemapCUIndex(OriginalCUIndex);
164202
const DebugAddressRangesVector &Ranges = CURangesPair.second;
165203
for (const DebugAddressRange &Range : Ranges) {
166204
write64le(Buffer, Range.LowPC);
167205
write64le(Buffer + 8, Range.HighPC);
168-
write32le(Buffer + 16, CUIndex);
206+
write32le(Buffer + 16, UpdatedCUIndex);
169207
Buffer += 20;
170208
}
171209
}
@@ -178,6 +216,56 @@ void GDBIndex::updateGdbIndexSection(
178216
// Copy over the rest of the original data.
179217
memcpy(Buffer, Data, TrailingSize);
180218

219+
// Fixup CU-indices in constant pool.
220+
const char *const OriginalConstantPoolData =
221+
GdbIndexContents.data() + ConstantPoolOffset;
222+
uint8_t *const UpdatedConstantPoolData =
223+
NewGdbIndexContents + ConstantPoolOffset + Delta;
224+
225+
const char *OriginalSymbolTableData =
226+
GdbIndexContents.data() + SymbolTableOffset;
227+
std::set<uint32_t> CUVectorOffsets;
228+
// Parse the symbol map and extract constant pool CU offsets from it.
229+
while (OriginalSymbolTableData < OriginalConstantPoolData) {
230+
const uint32_t NameOffset = read32le(OriginalSymbolTableData);
231+
const uint32_t CUVectorOffset = read32le(OriginalSymbolTableData + 4);
232+
OriginalSymbolTableData += 8;
233+
234+
// Iff both are zero, then the slot is considered empty in the hash-map.
235+
if (NameOffset || CUVectorOffset) {
236+
CUVectorOffsets.insert(CUVectorOffset);
237+
}
238+
}
239+
240+
// Update the CU-indicies in the constant pool
241+
for (const auto CUVectorOffset : CUVectorOffsets) {
242+
const char *CurrentOriginalConstantPoolData =
243+
OriginalConstantPoolData + CUVectorOffset;
244+
uint8_t *CurrentUpdatedConstantPoolData =
245+
UpdatedConstantPoolData + CUVectorOffset;
246+
247+
const uint32_t Num = read32le(CurrentOriginalConstantPoolData);
248+
CurrentOriginalConstantPoolData += 4;
249+
CurrentUpdatedConstantPoolData += 4;
250+
251+
for (uint32_t J = 0; J < Num; ++J) {
252+
const uint32_t OriginalCUIndexAndAttributes =
253+
read32le(CurrentOriginalConstantPoolData);
254+
CurrentOriginalConstantPoolData += 4;
255+
256+
// We only care for the index, which is the lowest 24 bits, other bits are
257+
// left as is.
258+
const uint32_t OriginalCUIndex =
259+
OriginalCUIndexAndAttributes & ((1 << 24) - 1);
260+
const uint32_t Attributes = OriginalCUIndexAndAttributes >> 24;
261+
const uint32_t UpdatedCUIndexAndAttributes =
262+
RemapCUIndex(OriginalCUIndex) | (Attributes << 24);
263+
264+
write32le(CurrentUpdatedConstantPoolData, UpdatedCUIndexAndAttributes);
265+
CurrentUpdatedConstantPoolData += 4;
266+
}
267+
}
268+
181269
// Register the new section.
182270
BC.registerOrUpdateNoteSection(".gdb_index", NewGdbIndexContents,
183271
NewGdbIndexSize);

bolt/lib/Passes/Instrumentation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,8 @@ void Instrumentation::createAuxiliaryFunctions(BinaryContext &BC) {
753753
createSimpleFunction("__bolt_fini_trampoline",
754754
BC.MIB->createReturnInstructionList(BC.Ctx.get()));
755755
}
756+
if (BC.isAArch64())
757+
BC.MIB->createInstrCounterIncrFunc(BC);
756758
}
757759
}
758760

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1312,7 +1312,9 @@ void RewriteInstance::discoverFileObjects() {
13121312

13131313
// Annotate functions with code/data markers in AArch64
13141314
for (auto &[Address, Type] : MarkerSymbols) {
1315-
auto *BF = BC->getBinaryFunctionContainingAddress(Address, true, true);
1315+
auto *BF = BC->getBinaryFunctionContainingAddress(Address,
1316+
/*CheckPastEnd*/ false,
1317+
/*UseMaxSize*/ true);
13161318

13171319
if (!BF) {
13181320
// Stray marker

0 commit comments

Comments
 (0)