1 2 # FIXME 22 Jan 09: helgrind-glibc2X-005 overlaps with a lot of 3 # other stuff. They should be removed. 4 5 ##----------------------------------------------------------------------## 6 # Suppressions for the Helgrind tool when using 7 # a glibc-2.{3,4,5,6,7,8,9} system 8 9 #################################################### 10 # glibc-2.X specific 11 # These are generic cover-alls which catch a lot of stuff 12 # in various combinations of ld, libc and libpthread 13 # 14 # Note this is heavyhanded and not very clever: 15 # 16 # - suppress anything that has its top frame in ld.so 17 # That's fine, since it's mostly dynamic linking stuff, 18 # which has various deliberate (harmless) races 19 # 20 # - suppress anything that has its top frame in libc.so. 21 # This really isn't clever, since it could hide some 22 # legitimate races. But the problem is, if we don't do 23 # this, then loads of errors to do with stdio are reported, because 24 # H fails to see glibc's internal locking/unlocking of FILE*s 25 # as required by POSIX. A better solution is needed. 26 # 27 # - some of the stdio functions in newer glibc manipulate stdio 28 # FILE*s state through mempcpy, which we intercept, so we also need 29 # to suppress such manipulations. 30 31 #{ 32 # helgrind-glibc2X-001 33 # Helgrind:Race 34 # obj:*/lib*/ld-2.*so* 35 #} 36 37 # helgrind-glibc2X-002 was merged into helgrind-glibc2X-001 38 39 # helgrind-glibc2X-003 was merged into helgrind-glibc2X-001 40 41 { 42 helgrind-glibc2X-004 43 Helgrind:Race 44 obj:*/lib*/libc-2.*so* 45 } 46 47 { 48 helgrind-glibc-io-xsputn-mempcpy 49 Helgrind:Race 50 fun:__GI_mempcpy 51 fun:_IO_*xsputn* 52 obj:*/lib*/libc-2.*so* 53 } 54 55 { 56 helgrind-glibc2X-005 57 Helgrind:Race 58 obj:*/lib*/libpthread-2.*so* 59 } 60 61 # helgrind-glibc2X-006 was merged into helgrind-glibc2X-005 62 63 # helgrind-glibc2X-007 was merged into helgrind-glibc2X-001 64 65 # helgrind-glibc2X-008 was merged into helgrind-glibc2X-004 66 67 # helgrind-glibc2X-009 was merged into helgrind-glibc2X-004 68 69 # helgrind-glibc2X-010 was merged into helgrind-glibc2X-001 70 71 # helgrind-glibc2X-011 was merged into helgrind-glibc2X-004 72 73 # helgrind-glibc2X-012 was merged into helgrind-glibc2X-001 74 75 # helgrind-glibc2X-013 was merged into helgrind-glibc2X-001 76 77 # helgrind-glibc2X-014 was merged into helgrind-glibc2X-001 78 79 # helgrind-glibc2X-015 was merged into helgrind-glibc2X-004 80 81 # helgrind-glibc2X-016 was merged into helgrind-glibc2X-004 82 83 # These are very ugly. They are needed to suppress errors inside (eg) 84 # NPTL's pthread_cond_signal. Why only one stack frame -- at least we 85 # should see the wrapper calling the real functions, right? 86 # Unfortunately, no: the real functions are handwritten assembly (in 87 # the glibc-2.5 sources) and does not create a proper stack frame. 88 # Therefore it's only one level of unwinding before we're back out in 89 # user code rather than the 2 levels you'd expect. 90 { 91 helgrind-glibc2X-101 92 Helgrind:Race 93 obj:*/lib*/libpthread-2.*so* 94 fun:pthread_* 95 } 96 { 97 helgrind-glibc2X-102 98 Helgrind:Race 99 fun:mythread_wrapper 100 obj:*/lib*/libpthread-2.*so* 101 } 102 { 103 helgrind-glibc2X-103 104 Helgrind:Race 105 fun:pthread_cond_*@@GLIBC_2.* 106 } 107 { 108 helgrind-glibc2X-104 109 Helgrind:Race 110 fun:__lll_mutex_* 111 } 112 { 113 helgrind-glibc2X-105 114 Helgrind:Race 115 fun:pthread_rwlock_*lock* 116 } 117 { 118 helgrind-glibc2X-106 119 Helgrind:Race 120 fun:__lll_lock_wait 121 } 122 { 123 helgrind-glibc2X-107 124 Helgrind:Race 125 obj:*/lib*/libpthread-2.*so* 126 fun:sem_* 127 } 128 { 129 helgrind-glibc2X-108 130 Helgrind:Race 131 fun:clone 132 } 133 { 134 helgrind-glibc2X-109 135 Helgrind:Race 136 fun:start_thread 137 } 138 { 139 helgrind-glibc2X-110 140 Helgrind:Race 141 obj:*/lib*/libc-2.*so* 142 fun:pthread_* 143 } 144 { 145 helgrind-glibc2X-111 146 Helgrind:Race 147 fun:__lll_*lock_* 148 } 149 { 150 helgrind-glibc2X-113 151 Helgrind:Race 152 fun:pthread_barrier_wait* 153 } 154 155 156 #################################################### 157 # qt4 specific (GNU mangling) 158 # 159 { 160 helgrind-qt4---QMutex::lock()-QMutex::lock() 161 Helgrind:Race 162 ... 163 fun:_ZN6QMutex4lockEv 164 fun:_ZN6QMutex4lockEv 165 } 166 167 { 168 helgrind-qt4---QMutex::unlock()-QMutex::unlock() 169 Helgrind:Race 170 ... 171 fun:_ZN6QMutex6unlockEv 172 fun:_ZN6QMutex6unlockEv 173 } 174 175 { 176 helgrind-qt4---pthread_setspecific-QThreadPrivate::start(void*) 177 Helgrind:Race 178 fun:pthread_setspecific 179 fun:_ZN14QThreadPrivate5startEPv 180 } 181 182 183 #################################################### 184 # Other stuff. 185 # 186 # pthread_exit apparently calls some kind of unwind 187 # mechanism - maybe to remove some number of frames 188 # from the thread's stack, so as to get back to the 189 # outermost frame for the thread? Anyway.. 190 191 { 192 helgrind---*Unwind*-...-pthread_exit 193 Helgrind:Race 194 fun:*Unwind* 195 ... 196 fun:pthread_exit 197 } 198 199 { 200 helgrind---...-*Unwind*-*pthread_unwind* 201 Helgrind:Race 202 ... 203 fun:*Unwind* 204 fun:*pthread_unwind* 205 } 206 207 { 208 helgrind---...-*Unwind*-*pthread_unwind* 209 Helgrind:Race 210 ... 211 fun:_Unwind* 212 ... 213 fun:_Unwind_Backtrace 214 } 215 216 217 218 219 #################################################### 220 # To do with thread stack allocation and deallocation? 221 # 222 { 223 helgrind---free_stacks-__deallocate_stack 224 Helgrind:Race 225 fun:free_stacks 226 fun:__deallocate_stack 227 } 228 229 { 230 helgrind---__deallocate_stack-start_thread-clone 231 Helgrind:Race 232 fun:__deallocate_stack 233 fun:start_thread 234 fun:clone 235 } 236 237 238 #################################################### 239 # To do with pthread_{set,get}specific 240 # 241 { 242 helgrind---pthread_setspecific 243 Helgrind:Race 244 fun:pthread_setspecific 245 } 246 247 { 248 helgrind---pthread_getspecific 249 Helgrind:Race 250 fun:pthread_getspecific 251 } 252 253 254 #################################################### 255 # To do with dynamic linking 256 # 257 # helgrind---ld.so-...-dlsym was merged into helgrind-glibc2X-001 258 259 { 260 helgrind---_dl_allocate_tls 261 Helgrind:Race 262 fun:mempcpy 263 fun:_dl_allocate_tls_init 264 ... 265 fun:pthread_create@@GLIBC_2.2* 266 fun:pthread_create_WRK 267 fun:pthread_create@* 268 } 269 270 #################################################### 271 # To do with GNU libgomp 272 # 273 { 274 helgrind---libgomp43-1 275 Helgrind:Race 276 fun:gomp_ordered_sync 277 } 278 279 { 280 helgrind---libgomp43-1 281 Helgrind:Race 282 fun:gomp_ordered_next 283 } 284 285 { 286 helgrind---libgomp43-1 287 Helgrind:Race 288 fun:gomp_ordered_last 289 } 290