File indexing completed on 2025-09-15 09:14:27
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