File indexing completed on 2025-09-18 09:35:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #ifndef __PUB_TOOL_BASICS_H
0030 #define __PUB_TOOL_BASICS_H
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 #include "libvex_basictypes.h"
0046
0047
0048 #include <stdarg.h>
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 #define VGAPPEND(str1,str2) str1##str2
0067
0068 #define VG_(str) VGAPPEND(vgPlain_, str)
0069 #define ML_(str) VGAPPEND(vgModuleLocal_, str)
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084 typedef unsigned long UWord;
0085 typedef signed long Word;
0086
0087
0088
0089 typedef Word SSizeT;
0090
0091
0092
0093
0094
0095 typedef Word PtrdiffT;
0096
0097
0098
0099
0100
0101
0102
0103 #if defined(VGO_linux) || defined(VGO_solaris)
0104 typedef Word OffT;
0105 #elif defined(VGO_freebsd)
0106 typedef Long OffT;
0107 #elif defined(VGO_darwin)
0108 typedef Long OffT;
0109 #else
0110 # error Unknown OS
0111 #endif
0112 typedef Long Off64T;
0113
0114 #if !defined(NULL)
0115 # define NULL ((void*)0)
0116 #endif
0117
0118
0119 typedef struct { UWord uw1; UWord uw2; } UWordPair;
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130 typedef UInt ThreadId;
0131
0132
0133
0134
0135
0136
0137
0138
0139 typedef struct { UInt n; } DiEpoch;
0140
0141 static inline DiEpoch DiEpoch_INVALID ( void ) {
0142 DiEpoch dep; dep.n = 0; return dep;
0143 }
0144
0145 static inline Bool is_DiEpoch_INVALID ( DiEpoch dep ) {
0146 return dep.n == 0;
0147 }
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158 typedef void* (*Alloc_Fn_t) ( const HChar* cc, SizeT szB );
0159 typedef void (*Free_Fn_t) ( void* p );
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196 #if defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
0197 typedef
0198 struct {
0199 Bool _isError;
0200 RegWord _val;
0201 UWord _valEx;
0202 }
0203 SysRes;
0204
0205 #elif defined(VGO_linux) \
0206 && !defined(VGP_mips32_linux) && !defined(VGP_mips64_linux)
0207 typedef
0208 struct {
0209 Bool _isError;
0210 UWord _val;
0211 }
0212 SysRes;
0213
0214 #elif defined(VGO_darwin)
0215 typedef
0216 enum {
0217 SysRes_MACH=40,
0218 SysRes_MDEP,
0219 SysRes_UNIX_OK,
0220 SysRes_UNIX_ERR
0221 }
0222 SysResMode;
0223 typedef
0224 struct {
0225 UWord _wLO;
0226 UWord _wHI;
0227 SysResMode _mode;
0228 }
0229 SysRes;
0230 #elif defined(VGO_freebsd)
0231 typedef
0232 struct {
0233 UWord _val;
0234 UWord _val2;
0235 Bool _isError;
0236 }
0237 SysRes;
0238
0239 #elif defined(VGO_solaris)
0240 typedef
0241 struct {
0242 UWord _val;
0243 UWord _val2;
0244 Bool _isError;
0245 }
0246 SysRes;
0247
0248 #else
0249 # error "Unknown OS"
0250 #endif
0251
0252
0253
0254
0255 #if defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
0256
0257 static inline Bool sr_isError ( SysRes sr ) {
0258 return sr._isError;
0259 }
0260 static inline RegWord sr_Res ( SysRes sr ) {
0261 return sr._isError ? 0 : sr._val;
0262 }
0263 static inline UWord sr_ResEx ( SysRes sr ) {
0264 return sr._isError ? 0 : sr._valEx;
0265 }
0266 static inline UWord sr_Err ( SysRes sr ) {
0267 return sr._isError ? sr._val : 0;
0268 }
0269 static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
0270
0271
0272
0273
0274
0275
0276
0277
0278 # if defined(VGP_mips32_linux)
0279 const UInt __nr_Linux = 4000;
0280 const UInt __nr_pipe = __nr_Linux + 42;
0281 const UInt __nr_pipe2 = __nr_Linux + 328;
0282 # elif defined(VGP_mips64_linux) && defined(VGABI_N32)
0283 const UInt __nr_Linux = 6000;
0284 const UInt __nr_pipe = __nr_Linux + 21;
0285 const UInt __nr_pipe2 = __nr_Linux + 291;
0286 # else
0287 const UInt __nr_Linux = 5000;
0288 const UInt __nr_pipe = __nr_Linux + 21;
0289 const UInt __nr_pipe2 = __nr_Linux + 287;
0290 # endif
0291 Bool useEx = sysno == __nr_pipe || sysno == __nr_pipe2;
0292 return sr1._val == sr2._val
0293 && (useEx ? (sr1._valEx == sr2._valEx) : True)
0294 && sr1._isError == sr2._isError;
0295 }
0296
0297 #elif defined(VGO_linux) \
0298 && !defined(VGP_mips32_linux) && !defined(VGP_mips64_linux)
0299
0300 static inline Bool sr_isError ( SysRes sr ) {
0301 return sr._isError;
0302 }
0303 static inline UWord sr_Res ( SysRes sr ) {
0304 return sr._isError ? 0 : sr._val;
0305 }
0306 static inline UWord sr_Err ( SysRes sr ) {
0307 #if defined(VGP_nanomips_linux)
0308 return sr._isError ? -sr._val : 0;
0309 #else
0310 return sr._isError ? sr._val : 0;
0311 #endif
0312 }
0313 static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
0314
0315 return sr1._val == sr2._val
0316 && sr1._isError == sr2._isError;
0317 }
0318
0319 #elif defined(VGO_freebsd)
0320
0321 static inline Bool sr_isError ( SysRes sr ) {
0322 return sr._isError;
0323 }
0324 static inline UWord sr_Res ( SysRes sr ) {
0325 return sr._isError ? 0 : sr._val;
0326 }
0327 static inline UWord sr_ResHI ( SysRes sr ) {
0328 return sr._isError ? 0 : sr._val2;
0329 }
0330 static inline UWord sr_Err ( SysRes sr ) {
0331 return sr._isError ? sr._val : 0;
0332 }
0333 static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
0334 return sr_Res(sr1) == sr_Res(sr2)
0335 && sr_ResHI(sr1) == sr_ResHI(sr2)
0336 && ((sr_isError(sr1) && sr_isError(sr2))
0337 || (!sr_isError(sr1) && !sr_isError(sr2)));
0338 }
0339
0340 #elif defined(VGO_darwin)
0341
0342 static inline Bool sr_isError ( SysRes sr ) {
0343 switch (sr._mode) {
0344 case SysRes_UNIX_ERR:
0345 return True;
0346
0347 case SysRes_MACH:
0348 case SysRes_MDEP:
0349 case SysRes_UNIX_OK:
0350 default:
0351 return False;
0352 }
0353 }
0354
0355 static inline UWord sr_Res ( SysRes sr ) {
0356 switch (sr._mode) {
0357 case SysRes_MACH:
0358 case SysRes_MDEP:
0359 case SysRes_UNIX_OK:
0360 return sr._wLO;
0361
0362 case SysRes_UNIX_ERR:
0363 default:
0364 return 0;
0365 }
0366 }
0367
0368 static inline UWord sr_ResHI ( SysRes sr ) {
0369 switch (sr._mode) {
0370 case SysRes_UNIX_OK:
0371 return sr._wHI;
0372
0373 case SysRes_MACH:
0374 case SysRes_MDEP:
0375 case SysRes_UNIX_ERR:
0376 default:
0377 return 0;
0378 }
0379 }
0380
0381 static inline UWord sr_Err ( SysRes sr ) {
0382 switch (sr._mode) {
0383 case SysRes_UNIX_ERR:
0384 return sr._wLO;
0385
0386 case SysRes_MACH:
0387 case SysRes_MDEP:
0388 case SysRes_UNIX_OK:
0389 default:
0390 return 0;
0391 }
0392 }
0393
0394 static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
0395
0396 return sr1._mode == sr2._mode
0397 && sr1._wLO == sr2._wLO && sr1._wHI == sr2._wHI;
0398 }
0399
0400 #elif defined(VGO_solaris)
0401
0402 static inline Bool sr_isError ( SysRes sr ) {
0403 return sr._isError;
0404 }
0405 static inline UWord sr_Res ( SysRes sr ) {
0406 return sr._isError ? 0 : sr._val;
0407 }
0408 static inline UWord sr_ResHI ( SysRes sr ) {
0409 return sr._isError ? 0 : sr._val2;
0410 }
0411 static inline UWord sr_Err ( SysRes sr ) {
0412 return sr._isError ? sr._val : 0;
0413 }
0414 static inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
0415
0416 return sr1._val == sr2._val
0417 && sr1._isError == sr2._isError
0418 && (!sr1._isError) ? (sr1._val2 == sr2._val2) : True;
0419 }
0420
0421 #else
0422 # error "Unknown OS"
0423 #endif
0424
0425
0426
0427
0428
0429
0430
0431
0432 #define VG_WORDSIZE VEX_HOST_WORDSIZE
0433
0434
0435 #undef VG_BIGENDIAN
0436 #undef VG_LITTLEENDIAN
0437
0438 #if defined(VGA_x86) || defined(VGA_amd64) || defined (VGA_arm) \
0439 || ((defined(VGA_mips32) || defined(VGA_mips64) || defined(VGA_nanomips)) \
0440 && defined (_MIPSEL)) || defined(VGA_arm64) || defined(VGA_ppc64le)
0441 # define VG_LITTLEENDIAN 1
0442 #elif defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_s390x) \
0443 || ((defined(VGA_mips32) || defined(VGA_mips64) || defined(VGA_nanomips)) \
0444 && defined (_MIPSEB))
0445 # define VG_BIGENDIAN 1
0446 #else
0447 # error Unknown arch
0448 #endif
0449
0450
0451 #if !defined(offsetof)
0452 # define offsetof(type,memb) ((SizeT)(HWord)&((type*)0)->memb)
0453 #endif
0454
0455 #if !defined(container_of)
0456 # define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
0457 #endif
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479 #define vg_alignof(_type) (sizeof(struct {char c;_type _t;})-sizeof(_type))
0480
0481
0482 #if defined(VGA_x86)
0483 # define VG_REGPARM(n) __attribute__((regparm(n)))
0484 #elif defined(VGA_amd64) || defined(VGA_ppc32) \
0485 || defined(VGA_ppc64be) || defined(VGA_ppc64le) \
0486 || defined(VGA_arm) || defined(VGA_s390x) \
0487 || defined(VGA_mips32) || defined(VGA_mips64) \
0488 || defined(VGA_arm64) || defined(VGA_nanomips)
0489 # define VG_REGPARM(n)
0490 #else
0491 # error Unknown arch
0492 #endif
0493
0494
0495 #define VG_STRINGIFZ(__str) #__str
0496 #define VG_STRINGIFY(__str) VG_STRINGIFZ(__str)
0497
0498
0499 #define VG_BUGS_TO "www.valgrind.org"
0500
0501
0502 #if defined(__GNUC__)
0503 # define LIKELY(x) __builtin_expect(!!(x), 1)
0504 # define UNLIKELY(x) __builtin_expect(!!(x), 0)
0505 #else
0506 # define LIKELY(x) (x)
0507 # define UNLIKELY(x) (x)
0508 #endif
0509
0510
0511
0512
0513
0514 #if defined(__GNUC__)
0515 #define PRINTF_CHECK(x, y) __attribute__((format(__printf__, x, y)))
0516 #else
0517 #define PRINTF_CHECK(x, y)
0518 #endif
0519
0520
0521
0522
0523 #define CONST_CAST(T,x) \
0524 ({ \
0525 union { \
0526 const T in; \
0527 T out; \
0528 } var = { .in = x }; var.out; \
0529 })
0530
0531
0532
0533
0534 #define ASSUME_ALIGNED(D, x) \
0535 ({ \
0536 union { \
0537 void *in; \
0538 D out; \
0539 } var; \
0540 var.in = (void *) (x); var.out; \
0541 })
0542
0543
0544 #define STATIC_ASSERT(x) extern int VG_(VG_(VG_(unused)))[(x) ? 1 : -1] \
0545 __attribute__((unused))
0546
0547 #define VG_MAX(a,b) ((a) > (b) ? a : b)
0548 #define VG_MIN(a,b) ((a) < (b) ? a : b)
0549
0550 #endif
0551
0552
0553
0554