Warning, file /include/valgrind/pub_tool_options.h was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
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_OPTIONS_H
0030 #define __PUB_TOOL_OPTIONS_H
0031
0032 #include "pub_tool_basics.h" // for VG_ macro
0033 #include "pub_tool_libcbase.h" // for VG__ str functions
0034 #include "pub_tool_libcprint.h" // for VG_(fmsg_bad_option)
0035 #include "libvex.h" // for VexControl
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 typedef
0048 enum {
0049 cloE = 1,
0050 cloP = 2,
0051 cloD = 4,
0052 cloH = 8
0053 } Clo_Mode;
0054
0055
0056 #define cloEP (cloE | cloP)
0057 #define cloED (cloE | cloD)
0058 #define cloPD (cloP | cloD)
0059
0060
0061
0062 void VG_(set_Clo_Mode) (Clo_Mode mode);
0063
0064 Clo_Mode VG_(Clo_Mode) (void);
0065
0066
0067
0068 void VG_(set_Clo_Recognised) (void);
0069 Bool VG_(Clo_Recognised) (void);
0070
0071
0072
0073
0074 void VG_(process_dynamic_option) (Clo_Mode mode, HChar *value);
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085 Bool VG_(check_clom) (Clo_Mode modes, const HChar* arg, const HChar* option,
0086 Bool recognised);
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 extern void VG_(list_clo)(const HChar *qq_option);
0108
0109
0110
0111 #define VG_STREQN_CLOM(qq_mode, qq_len, qq_arg, qq_option) \
0112 (VG_(check_clom) \
0113 (qq_mode, qq_arg, qq_option, \
0114 VG_STREQN(qq_len, qq_arg, qq_option)))
0115
0116
0117
0118 #define VG_STREQ_CLOM(qq_mode, qq_arg, qq_option) \
0119 (VG_(check_clom) \
0120 (qq_mode, qq_arg, qq_option, \
0121 VG_STREQ(qq_arg, qq_option)))
0122
0123 static inline
0124 Bool VG_(bool_clom)(Clo_Mode qq_mode, const HChar* qq_arg, const HChar* qq_option, Bool* qq_var, Bool qq_vareq_arg)
0125 {
0126 Bool res = False;
0127 if (VG_(check_clom)(qq_mode, qq_arg, qq_option, qq_vareq_arg))
0128 {
0129 const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ];
0130 if (VG_(strcmp)(val, "yes") == 0)
0131 {
0132 *qq_var = True;
0133 res = True;
0134 }
0135 else if (VG_(strcmp)(val, "no") == 0)
0136 {
0137 *qq_var = False;
0138 res = True;
0139 }
0140 else
0141 {
0142 VG_(fmsg_bad_option)(qq_arg, "Invalid boolean value '%s'"
0143 " (should be 'yes' or 'no')\n",
0144
0145
0146 (val ? val : "(null)"));
0147 }
0148 } else if (VG_STREQN(VG_(strlen)(qq_option), qq_arg, qq_option) &&
0149 VG_(strlen)(qq_option) == VG_(strlen)(qq_arg))
0150 {
0151 VG_(fmsg_bad_option)(qq_arg,
0152 "Missing boolean value, did you mean '%s=yes'?\n",
0153 qq_arg);
0154 }
0155
0156 return res;
0157 }
0158
0159
0160 #define VG_BOOL_CLOM(qq_mode, qq_arg, qq_option, qq_var) \
0161 (VG_(bool_clom)((qq_mode), (qq_arg), (qq_option), &(qq_var), \
0162 VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) \
0163 )
0164
0165 #define VG_BOOL_CLO(qq_arg, qq_option, qq_var) \
0166 VG_BOOL_CLOM(cloP, qq_arg, qq_option, qq_var)
0167
0168
0169 #define VG_STR_CLOM(qq_mode, qq_arg, qq_option, qq_var) \
0170 (VG_(check_clom) \
0171 (qq_mode, qq_arg, qq_option, \
0172 VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) && \
0173 ({const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
0174 (qq_var) = val; \
0175 True; }))
0176
0177 #define VG_STR_CLO(qq_arg, qq_option, qq_var) \
0178 VG_STR_CLOM(cloP, qq_arg, qq_option, qq_var)
0179
0180
0181
0182 #define VG_USETGEN_CLOM(qq_mode, qq_arg, qq_option, qq_vals, qq_var, qq_all) \
0183 (VG_(check_clom) \
0184 (qq_mode, qq_arg, qq_option, \
0185 VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) && \
0186 ({Bool res = True; \
0187 const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
0188 if (!VG_(parse_enum_set)(qq_vals, \
0189 qq_all, \
0190 val, \
0191 &(qq_var))) { \
0192 VG_(fmsg_bad_option)(qq_arg, "%s is an invalid %s set\n", \
0193 val, &qq_option[2]); \
0194 res = False; } \
0195 res; }))
0196
0197
0198 #define VG_USET_CLO(qq_arg, qq_option, qq_vals, qq_var) \
0199 VG_USETGEN_CLOM(cloP, (qq_arg), qq_option, (qq_vals), (qq_var), True)
0200 #define VG_USET_CLOM(qq_mode, qq_arg, qq_option, qq_vals, qq_var) \
0201 VG_USETGEN_CLOM(qq_mode, (qq_arg), qq_option, (qq_vals), (qq_var), True)
0202
0203
0204
0205 #define VG_USETX_CLO(qq_arg, qq_option, qq_vals, qq_var) \
0206 VG_USETGEN_CLOM(cloP, (qq_arg), qq_option, (qq_vals), (qq_var), False)
0207 #define VG_USETX_CLOM(qq_mode, qq_arg, qq_option, qq_vals, qq_var) \
0208 VG_USETGEN_CLOM(qq_mode, (qq_arg), qq_option, (qq_vals), (qq_var), False)
0209
0210
0211 #define VG_INT_CLOM(qq_mode, qq_arg, qq_option, qq_var) \
0212 (VG_(check_clom) \
0213 (qq_mode, qq_arg, qq_option, \
0214 VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) && \
0215 ({Bool res = True; \
0216 const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
0217 HChar* s; \
0218 Long n = VG_(strtoll10)( val, &s ); \
0219 (qq_var) = n; \
0220 \
0221 if ('\0' != s[0] || (qq_var) != n) { \
0222 VG_(fmsg_bad_option)(qq_arg, \
0223 "Invalid integer value '%s'\n", val); \
0224 res = False; } \
0225 res; }))
0226
0227 #define VG_INT_CLO(qq_arg, qq_option, qq_var) \
0228 VG_INT_CLOM(cloP, qq_arg, qq_option, qq_var)
0229
0230
0231
0232 #define VG_BINTN_CLOM(qq_mode, qq_base, qq_arg, qq_option, qq_var, qq_lo, qq_hi) \
0233 (VG_(check_clom) \
0234 (qq_mode, qq_arg, qq_option, \
0235 VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) && \
0236 ({Bool res = True; \
0237 const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
0238 HChar* s; \
0239 Long n = VG_(strtoll##qq_base)( val, &s ); \
0240 (qq_var) = n; \
0241 \
0242 \
0243 \
0244 \
0245 if ('\0' != s[0] || (qq_var) != n) { \
0246 VG_(fmsg_bad_option)(qq_arg, \
0247 "Invalid integer value '%s'\n", val); \
0248 res = False; } \
0249 \
0250 if ((qq_var) < (qq_lo) || (qq_var) > (qq_hi)) { \
0251 VG_(fmsg_bad_option)(qq_arg, \
0252 "'%s' argument must be between %lld and %lld\n", \
0253 (qq_option), (Long)(qq_lo), (Long)(qq_hi)); \
0254 res = False; \
0255 } \
0256 res;}))
0257
0258
0259 #define VG_BUINTN_CLOM(qq_mode, qq_base, qq_arg, qq_option, qq_var, qq_hi) \
0260 (VG_(check_clom) \
0261 (qq_mode, qq_arg, qq_option, \
0262 VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) && \
0263 ({Bool res = True; \
0264 const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
0265 HChar* s; \
0266 Long n = VG_(strtoll##qq_base)( val, &s ); \
0267 (qq_var) = n; \
0268 if ('\0' != s[0] || (qq_var) != n) { \
0269 VG_(fmsg_bad_option)(qq_arg, \
0270 "Invalid integer value '%s'\n", val); \
0271 res = False; } \
0272 \
0273 if ((qq_var) > (qq_hi)) { \
0274 VG_(fmsg_bad_option)(qq_arg, \
0275 "'%s' argument must be <= %lld\n", \
0276 (qq_option), (Long)(qq_hi)); \
0277 res = False; \
0278 } \
0279 res;}))
0280
0281
0282 #define VG_BINT_CLO(qq_arg, qq_option, qq_var, qq_lo, qq_hi) \
0283 VG_BINTN_CLOM(cloP, 10, (qq_arg), qq_option, (qq_var), (qq_lo), (qq_hi))
0284 #define VG_BINT_CLOM(qq_mode, qq_arg, qq_option, qq_var, qq_lo, qq_hi) \
0285 VG_BINTN_CLOM(qq_mode, 10, (qq_arg), qq_option, (qq_var), (qq_lo), (qq_hi))
0286 #define VG_BUINT_CLOM(qq_mode, qq_arg, qq_option, qq_var, qq_hi) \
0287 VG_BUINTN_CLOM(qq_mode, 10, (qq_arg), qq_option, (qq_var), (qq_hi))
0288
0289
0290 #define VG_BHEX_CLO(qq_arg, qq_option, qq_var, qq_lo, qq_hi) \
0291 VG_BINTN_CLOM(cloP, 16, (qq_arg), qq_option, (qq_var), (qq_lo), (qq_hi))
0292
0293
0294
0295
0296 #define VG_DBL_CLOM(qq_mode, qq_arg, qq_option, qq_var) \
0297 (VG_(check_clom) \
0298 (qq_mode, qq_arg, qq_option, \
0299 VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) && \
0300 ({Bool res = True; \
0301 const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
0302 HChar* s; \
0303 double n = VG_(strtod)( val, &s ); \
0304 (qq_var) = n; \
0305 \
0306 if ('\0' != s[0]) { \
0307 VG_(fmsg_bad_option)(qq_arg, \
0308 "Invalid floating point value '%s'\n",val); \
0309 res = False; } \
0310 res;}))
0311
0312 #define VG_DBL_CLO( qq_arg, qq_option, qq_var) \
0313 VG_DBL_CLOM(cloP, qq_arg, qq_option, qq_var)
0314
0315
0316
0317 #define VG_XACT_CLOM(qq_mode, qq_arg, qq_option, qq_var, qq_val) \
0318 (VG_(check_clom) \
0319 (qq_mode, qq_arg, qq_option, \
0320 VG_STREQ((qq_arg), (qq_option))) && \
0321 ({(qq_var) = (qq_val); \
0322 True; }))
0323
0324 #define VG_XACT_CLO(qq_arg, qq_option, qq_var, qq_val) \
0325 VG_XACT_CLOM(cloP, qq_arg, qq_option, qq_var, qq_val)
0326
0327
0328
0329
0330 #define VG_STRINDEX_CLOM(qq_mode, qq_arg, qq_option, qq_strings, qq_ix) \
0331 (VG_(check_clom) \
0332 (qq_mode, qq_arg, qq_option, \
0333 VG_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) && \
0334 ({Bool res = True; \
0335 const HChar* val = &(qq_arg)[ VG_(strlen)(qq_option)+1 ]; \
0336 for (qq_ix = 0; (qq_strings)[qq_ix]; qq_ix++) { \
0337 if (VG_STREQ(val, (qq_strings)[qq_ix])) \
0338 break; \
0339 } \
0340 if ((qq_strings)[qq_ix] == NULL) { \
0341 VG_(fmsg_bad_option)(qq_arg, \
0342 "Invalid string '%s' in '%s'\n", val, qq_arg); \
0343 res = False; \
0344 } \
0345 res; }))
0346
0347 #define VG_STRINDEX_CLO(qq_arg, qq_option, qq_strings, qq_ix) \
0348 VG_STRINDEX_CLOM(cloP, qq_arg, qq_option, qq_strings, qq_ix)
0349
0350
0351 extern Int VG_(clo_verbosity);
0352
0353
0354 extern Bool VG_(clo_stats);
0355
0356
0357
0358 extern Int VG_(clo_vgdb_error);
0359
0360
0361
0362
0363 extern Bool VG_(clo_launched_with_multi);
0364
0365
0366
0367
0368
0369
0370
0371 extern const HChar *VG_(arg_vgdb_prefix);
0372
0373
0374
0375
0376 extern Bool VG_(clo_xml);
0377
0378
0379
0380 extern const HChar* VG_(clo_xml_user_comment);
0381
0382
0383
0384 extern VexControl VG_(clo_vex_control);
0385 extern VexRegisterUpdates VG_(clo_px_file_backed);
0386
0387 extern Int VG_(clo_redzone_size);
0388
0389 typedef
0390 enum {
0391 Vg_XTMemory_None,
0392 Vg_XTMemory_Allocs,
0393 Vg_XTMemory_Full,
0394
0395 }
0396 VgXTMemory;
0397
0398
0399
0400 extern VgXTMemory VG_(clo_xtree_memory);
0401
0402
0403 extern const HChar* VG_(clo_xtree_memory_file);
0404
0405 extern Bool VG_(clo_xtree_compress_strings);
0406
0407
0408 extern Int VG_(clo_backtrace_size);
0409
0410
0411 extern Bool VG_(clo_show_below_main);
0412
0413
0414
0415
0416
0417 extern Bool VG_(clo_keep_debuginfo);
0418
0419
0420 extern UInt VG_(clo_track_fds);
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441 extern HChar* VG_(expand_file_name)(const HChar* option_name,
0442 const HChar* format);
0443
0444 #endif
0445
0446
0447
0448