Author: Petr Hosek Date: 2024-11-25T11:53:16-08:00 New Revision: 1a6525e438abfe54708f14b9ceec27c0e337f336
URL: https://github.com/llvm/llvm-project/commit/1a6525e438abfe54708f14b9ceec27c0e337f336 DIFF: https://github.com/llvm/llvm-project/commit/1a6525e438abfe54708f14b9ceec27c0e337f336.diff LOG: Revert "[profile] Use base+vaddr for `__llvm_write_binary_ids` note pointers …" This reverts commit 667e1fadcf4376ce41f5cae7cabab9f5ccc77b15. Added: Modified: compiler-rt/lib/profile/InstrProfilingPlatformLinux.c Removed: compiler-rt/test/profile/Linux/binary-id-offset.c ################################################################################ diff --git a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c index 5b230c1b200623..613cfb60857cf3 100644 --- a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c +++ b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c @@ -194,33 +194,41 @@ static int WriteBinaryIds(ProfDataWriter *Writer, const ElfW(Nhdr) * Note, */ COMPILER_RT_VISIBILITY int __llvm_write_binary_ids(ProfDataWriter *Writer) { extern const ElfW(Ehdr) __ehdr_start __attribute__((visibility("hidden"))); - extern ElfW(Dyn) _DYNAMIC[] __attribute__((weak, visibility("hidden"))); - const ElfW(Ehdr) *ElfHeader = &__ehdr_start; const ElfW(Phdr) *ProgramHeader = (const ElfW(Phdr) *)((uintptr_t)ElfHeader + ElfHeader->e_phoff); - /* Compute the added base address in case of position-independent code. */ - uintptr_t Base = 0; - for (uint32_t I = 0; I < ElfHeader->e_phnum; I++) { - if (ProgramHeader[I].p_type == PT_PHDR) - Base = (uintptr_t)ProgramHeader - ProgramHeader[I].p_vaddr; - if (ProgramHeader[I].p_type == PT_DYNAMIC && _DYNAMIC) - Base = (uintptr_t)_DYNAMIC - ProgramHeader[I].p_vaddr; - } - int TotalBinaryIdsSize = 0; + uint32_t I; /* Iterate through entries in the program header. */ - for (uint32_t I = 0; I < ElfHeader->e_phnum; I++) { + for (I = 0; I < ElfHeader->e_phnum; I++) { /* Look for the notes segment in program header entries. */ if (ProgramHeader[I].p_type != PT_NOTE) continue; /* There can be multiple notes segment, and examine each of them. */ - const ElfW(Nhdr) *Note = - (const ElfW(Nhdr) *)(Base + ProgramHeader[I].p_vaddr); - const ElfW(Nhdr) *NotesEnd = - (const ElfW(Nhdr) *)((const char *)(Note) + ProgramHeader[I].p_memsz); + const ElfW(Nhdr) * Note; + const ElfW(Nhdr) * NotesEnd; + /* + * When examining notes in file, use p_offset, which is the offset within + * the elf file, to find the start of notes. + */ + if (ProgramHeader[I].p_memsz == 0 || + ProgramHeader[I].p_memsz == ProgramHeader[I].p_filesz) { + Note = (const ElfW(Nhdr) *)((uintptr_t)ElfHeader + + ProgramHeader[I].p_offset); + NotesEnd = (const ElfW(Nhdr) *)((const char *)(Note) + + ProgramHeader[I].p_filesz); + } else { + /* + * When examining notes in memory, use p_vaddr, which is the address of + * section after loaded to memory, to find the start of notes. + */ + Note = + (const ElfW(Nhdr) *)((uintptr_t)ElfHeader + ProgramHeader[I].p_vaddr); + NotesEnd = + (const ElfW(Nhdr) *)((const char *)(Note) + ProgramHeader[I].p_memsz); + } int BinaryIdsSize = WriteBinaryIds(Writer, Note, NotesEnd); if (TotalBinaryIdsSize == -1) diff --git a/compiler-rt/test/profile/Linux/binary-id-offset.c b/compiler-rt/test/profile/Linux/binary-id-offset.c deleted file mode 100644 index c66fe82d714ce9..00000000000000 --- a/compiler-rt/test/profile/Linux/binary-id-offset.c +++ /dev/null @@ -1,33 +0,0 @@ -// REQUIRES: linux -// -// Make sure the build-id can be found in both EXEC and DYN (PIE) files, -// even when the note's section-start is forced to a weird address. -// (The DYN case would also apply to libraries, not explicitly tested here.) - -// DEFINE: %{cflags} = -// DEFINE: %{check} = ( \ -// DEFINE: %clang_profgen -Wl,--build-id -o %t %s %{cflags} && \ -// DEFINE: env LLVM_PROFILE_FILE=%t.profraw %run %t && \ -// DEFINE: llvm-readelf --notes %t && \ -// DEFINE: llvm-profdata show --binary-ids %t.profraw \ -// DEFINE: ) | FileCheck %s - -// REDEFINE: %{cflags} = -no-pie -// RUN: %{check} - -// REDEFINE: %{cflags} = -pie -fPIE -// RUN: %{check} - -// REDEFINE: %{cflags} = -no-pie -Wl,--section-start=.note.gnu.build-id=0x1000000 -// RUN: %{check} - -// REDEFINE: %{cflags} = -pie -fPIE -Wl,--section-start=.note.gnu.build-id=0x1000000 -// RUN: %{check} - -// CHECK-LABEL{LITERAL}: .note.gnu.build-id -// CHECK: Build ID: [[ID:[0-9a-f]+]] - -// CHECK-LABEL{LITERAL}: Binary IDs: -// CHECK-NEXT: [[ID]] - -int main() { return 0; } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits