[compiler-rt] 58ecfcc - [profile] Add __attribute__((used)) to zero size dummy sections

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 17 19:22:33 PST 2021


Author: Fangrui Song
Date: 2021-02-17T19:22:25-08:00
New Revision: 58ecfccd0dd3a064a11b1f2eb164cbff7d60faf5

URL: https://github.com/llvm/llvm-project/commit/58ecfccd0dd3a064a11b1f2eb164cbff7d60faf5
DIFF: https://github.com/llvm/llvm-project/commit/58ecfccd0dd3a064a11b1f2eb164cbff7d60faf5.diff

LOG: [profile] Add __attribute__((used)) to zero size dummy sections

D14468 added these dummy sections. This patch adds `__attribute__((used))` so
that when compiled by GCC>=11 or (expected, D96838) Clang>=13 on some ELF platforms,
these sections will get SHF_GNU_RETAIN to make sure they will not be discarded
by ld --gc-sections.

We are trying to get rid of LLD's "__start_/__stop_ references retain C identifier name sections" rule.
If LLD drops the rule in the future (we will retain compatibility for `__llvm_prf_*` for a while),
`__llvm_prf_*` will need to have the SHF_GNU_RETAIN flag, otherwise:

```
// __llvm_prf_cnts/__llvm_prf_data usually exist, but {names,vnds} may not exist.
// Such diagnostics will happen with {cnts,data} as well if no input object file is instrumented.
% clang++ -fprofile-generate a.cc -fuse-ld=lld -Wl,--gc-sections
ld.lld: error: undefined hidden symbol: __start___llvm_prf_names
>>> referenced by InstrProfilingPlatformLinux.c
>>>               InstrProfilingPlatformLinux.c.o:(__llvm_profile_begin_names) in archive /tmp/RelA/lib/clang/13.0.0/lib/linux/libclang_rt.profile-x86_64.a
...
```

Differential Revision: https://reviews.llvm.org/D96902

Added: 
    

Modified: 
    compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
    compiler-rt/lib/profile/InstrProfilingPort.h

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
index c9fb481f8e90..1d11eae421ef 100644
--- a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
+++ b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
@@ -36,15 +36,19 @@ extern char PROF_NAME_STOP COMPILER_RT_VISIBILITY;
 extern ValueProfNode PROF_VNODES_START COMPILER_RT_VISIBILITY;
 extern ValueProfNode PROF_VNODES_STOP COMPILER_RT_VISIBILITY;
 
-/* Add dummy data to ensure the section is always created. */
-__llvm_profile_data
-    __prof_data_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_DATA_SECT_NAME);
-uint64_t
-    __prof_cnts_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_CNTS_SECT_NAME);
-uint32_t
-    __prof_orderfile_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_ORDERFILE_SECT_NAME);
-const char __prof_nms_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_NAME_SECT_NAME);
-ValueProfNode __prof_vnodes_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_VNODES_SECT_NAME);
+/* Add dummy data to ensure the section is always created. Add used attribute so
+ * that they are linker GC roots on supported ELF platforms.
+ */
+__llvm_profile_data __prof_data_sect_data[0] COMPILER_RT_SECTION(
+    INSTR_PROF_DATA_SECT_NAME) COMPILER_RT_USED;
+uint64_t __prof_cnts_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_CNTS_SECT_NAME)
+    COMPILER_RT_USED;
+uint32_t __prof_orderfile_sect_data[0] COMPILER_RT_SECTION(
+    INSTR_PROF_ORDERFILE_SECT_NAME) COMPILER_RT_USED;
+const char __prof_nms_sect_data[0] COMPILER_RT_SECTION(
+    INSTR_PROF_NAME_SECT_NAME) COMPILER_RT_USED;
+ValueProfNode __prof_vnodes_sect_data[0] COMPILER_RT_SECTION(
+    INSTR_PROF_VNODES_SECT_NAME) COMPILER_RT_USED;
 
 COMPILER_RT_VISIBILITY const __llvm_profile_data *
 __llvm_profile_begin_data(void) {

diff  --git a/compiler-rt/lib/profile/InstrProfilingPort.h b/compiler-rt/lib/profile/InstrProfilingPort.h
index cb66c5964ad1..ed0905cc5f20 100644
--- a/compiler-rt/lib/profile/InstrProfilingPort.h
+++ b/compiler-rt/lib/profile/InstrProfilingPort.h
@@ -23,6 +23,7 @@
 #define COMPILER_RT_FTRUNCATE(f,l) _chsize(_fileno(f),l)
 #define COMPILER_RT_ALWAYS_INLINE __forceinline
 #define COMPILER_RT_CLEANUP(x)
+#define COMPILER_RT_USED
 #elif __GNUC__
 #ifdef _WIN32
 #define COMPILER_RT_FTRUNCATE(f, l) _chsize(fileno(f), l)
@@ -37,6 +38,7 @@
 #define COMPILER_RT_ALLOCA __builtin_alloca
 #define COMPILER_RT_ALWAYS_INLINE inline __attribute((always_inline))
 #define COMPILER_RT_CLEANUP(x) __attribute__((cleanup(x)))
+#define COMPILER_RT_USED __attribute__((used))
 #endif
 
 #if defined(__APPLE__)


        


More information about the llvm-commits mailing list