Skip to content

[BOLT][NFC] Add const qualifier to certain pointers to read-only objects #148543

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

Merged
merged 2 commits into from
Jul 14, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 32 additions & 30 deletions bolt/runtime/instr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -568,13 +568,13 @@ struct FunctionDescription {
/// should be straightforward as most data is POD or an array of POD elements.
/// This metadata is used to reconstruct function CFGs.
struct ProfileWriterContext {
IndCallDescription *IndCallDescriptions;
IndCallTargetDescription *IndCallTargets;
uint8_t *FuncDescriptions;
char *Strings; // String table with function names used in this binary
const IndCallDescription *IndCallDescriptions;
const IndCallTargetDescription *IndCallTargets;
const uint8_t *FuncDescriptions;
const char *Strings; // String table with function names used in this binary
int FileDesc; // File descriptor for the file on disk backing this
// information in memory via mmap
void *MMapPtr; // The mmap ptr
const void *MMapPtr; // The mmap ptr
int MMapSize; // The mmap size

/// Hash table storing all possible call destinations to detect untracked
Expand Down Expand Up @@ -721,7 +721,7 @@ static char *getBinaryPath() {

ProfileWriterContext readDescriptions() {
ProfileWriterContext Result;
char *BinPath = getBinaryPath();
const char *BinPath = getBinaryPath();
assert(BinPath && BinPath[0] != '\0', "failed to find binary path");

uint64_t FD = __open(BinPath, O_RDONLY,
Expand All @@ -732,23 +732,24 @@ ProfileWriterContext readDescriptions() {

// mmap our binary to memory
uint64_t Size = __lseek(FD, 0, SEEK_END);
uint8_t *BinContents = reinterpret_cast<uint8_t *>(
const uint8_t *BinContents = reinterpret_cast<uint8_t *>(
__mmap(0, Size, PROT_READ, MAP_PRIVATE, FD, 0));
assert(BinContents != MAP_FAILED, "readDescriptions: Failed to mmap self!");
Result.MMapPtr = BinContents;
Result.MMapSize = Size;
Elf64_Ehdr *Hdr = reinterpret_cast<Elf64_Ehdr *>(BinContents);
Elf64_Shdr *Shdr = reinterpret_cast<Elf64_Shdr *>(BinContents + Hdr->e_shoff);
Elf64_Shdr *StringTblHeader = reinterpret_cast<Elf64_Shdr *>(
const Elf64_Ehdr *Hdr = reinterpret_cast<const Elf64_Ehdr *>(BinContents);
const Elf64_Shdr *Shdr =
reinterpret_cast<const Elf64_Shdr *>(BinContents + Hdr->e_shoff);
const Elf64_Shdr *StringTblHeader = reinterpret_cast<const Elf64_Shdr *>(
BinContents + Hdr->e_shoff + Hdr->e_shstrndx * Hdr->e_shentsize);

// Find .bolt.instr.tables with the data we need and set pointers to it
for (int I = 0; I < Hdr->e_shnum; ++I) {
char *SecName = reinterpret_cast<char *>(
const char *SecName = reinterpret_cast<const char *>(
BinContents + StringTblHeader->sh_offset + Shdr->sh_name);
if (compareStr(SecName, ".bolt.instr.tables", 64) != 0) {
Shdr = reinterpret_cast<Elf64_Shdr *>(BinContents + Hdr->e_shoff +
(I + 1) * Hdr->e_shentsize);
Shdr = reinterpret_cast<const Elf64_Shdr *>(BinContents + Hdr->e_shoff +
(I + 1) * Hdr->e_shentsize);
continue;
}
// Actual contents of the ELF note start after offset 20 decimal:
Expand All @@ -758,19 +759,19 @@ ProfileWriterContext readDescriptions() {
// Offset 12: Producer name (BOLT\0) (5 bytes + align to 4-byte boundary)
// Offset 20: Contents
uint32_t IndCallDescSize =
*reinterpret_cast<uint32_t *>(BinContents + Shdr->sh_offset + 20);
uint32_t IndCallTargetDescSize = *reinterpret_cast<uint32_t *>(
*reinterpret_cast<const uint32_t *>(BinContents + Shdr->sh_offset + 20);
uint32_t IndCallTargetDescSize = *reinterpret_cast<const uint32_t *>(
BinContents + Shdr->sh_offset + 24 + IndCallDescSize);
uint32_t FuncDescSize =
*reinterpret_cast<uint32_t *>(BinContents + Shdr->sh_offset + 28 +
IndCallDescSize + IndCallTargetDescSize);
Result.IndCallDescriptions = reinterpret_cast<IndCallDescription *>(
uint32_t FuncDescSize = *reinterpret_cast<const uint32_t *>(
BinContents + Shdr->sh_offset + 28 + IndCallDescSize +
IndCallTargetDescSize);
Result.IndCallDescriptions = reinterpret_cast<const IndCallDescription *>(
BinContents + Shdr->sh_offset + 24);
Result.IndCallTargets = reinterpret_cast<IndCallTargetDescription *>(
Result.IndCallTargets = reinterpret_cast<const IndCallTargetDescription *>(
BinContents + Shdr->sh_offset + 28 + IndCallDescSize);
Result.FuncDescriptions = BinContents + Shdr->sh_offset + 32 +
IndCallDescSize + IndCallTargetDescSize;
Result.Strings = reinterpret_cast<char *>(
Result.Strings = reinterpret_cast<const char *>(
BinContents + Shdr->sh_offset + 32 + IndCallDescSize +
IndCallTargetDescSize + FuncDescSize);
return Result;
Expand Down Expand Up @@ -814,13 +815,14 @@ void printStats(const ProfileWriterContext &Ctx) {
strCopy(StatPtr,
"\nBOLT INSTRUMENTATION RUNTIME STATISTICS\n\nIndCallDescSize: ");
StatPtr = intToStr(StatPtr,
Ctx.FuncDescriptions -
reinterpret_cast<uint8_t *>(Ctx.IndCallDescriptions),
Ctx.FuncDescriptions - reinterpret_cast<const uint8_t *>(
Ctx.IndCallDescriptions),
10);
StatPtr = strCopy(StatPtr, "\nFuncDescSize: ");
StatPtr = intToStr(
StatPtr,
reinterpret_cast<uint8_t *>(Ctx.Strings) - Ctx.FuncDescriptions, 10);
StatPtr = intToStr(StatPtr,
reinterpret_cast<const uint8_t *>(Ctx.Strings) -
Ctx.FuncDescriptions,
10);
StatPtr = strCopy(StatPtr, "\n__bolt_instr_num_ind_calls: ");
StatPtr = intToStr(StatPtr, __bolt_instr_num_ind_calls, 10);
StatPtr = strCopy(StatPtr, "\n__bolt_instr_num_funcs: ");
Expand Down Expand Up @@ -1549,7 +1551,7 @@ __bolt_instr_data_dump(int FD) {
Ctx.CallFlowTable->forEachElement(visitCallFlowEntry, FD, &Ctx);

__fsync(FD);
__munmap(Ctx.MMapPtr, Ctx.MMapSize);
__munmap((void *)Ctx.MMapPtr, Ctx.MMapSize);
__close(Ctx.FileDesc);
HashAlloc.destroy();
GlobalWriteProfileMutex->release();
Expand Down Expand Up @@ -1756,7 +1758,7 @@ extern "C" __attribute((naked)) void __bolt_instr_start()
"jal x1, __bolt_instr_setup\n"
RESTORE_ALL
"setup_symbol:\n"
"auipc x5, %%pcrel_hi(__bolt_start_trampoline)\n"
"auipc x5, %%pcrel_hi(__bolt_start_trampoline)\n"
"addi x5, x5, %%pcrel_lo(setup_symbol)\n"
"jr x5\n"
:::);
Expand Down Expand Up @@ -1788,8 +1790,8 @@ extern "C" void __bolt_instr_fini() {
__asm__ __volatile__(
SAVE_ALL
"fini_symbol:\n"
"auipc x5, %%pcrel_hi(__bolt_fini_trampoline)\n"
"addi x5, x5, %%pcrel_lo(fini_symbol)\n"
"auipc x5, %%pcrel_hi(__bolt_fini_trampoline)\n"
"addi x5, x5, %%pcrel_lo(fini_symbol)\n"
"jalr x1, 0(x5)\n"
RESTORE_ALL
:::);
Expand Down
Loading