diff --git a/bolt/runtime/instr.cpp b/bolt/runtime/instr.cpp index ae356e71cbe41..141171a981b39 100644 --- a/bolt/runtime/instr.cpp +++ b/bolt/runtime/instr.cpp @@ -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 @@ -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, @@ -732,23 +732,24 @@ ProfileWriterContext readDescriptions() { // mmap our binary to memory uint64_t Size = __lseek(FD, 0, SEEK_END); - uint8_t *BinContents = reinterpret_cast( + const uint8_t *BinContents = reinterpret_cast( __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(BinContents); - Elf64_Shdr *Shdr = reinterpret_cast(BinContents + Hdr->e_shoff); - Elf64_Shdr *StringTblHeader = reinterpret_cast( + const Elf64_Ehdr *Hdr = reinterpret_cast(BinContents); + const Elf64_Shdr *Shdr = + reinterpret_cast(BinContents + Hdr->e_shoff); + const Elf64_Shdr *StringTblHeader = reinterpret_cast( 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( + const char *SecName = reinterpret_cast( BinContents + StringTblHeader->sh_offset + Shdr->sh_name); if (compareStr(SecName, ".bolt.instr.tables", 64) != 0) { - Shdr = reinterpret_cast(BinContents + Hdr->e_shoff + - (I + 1) * Hdr->e_shentsize); + Shdr = reinterpret_cast(BinContents + Hdr->e_shoff + + (I + 1) * Hdr->e_shentsize); continue; } // Actual contents of the ELF note start after offset 20 decimal: @@ -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(BinContents + Shdr->sh_offset + 20); - uint32_t IndCallTargetDescSize = *reinterpret_cast( + *reinterpret_cast(BinContents + Shdr->sh_offset + 20); + uint32_t IndCallTargetDescSize = *reinterpret_cast( BinContents + Shdr->sh_offset + 24 + IndCallDescSize); - uint32_t FuncDescSize = - *reinterpret_cast(BinContents + Shdr->sh_offset + 28 + - IndCallDescSize + IndCallTargetDescSize); - Result.IndCallDescriptions = reinterpret_cast( + uint32_t FuncDescSize = *reinterpret_cast( + BinContents + Shdr->sh_offset + 28 + IndCallDescSize + + IndCallTargetDescSize); + Result.IndCallDescriptions = reinterpret_cast( BinContents + Shdr->sh_offset + 24); - Result.IndCallTargets = reinterpret_cast( + Result.IndCallTargets = reinterpret_cast( BinContents + Shdr->sh_offset + 28 + IndCallDescSize); Result.FuncDescriptions = BinContents + Shdr->sh_offset + 32 + IndCallDescSize + IndCallTargetDescSize; - Result.Strings = reinterpret_cast( + Result.Strings = reinterpret_cast( BinContents + Shdr->sh_offset + 32 + IndCallDescSize + IndCallTargetDescSize + FuncDescSize); return Result; @@ -814,13 +815,14 @@ void printStats(const ProfileWriterContext &Ctx) { strCopy(StatPtr, "\nBOLT INSTRUMENTATION RUNTIME STATISTICS\n\nIndCallDescSize: "); StatPtr = intToStr(StatPtr, - Ctx.FuncDescriptions - - reinterpret_cast(Ctx.IndCallDescriptions), + Ctx.FuncDescriptions - reinterpret_cast( + Ctx.IndCallDescriptions), 10); StatPtr = strCopy(StatPtr, "\nFuncDescSize: "); - StatPtr = intToStr( - StatPtr, - reinterpret_cast(Ctx.Strings) - Ctx.FuncDescriptions, 10); + StatPtr = intToStr(StatPtr, + reinterpret_cast(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: "); @@ -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(); @@ -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" :::); @@ -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 :::);