[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