[llvm-branch-commits] [compiler-rt] 1a6525e - Revert "[profile] Use base+vaddr for `__llvm_write_binary_ids` note pointers …"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Nov 25 11:53:20 PST 2024
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; }
More information about the llvm-branch-commits
mailing list