-
Notifications
You must be signed in to change notification settings - Fork 15.1k
[BOLT] Fix incorrect CU-indicies in gdb-index #151927
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BOLT] Fix incorrect CU-indicies in gdb-index #151927
Conversation
|
@llvm/pr-subscribers-bolt Author: None (itrofimow) ChangesAfter we sort the CUVector, we have to update CU-indices in address map and constant pool Full diff: https://github.com/llvm/llvm-project/pull/151927.diff 1 Files Affected:
diff --git a/bolt/lib/Core/GDBIndex.cpp b/bolt/lib/Core/GDBIndex.cpp
index c7fb4889646b4..0fe1c5de94138 100644
--- a/bolt/lib/Core/GDBIndex.cpp
+++ b/bolt/lib/Core/GDBIndex.cpp
@@ -130,6 +130,26 @@ void GDBIndex::updateGdbIndexSection(
[](const MapEntry &E1, const MapEntry &E2) -> bool {
return E1.second.Offset < E2.second.Offset;
});
+ // Create the original CU index -> updated CU index mapping,
+ // as the sort above could've changed the order and we have to update
+ // indexes correspondingly in address map and constant pool.
+ std::unordered_map<uint32_t, uint32_t> OriginalCUIndexToUpdatedCUIndexMap;
+ OriginalCUIndexToUpdatedCUIndexMap.reserve(CUVector.size());
+ for (uint32_t I = 0; I < CUVector.size(); ++I) {
+ OriginalCUIndexToUpdatedCUIndexMap[OffsetToIndexMap.at(CUVector[I].first)] =
+ I;
+ }
+ const auto RemapCUIndex =
+ [&OriginalCUIndexToUpdatedCUIndexMap](uint32_t OriginalIndex) {
+ const auto it = OriginalCUIndexToUpdatedCUIndexMap.find(OriginalIndex);
+ if (it == OriginalCUIndexToUpdatedCUIndexMap.end()) {
+ errs() << "BOLT-ERROR: .gdb_index unknown CU index\n";
+ exit(1);
+ }
+
+ return it->second;
+ };
+
// Writing out CU List <Offset, Size>
for (auto &CUInfo : CUVector) {
// Skipping TU for DWARF5 when they are not included in CU list.
@@ -160,12 +180,13 @@ void GDBIndex::updateGdbIndexSection(
// Generate new address table.
for (const std::pair<const uint64_t, DebugAddressRangesVector> &CURangesPair :
ARangesSectionWriter.getCUAddressRanges()) {
- const uint32_t CUIndex = OffsetToIndexMap[CURangesPair.first];
+ const uint32_t OriginalCUIndex = OffsetToIndexMap[CURangesPair.first];
+ const uint32_t UpdatedCUIndex = RemapCUIndex(OriginalCUIndex);
const DebugAddressRangesVector &Ranges = CURangesPair.second;
for (const DebugAddressRange &Range : Ranges) {
write64le(Buffer, Range.LowPC);
write64le(Buffer + 8, Range.HighPC);
- write32le(Buffer + 16, CUIndex);
+ write32le(Buffer + 16, UpdatedCUIndex);
Buffer += 20;
}
}
@@ -178,6 +199,56 @@ void GDBIndex::updateGdbIndexSection(
// Copy over the rest of the original data.
memcpy(Buffer, Data, TrailingSize);
+ // Fixup CU-indicies in constant pool.
+ const char *const OriginalConstantPoolData =
+ GdbIndexContents.data() + ConstantPoolOffset;
+ uint8_t *const UpdatedConstantPoolData =
+ NewGdbIndexContents + ConstantPoolOffset + Delta;
+
+ const char *OriginalSymbolTableData =
+ GdbIndexContents.data() + SymbolTableOffset;
+ std::set<uint32_t> CUVectorOffsets;
+ // Parse the symbol map and extract constant pool CU offsets from it.
+ while (OriginalSymbolTableData < OriginalConstantPoolData) {
+ const uint32_t NameOffset = read32le(OriginalSymbolTableData);
+ const uint32_t CUVectorOffset = read32le(OriginalSymbolTableData + 4);
+ OriginalSymbolTableData += 8;
+
+ // Iff both are zero, then the slot is considered empty in the hash-map.
+ if (NameOffset || CUVectorOffset) {
+ CUVectorOffsets.insert(CUVectorOffset);
+ }
+ }
+
+ // Update the CU-indicies in the constant pool
+ for (const auto CUVectorOffset : CUVectorOffsets) {
+ const char *CurrentOriginalConstantPoolData =
+ OriginalConstantPoolData + CUVectorOffset;
+ uint8_t *CurrentUpdatedConstantPoolData =
+ UpdatedConstantPoolData + CUVectorOffset;
+
+ const uint32_t Num = read32le(CurrentOriginalConstantPoolData);
+ CurrentOriginalConstantPoolData += 4;
+ CurrentUpdatedConstantPoolData += 4;
+
+ for (uint32_t J = 0; J < Num; ++J) {
+ const uint32_t OriginalCUIndexAndAttributes =
+ read32le(CurrentOriginalConstantPoolData);
+ CurrentOriginalConstantPoolData += 4;
+
+ // We only care for the index, which is the lowest 24 bits, other bits are
+ // left as is.
+ const uint32_t OriginalCUIndex =
+ OriginalCUIndexAndAttributes & ((1 << 24) - 1);
+ const uint32_t Attributes = OriginalCUIndexAndAttributes >> 24;
+ const uint32_t UpdatedCUIndexAndAttributes =
+ RemapCUIndex(OriginalCUIndex) | (Attributes << 24);
+
+ write32le(CurrentUpdatedConstantPoolData, UpdatedCUIndexAndAttributes);
+ CurrentUpdatedConstantPoolData += 4;
+ }
+ }
+
// Register the new section.
BC.registerOrUpdateNoteSection(".gdb_index", NewGdbIndexContents,
NewGdbIndexSize);
|
|
Hi @aaupov ! Could you please have a look at this PR? |
|
Hi @ayermolo ! llvm-project/bolt/lib/Core/GDBIndex.cpp Lines 127 to 132 in fde9ee1
(coming from this commit dcfa2ab), which I think introduced the problem, so could you please have a look at this PR? There's no rush for me to get this landed, but I intend to backport this change into BOLT we use, so I'd appreciate a review |
|
Hi, sorry for late reply. |
|
Hi! No worries, thanks The problem I'm talking about clearly manifests itself in this test, for instance: llvm-project/bolt/test/X86/dwarf5-gdb-index-types-lld-generated.test Lines 12 to 20 in b975a7b
where CU id = 3 in line 20 is just out of range
|
ayermolo
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Sorry it took so long.
|
Kindly pinging you @ayermolo about this PR |
maksfb
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
After we sort the CUVector, we have to update CU-indices in address map and constant pool
After we sort the CUVector, we have to update CU-indices in address map and constant pool