2 /*--------------------------------------------------------------------*/
3 /*--- Startup: the real stuff m_main.c ---*/
4 /*--------------------------------------------------------------------*/
7 This file is part of Valgrind, a dynamic binary instrumentation
10 Copyright (C) 2000-2017 Julian Seward
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, see <http://www.gnu.org/licenses/>.
26 The GNU General Public License is contained in the file COPYING.
29 #include "vgversion.h"
30 #include "pub_core_basics.h"
31 #include "pub_core_vki.h"
32 #include "pub_core_threadstate.h"
33 #include "pub_core_xarray.h"
34 #include "pub_core_clientstate.h"
35 #include "pub_core_aspacemgr.h"
36 #include "pub_core_aspacehl.h"
37 #include "pub_core_clreq.h"
38 #include "pub_core_commandline.h"
39 #include "pub_core_debuglog.h"
40 #include "pub_core_errormgr.h"
41 #include "pub_core_execontext.h"
42 #include "pub_core_gdbserver.h"
43 #include "pub_core_initimg.h"
44 #include "pub_core_libcbase.h"
45 #include "pub_core_libcassert.h"
46 #include "pub_core_libcfile.h"
47 #include "pub_core_libcprint.h"
48 #include "pub_core_libcproc.h"
49 #include "pub_core_libcsignal.h"
50 #include "pub_core_sbprofile.h"
51 #include "pub_core_mach.h"
52 #include "pub_core_machine.h"
53 #include "pub_core_mallocfree.h"
54 #include "pub_core_options.h"
55 #include "pub_core_debuginfo.h"
56 #include "pub_core_redir.h"
57 #include "pub_core_scheduler.h"
58 #include "pub_core_seqmatch.h" // For VG_(string_match)
59 #include "pub_core_signals.h"
60 #include "pub_core_stacks.h" // For VG_(register_stack)
61 #include "pub_core_syswrap.h"
62 #include "pub_core_tooliface.h"
63 #include "pub_core_translate.h" // For VG_(translate)
64 #include "pub_core_trampoline.h"
65 #include "pub_core_transtab.h"
66 #include "pub_core_inner.h"
67 #if defined(ENABLE_INNER_CLIENT_REQUEST)
68 #include "pub_core_clreq.h"
72 /*====================================================================*/
73 /*=== Command-line: variables, processing, etc ===*/
74 /*====================================================================*/
76 // See pub_{core,tool}_options.h for explanations of all these.
78 // need_help: 0 = no, 1 = --help-dyn-options, 2 = --help 3 = --help-debug
79 static void usage_NORETURN ( int need_help
)
81 /* 'usage1' contains a %s
82 - for the name of the GDB executable
83 - for the name of vgdb's path prefix
84 which must be supplied when they are VG_(printf)'d. */
85 const HChar usage1
[] =
86 "usage: valgrind [options] prog-and-args\n"
88 " tool-selection option, with default in [ ]:\n"
89 " --tool=<name> use the Valgrind tool named <name> [memcheck]\n"
91 " basic user options for all Valgrind tools, with defaults in [ ]:\n"
92 " -h --help show this message\n"
93 " --help-debug show this message, plus debugging options\n"
94 " --help-dyn-options show the dynamically changeable options\n"
95 " --version show version\n"
96 " -q --quiet run silently; only print error msgs\n"
97 " -v --verbose be more verbose -- show misc extra info\n"
98 " --trace-children=no|yes Valgrind-ise child processes (follow execve)? [no]\n"
99 " --trace-children-skip=patt1,patt2,... specifies a list of executables\n"
100 " that --trace-children=yes should not trace into\n"
101 " --trace-children-skip-by-arg=patt1,patt2,... same as --trace-children-skip=\n"
102 " but check the argv[] entries for children, rather\n"
103 " than the exe name, to make a follow/no-follow decision\n"
104 " --child-silent-after-fork=no|yes omit child output between fork & exec? [no]\n"
105 " --vgdb=no|yes|full activate gdbserver? [yes]\n"
106 " full is slower but provides precise watchpoint/step\n"
107 " --vgdb-error=<number> invoke gdbserver after <number> errors [%d]\n"
108 " to get started quickly, use --vgdb-error=0\n"
109 " and follow the on-screen directions\n"
110 " --vgdb-stop-at=event1,event2,... invoke gdbserver for given events [none]\n"
111 " where event is one of:\n"
112 " startup exit valgrindabexit all none\n"
113 " --track-fds=no|yes|all track open file descriptors? [no]\n"
114 " all includes reporting stdin, stdout and stderr\n"
115 " --time-stamp=no|yes add timestamps to log messages? [no]\n"
116 " --log-fd=<number> log messages to file descriptor [2=stderr]\n"
117 " --log-file=<file> log messages to <file>\n"
118 " --log-socket=ipaddr:port log messages to socket ipaddr:port\n"
120 " user options for Valgrind tools that report errors:\n"
121 " --xml=yes emit error output in XML (some tools only)\n"
122 " --xml-fd=<number> XML output to file descriptor\n"
123 " --xml-file=<file> XML output to <file>\n"
124 " --xml-socket=ipaddr:port XML output to socket ipaddr:port\n"
125 " --xml-user-comment=STR copy STR verbatim into XML output\n"
126 " --demangle=no|yes automatically demangle C++ names? [yes]\n"
127 " --num-callers=<number> show <number> callers in stack traces [12]\n"
128 " --error-limit=no|yes stop showing new errors if too many? [yes]\n"
129 " --exit-on-first-error=no|yes exit code on the first error found? [no]\n"
130 " --error-exitcode=<number> exit code to return if errors found [0=disable]\n"
131 " --error-markers=<begin>,<end> add lines with begin/end markers before/after\n"
132 " each error output in plain text mode [none]\n"
133 " --show-error-list=no|yes show detected errors list and\n"
134 " suppression counts at exit [no]\n"
135 " -s same as --show-error-list=yes\n"
136 " --keep-debuginfo=no|yes Keep symbols etc for unloaded code [no]\n"
137 " This allows saved stack traces (e.g. memory leaks)\n"
138 " to include file/line info for code that has been\n"
139 " dlclose'd (or similar)\n"
140 " --show-below-main=no|yes continue stack traces below main() [no]\n"
141 " --default-suppressions=yes|no\n"
142 " load default suppressions [yes]\n"
143 " --suppressions=<filename> suppress errors described in <filename>\n"
144 " --gen-suppressions=no|yes|all print suppressions for errors? [no]\n"
145 " --input-fd=<number> file descriptor for input [0=stdin]\n"
146 " --dsymutil=no|yes run dsymutil on Mac OS X when helpful? [yes]\n"
147 " --max-stackframe=<number> assume stack switch for SP changes larger\n"
148 " than <number> bytes [2000000]\n"
149 " --main-stacksize=<number> set size of main thread's stack (in bytes)\n"
150 " [min(max(current 'ulimit' value,1MB),16MB)]\n"
152 " user options for Valgrind tools that replace malloc:\n"
153 " --alignment=<number> set minimum alignment of heap allocations [%s]\n"
154 " --redzone-size=<number> set minimum size of redzones added before/after\n"
155 " heap blocks (in bytes). [%s]\n"
156 " --xtree-memory=none|allocs|full profile heap memory in an xtree [none]\n"
157 " and produces a report at the end of the execution\n"
158 " none: no profiling, allocs: current allocated\n"
159 " size/blocks, full: profile current and cumulative\n"
160 " allocated size/blocks and freed size/blocks.\n"
161 " --xtree-memory-file=<file> xtree memory report file [xtmemory.kcg.%%p]\n"
163 " uncommon user options for all Valgrind tools:\n"
164 " --fullpath-after= (with nothing after the '=')\n"
165 " show full source paths in call stacks\n"
166 " --fullpath-after=string like --fullpath-after=, but only show the\n"
167 " part of the path after 'string'. Allows removal\n"
168 " of path prefixes. Use this flag multiple times\n"
169 " to specify a set of prefixes to remove.\n"
170 " --extra-debuginfo-path=path absolute path to search for additional\n"
171 " debug symbols, in addition to existing default\n"
172 " well known search paths.\n"
173 " --debuginfo-server=ipaddr:port also query this server\n"
174 " (valgrind-di-server) for debug symbols\n"
175 " --allow-mismatched-debuginfo=no|yes [no]\n"
176 " for the above two flags only, accept debuginfo\n"
177 " objects that don't \"match\" the main object\n"
178 " --smc-check=none|stack|all|all-non-file [all-non-file]\n"
179 " checks for self-modifying code: none, only for\n"
180 " code found in stacks, for all code, or for all\n"
181 " code except that from file-backed mappings\n"
182 " --read-inline-info=yes|no read debug info about inlined function calls\n"
183 " and use it to do better stack traces.\n"
184 " [yes] on Linux/Android/Solaris for the tools\n"
185 " Memcheck/Massif/Helgrind/DRD only.\n"
186 " [no] for all other tools and platforms.\n"
187 " --read-var-info=yes|no read debug info on stack and global variables\n"
188 " and use it to print better error messages in\n"
189 " tools that make use of it (Memcheck, Helgrind,\n"
191 " --vgdb-poll=<number> gdbserver poll max every <number> basic blocks [%d] \n"
192 " --vgdb-shadow-registers=no|yes let gdb see the shadow registers [no]\n"
193 " --vgdb-prefix=<prefix> prefix for vgdb FIFOs [%s]\n"
194 " --run-libc-freeres=no|yes free up glibc memory at exit on Linux? [yes]\n"
195 " --run-cxx-freeres=no|yes free up libstdc++ memory at exit on Linux\n"
196 " and Solaris? [yes]\n"
197 " --sim-hints=hint1,hint2,... activate unusual sim behaviours [none] \n"
198 " where hint is one of:\n"
199 " lax-ioctls lax-doors fuse-compatible enable-outer\n"
200 " no-inner-prefix no-nptl-pthread-stackcache fallback-llsc none\n"
201 " --fair-sched=no|yes|try schedule threads fairly on multicore systems [no]\n"
202 " --kernel-variant=variant1,variant2,...\n"
203 " handle non-standard kernel variants [none]\n"
204 " where variant is one of:\n"
205 " bproc android-no-hw-tls\n"
206 " android-gpu-sgx5xx android-gpu-adreno3xx none\n"
207 " --merge-recursive-frames=<number> merge frames between identical\n"
208 " program counters in max <number> frames) [0]\n"
209 " --num-transtab-sectors=<number> size of translated code cache [%d]\n"
210 " more sectors may increase performance, but use more memory.\n"
211 " --avg-transtab-entry-size=<number> avg size in bytes of a translated\n"
212 " basic block [0, meaning use tool provided default]\n"
213 " --aspace-minaddr=0xPP avoid mapping memory below 0xPP [guessed]\n"
214 " --valgrind-stacksize=<number> size of valgrind (host) thread's stack\n"
216 VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)
218 " --show-emwarns=no|yes show warnings about emulation limits? [no]\n"
219 " --require-text-symbol=:sonamepattern:symbolpattern abort run if the\n"
220 " stated shared object doesn't have the stated\n"
221 " text symbol. Patterns can contain ? and *.\n"
222 " --soname-synonyms=syn1=pattern1,syn2=pattern2,... synonym soname\n"
223 " specify patterns for function wrapping or replacement.\n"
224 " To use a non-libc malloc library that is\n"
225 " in the main exe: --soname-synonyms=somalloc=NONE\n"
226 " in libxyzzy.so: --soname-synonyms=somalloc=libxyzzy.so\n"
227 " --sigill-diagnostics=yes|no warn about illegal instructions? [yes]\n"
228 " --unw-stack-scan-thresh=<number> Enable stack-scan unwind if fewer\n"
229 " than <number> good frames found [0, meaning \"disabled\"]\n"
230 " NOTE: stack scanning is only available on arm-linux.\n"
231 " --unw-stack-scan-frames=<number> Max number of frames that can be\n"
232 " recovered by stack scanning [5]\n"
233 " --resync-filter=no|yes|verbose [yes on MacOS, no on other OSes]\n"
234 " attempt to avoid expensive address-space-resync operations\n"
235 " --max-threads=<number> maximum number of threads that valgrind can\n"
239 const HChar usage2
[] =
241 " debugging options for all Valgrind tools:\n"
242 " -d show verbose debugging output\n"
243 " --stats=no|yes show tool and core statistics [no]\n"
244 " --sanity-level=<number> level of sanity checking to do [1]\n"
245 " --trace-flags=<XXXXXXXX> show generated code? (X = 0|1) [00000000]\n"
246 " --profile-flags=<XXXXXXXX> ditto, but for profiling (X = 0|1) [00000000]\n"
247 " --profile-interval=<number> show profile every <number> event checks\n"
248 " [0, meaning only at the end of the run]\n"
249 " --trace-notbelow=<number> only show BBs above <number> [999999999]\n"
250 " --trace-notabove=<number> only show BBs below <number> [0]\n"
251 " --trace-syscalls=no|yes show all system calls? [no]\n"
252 " --trace-signals=no|yes show signal handling details? [no]\n"
253 " --trace-symtab=no|yes show symbol table details? [no]\n"
254 " --trace-symtab-patt=<patt> limit debuginfo tracing to obj name <patt>\n"
255 " --trace-cfi=no|yes show call-frame-info details? [no]\n"
256 " --debug-dump=syms mimic /usr/bin/readelf --syms\n"
257 " --debug-dump=line mimic /usr/bin/readelf --debug-dump=line\n"
258 " --debug-dump=frames mimic /usr/bin/readelf --debug-dump=frames\n"
259 " --trace-redir=no|yes show redirection details? [no]\n"
260 " --trace-sched=no|yes show thread scheduler details? [no]\n"
261 " --profile-heap=no|yes profile Valgrind's own space use\n"
262 " --core-redzone-size=<number> set minimum size of redzones added before/after\n"
263 " heap blocks allocated for Valgrind internal use (in bytes) [4]\n"
264 " --wait-for-gdb=yes|no pause on startup to wait for gdb attach\n"
265 " --sym-offsets=yes|no show syms in form 'name+offset'? [no]\n"
266 " --progress-interval=<number> report progress every <number>\n"
267 " CPU seconds [0, meaning disabled]\n"
268 " --command-line-only=no|yes only use command line options [no]\n"
270 " Vex options for all Valgrind tools:\n"
271 " --vex-iropt-verbosity=<0..9> [0]\n"
272 " --vex-iropt-level=<0..2> [2]\n"
273 " --vex-iropt-unroll-thresh=<0..400> [120]\n"
274 " --vex-guest-max-insns=<1..100> [50]\n"
275 " --vex-guest-chase=no|yes [yes]\n"
276 " Precise exception control. Possible values for 'mode' are as follows\n"
277 " and specify the minimum set of registers guaranteed to be correct\n"
278 " immediately prior to memory access instructions:\n"
279 " sp-at-mem-access stack pointer only\n"
280 " unwindregs-at-mem-access registers needed for stack unwinding\n"
281 " allregs-at-mem-access all registers\n"
282 " allregs-at-each-insn all registers are always correct\n"
283 " Default value for all 3 following flags is [unwindregs-at-mem-access].\n"
284 " --vex-iropt-register-updates=mode setting to use by default\n"
285 " --px-default=mode synonym for --vex-iropt-register-updates\n"
286 " --px-file-backed=mode optional setting for file-backed (non-JIT) code\n"
287 " Tracing and profile control:\n"
288 " --trace-flags and --profile-flags values (omit the middle space):\n"
289 " 1000 0000 show conversion into IR\n"
290 " 0100 0000 show after initial opt\n"
291 " 0010 0000 show after instrumentation\n"
292 " 0001 0000 show after second opt\n"
293 " 0000 1000 show after tree building\n"
294 " 0000 0100 show selecting insns\n"
295 " 0000 0010 show after reg-alloc\n"
296 " 0000 0001 show final assembly\n"
297 " 0000 0000 show summary profile only\n"
298 " (Nb: you need --trace-notbelow and/or --trace-notabove\n"
299 " with --trace-flags for full details)\n"
300 " --vex-regalloc-version=2|3 [3]\n"
302 " debugging options for Valgrind tools that report errors\n"
303 " --dump-error=<number> show translation for basic block associated\n"
304 " with <number>'th error context [0=show none]\n"
306 " debugging options for Valgrind tools that replace malloc:\n"
307 " --trace-malloc=no|yes show client malloc details? [no]\n"
308 " --xtree-compress-strings=no|yes compress strings in xtree callgrind format [yes]\n"
311 const HChar usage3
[] =
313 " Extra options read from ~/.valgrindrc, $VALGRIND_OPTS, ./.valgrindrc\n"
316 " Valgrind is Copyright (C) 2000-2017, and GNU GPL'd, by Julian Seward et al.\n"
317 " LibVEX is Copyright (C) 2004-2017, and GNU GPL'd, by OpenWorks LLP et al.\n"
319 " Bug reports, feedback, admiration, abuse, etc, to: %s.\n"
322 const HChar dyn_usage
[] =
323 "Some command line settings are \"dynamic\", meaning they can be changed\n"
324 "while Valgrind is running, like this:\n"
325 " From the shell, using vgdb. Example:\n"
326 " $ vgdb \"v.clo --trace-children=yes --child-silent-after-fork=no\"\n"
327 " From a gdb attached to the valgrind gdbserver. Example:\n"
328 " (gdb) monitor v.clo --trace-children=yes --child-silent-after-fork=no\"\n"
329 " From your program, using a client request. Example:\n"
330 " #include <valgrind/valgrind.h>\n"
331 " VALGRIND_CLO_CHANGE(\"--trace-children=yes\");\n"
332 " VALGRIND_CLO_CHANGE(\"--child-silent-after-fork=no\");\n\n";
335 HChar default_alignment
[30]; // large enough
336 HChar default_redzone_size
[30]; // large enough
338 // Ensure the message goes to stdout
339 VG_(log_output_sink
).fd
= 1;
340 VG_(log_output_sink
).type
= VgLogTo_Fd
;
342 if (VG_(needs
).malloc_replacement
) {
343 VG_(sprintf
)(default_alignment
, "%d", VG_MIN_MALLOC_SZB
);
344 VG_(sprintf
)(default_redzone_size
, "%lu", VG_(tdict
).tool_client_redzone_szB
);
346 VG_(strcpy
)(default_alignment
, "not used by this tool");
347 VG_(strcpy
)(default_redzone_size
, "not used by this tool");
350 /* 'usage1' a type as described after each arg. */
352 VG_(clo_vgdb_error
) /* int */,
353 default_alignment
/* char* */,
354 default_redzone_size
/* char* */,
355 VG_(clo_vgdb_poll
) /* int */,
356 VG_(vgdb_prefix_default
)() /* char* */,
357 N_SECTORS_DEFAULT
/* int */,
358 MAX_THREADS_DEFAULT
/* int */
360 if (need_help
> 1 && VG_(details
).name
) {
361 VG_(printf
)(" user options for %s:\n", VG_(details
).name
);
362 if (VG_(needs
).command_line_options
)
363 VG_TDICT_CALL(tool_print_usage
);
365 VG_(printf
)(" (none)\n");
367 if (need_help
== 1) {
368 VG_(printf
)(dyn_usage
);
369 VG_(list_dynamic_options
) ();
370 VG_(printf
)("valgrind: Use --help for more information.\n");
374 VG_(printf
)("%s", usage2
);
376 if (VG_(details
).name
) {
377 VG_(printf
)(" debugging options for %s:\n", VG_(details
).name
);
379 if (VG_(needs
).command_line_options
)
380 VG_TDICT_CALL(tool_print_debug_usage
);
382 VG_(printf
)(" (none)\n");
386 VG_(printf
)(usage3
, VG_(details
).name
, VG_(details
).copyright_author
,
392 struct process_option_state
{
393 /* Whether the user has asked for --version/--help. */
397 /* Whether the user has explicitly provided --sigill-diagnostics
398 or --show-error-list.
399 If not explicitly given depends on general verbosity setting. */
400 Bool sigill_diag_set
;
401 Bool show_error_list_set
;
403 /* Log to stderr by default, but usage message goes to stdout. XML
404 output is initially disabled. */
405 VgLogTo log_to
; // Where is logging output to be sent?
406 VgLogTo xml_to
; // Where is XML output to be sent?
411 static void process_option (Clo_Mode mode
,
412 HChar
*arg
, struct process_option_state
*pos
)
414 const HChar
* tmp_str
; // Used in a couple of places.
415 Int toolname_len
= VG_(strlen
)(VG_(clo_toolname
));
419 /* Constants for parsing PX control flags. */
420 const HChar
* pxStrings
[5]
421 = { "sp-at-mem-access", "unwindregs-at-mem-access",
422 "allregs-at-mem-access", "allregs-at-each-insn", NULL
};
423 const VexRegisterUpdates pxVals
[5]
424 = { VexRegUpdSpAtMemAccess
, VexRegUpdUnwindregsAtMemAccess
,
425 VexRegUpdAllregsAtMemAccess
, VexRegUpdAllregsAtEachInsn
, 0/*inval*/ };
427 VG_(set_Clo_Mode
) (mode
);
429 // Look for a colon in the option name.
430 while (*colon
&& *colon
!= ':' && *colon
!= '=')
433 // Does it have the form "--toolname:foo"? We have to do it at the start
434 // in case someone has combined a prefix with a core-specific option,
435 // eg. "--memcheck:verbose".
437 if (VG_STREQN(2, arg
, "--") &&
438 VG_STREQN(toolname_len
, arg
+2, VG_(clo_toolname
)) &&
439 VG_STREQN(1, arg
+2+toolname_len
, ":")) {
440 // Prefix matches, convert "--toolname:foo" to "--foo".
441 // Two things to note:
442 // - We cannot modify the option in-place. If we did, and then
443 // a child was spawned with --trace-children=yes, the
444 // now-non-prefixed option would be passed and could screw up
446 // - We create copies, and never free them. Why? Non-prefixed
447 // options hang around forever, so tools need not make copies
448 // of strings within them. We need to have the same behaviour
449 // for prefixed options. The pointer to the copy will be lost
450 // once we leave this function (although a tool may keep a
451 // pointer into it), but the space wasted is insignificant.
452 // (In bug #142197, the copies were being freed, which caused
453 // problems for tools that reasonably assumed that arguments
454 // wouldn't disappear on them.)
456 VG_(printf
)("tool-specific arg: %s\n", arg
);
457 arg
= VG_(strdup
)("main.mpclo.1", arg
+ toolname_len
+ 1);
462 // prefix doesn't match, declare it as recognised and skip this arg
463 VG_(set_Clo_Recognised
) ();
468 if VG_XACT_CLOM(cloE
, arg
, "--version", pos
->need_version
, 1) {}
469 else if (VG_STREQ_CLOM(cloED
, arg
, "-v") ||
470 VG_STREQ_CLOM(cloED
, arg
, "--verbose"))
471 VG_(clo_verbosity
)++;
472 else if (VG_STREQ_CLOM(cloED
, arg
, "-q") ||
473 VG_STREQ_CLOM(cloED
, arg
, "--quiet"))
474 VG_(clo_verbosity
)--;
475 else if VG_XACT_CLOM(cloE
, arg
, "--help-dyn-options", pos
->need_help
, 1) {}
476 else if VG_XACT_CLOM(cloE
, arg
, "-h", pos
->need_help
, 2) {}
477 else if VG_XACT_CLOM(cloE
, arg
, "--help", pos
->need_help
, 2) {}
478 else if VG_XACT_CLOM(cloE
, arg
, "--help-debug", pos
->need_help
, 3) {}
480 // The tool has already been determined, but we need to know the name
482 else if VG_STR_CLOM(cloE
, arg
, "--tool", VG_(clo_toolname
)) {}
484 // Set up VG_(clo_max_stackframe) and VG_(clo_main_stacksize).
485 // These are needed by VG_(ii_create_image), which happens
486 // before main_process_cmd_line_options().
487 else if VG_INT_CLOM(cloE
, arg
, "--max-stackframe", VG_(clo_max_stackframe
)) {}
488 else if VG_INT_CLOM(cloE
, arg
, "--main-stacksize", VG_(clo_main_stacksize
)) {}
490 // Set up VG_(clo_max_threads); needed for VG_(tl_pre_clo_init)
491 else if VG_INT_CLOM(cloE
, arg
, "--max-threads", VG_(clo_max_threads
)) {}
493 // Set up VG_(clo_sim_hints). This is needed a.o. for an inner
494 // running in an outer, to have "no-inner-prefix" enabled
495 // as early as possible.
496 else if VG_USETX_CLOM (cloE
, arg
, "--sim-hints",
497 "lax-ioctls,lax-doors,fuse-compatible,"
498 "enable-outer,no-inner-prefix,"
499 "no-nptl-pthread-stackcache,fallback-llsc",
500 VG_(clo_sim_hints
)) {}
502 else if VG_STREQN_CLOM(0, 20, arg
, "--command-line-only=") {} // m_commandline.c
503 else if VG_STREQ(arg
, "--") {}
504 else if VG_STREQ_CLOM(cloD
, arg
, "-d") // pre-early + Dynamic
505 VG_(debugLog_startup
) (VG_(debugLog_getLevel
)() + 1,
506 "dynamic option change");
507 else if VG_STREQN_CLOM(0, 15, arg
, "--profile-heap=") {} // pre-early
508 else if VG_STREQN_CLOM(0, 20, arg
, "--core-redzone-size=") {} // pre-early
509 else if VG_STREQN_CLOM(0, 15, arg
, "--redzone-size=") {} // pre-early
510 else if VG_STREQN_CLOM(0, 17, arg
, "--aspace-minaddr=") {} // pre-early
512 else if VG_BINT_CLOM(cloE
, arg
, "--valgrind-stacksize",
513 VG_(clo_valgrind_stacksize
),
514 2*VKI_PAGE_SIZE
, 10*VG_DEFAULT_STACK_ACTIVE_SZB
)
515 VG_(clo_valgrind_stacksize
) = VG_PGROUNDUP(VG_(clo_valgrind_stacksize
));
517 /* Obsolete options. Report an error and exit */
518 else if VG_STREQN(34, arg
, "--vex-iropt-precise-memory-exns=no") {
521 "--vex-iropt-precise-memory-exns is obsolete\n"
522 "Use --vex-iropt-register-updates=unwindregs-at-mem-access instead\n");
524 else if VG_STREQN(35, arg
, "--vex-iropt-precise-memory-exns=yes") {
527 "--vex-iropt-precise-memory-exns is obsolete\n"
528 "Use --vex-iropt-register-updates=allregs-at-mem-access instead\n"
529 " (or --vex-iropt-register-updates=allregs-at-each-insn)\n");
532 /* These options are new, not yet handled by
533 early_process_cmd_line_options. */
534 else if VG_BOOL_CLO(arg
, "--sigill-diagnostics", VG_(clo_sigill_diag
))
535 pos
->sigill_diag_set
= True
;
537 else if VG_BOOL_CLOM(cloPD
, arg
, "--stats", VG_(clo_stats
)) {}
538 else if VG_BOOL_CLO(arg
, "--xml", VG_(clo_xml
))
539 VG_(debugLog_setXml
)(VG_(clo_xml
));
541 else if VG_XACT_CLOM(cloPD
, arg
, "--vgdb=no", VG_(clo_vgdb
), Vg_VgdbNo
) {}
542 else if VG_XACT_CLOM(cloPD
, arg
, "--vgdb=yes", VG_(clo_vgdb
), Vg_VgdbYes
) {}
543 else if VG_XACT_CLOM(cloPD
, arg
, "--vgdb=full", VG_(clo_vgdb
), Vg_VgdbFull
) {
544 /* automatically updates register values at each insn
546 VG_(clo_vex_control
).iropt_register_updates_default
547 = VG_(clo_px_file_backed
)
548 = VexRegUpdAllregsAtEachInsn
;
550 else if VG_INT_CLOM (cloPD
, arg
, "--vgdb-poll", VG_(clo_vgdb_poll
)) {}
551 else if VG_INT_CLOM (cloPD
, arg
, "--vgdb-error", VG_(clo_vgdb_error
)) {}
552 else if VG_USET_CLOM (cloPD
, arg
, "--vgdb-stop-at",
553 "startup,exit,valgrindabexit",
554 VG_(clo_vgdb_stop_at
)) {}
555 else if VG_STR_CLO (arg
, "--vgdb-prefix", VG_(clo_vgdb_prefix
)) {
556 VG_(arg_vgdb_prefix
) = arg
;
558 else if VG_BOOL_CLO(arg
, "--vgdb-shadow-registers",
559 VG_(clo_vgdb_shadow_registers
)) {}
560 else if VG_BOOL_CLO(arg
, "--demangle", VG_(clo_demangle
)) {}
561 else if VG_STR_CLO (arg
, "--soname-synonyms",VG_(clo_soname_synonyms
)) {}
562 else if VG_BOOL_CLO(arg
, "--error-limit", VG_(clo_error_limit
)) {}
563 else if VG_BOOL_CLO(arg
, "--exit-on-first-error", VG_(clo_exit_on_first_error
)) {}
564 else if VG_INT_CLO (arg
, "--error-exitcode", VG_(clo_error_exitcode
)) {}
565 else if VG_STR_CLOM (cloPD
, arg
, "--error-markers", tmp_str
) {
567 const HChar
*startpos
= tmp_str
;
568 const HChar
*nextpos
;
570 VG_(Clo_Mode
)() != cloE
571 && m
< sizeof(VG_(clo_error_markers
))
572 /sizeof(VG_(clo_error_markers
)[0]);
574 /* Release previous value if clo given multiple times. */
575 VG_(free
)(VG_(clo_error_markers
)[m
]);
576 VG_(clo_error_markers
)[m
] = NULL
;
578 nextpos
= VG_(strchr
)(startpos
, ',');
580 nextpos
= startpos
+ VG_(strlen
)(startpos
);
581 if (startpos
!= nextpos
) {
582 VG_(clo_error_markers
)[m
]
583 = VG_(malloc
)("main.mpclo.2", nextpos
- startpos
+ 1);
584 VG_(memcpy
)(VG_(clo_error_markers
)[m
], startpos
,
586 VG_(clo_error_markers
)[m
][nextpos
- startpos
] = '\0';
588 startpos
= *nextpos
? nextpos
+ 1 : nextpos
;
591 else if VG_BOOL_CLOM(cloPD
, arg
, "--show-error-list", VG_(clo_show_error_list
)) {
592 pos
->show_error_list_set
= True
; }
593 else if (VG_STREQ_CLOM(cloPD
, arg
, "-s")) {
594 VG_(clo_show_error_list
) = True
;
595 pos
->show_error_list_set
= True
;
597 else if VG_BOOL_CLO(arg
, "--show-emwarns", VG_(clo_show_emwarns
)) {}
599 else if VG_BOOL_CLO(arg
, "--run-libc-freeres", VG_(clo_run_libc_freeres
)) {}
600 else if VG_BOOL_CLO(arg
, "--run-cxx-freeres", VG_(clo_run_cxx_freeres
)) {}
601 else if VG_BOOL_CLOM(cloPD
, arg
, "--show-below-main", VG_(clo_show_below_main
)) {}
602 else if VG_BOOL_CLO(arg
, "--keep-debuginfo", VG_(clo_keep_debuginfo
)) {}
603 else if VG_BOOL_CLOM(cloPD
, arg
, "--time-stamp", VG_(clo_time_stamp
)) {}
604 else if VG_STR_CLO(arg
, "--track-fds", tmp_str
) {
605 if (VG_(strcmp
)(tmp_str
, "yes") == 0)
606 VG_(clo_track_fds
) = 1;
607 else if (VG_(strcmp
)(tmp_str
, "all") == 0)
608 VG_(clo_track_fds
) = 2;
609 else if (VG_(strcmp
)(tmp_str
, "no") == 0)
610 VG_(clo_track_fds
) = 0;
612 VG_(fmsg_bad_option
)(arg
,
613 "Bad argument, should be 'yes', 'all' or 'no'\n");
615 else if VG_BOOL_CLOM(cloPD
, arg
, "--trace-children", VG_(clo_trace_children
)) {}
616 else if VG_BOOL_CLOM(cloPD
, arg
, "--child-silent-after-fork",
617 VG_(clo_child_silent_after_fork
)) {}
618 else if VG_STR_CLO(arg
, "--fair-sched", tmp_str
) {
619 if (VG_(Clo_Mode
)() != cloP
)
621 else if (VG_(strcmp
)(tmp_str
, "yes") == 0)
622 VG_(clo_fair_sched
) = enable_fair_sched
;
623 else if (VG_(strcmp
)(tmp_str
, "try") == 0)
624 VG_(clo_fair_sched
) = try_fair_sched
;
625 else if (VG_(strcmp
)(tmp_str
, "no") == 0)
626 VG_(clo_fair_sched
) = disable_fair_sched
;
628 VG_(fmsg_bad_option
)(arg
,
629 "Bad argument, should be 'yes', 'try' or 'no'\n");
631 else if VG_BOOL_CLOM(cloPD
, arg
, "--trace-sched", VG_(clo_trace_sched
)) {}
632 else if VG_BOOL_CLOM(cloPD
, arg
, "--trace-signals", VG_(clo_trace_signals
)) {}
633 else if VG_BOOL_CLOM(cloPD
, arg
, "--trace-symtab", VG_(clo_trace_symtab
)) {}
634 else if VG_STR_CLO (arg
, "--trace-symtab-patt", VG_(clo_trace_symtab_patt
)) {}
635 else if VG_BOOL_CLOM(cloPD
, arg
, "--trace-cfi", VG_(clo_trace_cfi
)) {}
636 else if VG_XACT_CLOM(cloPD
, arg
, "--debug-dump=syms", VG_(clo_debug_dump_syms
),
638 else if VG_XACT_CLOM(cloPD
, arg
, "--debug-dump=line", VG_(clo_debug_dump_line
),
640 else if VG_XACT_CLOM(cloPD
, arg
, "--debug-dump=frames",
641 VG_(clo_debug_dump_frames
), True
) {}
642 else if VG_BOOL_CLOM(cloPD
, arg
, "--trace-redir", VG_(clo_trace_redir
)) {}
644 else if VG_BOOL_CLOM(cloPD
, arg
, "--trace-syscalls", VG_(clo_trace_syscalls
)) {}
645 else if VG_BOOL_CLOM(cloE
, arg
, "--wait-for-gdb", VG_(clo_wait_for_gdb
)) {
646 //--------------------------------------------------------------
649 //--------------------------------------------------------------
650 /* Hook to delay things long enough so we can get the pid and
651 attach GDB in another shell. */
652 if (VG_(clo_wait_for_gdb
)) {
653 const int ms
= 8000; // milliseconds
654 VG_(debugLog
)(1, "main", "Wait for GDB during %d ms\n", ms
);
655 VG_(printf
)("pid=%d, entering delay %d ms loop\n", VG_(getpid
)(), ms
);
656 VG_(poll
)(NULL
, 0, ms
);
660 else if VG_BOOL_CLOM(cloPD
, arg
, "--sym-offsets", VG_(clo_sym_offsets
)) {}
661 else if VG_BINT_CLOM(cloPD
, arg
, "--progress-interval",
662 VG_(clo_progress_interval
), 0, 3600) {}
663 else if VG_BOOL_CLO(arg
, "--read-inline-info", VG_(clo_read_inline_info
)) {}
664 else if VG_BOOL_CLO(arg
, "--read-var-info", VG_(clo_read_var_info
)) {}
666 else if VG_INT_CLO (arg
, "--dump-error", VG_(clo_dump_error
)) {}
667 else if VG_INT_CLO (arg
, "--input-fd", VG_(clo_input_fd
)) {}
668 else if VG_INT_CLO (arg
, "--sanity-level", VG_(clo_sanity_level
)) {}
669 else if VG_BINT_CLO(arg
, "--num-callers", VG_(clo_backtrace_size
), 1,
670 VG_DEEPEST_BACKTRACE
) {}
671 else if VG_BINT_CLO(arg
, "--num-transtab-sectors",
672 VG_(clo_num_transtab_sectors
),
673 MIN_N_SECTORS
, MAX_N_SECTORS
) {}
674 else if VG_BINT_CLO(arg
, "--avg-transtab-entry-size",
675 VG_(clo_avg_transtab_entry_size
),
677 else if VG_BINT_CLOM(cloPD
, arg
, "--merge-recursive-frames",
678 VG_(clo_merge_recursive_frames
), 0,
679 VG_DEEPEST_BACKTRACE
) {}
681 else if VG_XACT_CLO(arg
, "--smc-check=none",
682 VG_(clo_smc_check
), Vg_SmcNone
) {}
683 else if VG_XACT_CLO(arg
, "--smc-check=stack",
684 VG_(clo_smc_check
), Vg_SmcStack
) {}
685 else if VG_XACT_CLO(arg
, "--smc-check=all",
686 VG_(clo_smc_check
), Vg_SmcAll
) {}
687 else if VG_XACT_CLO(arg
, "--smc-check=all-non-file",
688 VG_(clo_smc_check
), Vg_SmcAllNonFile
) {}
690 else if VG_USETX_CLO (arg
, "--kernel-variant",
693 "android-gpu-sgx5xx,"
694 "android-gpu-adreno3xx",
695 VG_(clo_kernel_variant
)) {}
697 else if VG_BOOL_CLO(arg
, "--dsymutil", VG_(clo_dsymutil
)) {}
699 else if VG_STR_CLO (arg
, "--trace-children-skip",
700 VG_(clo_trace_children_skip
)) {}
701 else if VG_STR_CLO (arg
, "--trace-children-skip-by-arg",
702 VG_(clo_trace_children_skip_by_arg
)) {}
704 else if VG_BINT_CLOM(cloPD
, arg
, "--vex-iropt-verbosity",
705 VG_(clo_vex_control
).iropt_verbosity
, 0, 10) {}
706 else if VG_BINT_CLO(arg
, "--vex-iropt-level",
707 VG_(clo_vex_control
).iropt_level
, 0, 2) {}
708 else if VG_BINT_CLO(arg
, "--vex-regalloc-version",
709 VG_(clo_vex_control
).regalloc_version
, 2, 3) {}
711 else if (VG_STRINDEX_CLO(arg
, "--vex-iropt-register-updates",
713 || VG_STRINDEX_CLO(arg
, "--px-default", pxStrings
, ix
))
714 // NB: --px-default is an alias for the hard-to-remember
715 // --vex-iropt-register-updates, hence the same logic.
718 vg_assert(pxVals
[ix
] >= VexRegUpdSpAtMemAccess
);
719 vg_assert(pxVals
[ix
] <= VexRegUpdAllregsAtEachInsn
);
720 VG_(clo_vex_control
).iropt_register_updates_default
= pxVals
[ix
];
723 else if VG_STRINDEX_CLO(arg
, "--px-file-backed", pxStrings
, ix
) {
724 // Whereas --px-file-backed isn't
725 // the same flag as --vex-iropt-register-updates.
727 vg_assert(pxVals
[ix
] >= VexRegUpdSpAtMemAccess
);
728 vg_assert(pxVals
[ix
] <= VexRegUpdAllregsAtEachInsn
);
729 VG_(clo_px_file_backed
) = pxVals
[ix
];
732 else if VG_BINT_CLO(arg
, "--vex-iropt-unroll-thresh",
733 VG_(clo_vex_control
).iropt_unroll_thresh
, 0, 400) {}
734 else if VG_BINT_CLO(arg
, "--vex-guest-max-insns",
735 VG_(clo_vex_control
).guest_max_insns
, 1, 100) {}
736 else if VG_BOOL_CLO(arg
, "--vex-guest-chase",
737 VG_(clo_vex_control
).guest_chase
) {}
739 else if VG_INT_CLO(arg
, "--log-fd", pos
->tmp_log_fd
) {
740 pos
->log_to
= VgLogTo_Fd
;
741 VG_(clo_log_fname_unexpanded
) = NULL
;
743 else if VG_INT_CLO(arg
, "--xml-fd", pos
->tmp_xml_fd
) {
744 pos
->xml_to
= VgLogTo_Fd
;
745 VG_(clo_xml_fname_unexpanded
) = NULL
;
748 else if VG_STR_CLO(arg
, "--log-file", VG_(clo_log_fname_unexpanded
)) {
749 pos
->log_to
= VgLogTo_File
;
751 else if VG_STR_CLO(arg
, "--xml-file", VG_(clo_xml_fname_unexpanded
)) {
752 pos
->xml_to
= VgLogTo_File
;
755 else if VG_STR_CLO(arg
, "--log-socket", VG_(clo_log_fname_unexpanded
)) {
756 pos
->log_to
= VgLogTo_Socket
;
758 else if VG_STR_CLO(arg
, "--xml-socket", VG_(clo_xml_fname_unexpanded
)) {
759 pos
->xml_to
= VgLogTo_Socket
;
762 else if VG_STR_CLO(arg
, "--debuginfo-server",
763 VG_(clo_debuginfo_server
)) {}
765 else if VG_BOOL_CLO(arg
, "--allow-mismatched-debuginfo",
766 VG_(clo_allow_mismatched_debuginfo
)) {}
768 else if VG_STR_CLO(arg
, "--xml-user-comment",
769 VG_(clo_xml_user_comment
)) {}
771 else if VG_BOOL_CLO(arg
, "--default-suppressions",
772 VG_(clo_default_supp
)) {}
774 else if VG_STR_CLOM(cloPD
, arg
, "--suppressions", tmp_str
) {
775 VG_(add_suppression_file
)(tmp_str
);
778 else if VG_STR_CLO (arg
, "--fullpath-after", tmp_str
) {
779 VG_(addToXA
)(VG_(clo_fullpath_after
), &tmp_str
);
782 else if VG_STR_CLO (arg
, "--extra-debuginfo-path",
783 VG_(clo_extra_debuginfo_path
)) {}
785 else if VG_STR_CLO(arg
, "--require-text-symbol", tmp_str
) {
786 /* String needs to be of the form C?*C?*, where C is any
787 character, but is the same both times. Having it in this
788 form facilitates finding the boundary between the sopatt
789 and the fnpatt just by looking for the second occurrence
790 of C, without hardwiring any assumption about what C
794 ok
= tmp_str
&& VG_(strlen
)(tmp_str
) > 0;
796 patt
[0] = patt
[3] = tmp_str
[0];
797 patt
[1] = patt
[4] = '?';
798 patt
[2] = patt
[5] = '*';
800 ok
= VG_(string_match
)(patt
, tmp_str
);
803 VG_(fmsg_bad_option
)(arg
,
804 "Invalid --require-text-symbol= specification.\n");
806 VG_(addToXA
)(VG_(clo_req_tsyms
), &tmp_str
);
809 /* "stuvwxyz" --> stuvwxyz (binary) */
810 else if VG_STR_CLOM(cloPD
, arg
, "--trace-flags", tmp_str
) {
812 if (8 != VG_(strlen
)(tmp_str
)) {
813 VG_(fmsg_bad_option
)(arg
,
814 "--trace-flags argument must have 8 digits\n");
816 for (j
= 0; j
< 8; j
++) {
817 if ('0' == tmp_str
[j
]) { /* do nothing */ }
818 else if ('1' == tmp_str
[j
]) VG_(clo_trace_flags
) |= (1 << (7-j
));
820 VG_(fmsg_bad_option
)(arg
,
821 "--trace-flags argument can only contain 0s and 1s\n");
826 else if VG_INT_CLOM (cloPD
, arg
, "--trace-notbelow", VG_(clo_trace_notbelow
)) {}
828 else if VG_INT_CLOM (cloPD
, arg
, "--trace-notabove", VG_(clo_trace_notabove
)) {}
830 /* "stuvwxyz" --> stuvwxyz (binary) */
831 else if VG_STR_CLOM(cloPD
, arg
, "--profile-flags", tmp_str
) {
833 if (8 != VG_(strlen
)(tmp_str
)) {
834 VG_(fmsg_bad_option
)(arg
,
835 "--profile-flags argument must have 8 digits\n");
837 for (j
= 0; j
< 8; j
++) {
838 if ('0' == tmp_str
[j
]) { /* do nothing */ }
839 else if ('1' == tmp_str
[j
]) VG_(clo_profyle_flags
) |= (1 << (7-j
));
841 VG_(fmsg_bad_option
)(arg
,
842 "--profile-flags argument can only contain 0s and 1s\n");
845 VG_(clo_profyle_sbs
) = True
;
848 else if VG_INT_CLO (arg
, "--profile-interval",
849 VG_(clo_profyle_interval
)) {}
851 else if VG_XACT_CLOM(cloPD
, arg
, "--gen-suppressions=no",
852 VG_(clo_gen_suppressions
), 0) {}
853 else if VG_XACT_CLOM(cloPD
, arg
, "--gen-suppressions=yes",
854 VG_(clo_gen_suppressions
), 1) {}
855 else if VG_XACT_CLOM(cloPD
, arg
, "--gen-suppressions=all",
856 VG_(clo_gen_suppressions
), 2) {}
858 else if VG_BINT_CLO(arg
, "--unw-stack-scan-thresh",
859 VG_(clo_unw_stack_scan_thresh
), 0, 100) {}
860 else if VG_BINT_CLO(arg
, "--unw-stack-scan-frames",
861 VG_(clo_unw_stack_scan_frames
), 0, 32) {}
863 else if VG_XACT_CLO(arg
, "--resync-filter=no",
864 VG_(clo_resync_filter
), 0) {}
865 else if VG_XACT_CLO(arg
, "--resync-filter=yes",
866 VG_(clo_resync_filter
), 1) {}
867 else if VG_XACT_CLO(arg
, "--resync-filter=verbose",
868 VG_(clo_resync_filter
), 2) {}
870 else if ( VG_(Clo_Mode
)() != cloE
// tool does not have Early options
871 && !VG_(Clo_Recognised
) ()
872 && (! VG_(needs
).command_line_options
873 || ! VG_TDICT_CALL(tool_process_cmd_line_option
, arg
) )) {
874 if (VG_(Clo_Mode
)() == cloH
)
876 else if (VG_(Clo_Mode
)() == cloP
&& !VG_(Clo_Recognised
) ())
877 VG_(fmsg_unknown_option
)(arg
);
878 else if (VG_(Clo_Mode
)() == cloD
&& !VG_(Clo_Recognised
) ())
879 VG_(umsg
)("Ignoring dynamic change to unrecognised option %s\n", arg
);
883 void VG_(process_dynamic_option
) (Clo_Mode mode
, HChar
*value
)
885 process_option (mode
, value
, NULL
);
886 // This is not supposed to change values in process_option_state,
887 // so we can give a NULL.
890 /* Peer at previously set up VG_(args_for_valgrind) and do some
891 minimal command line processing that must happen early on:
893 - show the version string, if requested (-v)
894 - extract any request for help (-h --help, --help-dyn-options, --help-debug)
895 - set VG_(toolname) (--tool=)
896 - set VG_(clo_max_stackframe) (--max-stackframe=)
897 - set VG_(clo_main_stacksize) (--main-stacksize=)
898 - set VG_(clo_sim_hints) (--sim-hints=)
899 - set VG_(clo_max_threads) (--max-threads)
901 That's all it does. The main command line processing is done below
902 by main_process_cmd_line_options. Note that
903 main_process_cmd_line_options has to handle but ignore the ones we
906 static void early_process_cmd_line_options ( /*OUT*/Int
* need_help
)
910 struct process_option_state pos
911 = {0, 0, False
, False
, VgLogTo_Fd
, VgLogTo_Fd
, 2, -1};
913 vg_assert( VG_(args_for_valgrind
) );
915 /* parse the options we have (only the options we care about now) */
916 for (i
= 0; i
< VG_(sizeXA
)( VG_(args_for_valgrind
) ); i
++) {
918 str
= * (HChar
**) VG_(indexXA
)( VG_(args_for_valgrind
), i
);
920 process_option (cloE
, str
, &pos
);
923 if (pos
.need_version
) {
924 // Nb: the version string goes to stdout.
925 VG_(log_output_sink
).fd
= 1;
926 VG_(log_output_sink
).type
= VgLogTo_Fd
;
927 if (VG_(clo_verbosity
) <= 1)
928 VG_(printf
)("valgrind-" VERSION
"\n");
930 VG_(printf
)("valgrind-" VERSION
"-" VGGIT
"\n");
934 *need_help
= pos
.need_help
;
936 /* For convenience */
937 VG_N_THREADS
= VG_(clo_max_threads
);
939 # if defined(VGO_solaris) || defined(VGO_darwin)
940 /* Sim hint no-nptl-pthread-stackcache should be ignored. */
941 VG_(clo_sim_hints
) &= ~SimHint2S(SimHint_no_nptl_pthread_stackcache
);
945 /* The main processing for command line options. See comments above
946 on early_process_cmd_line_options. */
948 void main_process_cmd_line_options( void )
951 struct process_option_state pos
952 = {0, 0, False
, False
, VgLogTo_Fd
, VgLogTo_Fd
, 2, -1};
954 /* Check for sane path in ./configure --prefix=... */
955 if (VG_LIBDIR
[0] != '/')
956 VG_(err_config_error
)("Please use absolute paths in "
957 "./configure --prefix=... or --libdir=...\n");
959 vg_assert( VG_(args_for_valgrind
) );
961 VG_(clo_suppressions
) = VG_(newXA
)(VG_(malloc
), "main.mpclo.4",
962 VG_(free
), sizeof(HChar
*));
963 VG_(clo_fullpath_after
) = VG_(newXA
)(VG_(malloc
), "main.mpclo.5",
964 VG_(free
), sizeof(HChar
*));
965 VG_(clo_req_tsyms
) = VG_(newXA
)(VG_(malloc
), "main.mpclo.6",
966 VG_(free
), sizeof(HChar
*));
968 /* BEGIN command-line processing loop */
970 for (i
= 0; i
< VG_(sizeXA
)( VG_(args_for_valgrind
) ); i
++) {
971 HChar
* arg
= * (HChar
**) VG_(indexXA
)( VG_(args_for_valgrind
), i
);
972 process_option (cloP
, arg
, &pos
);
975 /* END command-line processing loop. From now on, only dynamically
976 changeable options will have an effect. */
977 VG_(set_Clo_Mode
)(cloD
);
979 /* Notify about deprecated features here. */
981 /* Determine the path prefix for vgdb */
982 if (VG_(clo_vgdb_prefix
) == NULL
)
983 VG_(clo_vgdb_prefix
) = VG_(vgdb_prefix_default
)();
985 /* Check various option values */
987 if (VG_(clo_verbosity
) < 0)
988 VG_(clo_verbosity
) = 0;
990 if (!pos
.sigill_diag_set
)
991 VG_(clo_sigill_diag
) = (VG_(clo_verbosity
) > 0);
993 if (!pos
.show_error_list_set
) {
995 VG_(clo_show_error_list
) = VG_(clo_verbosity
) >= 1;
997 VG_(clo_show_error_list
) = VG_(clo_verbosity
) >= 2;
1000 if (VG_(clo_trace_notbelow
) == -1) {
1001 if (VG_(clo_trace_notabove
) == -1) {
1003 VG_(clo_trace_notbelow
) = 2147483647;
1004 VG_(clo_trace_notabove
) = 0;
1006 /* [0 .. notabove] */
1007 VG_(clo_trace_notbelow
) = 0;
1010 if (VG_(clo_trace_notabove
) == -1) {
1011 /* [notbelow .. ] */
1012 VG_(clo_trace_notabove
) = 2147483647;
1014 /* [notbelow .. notabove] */
1018 if (VG_(clo_gen_suppressions
) > 0 &&
1019 !VG_(needs
).core_errors
&& !VG_(needs
).tool_errors
) {
1020 VG_(fmsg_bad_option
)("--gen-suppressions=yes",
1021 "Can't use --gen-suppressions= with %s\n"
1022 "because it doesn't generate errors.\n", VG_(details
).name
);
1024 if ((VG_(clo_exit_on_first_error
)) &&
1025 (VG_(clo_error_exitcode
)==0)) {
1026 VG_(fmsg_bad_option
)("--exit-on-first-error=yes",
1027 "You must define a non nul exit error code, with --error-exitcode=...\n");
1030 # if !defined(VGO_darwin)
1031 if (VG_(clo_resync_filter
) != 0) {
1032 VG_(fmsg_bad_option
)("--resync-filter=yes or =verbose",
1033 "--resync-filter= is only available on MacOS X.\n");
1038 /* If XML output is requested, check that the tool actually
1040 if (VG_(clo_xml
) && !VG_(needs
).xml_output
) {
1041 VG_(clo_xml
) = False
;
1042 VG_(fmsg_bad_option
)("--xml=yes",
1043 "%s does not support XML output.\n", VG_(details
).name
);
1047 vg_assert( VG_(clo_gen_suppressions
) >= 0 );
1048 vg_assert( VG_(clo_gen_suppressions
) <= 2 );
1050 /* If we've been asked to emit XML, mash around various other
1051 options so as to constrain the output somewhat, and to remove
1052 any need for user input during the run.
1056 /* We can't allow --gen-suppressions=yes, since that requires us
1057 to print the error and then ask the user if she wants a
1058 suppression for it, but in XML mode we won't print it until
1059 we know whether we also need to print a suppression. Hence a
1060 circular dependency. So disallow this.
1061 (--gen-suppressions=all is still OK since we don't need any
1062 user interaction in this case.) */
1063 if (VG_(clo_gen_suppressions
) == 1) {
1064 VG_(fmsg_bad_option
)(
1065 "--xml=yes together with --gen-suppressions=yes",
1066 "When --xml=yes is specified, --gen-suppressions=no\n"
1067 "or --gen-suppressions=all is allowed, but not "
1068 "--gen-suppressions=yes.\n");
1071 /* Disallow dump_error in XML mode; sounds like a recipe for
1072 chaos. No big deal; dump_error is a flag for debugging V
1074 if (VG_(clo_dump_error
) > 0) {
1075 VG_(fmsg_bad_option
)("--xml=yes",
1076 "Cannot be used together with --dump-error");
1079 /* Disable error limits (this might be a bad idea!) */
1080 VG_(clo_error_limit
) = False
;
1081 /* Disable emulation warnings */
1083 /* Also, we want to set options for the leak checker, but that
1084 will have to be done in Memcheck's flag-handling code, not
1088 /* All non-logging-related options have been checked. If the logging
1089 option specified is ok, we can switch to it, as we know we won't
1090 have to generate any other command-line-related error messages.
1091 (So far we should be still attached to stderr, so we can show on
1092 the terminal any problems to do with processing command line
1094 VG_(init_log_xml_sinks
)(pos
.log_to
, pos
.xml_to
,
1095 pos
.tmp_log_fd
, pos
.tmp_xml_fd
);
1097 /* Register child at-fork handler which will take care of handling
1098 --child-silent-after-fork clo and also reopening output sinks for forked
1099 children, if requested via --log|xml-file= options. */
1100 VG_(atfork
)(NULL
, NULL
, VG_(logging_atfork_child
));
1102 // Suppressions related stuff
1104 if (VG_(clo_default_supp
) &&
1105 (VG_(needs
).core_errors
|| VG_(needs
).tool_errors
)) {
1106 /* If loading default is enabled, add it to the supp list. */
1107 static const HChar default_supp
[] = "default.supp";
1108 Int len
= VG_(strlen
)(VG_(libdir
)) + 1 + sizeof(default_supp
);
1109 HChar
*buf
= VG_(malloc
)("main.mpclo.3", len
);
1110 VG_(sprintf
)(buf
, "%s/%s", VG_(libdir
), default_supp
);
1111 VG_(add_suppression_file
)(buf
);
1117 /*====================================================================*/
1118 /*=== File descriptor setup ===*/
1119 /*====================================================================*/
1121 /* Number of file descriptors that Valgrind tries to reserve for
1122 its own use - just a small constant. */
1123 #define N_RESERVED_FDS (12)
1125 static void setup_file_descriptors(void)
1127 struct vki_rlimit rl
;
1130 /* Get the current file descriptor limits. */
1131 if (VG_(getrlimit
)(VKI_RLIMIT_NOFILE
, &rl
) < 0) {
1136 # if defined(VGO_darwin)
1137 /* Darwin lies. It reports file max as RLIM_INFINITY but
1138 silently disallows anything bigger than 10240. */
1139 if (rl
.rlim_cur
>= 10240 && rl
.rlim_max
== 0x7fffffffffffffffULL
) {
1140 rl
.rlim_max
= 10240;
1145 VG_(printf
)("fd limits: host, before: cur %llu max %llu\n",
1146 (ULong
)rl
.rlim_cur
, (ULong
)rl
.rlim_max
);
1148 /* Work out where to move the soft limit to. */
1149 if (rl
.rlim_cur
+ N_RESERVED_FDS
<= rl
.rlim_max
) {
1150 rl
.rlim_cur
= rl
.rlim_cur
+ N_RESERVED_FDS
;
1152 rl
.rlim_cur
= rl
.rlim_max
;
1155 /* Reserve some file descriptors for our use. */
1156 VG_(fd_soft_limit
) = rl
.rlim_cur
- N_RESERVED_FDS
;
1157 VG_(fd_hard_limit
) = rl
.rlim_cur
- N_RESERVED_FDS
;
1159 /* Update the soft limit. */
1160 VG_(setrlimit
)(VKI_RLIMIT_NOFILE
, &rl
);
1163 VG_(printf
)("fd limits: host, after: cur %lu max %lu\n",
1164 (UWord
)rl
.rlim_cur
, (UWord
)rl
.rlim_max
);
1165 VG_(printf
)("fd limits: guest : cur %d max %d\n",
1166 VG_(fd_soft_limit
), VG_(fd_hard_limit
));
1169 if (VG_(cl_exec_fd
) != -1)
1170 VG_(cl_exec_fd
) = VG_(safe_fd
)( VG_(cl_exec_fd
) );
1174 /*====================================================================*/
1176 /*====================================================================*/
1178 /* When main() is entered, we should be on the following stack, not
1179 the one the kernel gave us. We will run on this stack until
1180 simulation of the root thread is started, at which point a transfer
1181 is made to a dynamically allocated stack. This is for the sake of
1182 uniform overflow detection for all Valgrind threads. This is
1183 marked global even though it isn't, because assembly code below
1184 needs to reference the name. */
1187 HChar bytes
[VG_STACK_GUARD_SZB
+ VG_DEFAULT_STACK_ACTIVE_SZB
+ VG_STACK_GUARD_SZB
];
1188 } VG_(interim_stack
);
1190 /* These are the structures used to hold info for creating the initial
1193 'iicii' mostly holds important register state present at system
1194 startup (_start_valgrind). valgrind_main() then fills in the rest
1195 of it and passes it to VG_(ii_create_image)(). That produces
1196 'iifii', which is later handed to VG_(ii_finalise_image). */
1198 /* In all OS-instantiations, the_iicii has a field .sp_at_startup.
1199 This should get some address inside the stack on which we gained
1200 control (eg, it could be the SP at startup). It doesn't matter
1201 exactly where in the stack it is. This value is passed to the
1202 address space manager at startup. On Linux, aspacem then uses it
1203 to identify the initial stack segment and hence the upper end of
1204 the usable address space. */
1206 static IICreateImageInfo the_iicii
;
1207 static IIFinaliseImageInfo the_iifii
;
1210 /* A simple pair structure, used for conveying debuginfo handles to
1211 calls to VG_TRACK(new_mem_startup, ...). */
1212 typedef struct { Addr a
; ULong ull
; } Addr_n_ULong
;
1215 /* --- Forwards decls to do with shutdown --- */
1217 static void final_tidyup(ThreadId tid
);
1219 /* Do everything which needs doing when the last thread exits */
1221 void shutdown_actions_NORETURN( ThreadId tid
,
1222 VgSchedReturnCode tids_schedretcode
);
1224 /* --- end of Forwards decls to do with shutdown --- */
1227 /* By the time we get to valgrind_main, the_iicii should already have
1228 been filled in with any important details as required by whatever
1229 OS we have been built for.
1232 Int
valgrind_main ( Int argc
, HChar
**argv
, HChar
**envp
)
1235 ThreadId tid_main
= VG_INVALID_THREADID
;
1237 XArray
* addr2dihandle
= NULL
;
1239 //============================================================
1241 // Nb: startup is complex. Prerequisites are shown at every step.
1242 // *** Be very careful when messing with the order ***
1244 // The first order of business is to get debug logging, the address
1245 // space manager and the dynamic memory manager up and running.
1246 // Once that's done, we can relax a bit.
1248 //============================================================
1250 /* This is needed to make VG_(getenv) usable early. */
1251 VG_(client_envp
) = (HChar
**)envp
;
1253 //--------------------------------------------------------------
1254 // Start up Mach kernel interface, if any
1256 //--------------------------------------------------------------
1257 # if defined(VGO_darwin)
1261 //--------------------------------------------------------------
1262 // Start up the logging mechanism
1264 //--------------------------------------------------------------
1265 /* Start the debugging-log system ASAP. First find out how many
1266 "-d"s were specified. This is a pre-scan of the command line. Also
1267 get --profile-heap=yes, --core-redzone-size, --redzone-size
1268 --aspace-minaddr which are needed by the time we start up dynamic
1269 memory management. */
1271 for (i
= 1; i
< argc
; i
++) {
1272 const HChar
* tmp_str
;
1273 if (argv
[i
][0] != '-') break;
1274 if VG_STREQ(argv
[i
], "--") break;
1275 if VG_STREQ(argv
[i
], "-d") loglevel
++;
1276 if VG_BOOL_CLOM(cloE
, argv
[i
], "--profile-heap", VG_(clo_profile_heap
)) {}
1277 if VG_BINT_CLOM(cloE
, argv
[i
], "--core-redzone-size", VG_(clo_core_redzone_size
),
1278 0, MAX_CLO_REDZONE_SZB
) {}
1279 if VG_BINT_CLOM(cloE
, argv
[i
], "--redzone-size", VG_(clo_redzone_size
),
1280 0, MAX_CLO_REDZONE_SZB
) {}
1281 if VG_STR_CLOM(cloE
, argv
[i
], "--aspace-minaddr", tmp_str
) {
1282 Bool ok
= VG_(parse_Addr
) (&tmp_str
, &VG_(clo_aspacem_minAddr
));
1284 VG_(fmsg_bad_option
)(argv
[i
], "Invalid address\n");
1285 const HChar
*errmsg
;
1286 if (!VG_(am_is_valid_for_aspacem_minAddr
)(VG_(clo_aspacem_minAddr
),
1288 VG_(fmsg_bad_option
)(argv
[i
], "%s\n", errmsg
);
1292 /* ... and start the debug logger. Now we can safely emit logging
1293 messages all through startup. */
1294 VG_(debugLog_startup
)(loglevel
, "Stage 2 (main)");
1295 VG_(debugLog
)(1, "main", "Welcome to Valgrind version "
1296 VERSION
" debug logging\n");
1298 //--------------------------------------------------------------
1299 // Ensure we're on a plausible stack.
1301 //--------------------------------------------------------------
1302 VG_(debugLog
)(1, "main", "Checking current stack is plausible\n");
1303 { HChar
* limLo
= (HChar
*)(&VG_(interim_stack
).bytes
[0]);
1304 HChar
* limHi
= limLo
+ sizeof(VG_(interim_stack
));
1306 aLocal
= (HChar
*)&limLo
; /* any auto local will do */
1307 /* Re "volatile": Apple clang version 4.0
1308 (tags/Apple/clang-421.0.57) (based on LLVM 3.1svn)" appeared
1309 to miscompile the following check, causing run to abort at
1310 this point (in 64-bit mode) even though aLocal is within limLo
1311 .. limHi. But in fact clang is within its rights to do
1312 strange things here. "The reason is that the comparisons
1313 aLocal < limLo and aLocal >= limHi cause undefined behaviour
1314 (according to c99 6.5.8) because they compare pointers that do
1315 not point into the same aggregate." Adding "volatile" appears
1316 to fix it because "The compiler would have to prove that there
1317 is undefined behavior in order to exploit it. But as a
1318 volatile variable can change its value in ways invisible to
1319 the compiler, the compiler must make the conservative
1320 assumption that it points into the same aggregate as the other
1321 pointer its compared against. I.e. the behaviour is possibly
1322 defined." (Analysis by Florian Krohm). */
1323 if (aLocal
< limLo
|| aLocal
>= limHi
) {
1324 /* something's wrong. Stop. */
1325 VG_(debugLog
)(0, "main", "Root stack %p to %p, a local %p\n",
1326 limLo
, limHi
, aLocal
);
1327 VG_(debugLog
)(0, "main", "Valgrind: FATAL: "
1328 "Initial stack switched failed.\n");
1329 VG_(debugLog
)(0, "main", " Cannot continue. Sorry.\n");
1334 //--------------------------------------------------------------
1335 // Ensure we have a plausible pointer to the stack on which
1336 // we gained control (not the current stack!)
1338 //--------------------------------------------------------------
1339 VG_(debugLog
)(1, "main", "Checking initial stack was noted\n");
1340 if (the_iicii
.sp_at_startup
== 0) {
1341 VG_(debugLog
)(0, "main", "Valgrind: FATAL: "
1342 "Initial stack was not noted.\n");
1343 VG_(debugLog
)(0, "main", " Cannot continue. Sorry.\n");
1347 //--------------------------------------------------------------
1348 // Start up the address space manager, and determine the
1349 // approximate location of the client's stack
1350 // p: logging, plausible-stack
1351 //--------------------------------------------------------------
1352 VG_(debugLog
)(1, "main", "Starting the address space manager\n");
1353 vg_assert(VKI_PAGE_SIZE
== 4096 || VKI_PAGE_SIZE
== 8192
1354 || VKI_PAGE_SIZE
== 16384 || VKI_PAGE_SIZE
== 32768
1355 || VKI_PAGE_SIZE
== 65536);
1356 vg_assert(VKI_MAX_PAGE_SIZE
== 4096 || VKI_MAX_PAGE_SIZE
== 8192
1357 || VKI_MAX_PAGE_SIZE
== 16384 || VKI_MAX_PAGE_SIZE
== 32768
1358 || VKI_MAX_PAGE_SIZE
== 65536);
1359 vg_assert(VKI_PAGE_SIZE
<= VKI_MAX_PAGE_SIZE
);
1360 vg_assert(VKI_PAGE_SIZE
== (1 << VKI_PAGE_SHIFT
));
1361 vg_assert(VKI_MAX_PAGE_SIZE
== (1 << VKI_MAX_PAGE_SHIFT
));
1362 the_iicii
.clstack_end
= VG_(am_startup
)( the_iicii
.sp_at_startup
);
1363 VG_(debugLog
)(1, "main", "Address space manager is running\n");
1365 //--------------------------------------------------------------
1366 // Start up the dynamic memory manager
1367 // p: address space management
1368 // p: getting --profile-heap,--core-redzone-size,--redzone-size
1369 // In fact m_mallocfree is self-initialising, so there's no
1370 // initialisation call to do. Instead, try a simple malloc/
1371 // free pair right now to check that nothing is broken.
1372 //--------------------------------------------------------------
1373 VG_(debugLog
)(1, "main", "Starting the dynamic memory manager\n");
1374 { void* p
= VG_(malloc
)( "main.vm.1", 12345 );
1377 VG_(debugLog
)(1, "main", "Dynamic memory manager is running\n");
1379 //============================================================
1381 // Dynamic memory management is now available.
1383 //============================================================
1385 //--------------------------------------------------------------
1386 // Initialise m_debuginfo
1387 // p: dynamic memory allocation
1388 VG_(debugLog
)(1, "main", "Initialise m_debuginfo\n");
1389 VG_(di_initialise
)();
1391 //--------------------------------------------------------------
1392 // Look for alternative libdir
1393 { HChar
*cp
= VG_(getenv
)(VALGRIND_LIB
);
1396 VG_(debugLog
)(1, "main", "VG_(libdir) = %s\n", VG_(libdir
));
1399 //--------------------------------------------------------------
1400 // Extract the launcher name from the environment.
1401 VG_(debugLog
)(1, "main", "Getting launcher's name ...\n");
1402 VG_(name_of_launcher
) = VG_(getenv
)(VALGRIND_LAUNCHER
);
1403 if (VG_(name_of_launcher
) == NULL
) {
1404 VG_(printf
)("valgrind: You cannot run '%s' directly.\n", argv
[0]);
1405 VG_(printf
)("valgrind: You should use $prefix/bin/valgrind.\n");
1408 VG_(debugLog
)(1, "main", "... %s\n", VG_(name_of_launcher
));
1410 //--------------------------------------------------------------
1411 // We used to set the process datasize rlimit to zero to prevent
1412 // any internal use of brk() from having any effect. But later
1413 // linux kernels redefine RLIMIT_DATA as the size of any data
1414 // areas, including some dynamic mmap memory allocations.
1415 // See bug #357833 for the commit that went into linux 4.5
1416 // changing the definition of RLIMIT_DATA. So don't mess with
1417 // RLIMIT_DATA here now anymore. Just remember it for use in
1418 // the syscall wrappers.
1419 VG_(getrlimit
)(VKI_RLIMIT_DATA
, &VG_(client_rlimit_data
));
1421 // Get the current process stack rlimit.
1422 VG_(getrlimit
)(VKI_RLIMIT_STACK
, &VG_(client_rlimit_stack
));
1424 //--------------------------------------------------------------
1425 // Figure out what sort of CPU we're on, and whether it is
1427 /* The vex_archinfo structure is passed down later to the client
1428 * to verify the HW info settings are consistent.
1430 VexArchInfo vex_archinfo
;
1431 VG_(debugLog
)(1, "main", "Get hardware capabilities ...\n");
1433 Bool ok
= VG_(machine_get_hwcaps
)();
1436 VG_(printf
)("valgrind: fatal error: unsupported CPU.\n");
1437 VG_(printf
)(" Supported CPUs are:\n");
1438 VG_(printf
)(" * x86 (practically any; Pentium-I or above), "
1439 "AMD Athlon or above)\n");
1440 VG_(printf
)(" * AMD Athlon64/Opteron\n");
1441 VG_(printf
)(" * ARM (armv7)\n");
1442 VG_(printf
)(" * MIPS (mips32 and above; mips64 and above)\n");
1443 VG_(printf
)(" * PowerPC (most; ppc405 and above)\n");
1444 VG_(printf
)(" * System z (64bit only - s390x; z990 and above)\n");
1448 VG_(machine_get_VexArchInfo
)( &vex_arch
, &vex_archinfo
);
1450 1, "main", "... arch = %s, hwcaps = %s\n",
1451 LibVEX_ppVexArch ( vex_arch
),
1452 LibVEX_ppVexHwCaps ( vex_arch
, vex_archinfo
.hwcaps
)
1456 //--------------------------------------------------------------
1457 // Record the working directory at startup
1459 VG_(debugLog
)(1, "main", "Getting the working directory at startup\n");
1460 VG_(record_startup_wd
)();
1461 const HChar
*wd
= VG_(get_startup_wd
)();
1462 VG_(debugLog
)(1, "main", "... %s\n", wd
!= NULL
? wd
: "<NO CWD>" );
1464 //============================================================
1465 // Command line argument handling order:
1466 // * If --help/--help-debug are present, show usage message
1467 // (including the tool-specific usage)
1468 // * (If no --tool option given, default to Memcheck)
1469 // * Then, if client is missing, abort with error msg
1470 // * Then, if any cmdline args are bad, abort with error msg
1471 //============================================================
1473 //--------------------------------------------------------------
1474 // Split up argv into: C args, V args, V extra args, and exename.
1475 // p: dynamic memory allocation
1476 //--------------------------------------------------------------
1477 VG_(debugLog
)(1, "main", "Split up command line\n");
1478 VG_(split_up_argv
)( argc
, argv
);
1479 vg_assert( VG_(args_for_valgrind
) );
1480 vg_assert( VG_(args_for_client
) );
1482 for (i
= 0; i
< VG_(sizeXA
)( VG_(args_for_valgrind
) ); i
++)
1485 * (HChar
**) VG_(indexXA
)( VG_(args_for_valgrind
), i
)
1487 VG_(printf
)(" exe %s\n", VG_(args_the_exename
));
1488 for (i
= 0; i
< VG_(sizeXA
)( VG_(args_for_client
) ); i
++)
1491 * (HChar
**) VG_(indexXA
)( VG_(args_for_client
), i
)
1495 //--------------------------------------------------------------
1496 // Extract tool name and whether help has been requested.
1497 // Note we can't print the help message yet, even if requested,
1498 // because the tool has not been initialised.
1499 // p: split_up_argv [for VG_(args_for_valgrind)]
1500 //--------------------------------------------------------------
1501 VG_(debugLog
)(1, "main",
1502 "(early_) Process Valgrind's command line options\n");
1503 early_process_cmd_line_options(&need_help
);
1506 // When changing the logic for the VG_(clo_read_inline_info) default,
1507 // the manual and --help output have to be changed accordingly.
1508 vg_assert(VG_(clo_toolname
) != NULL
);
1509 vg_assert(VG_(clo_read_inline_info
) == False
);
1510 # if !defined(VGO_darwin)
1511 if (0 == VG_(strcmp
)(VG_(clo_toolname
), "memcheck")
1512 || 0 == VG_(strcmp
)(VG_(clo_toolname
), "helgrind")
1513 || 0 == VG_(strcmp
)(VG_(clo_toolname
), "drd")
1514 || 0 == VG_(strcmp
)(VG_(clo_toolname
), "massif")
1515 || 0 == VG_(strcmp
)(VG_(clo_toolname
), "dhat")) {
1516 /* Change the default setting. Later on (just below)
1517 main_process_cmd_line_options should pick up any
1518 user-supplied setting for it and will override the default
1520 VG_(clo_read_inline_info
) = True
;
1525 // Set default vex control params.
1526 LibVEX_default_VexControl(& VG_(clo_vex_control
));
1528 //--------------------------------------------------------------
1529 // Load client executable, finding in $PATH if necessary
1530 // p: early_process_cmd_line_options() [for 'exec', 'need_help',
1531 // clo_max_stackframe,
1532 // clo_main_stacksize]
1533 // p: layout_remaining_space [so there's space]
1535 // Set up client's environment
1536 // p: set-libdir [for VG_(libdir)]
1537 // p: early_process_cmd_line_options [for VG_(clo_toolname)]
1539 // Setup client stack, eip, and VG_(client_arg[cv])
1540 // p: load_client() [for 'info']
1541 // p: fix_environment() [for 'env']
1543 // Setup client data (brk) segment. Initially a 1-page segment
1544 // which abuts a shrinkable reservation.
1545 // p: load_client() [for 'info' and hence VG_(brk_base)]
1547 // p: _start_in_C (for zeroing out the_iicii and putting some
1548 // initial values into it)
1549 //--------------------------------------------------------------
1551 VG_(debugLog
)(1, "main", "Create initial image\n");
1553 # if defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_solaris)
1554 the_iicii
.argv
= argv
;
1555 the_iicii
.envp
= envp
;
1556 the_iicii
.toolname
= VG_(clo_toolname
);
1558 # error "Unknown platform"
1561 /* NOTE: this call reads VG_(clo_main_stacksize). */
1562 the_iifii
= VG_(ii_create_image
)( the_iicii
, &vex_archinfo
);
1565 //==============================================================
1567 // Finished loading/setting up the client address space.
1569 //==============================================================
1571 //--------------------------------------------------------------
1572 // setup file descriptors
1574 //--------------------------------------------------------------
1575 VG_(debugLog
)(1, "main", "Setup file descriptors\n");
1576 setup_file_descriptors();
1578 //--------------------------------------------------------------
1579 // create fake /proc/<pid>/cmdline and /proc/<pid>/auxv files
1580 // and then unlink them, but hold onto the fds, so we can handr
1581 // them out to the client when it tries to open
1582 // /proc/<pid>/cmdline or /proc/<pid>/auxv for itself.
1583 // p: setup file descriptors
1584 // p: ii_create_image for VG_(client_auxv) setup.
1585 //--------------------------------------------------------------
1586 VG_(cl_cmdline_fd
) = -1;
1587 VG_(cl_auxv_fd
) = -1;
1588 #if defined(VGO_solaris)
1589 VG_(cl_psinfo_fd
) = -1;
1592 #if defined(VGO_linux) || defined(VGO_solaris)
1594 HChar buf
[50]; // large enough
1595 HChar buf2
[VG_(mkstemp_fullname_bufsz
)(sizeof buf
- 1)];
1598 #if defined(VGO_linux) || defined(SOLARIS_PROC_CMDLINE)
1599 /* Fake /proc/<pid>/cmdline only on Linux and Solaris if supported. */
1601 const HChar
* exename
;
1603 VG_(debugLog
)(1, "main", "Create fake /proc/<pid>/cmdline\n");
1605 VG_(sprintf
)(buf
, "proc_%d_cmdline", VG_(getpid
)());
1606 fd
= VG_(mkstemp
)( buf
, buf2
);
1608 VG_(err_config_error
)("Can't create client cmdline file in %s\n", buf2
);
1611 exename
= VG_(args_the_exename
);
1612 VG_(write
)(fd
, exename
, VG_(strlen
)( exename
));
1613 VG_(write
)(fd
, nul
, 1);
1615 for (i
= 0; i
< VG_(sizeXA
)( VG_(args_for_client
) ); i
++) {
1616 HChar
* arg
= * (HChar
**) VG_(indexXA
)( VG_(args_for_client
), i
);
1617 VG_(write
)(fd
, arg
, VG_(strlen
)( arg
));
1618 VG_(write
)(fd
, nul
, 1);
1621 /* Don't bother to seek the file back to the start; instead do
1622 it every time a copy of it is given out (by PRE(sys_open) or
1623 PRE(sys_openat)). That is probably more robust across fork() etc. */
1625 /* Now delete it, but hang on to the fd. */
1626 r
= VG_(unlink
)( buf2
);
1628 VG_(err_config_error
)("Can't delete client cmdline file in %s\n", buf2
);
1630 VG_(cl_cmdline_fd
) = fd
;
1631 #endif // defined(VGO_linux) || defined(SOLARIS_PROC_CMDLINE)
1633 /* Fake /proc/<pid>/auxv on both Linux and Solaris. */
1634 VG_(debugLog
)(1, "main", "Create fake /proc/<pid>/auxv\n");
1636 VG_(sprintf
)(buf
, "proc_%d_auxv", VG_(getpid
)());
1637 fd
= VG_(mkstemp
)( buf
, buf2
);
1639 VG_(err_config_error
)("Can't create client auxv file in %s\n", buf2
);
1641 UWord
*client_auxv
= VG_(client_auxv
);
1642 unsigned int client_auxv_len
= 0;
1643 while (*client_auxv
!= 0) {
1646 client_auxv_len
+= 2 * sizeof(UWord
);
1648 client_auxv_len
+= 2 * sizeof(UWord
);
1650 VG_(write
)(fd
, VG_(client_auxv
), client_auxv_len
);
1652 /* Don't bother to seek the file back to the start; instead do
1653 it every time a copy of it is given out (by PRE(sys_open)).
1654 That is probably more robust across fork() etc. */
1656 /* Now delete it, but hang on to the fd. */
1657 r
= VG_(unlink
)( buf2
);
1659 VG_(err_config_error
)("Can't delete client auxv file in %s\n", buf2
);
1661 VG_(cl_auxv_fd
) = fd
;
1663 #if defined(VGO_solaris)
1664 /* Fake /proc/<pid>/psinfo on Solaris.
1665 * Contents will be fetched and partially faked later on the fly. */
1666 VG_(debugLog
)(1, "main", "Create fake /proc/<pid>/psinfo\n");
1668 VG_(sprintf
)(buf
, "proc_%d_psinfo", VG_(getpid
)());
1669 fd
= VG_(mkstemp
)( buf
, buf2
);
1671 VG_(err_config_error
)("Can't create client psinfo file in %s\n", buf2
);
1673 /* Now delete it, but hang on to the fd. */
1674 r
= VG_(unlink
)( buf2
);
1676 VG_(err_config_error
)("Can't delete client psinfo file in %s\n", buf2
);
1678 VG_(cl_psinfo_fd
) = fd
;
1679 #endif /* VGO_solaris */
1683 //--------------------------------------------------------------
1684 // Init tool part 1: pre_clo_init
1685 // p: setup_client_stack() [for 'VG_(client_arg[cv]']
1686 // p: setup_file_descriptors() [for 'VG_(fd_xxx_limit)']
1687 //--------------------------------------------------------------
1688 VG_(debugLog
)(1, "main", "Initialise the tool part 1 (pre_clo_init)\n");
1689 VG_(tl_pre_clo_init
)();
1690 // Activate var info readers, if the tool asked for it:
1691 if (VG_(needs
).var_info
)
1692 VG_(clo_read_var_info
) = True
;
1694 //--------------------------------------------------------------
1695 // If --tool and --help/--help-debug was given, now give the core+tool
1697 // p: early_process_cmd_line_options() [for 'need_help']
1698 // p: tl_pre_clo_init [for 'VG_(tdict).usage']
1699 //--------------------------------------------------------------
1700 VG_(debugLog
)(1, "main", "Print help and quit, if requested\n");
1702 usage_NORETURN(need_help
);
1705 //--------------------------------------------------------------
1706 // Process command line options to Valgrind + tool
1707 // p: setup_client_stack() [for 'VG_(client_arg[cv]']
1708 // p: setup_file_descriptors() [for 'VG_(fd_xxx_limit)']
1709 //--------------------------------------------------------------
1710 VG_(debugLog
)(1, "main",
1711 "(main_) Process Valgrind's command line options, "
1713 main_process_cmd_line_options();
1715 //--------------------------------------------------------------
1716 // Zeroise the millisecond counter by doing a first read of it.
1718 //--------------------------------------------------------------
1719 (void) VG_(read_millisecond_timer
)();
1721 //--------------------------------------------------------------
1722 // Print the preamble
1723 // p: tl_pre_clo_init [for 'VG_(details).name' and friends]
1724 // p: main_process_cmd_line_options()
1725 // [for VG_(clo_verbosity), VG_(clo_xml)]
1726 //--------------------------------------------------------------
1727 VG_(debugLog
)(1, "main", "Print the preamble...\n");
1728 VG_(print_preamble
)(VG_(log_output_sink
).type
!= VgLogTo_File
);
1729 VG_(debugLog
)(1, "main", "...finished the preamble\n");
1731 //--------------------------------------------------------------
1732 // Init tool part 2: post_clo_init
1733 // p: setup_client_stack() [for 'VG_(client_arg[cv]']
1734 // p: setup_file_descriptors() [for 'VG_(fd_xxx_limit)']
1735 // p: print_preamble() [so any warnings printed in post_clo_init
1736 // are shown after the preamble]
1737 //--------------------------------------------------------------
1738 VG_(debugLog
)(1, "main", "Initialise the tool part 2 (post_clo_init)\n");
1739 VG_TDICT_CALL(tool_post_clo_init
);
1741 /* The tool's "needs" will by now be finalised, since it has no
1742 further opportunity to specify them. So now sanity check
1743 and finish initialising the needs. */
1746 ok
= VG_(finish_needs_init
)( &s
);
1752 //--------------------------------------------------------------
1753 // Initialise translation table and translation cache
1755 // p: tl_pre_clo_init [for 'VG_(details).avg_translation_sizeB']
1756 //--------------------------------------------------------------
1757 VG_(debugLog
)(1, "main", "Initialise TT/TC\n");
1760 //--------------------------------------------------------------
1761 // Initialise the redirect table.
1762 // p: init_tt_tc [so it can call VG_(search_transtab) safely]
1763 // p: aspacem [so can change ownership of sysinfo pages]
1764 //--------------------------------------------------------------
1765 VG_(debugLog
)(1, "main", "Initialise redirects\n");
1766 VG_(redir_initialise
)();
1768 //--------------------------------------------------------------
1769 // Search for file descriptors that are inherited from our parent
1770 // p: main_process_cmd_line_options [for VG_(clo_track_fds)]
1771 //--------------------------------------------------------------
1772 if (VG_(clo_track_fds
)) {
1773 VG_(debugLog
)(1, "main", "Init preopened fds\n");
1774 VG_(init_preopened_fds
)();
1777 #if defined(VGO_solaris)
1778 VG_(syswrap_init
)();
1781 //--------------------------------------------------------------
1782 // Load debug info for the existing segments.
1783 // p: setup_code_redirect_table [so that redirs can be recorded]
1785 // p: probably: setup fds and process CLOs, so that logging works
1786 // p: initialise m_debuginfo
1788 // While doing this, make a note of the debuginfo-handles that
1789 // come back from VG_(di_notify_mmap).
1790 // Later, in "Tell the tool about the initial client memory permissions"
1791 // (just below) we can then hand these handles off to the tool in
1792 // calls to VG_TRACK(new_mem_startup, ...). This gives the tool the
1793 // opportunity to make further queries to m_debuginfo before the
1794 // client is started, if it wants. We put this information into an
1795 // XArray, each handle along with the associated segment start address,
1796 // and search the XArray for the handles later, when calling
1797 // VG_TRACK(new_mem_startup, ...).
1798 //--------------------------------------------------------------
1799 VG_(debugLog
)(1, "main", "Load initial debug info\n");
1801 vg_assert(!addr2dihandle
);
1802 addr2dihandle
= VG_(newXA
)( VG_(malloc
), "main.vm.2",
1803 VG_(free
), sizeof(Addr_n_ULong
) );
1805 # if defined(VGO_linux) || defined(VGO_solaris)
1810 seg_starts
= VG_(get_segment_starts
)( SkFileC
| SkFileV
, &n_seg_starts
);
1811 vg_assert(seg_starts
&& n_seg_starts
>= 0);
1813 /* show them all to the debug info reader. allow_SkFileV has to
1814 be True here so that we read info from the valgrind executable
1816 for (i
= 0; i
< n_seg_starts
; i
++) {
1817 anu
.ull
= VG_(di_notify_mmap
)( seg_starts
[i
], True
/*allow_SkFileV*/,
1818 -1/*Don't use_fd*/);
1819 /* anu.ull holds the debuginfo handle returned by di_notify_mmap,
1822 anu
.a
= seg_starts
[i
];
1823 VG_(addToXA
)( addr2dihandle
, &anu
);
1827 VG_(free
)( seg_starts
);
1829 # elif defined(VGO_darwin)
1832 seg_starts
= VG_(get_segment_starts
)( SkFileC
, &n_seg_starts
);
1833 vg_assert(seg_starts
&& n_seg_starts
>= 0);
1835 /* show them all to the debug info reader.
1836 Don't read from V segments (unlike Linux) */
1837 // GrP fixme really?
1838 for (i
= 0; i
< n_seg_starts
; i
++) {
1839 VG_(di_notify_mmap
)( seg_starts
[i
], False
/*don't allow_SkFileV*/,
1840 -1/*don't use_fd*/);
1843 VG_(free
)( seg_starts
);
1849 //--------------------------------------------------------------
1850 // Tell aspacem of ownership change of the asm helpers, so that
1851 // m_translate allows them to be translated. However, only do this
1852 // after the initial debug info read, since making a hole in the
1853 // address range for the stage2 binary confuses the debug info reader.
1855 //--------------------------------------------------------------
1856 { Bool change_ownership_v_c_OK
;
1857 Addr co_start
= VG_PGROUNDDN( (Addr
)&VG_(trampoline_stuff_start
) );
1858 Addr co_endPlus
= VG_PGROUNDUP( (Addr
)&VG_(trampoline_stuff_end
) );
1859 VG_(debugLog
)(1,"redir",
1860 "transfer ownership V -> C of 0x%llx .. 0x%llx\n",
1861 (ULong
)co_start
, (ULong
)co_endPlus
-1 );
1863 change_ownership_v_c_OK
1864 = VG_(am_change_ownership_v_to_c
)( co_start
, co_endPlus
- co_start
);
1865 vg_assert(change_ownership_v_c_OK
);
1869 HChar buf
[50]; // large enough
1870 VG_(elapsed_wallclock_time
)(buf
, sizeof buf
);
1871 VG_(printf_xml
)( "<status>\n"
1872 " <state>RUNNING</state>\n"
1873 " <time>%pS</time>\n"
1876 VG_(printf_xml
)( "\n" );
1879 VG_(init_Threads
)();
1881 //--------------------------------------------------------------
1882 // Initialise the scheduler (phase 1) [generates tid_main]
1884 //--------------------------------------------------------------
1885 VG_(debugLog
)(1, "main", "Initialise scheduler (phase 1)\n");
1886 tid_main
= VG_(scheduler_init_phase1
)();
1887 vg_assert(tid_main
>= 0 && tid_main
< VG_N_THREADS
1888 && tid_main
!= VG_INVALID_THREADID
);
1889 /* Tell the tool about tid_main */
1890 VG_TRACK( pre_thread_ll_create
, VG_INVALID_THREADID
, tid_main
);
1892 //--------------------------------------------------------------
1893 // Tell the tool about the initial client memory permissions
1896 // p: setup_client_stack
1897 // p: setup_client_dataseg
1899 // For each segment we tell the client about, look up in
1900 // addr2dihandle as created above, to see if there's a debuginfo
1901 // handle associated with the segment, that we can hand along
1902 // to the tool, to be helpful.
1903 //--------------------------------------------------------------
1904 VG_(debugLog
)(1, "main", "Tell tool about initial permissions\n");
1908 vg_assert(addr2dihandle
);
1910 /* Mark the main thread as running while we tell the tool about
1911 the client memory so that the tool can associate that memory
1912 with the main thread. */
1913 vg_assert(VG_(running_tid
) == VG_INVALID_THREADID
);
1914 VG_(running_tid
) = tid_main
;
1916 seg_starts
= VG_(get_segment_starts
)( SkFileC
| SkAnonC
| SkShmC
,
1918 vg_assert(seg_starts
&& n_seg_starts
>= 0);
1920 /* Show client segments to the tool */
1921 for (i
= 0; i
< n_seg_starts
; i
++) {
1924 = VG_(am_find_nsegment
)( seg_starts
[i
] );
1926 vg_assert(seg
->kind
== SkFileC
|| seg
->kind
== SkAnonC
||
1927 seg
->kind
== SkShmC
);
1928 vg_assert(seg
->start
== seg_starts
[i
]);
1930 VG_(debugLog
)(2, "main",
1931 "tell tool about %010lx-%010lx %c%c%c\n",
1932 seg
->start
, seg
->end
,
1933 seg
->hasR
? 'r' : '-',
1934 seg
->hasW
? 'w' : '-',
1935 seg
->hasX
? 'x' : '-' );
1936 /* search addr2dihandle to see if we have an entry
1937 matching seg->start. */
1938 n
= VG_(sizeXA
)( addr2dihandle
);
1939 for (j
= 0; j
< n
; j
++) {
1940 Addr_n_ULong
* anl
= VG_(indexXA
)( addr2dihandle
, j
);
1941 if (anl
->a
== seg
->start
) {
1942 vg_assert(anl
->ull
> 0); /* check it's a valid handle */
1946 vg_assert(j
>= 0 && j
<= n
);
1947 VG_TRACK( new_mem_startup
, seg
->start
, seg
->end
+1-seg
->start
,
1948 seg
->hasR
, seg
->hasW
, seg
->hasX
,
1949 /* and the retrieved debuginfo handle, if any */
1951 ? ((Addr_n_ULong
*)VG_(indexXA
)( addr2dihandle
, j
))->ull
1956 VG_(free
)( seg_starts
);
1957 VG_(deleteXA
)( addr2dihandle
);
1959 /* Also do the initial stack permissions. */
1961 SSizeT inaccessible_len
;
1963 = VG_(am_find_nsegment
)( the_iifii
.initial_client_SP
);
1965 vg_assert(seg
->kind
== SkAnonC
);
1966 vg_assert(the_iifii
.initial_client_SP
>= seg
->start
);
1967 vg_assert(the_iifii
.initial_client_SP
<= seg
->end
);
1969 /* Stuff below the initial SP is unaddressable. Take into
1970 account any ABI-mandated space below the stack pointer that
1971 is required (VG_STACK_REDZONE_SZB). setup_client_stack()
1972 will have allocated an extra page if a red zone is required,
1973 to be on the safe side. */
1974 inaccessible_len
= the_iifii
.initial_client_SP
- VG_STACK_REDZONE_SZB
1976 vg_assert(inaccessible_len
>= 0);
1977 if (inaccessible_len
> 0)
1978 VG_TRACK( die_mem_stack
,
1981 VG_(debugLog
)(2, "main", "mark stack inaccessible %010lx-%010lx\n",
1983 the_iifii
.initial_client_SP
-1 - VG_STACK_REDZONE_SZB
);
1986 /* Also the assembly helpers. */
1987 VG_TRACK( new_mem_startup
,
1988 (Addr
)&VG_(trampoline_stuff_start
),
1989 (Addr
)&VG_(trampoline_stuff_end
)
1990 - (Addr
)&VG_(trampoline_stuff_start
),
1991 False
, /* readable? */
1992 False
, /* writable? */
1993 True
/* executable? */,
1994 0 /* di_handle: no associated debug info */ );
1996 /* Clear the running thread indicator */
1997 VG_(running_tid
) = VG_INVALID_THREADID
;
1998 vg_assert(VG_(running_tid
) == VG_INVALID_THREADID
);
2000 /* Darwin only: tell the tools where the client's kernel commpage
2001 is. It would be better to do this by telling aspacemgr about
2002 it -- see the now disused record_system_memory() in
2003 initimg-darwin.c -- but that causes the sync checker to fail,
2004 since the mapping doesn't appear in the kernel-supplied
2005 process map. So do it here instead. */
2006 # if defined(VGP_amd64_darwin)
2007 VG_TRACK( new_mem_startup
,
2008 0x7fffffe00000, 0x7ffffffff000-0x7fffffe00000,
2009 True
, False
, True
, /* r-x */
2010 0 /* di_handle: no associated debug info */ );
2011 # elif defined(VGP_x86_darwin)
2012 VG_TRACK( new_mem_startup
,
2013 0xfffec000, 0xfffff000-0xfffec000,
2014 True
, False
, True
, /* r-x */
2015 0 /* di_handle: no associated debug info */ );
2019 //--------------------------------------------------------------
2020 // Initialise the scheduler (phase 2)
2021 // p: Initialise the scheduler (phase 1) [for tid_main]
2022 // p: setup_file_descriptors() [else VG_(safe_fd)() breaks]
2023 // p: setup_client_stack
2024 //--------------------------------------------------------------
2025 VG_(debugLog
)(1, "main", "Initialise scheduler (phase 2)\n");
2026 { NSegment
const* seg
2027 = VG_(am_find_nsegment
)( the_iifii
.initial_client_SP
);
2029 vg_assert(seg
->kind
== SkAnonC
);
2030 vg_assert(the_iifii
.initial_client_SP
>= seg
->start
);
2031 vg_assert(the_iifii
.initial_client_SP
<= seg
->end
);
2032 VG_(scheduler_init_phase2
)( tid_main
,
2033 seg
->end
, the_iifii
.clstack_max_size
);
2036 //--------------------------------------------------------------
2037 // Set up state for the root thread
2039 // setup_scheduler() [for sched-specific thread 1 stuff]
2040 // VG_(ii_create_image) [for 'the_iicii' initial info]
2041 //--------------------------------------------------------------
2042 VG_(debugLog
)(1, "main", "Finalise initial image\n");
2043 { /* Mark the main thread as running while we tell the tool about
2044 the client memory which could be tracked during initial image
2045 finalisation. So the tool can associate that memory with the
2047 vg_assert(VG_(running_tid
) == VG_INVALID_THREADID
);
2048 VG_(running_tid
) = tid_main
;
2050 VG_(ii_finalise_image
)( the_iifii
);
2052 /* Clear the running thread indicator */
2053 VG_(running_tid
) = VG_INVALID_THREADID
;
2054 vg_assert(VG_(running_tid
) == VG_INVALID_THREADID
);
2057 //--------------------------------------------------------------
2058 // Initialise the signal handling subsystem
2060 //--------------------------------------------------------------
2061 // Nb: temporarily parks the saved blocking-mask in saved_sigmask.
2062 VG_(debugLog
)(1, "main", "Initialise signal management\n");
2063 /* Check that the kernel-interface signal definitions look sane */
2064 VG_(vki_do_initial_consistency_checks
)();
2065 /* .. and go on to use them. */
2066 VG_(sigstartup_actions
)();
2068 //--------------------------------------------------------------
2069 // Read suppression file
2070 // p: main_process_cmd_line_options() [for VG_(clo_suppressions)]
2071 //--------------------------------------------------------------
2072 if (VG_(needs
).core_errors
|| VG_(needs
).tool_errors
) {
2073 VG_(debugLog
)(1, "main", "Load suppressions\n");
2074 VG_(load_suppressions
)();
2077 //--------------------------------------------------------------
2078 // register client stack
2079 //--------------------------------------------------------------
2080 VG_(clstk_id
) = VG_(register_stack
)(VG_(clstk_start_base
), VG_(clstk_end
));
2082 //--------------------------------------------------------------
2083 // Show the address space state so far
2084 //--------------------------------------------------------------
2085 VG_(debugLog
)(1, "main", "\n");
2086 VG_(debugLog
)(1, "main", "\n");
2087 VG_(am_show_nsegments
)(1,"Memory layout at client startup");
2088 VG_(debugLog
)(1, "main", "\n");
2089 VG_(debugLog
)(1, "main", "\n");
2091 //--------------------------------------------------------------
2093 //--------------------------------------------------------------
2094 VG_(debugLog
)(1, "main", "Running thread 1\n");
2096 /* As a result of the following call, the last thread standing
2097 eventually winds up running shutdown_actions_NORETURN
2098 just below. Unfortunately, simply exporting said function
2099 causes m_main to be part of a module cycle, which is pretty
2100 nonsensical. So instead of doing that, the address of said
2101 function is stored in a global variable 'owned' by m_syswrap,
2102 and it uses that function pointer to get back here when it needs
2105 /* Set continuation address. */
2106 VG_(address_of_m_main_shutdown_actions_NORETURN
)
2107 = & shutdown_actions_NORETURN
;
2109 /* Run the first thread, eventually ending up at the continuation
2111 VG_(main_thread_wrapper_NORETURN
)(1);
2117 /* Do everything which needs doing when the last thread exits or when
2118 a thread exits requesting a complete process exit.
2120 We enter here holding The Lock. For the case VgSrc_ExitProcess we
2121 must never release it, because to do so would allow other threads
2122 to continue after the system is ostensibly shut down. So we must
2123 go to our grave, so to speak, holding the lock.
2125 In fact, there is never any point in releasing the lock at this
2126 point - we have it, we're shutting down the entire system, and
2127 for the case VgSrc_ExitProcess doing so positively causes trouble.
2130 The final_tidyup call makes a bit of a nonsense of the ExitProcess
2131 case, since it will run __gnu_cxx::__freeres and libc_freeres functions,
2132 thus allowing other lurking threads to run again. Hmm. */
2135 void shutdown_actions_NORETURN( ThreadId tid
,
2136 VgSchedReturnCode tids_schedretcode
)
2138 VG_(debugLog
)(1, "main", "entering VG_(shutdown_actions_NORETURN)\n");
2139 VG_(am_show_nsegments
)(1,"Memory layout at client shutdown");
2141 vg_assert(VG_(is_running_thread
)(tid
));
2142 vg_assert(tids_schedretcode
== VgSrc_ExitThread
2143 || tids_schedretcode
== VgSrc_ExitProcess
2144 || tids_schedretcode
== VgSrc_FatalSig
);
2146 if (tids_schedretcode
== VgSrc_ExitThread
) {
2148 // We are the last surviving thread. Right?
2149 vg_assert( VG_(count_living_threads
)() == 1 );
2151 // Wait for all other threads to exit.
2152 // jrs: Huh? but they surely are already gone
2153 VG_(reap_threads
)(tid
);
2155 // Clean the client up before the final report.
2156 // This causes __gnu_cxx::__freeres and libc_freeres functions to run.
2160 vg_assert(VG_(is_running_thread
)(tid
));
2161 vg_assert(VG_(count_living_threads
)() == 1);
2165 // We may not be the last surviving thread. However, we
2166 // want to shut down the entire process. We hold the lock
2167 // and we need to keep hold of it all the way out, in order
2168 // that none of the other threads ever run again.
2169 vg_assert( VG_(count_living_threads
)() >= 1 );
2171 // Clean the client up before the final report.
2172 // This causes __gnu_cxx::__freeres and libc_freeres functions to run.
2173 // Perhaps this is unsafe, as per comment above.
2177 vg_assert(VG_(is_running_thread
)(tid
));
2178 vg_assert(VG_(count_living_threads
)() >= 1);
2181 /* Final call to gdbserver, if requested. */
2182 if (VG_(gdbserver_stop_at
) (VgdbStopAt_Exit
)) {
2183 VG_(umsg
)("(action at exit) vgdb me ... \n");
2184 VG_(gdbserver
) (tid
);
2186 VG_(threads
)[tid
].status
= VgTs_Empty
;
2188 //--------------------------------------------------------------
2189 // Finalisation: cleanup, messages, etc. Order not so important, only
2190 // affects what order the messages come.
2191 //--------------------------------------------------------------
2192 // First thing in the post-amble is a blank line.
2194 VG_(printf_xml
)("\n");
2195 else if (VG_(clo_verbosity
) > 0)
2196 VG_(message
)(Vg_UserMsg
, "\n");
2199 HChar buf
[50]; // large enough
2200 VG_(elapsed_wallclock_time
)(buf
, sizeof buf
);
2201 VG_(printf_xml
)( "<status>\n"
2202 " <state>FINISHED</state>\n"
2203 " <time>%pS</time>\n"
2209 /* Print out file descriptor summary and stats. */
2210 if (VG_(clo_track_fds
))
2211 VG_(show_open_fds
)("at exit");
2213 /* Call the tool's finalisation function. This makes Memcheck's
2214 leak checker run, and possibly chuck a bunch of leak errors into
2215 the error management machinery. */
2216 VG_TDICT_CALL(tool_fini
, 0/*exitcode*/);
2218 if (VG_(needs
).core_errors
|| VG_(needs
).tool_errors
) {
2219 if (VG_(clo_verbosity
) == 1
2221 && !VG_(clo_show_error_list
))
2222 VG_(message
)(Vg_UserMsg
,
2223 "For lists of detected and suppressed errors,"
2224 " rerun with: -s\n");
2226 /* Show the error counts. */
2228 VG_(show_error_counts_as_XML
)();
2231 /* In XML mode, this merely prints the used suppressions. */
2232 VG_(show_all_errors
)(VG_(clo_verbosity
), VG_(clo_xml
));
2236 VG_(printf_xml
)("\n");
2237 VG_(printf_xml
)("</valgrindoutput>\n");
2238 VG_(printf_xml
)("\n");
2241 VG_(sanity_check_general
)( True
/*include expensive checks*/ );
2244 VG_(print_all_stats
)(VG_(clo_verbosity
) >= 1, /* Memory stats */
2245 False
/* tool prints stats in the tool fini */);
2247 /* Show a profile of the heap(s) at shutdown. Optionally, first
2248 throw away all the debug info, as that makes it easy to spot
2249 leaks in the debuginfo reader. */
2250 if (VG_(clo_profile_heap
)) {
2251 if (0) VG_(di_discard_ALL_debuginfo
)();
2252 VG_(print_arena_cc_analysis
)();
2255 /* If profiling has been requested, but with zero interval, it
2256 means "profile at the end of the run only". In which case we
2257 need to dump the profile now. */
2258 if (VG_(clo_profyle_sbs
) && VG_(clo_profyle_interval
) == 0) {
2259 VG_(get_and_show_SB_profile
)(0/*denoting end-of-run*/);
2262 /* Print Vex storage stats */
2264 LibVEX_ShowAllocStats();
2266 /* Flush any output cached by previous calls to VG_(message). */
2267 VG_(message_flush
)();
2269 /* Terminate gdbserver if ever it was started. We terminate it here
2270 so that it get the output above if output was redirected to
2272 VG_(gdbserver_exit
) (tid
, tids_schedretcode
);
2274 /* Ok, finally exit in the os-specific way, according to the scheduler's
2275 return code. In short, if the (last) thread exited by calling
2276 sys_exit, do likewise; if the (last) thread stopped due to a fatal
2277 signal, terminate the entire system with that same fatal signal. */
2278 VG_(debugLog
)(1, "core_os",
2279 "VG_(terminate_NORETURN)(tid=%u) schedretcode %s"
2280 " os_state.exit_code %ld fatalsig %d\n",
2281 tid
, VG_(name_of_VgSchedReturnCode
)(tids_schedretcode
),
2282 VG_(threads
)[tid
].os_state
.exitcode
,
2283 VG_(threads
)[tid
].os_state
.fatalsig
);
2285 switch (tids_schedretcode
) {
2286 case VgSrc_ExitThread
: /* the normal way out (Linux, Solaris) */
2287 case VgSrc_ExitProcess
: /* the normal way out (Darwin) */
2288 /* Change the application return code to user's return code,
2289 if an error was found */
2290 if (VG_(clo_error_exitcode
) > 0
2291 && VG_(get_n_errs_found
)() > 0) {
2292 VG_(client_exit
)( VG_(clo_error_exitcode
) );
2294 /* otherwise, return the client's exit code, in the normal
2296 VG_(client_exit
)( VG_(threads
)[tid
].os_state
.exitcode
);
2298 /* NOT ALIVE HERE! */
2299 VG_(core_panic
)("entered the afterlife in main() -- ExitT/P");
2300 break; /* what the hell :) */
2302 case VgSrc_FatalSig
:
2303 /* We were killed by a fatal signal, so replicate the effect */
2304 vg_assert(VG_(threads
)[tid
].os_state
.fatalsig
!= 0);
2305 VG_(kill_self
)(VG_(threads
)[tid
].os_state
.fatalsig
);
2306 /* we shouldn't be alive at this point. But VG_(kill_self)
2307 sometimes fails with EPERM on Darwin, for unclear reasons. */
2308 # if defined(VGO_darwin)
2309 VG_(debugLog
)(0, "main", "VG_(kill_self) failed. Exiting normally.\n");
2310 VG_(exit
)(0); /* bogus, but we really need to exit now */
2311 /* fall through .. */
2313 VG_(core_panic
)("main(): signal was supposed to be fatal");
2317 VG_(core_panic
)("main(): unexpected scheduler return code");
2321 /* -------------------- */
2323 /* Final clean-up before terminating the process.
2324 Clean up the client by calling __gnu_cxx::__freeres() (if requested)
2325 and __libc_freeres() (if requested).
2327 static void final_tidyup(ThreadId tid
)
2329 #if defined(VGO_linux) || defined(VGO_solaris)
2330 Addr freeres_wrapper
= VG_(client_freeres_wrapper
);
2332 vg_assert(VG_(is_running_thread
)(tid
));
2334 if (freeres_wrapper
== 0) {
2335 return; /* can't do it */
2338 Vg_FreeresToRun to_run
= 0;
2339 if (VG_(needs
).cxx_freeres
&& VG_(clo_run_cxx_freeres
)) {
2340 to_run
|= VG_RUN__GNU_CXX__FREERES
;
2343 if (VG_(needs
).libc_freeres
&& VG_(clo_run_libc_freeres
)) {
2344 to_run
|= VG_RUN__LIBC_FREERES
;
2348 return; /* won't do it */
2351 # if defined(VGP_ppc64be_linux)
2352 Addr r2
= VG_(get_tocptr
)(VG_(current_DiEpoch
)(),
2355 VG_(message
)(Vg_UserMsg
,
2356 "Caught __NR_exit, but can't run __gnu_cxx::__freeres()\n");
2357 VG_(message
)(Vg_UserMsg
,
2358 " or __libc_freeres() since cannot establish TOC pointer "
2364 if (VG_(clo_verbosity
) > 2 ||
2365 VG_(clo_trace_syscalls
) ||
2366 VG_(clo_trace_sched
)) {
2368 vg_assert(to_run
> 0);
2369 vg_assert(to_run
<= (VG_RUN__GNU_CXX__FREERES
| VG_RUN__LIBC_FREERES
));
2371 const HChar
*msgs
[] = {"__gnu_cxx::__freeres()", "__libc_freeres()",
2372 "__gnu_cxx::__freeres and __libc_freeres()"};
2373 VG_(message
)(Vg_DebugMsg
,
2374 "Caught __NR_exit; running %s wrapper\n", msgs
[to_run
- 1]);
2377 /* Set thread context to point to freeres_wrapper.
2378 ppc64be-linux note: freeres_wrapper gives us the real
2379 function entry point, not a fn descriptor, so can use it
2380 directly. However, we need to set R2 (the toc pointer)
2382 VG_(set_IP
)(tid
, freeres_wrapper
);
2384 # if defined(VGP_ppc64be_linux)
2385 VG_(threads
)[tid
].arch
.vex
.guest_GPR2
= r2
;
2386 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2387 offsetof(VexGuestPPC64State
, guest_GPR2
),
2388 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_GPR2
));
2389 # elif defined(VGP_ppc64le_linux)
2390 /* setting GPR2 but not really needed, GPR12 is needed */
2391 VG_(threads
)[tid
].arch
.vex
.guest_GPR2
= freeres_wrapper
;
2392 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2393 offsetof(VexGuestPPC64State
, guest_GPR2
),
2394 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_GPR2
));
2395 VG_(threads
)[tid
].arch
.vex
.guest_GPR12
= freeres_wrapper
;
2396 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2397 offsetof(VexGuestPPC64State
, guest_GPR12
),
2398 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_GPR12
));
2400 /* mips-linux note: we need to set t9 */
2401 # if defined(VGP_mips32_linux) || defined(VGP_nanomips_linux)
2402 VG_(threads
)[tid
].arch
.vex
.guest_r25
= freeres_wrapper
;
2403 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2404 offsetof(VexGuestMIPS32State
, guest_r25
),
2405 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_r25
));
2406 # elif defined(VGP_mips64_linux)
2407 VG_(threads
)[tid
].arch
.vex
.guest_r25
= freeres_wrapper
;
2408 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2409 offsetof(VexGuestMIPS64State
, guest_r25
),
2410 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_r25
));
2413 /* Pass a parameter to freeres_wrapper(). */
2414 # if defined(VGA_x86)
2415 Addr sp
= VG_(threads
)[tid
].arch
.vex
.guest_ESP
;
2416 *((UWord
*) sp
) = to_run
;
2417 VG_TRACK(post_mem_write
, Vg_CoreClientReq
, tid
, sp
, sizeof(UWord
));
2418 sp
= sp
- sizeof(UWord
);
2419 VG_(threads
)[tid
].arch
.vex
.guest_ESP
= sp
;
2420 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2421 offsetof(VexGuestX86State
, guest_ESP
),
2422 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_ESP
));
2423 # elif defined(VGA_amd64)
2424 VG_(threads
)[tid
].arch
.vex
.guest_RDI
= to_run
;
2425 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2426 offsetof(VexGuestAMD64State
, guest_RDI
),
2427 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_RDI
));
2428 # elif defined(VGA_arm)
2429 VG_(threads
)[tid
].arch
.vex
.guest_R0
= to_run
;
2430 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2431 offsetof(VexGuestARMState
, guest_R0
),
2432 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_R0
));
2433 # elif defined(VGA_arm64)
2434 VG_(threads
)[tid
].arch
.vex
.guest_X0
= to_run
;
2435 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2436 offsetof(VexGuestARM64State
, guest_X0
),
2437 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_X0
));
2438 # elif defined(VGA_mips32) || defined(VGA_nanomips)
2439 VG_(threads
)[tid
].arch
.vex
.guest_r4
= to_run
;
2440 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2441 offsetof(VexGuestMIPS32State
, guest_r4
),
2442 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_r4
));
2443 # elif defined(VGA_mips64)
2444 VG_(threads
)[tid
].arch
.vex
.guest_r4
= to_run
;
2445 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2446 offsetof(VexGuestMIPS64State
, guest_r4
),
2447 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_r4
));
2448 # elif defined(VGA_ppc32)
2449 VG_(threads
)[tid
].arch
.vex
.guest_GPR3
= to_run
;
2450 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2451 offsetof(VexGuestPPC32State
, guest_GPR3
),
2452 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_GPR3
));
2453 # elif defined(VGA_ppc64be) || defined(VGA_ppc64le)
2454 VG_(threads
)[tid
].arch
.vex
.guest_GPR3
= to_run
;
2455 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2456 offsetof(VexGuestPPC64State
, guest_GPR3
),
2457 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_GPR3
));
2458 # elif defined(VGA_s390x)
2459 VG_(threads
)[tid
].arch
.vex
.guest_r2
= to_run
;
2460 VG_TRACK(post_reg_write
, Vg_CoreClientReq
, tid
,
2461 offsetof(VexGuestS390XState
, guest_r2
),
2462 sizeof(VG_(threads
)[tid
].arch
.vex
.guest_r2
));
2464 I_die_here
: architecture missing in m_main
.c
2467 /* Block all blockable signals by copying the real block state into
2468 the thread's block state */
2469 VG_(sigprocmask
)(VKI_SIG_BLOCK
, NULL
, &VG_(threads
)[tid
].sig_mask
);
2470 VG_(threads
)[tid
].tmp_sig_mask
= VG_(threads
)[tid
].sig_mask
;
2472 /* and restore handlers to default. */
2473 VG_(set_default_handler
)(VKI_SIGSEGV
);
2474 VG_(set_default_handler
)(VKI_SIGBUS
);
2475 VG_(set_default_handler
)(VKI_SIGILL
);
2476 VG_(set_default_handler
)(VKI_SIGFPE
);
2478 // We were exiting, so assert that...
2479 vg_assert(VG_(is_exiting
)(tid
));
2480 // ...but now we're not again.
2481 VG_(threads
)[tid
].exitreason
= VgSrc_None
;
2483 // Run until client thread exits - ideally with FREERES_DONE,
2484 // but exit/exitgroup/signal will do.
2485 VG_(scheduler
)(tid
);
2487 vg_assert(VG_(is_exiting
)(tid
));
2492 /*====================================================================*/
2493 /*=== Getting to main() alive: LINUX ===*/
2494 /*====================================================================*/
2496 #if defined(VGO_linux)
2498 /* If linking of the final executables is done with glibc present,
2499 then Valgrind starts at main() above as usual, and all of the
2500 following code is irrelevant.
2502 However, this is not the intended mode of use. The plan is to
2503 avoid linking against glibc, by giving gcc the flags
2504 -nodefaultlibs -lgcc -nostartfiles at startup.
2506 From this derive two requirements:
2508 1. gcc may emit calls to memcpy, memmove and memset to deal with
2509 structure assignments etc. Since we have chosen to ignore all the
2510 "normal" supporting libraries, we have to provide our own
2511 implementations of them. No problem.
2513 2. We have to provide a symbol "_start", to which the kernel
2514 hands control at startup. Hence the code below.
2517 /* ---------------- Requirement 1 ---------------- */
2519 void* memcpy(void *dest
, const void *src
, SizeT n
);
2520 void* memcpy(void *dest
, const void *src
, SizeT n
) {
2521 return VG_(memcpy
)(dest
,src
,n
);
2523 void* memmove(void *dest
, const void *src
, SizeT n
);
2524 void* memmove(void *dest
, const void *src
, SizeT n
) {
2525 return VG_(memmove
)(dest
,src
,n
);
2527 void* memset(void *s
, int c
, SizeT n
);
2528 void* memset(void *s
, int c
, SizeT n
) {
2529 return VG_(memset
)(s
,c
,n
);
2532 /* BVA: abort() for those platforms that need it (PPC and ARM). */
2535 VG_(printf
)("Something called raise().\n");
2539 /* EAZG: ARM's EABI will call floating point exception handlers in
2540 libgcc which boil down to an abort or raise, that's usually defined
2541 in libc. Instead, define them here. */
2542 #if defined(VGP_arm_linux)
2546 VG_(printf
)("Something called raise().\n");
2550 void __aeabi_unwind_cpp_pr0(void);
2551 void __aeabi_unwind_cpp_pr0(void){
2552 VG_(printf
)("Something called __aeabi_unwind_cpp_pr0()\n");
2556 void __aeabi_unwind_cpp_pr1(void);
2557 void __aeabi_unwind_cpp_pr1(void){
2558 VG_(printf
)("Something called __aeabi_unwind_cpp_pr1()\n");
2562 #endif /* defined(VGP_arm_linux) */
2564 /* Some Android helpers. See bug 368529. */
2565 #if defined(__clang__) \
2566 && (defined(VGPV_arm_linux_android) \
2567 || defined(VGPV_x86_linux_android) \
2568 || defined(VGPV_mips32_linux_android) \
2569 || defined(VGPV_arm64_linux_android))
2571 /* Replace __aeabi_memcpy* functions with vgPlain_memcpy. */
2572 void *__aeabi_memcpy(void *dest
, const void *src
, SizeT n
);
2573 void *__aeabi_memcpy(void *dest
, const void *src
, SizeT n
)
2575 return VG_(memcpy
)(dest
, src
, n
);
2578 void *__aeabi_memcpy4(void *dest
, const void *src
, SizeT n
);
2579 void *__aeabi_memcpy4(void *dest
, const void *src
, SizeT n
)
2581 return VG_(memcpy
)(dest
, src
, n
);
2584 void *__aeabi_memcpy8(void *dest
, const void *src
, SizeT n
);
2585 void *__aeabi_memcpy8(void *dest
, const void *src
, SizeT n
)
2587 return VG_(memcpy
)(dest
, src
, n
);
2590 /* Replace __aeabi_memclr* functions with vgPlain_memset. */
2591 void *__aeabi_memclr(void *dest
, SizeT n
);
2592 void *__aeabi_memclr(void *dest
, SizeT n
)
2594 return VG_(memset
)(dest
, 0, n
);
2597 void *__aeabi_memclr4(void *dest
, SizeT n
);
2598 void *__aeabi_memclr4(void *dest
, SizeT n
)
2600 return VG_(memset
)(dest
, 0, n
);
2603 void *__aeabi_memclr8(void *dest
, SizeT n
);
2604 void *__aeabi_memclr8(void *dest
, SizeT n
)
2606 return VG_(memset
)(dest
, 0, n
);
2608 #endif /* clang and android, basically */
2610 /* ---------------- Requirement 2 ---------------- */
2612 /* Glibc's sysdeps/i386/elf/start.S has the following gem of a
2613 comment, which explains how the stack looks right at process start
2614 (when _start is jumped to). Hence _start passes %esp to
2615 _start_in_C_linux, which extracts argc/argv/envp and starts up
2618 /* This is the canonical entry point, usually the first thing in the text
2619 segment. The SVR4/i386 ABI (pages 3-31, 3-32) says that when the entry
2620 point runs, most registers' values are unspecified, except for:
2622 %edx Contains a function pointer to be registered with `atexit'.
2623 This is how the dynamic linker arranges to have DT_FINI
2624 functions called for shared libraries that have been loaded
2625 before this code runs.
2627 %esp The stack contains the arguments and environment:
2632 (4*(argc+1))(%esp) envp[0]
2637 /* The kernel hands control to _start, which extracts the initial
2638 stack pointer and calls onwards to _start_in_C_linux. This also switches
2640 #if defined(VGP_x86_linux)
2644 "\t.type _start,@function\n"
2646 /* set up the new stack in %eax */
2647 "\tmovl $vgPlain_interim_stack, %eax\n"
2648 "\taddl $"VG_STRINGIFY(VG_STACK_GUARD_SZB
)", %eax\n"
2649 "\taddl $"VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)", %eax\n"
2650 /* allocate at least 16 bytes on the new stack, and aligned */
2651 "\tsubl $16, %eax\n"
2652 "\tandl $~15, %eax\n"
2653 /* install it, and collect the original one */
2654 "\txchgl %eax, %esp\n"
2655 /* call _start_in_C_linux, passing it the startup %esp */
2656 "\tmovl %eax, (%esp)\n"
2657 "\tcall _start_in_C_linux\n"
2661 #elif defined(VGP_amd64_linux)
2665 "\t.type _start,@function\n"
2667 /* set up the new stack in %rdi */
2668 "\tmovq $vgPlain_interim_stack, %rdi\n"
2669 "\taddq $"VG_STRINGIFY(VG_STACK_GUARD_SZB
)", %rdi\n"
2670 "\taddq $"VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)", %rdi\n"
2671 "\tandq $~15, %rdi\n"
2672 /* install it, and collect the original one */
2673 "\txchgq %rdi, %rsp\n"
2674 /* call _start_in_C_linux, passing it the startup %rsp */
2675 "\tcall _start_in_C_linux\n"
2679 #elif defined(VGP_ppc32_linux)
2683 "\t.type _start,@function\n"
2685 /* set up the new stack in r16 */
2686 "\tlis 16,vgPlain_interim_stack@ha\n"
2687 "\tla 16,vgPlain_interim_stack@l(16)\n"
2688 "\tlis 17,("VG_STRINGIFY(VG_STACK_GUARD_SZB
)" >> 16)\n"
2689 "\tori 17,17,("VG_STRINGIFY(VG_STACK_GUARD_SZB
)" & 0xFFFF)\n"
2690 "\tlis 18,("VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)" >> 16)\n"
2691 "\tori 18,18,("VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)" & 0xFFFF)\n"
2694 "\trlwinm 16,16,0,0,27\n"
2695 /* now r16 = &vgPlain_interim_stack + VG_STACK_GUARD_SZB +
2696 VG_DEFAULT_STACK_ACTIVE_SZB rounded down to the nearest 16-byte
2697 boundary. And r1 is the original SP. Set the SP to r16 and
2698 call _start_in_C_linux, passing it the initial SP. */
2701 "\tbl _start_in_C_linux\n"
2705 #elif defined(VGP_ppc64be_linux)
2707 /* PPC64 ELF ABI says '_start' points to a function descriptor.
2708 So we must have one, and that is what goes into the .opd section. */
2710 "\t.global _start\n"
2711 "\t.section \".opd\",\"aw\"\n"
2714 "\t.quad ._start,.TOC.@tocbase,0\n"
2716 "\t.type ._start,@function\n"
2717 "\t.global ._start\n"
2719 /* set up the new stack in r16 */
2720 "\tlis 16, vgPlain_interim_stack@highest\n"
2721 "\tori 16,16,vgPlain_interim_stack@higher\n"
2723 "\toris 16,16,vgPlain_interim_stack@h\n"
2724 "\tori 16,16,vgPlain_interim_stack@l\n"
2726 "\tlis 17,("VG_STRINGIFY(VG_STACK_GUARD_SZB
)" >> 16)\n"
2727 "\tori 17,17,("VG_STRINGIFY(VG_STACK_GUARD_SZB
)" & 0xFFFF)\n"
2729 "\tlis 18,("VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)" >> 16)\n"
2730 "\tori 18,18,("VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)" & 0xFFFF)\n"
2733 "\trldicr 16,16,0,59\n"
2734 /* now r16 = &vgPlain_interim_stack + VG_STACK_GUARD_SZB +
2735 VG_DEFAULT_STACK_ACTIVE_SZB rounded down to the nearest 16-byte
2736 boundary. And r1 is the original SP. Set the SP to r16 and
2737 call _start_in_C_linux, passing it the initial SP. */
2740 "\tlis 14, _start_in_C_linux@highest\n"
2741 "\tori 14,14,_start_in_C_linux@higher\n"
2743 "\toris 14,14,_start_in_C_linux@h\n"
2744 "\tori 14,14,_start_in_C_linux@l\n"
2751 #elif defined(VGP_ppc64le_linux)
2752 /* Little Endian uses ELF version 2 but in the future may also
2753 * support other ELF versions.
2757 "\t.global _start\n"
2758 "\t.type _start,@function\n"
2760 "#if _CALL_ELF == 2 \n"
2761 "0: addis 2,12,.TOC.-0b@ha\n"
2762 " addi 2,2,.TOC.-0b@l\n"
2763 " .localentry _start, .-_start\n"
2765 /* set up the new stack in r16 */
2766 "\tlis 16, vgPlain_interim_stack@highest\n"
2767 "\tori 16,16,vgPlain_interim_stack@higher\n"
2769 "\toris 16,16,vgPlain_interim_stack@h\n"
2770 "\tori 16,16,vgPlain_interim_stack@l\n"
2772 "\tlis 17,("VG_STRINGIFY(VG_STACK_GUARD_SZB
)" >> 16)\n"
2773 "\tori 17,17,("VG_STRINGIFY(VG_STACK_GUARD_SZB
)" & 0xFFFF)\n"
2775 "\tlis 18,("VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)" >> 16)\n"
2776 "\tori 18,18,("VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)" & 0xFFFF)\n"
2779 "\trldicr 16,16,0,59\n"
2780 /* now r16 = &vgPlain_interim_stack + VG_STACK_GUARD_SZB +
2781 VG_DEFAULT_STACK_ACTIVE_SZB rounded down to the nearest 16-byte
2782 boundary. And r1 is the original SP. Set the SP to r16 and
2783 call _start_in_C_linux, passing it the initial SP. */
2786 "\tlis 14, _start_in_C_linux@highest\n"
2787 "\tori 14,14,_start_in_C_linux@higher\n"
2789 "\toris 14,14,_start_in_C_linux@h\n"
2790 "\tori 14,14,_start_in_C_linux@l\n"
2796 #elif defined(VGP_s390x_linux)
2798 This is the canonical entry point, usually the first thing in the text
2799 segment. Most registers' values are unspecified, except for:
2801 %r14 Contains a function pointer to be registered with `atexit'.
2802 This is how the dynamic linker arranges to have DT_FINI
2803 functions called for shared libraries that have been loaded
2804 before this code runs.
2806 %r15 The stack contains the arguments and environment:
2811 (8*(argc+1))(%r15) envp[0]
2818 ".type _start,@function\n\t"
2820 /* set up the new stack in %r1 */
2821 "larl %r1, vgPlain_interim_stack\n\t"
2823 "ag %r1, 0(%r5)\n\t"
2824 "ag %r1, 2f-1f(%r5)\n\t"
2825 "nill %r1, 0xFFF0\n\t"
2826 /* install it, and collect the original one */
2829 /* call _start_in_C_linux, passing it the startup %r15 */
2830 "brasl %r14, _start_in_C_linux\n\t"
2831 /* trigger execution of an invalid opcode -> halt machine */
2833 "1: .quad "VG_STRINGIFY(VG_STACK_GUARD_SZB
)"\n\t"
2834 "2: .quad "VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)"\n\t"
2837 #elif defined(VGP_arm_linux)
2841 "\t.type _start,#function\n"
2842 "\t.global _start\n"
2844 "\tldr r0, [pc, #36]\n"
2845 "\tldr r1, [pc, #36]\n"
2846 "\tadd r0, r1, r0\n"
2847 "\tldr r1, [pc, #32]\n"
2848 "\tadd r0, r1, r0\n"
2850 "\tand r0, r0, r1\n"
2854 "\tb _start_in_C_linux\n"
2855 "\t.word vgPlain_interim_stack\n"
2856 "\t.word "VG_STRINGIFY(VG_STACK_GUARD_SZB
)"\n"
2857 "\t.word "VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)"\n"
2859 #elif defined(VGP_arm64_linux)
2863 "\t.type _start,#function\n"
2864 "\t.global _start\n"
2866 "\tadrp x0, vgPlain_interim_stack\n"
2867 "\tadd x0, x0, :lo12:vgPlain_interim_stack\n"
2868 // The next 2 assume that VG_STACK_GUARD_SZB fits in 32 bits
2869 "\tmov x1, (("VG_STRINGIFY(VG_STACK_GUARD_SZB
)") >> 0) & 0xFFFF\n"
2870 "\tmovk x1, (("VG_STRINGIFY(VG_STACK_GUARD_SZB
)") >> 16) & 0xFFFF,"
2872 "\tadd x0, x0, x1\n"
2873 // The next 2 assume that VG_DEFAULT_STACK_ACTIVE_SZB fits in 32 bits
2874 "\tmov x1, (("VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)") >> 0) & 0xFFFF\n"
2875 "\tmovk x1, (("VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)") >> 16) & 0xFFFF,"
2877 "\tadd x0, x0, x1\n"
2878 "\tand x0, x0, -16\n"
2882 "\tb _start_in_C_linux\n"
2884 #elif defined(VGP_mips32_linux)
2886 "\t.type _gp_disp,@object\n"
2888 "\t.globl __start\n"
2889 "\t.type __start,@function\n"
2897 "\tlui $28, %hi(_gp_disp)\n"
2898 "\taddiu $28, $28, %lo(_gp_disp)\n"
2899 "\taddu $28, $28, $31\n"
2900 /* t1/$9 <- Addr(interim_stack) */
2901 "\tlui $9, %hi(vgPlain_interim_stack)\n"
2902 /* t1/$9 <- Addr(interim_stack) */
2903 "\taddiu $9, %lo(vgPlain_interim_stack)\n"
2906 "\tli $10, "VG_STRINGIFY(VG_STACK_GUARD_SZB
)"\n"
2907 "\tli $11, "VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)"\n"
2909 "\taddu $9, $9, $10\n"
2910 "\taddu $9, $9, $11\n"
2911 "\tli $12, 0xFFFFFFF0\n"
2912 "\tand $9, $9, $12\n"
2913 /* now t1/$9 = &vgPlain_interim_stack + VG_STACK_GUARD_SZB +
2914 VG_DEFAULT_STACK_ACTIVE_SZB rounded down to the nearest 16-byte
2915 boundary. And $29 is the original SP. Set the SP to t1 and
2916 call _start_in_C, passing it the initial SP. */
2918 "\tmove $4, $29\n" // a0 <- $sp (_start_in_C first arg)
2919 "\tmove $29, $9\n" // $sp <- t1 (new sp)
2921 "\tlui $25, %hi(_start_in_C_linux)\n"
2922 "\taddiu $25, %lo(_start_in_C_linux)\n"
2924 "\tbal _start_in_C_linux\n"
2928 #elif defined(VGP_mips64_linux)
2932 ".type __start,@function\n"
2934 "\t.set noreorder\n"
2938 "\tlui $9, %hi(vgPlain_interim_stack)\n"
2939 /* t1/$9 <- Addr(interim_stack) */
2940 "\tdaddiu $9, %lo(vgPlain_interim_stack)\n"
2942 "\tli $10, "VG_STRINGIFY(VG_STACK_GUARD_SZB
)"\n"
2943 "\tli $11, "VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)"\n"
2945 "\tdaddu $9, $9, $10\n"
2946 "\tdaddu $9, $9, $11\n"
2947 "\tli $12, 0xFFFFFF00\n"
2948 "\tand $9, $9, $12\n"
2949 /* now t1/$9 = &vgPlain_interim_stack + VG_STACK_GUARD_SZB +
2950 VG_DEFAULT_STACK_ACTIVE_SZB rounded down to the nearest 16-byte
2951 boundary. And $29 is the original SP. Set the SP to t1 and
2952 call _start_in_C, passing it the initial SP. */
2954 "\tmove $4, $29\n" // a0 <- $sp (_start_in_C first arg)
2955 "\tmove $29, $9\n" // $sp <- t1 (new sp)
2957 "\tlui $9, %highest(_start_in_C_linux)\n"
2958 "\tori $9, %higher(_start_in_C_linux)\n"
2959 "\tdsll32 $9, $9, 0x0\n"
2960 "\tlui $10, %hi(_start_in_C_linux)\n"
2961 "\tdaddiu $10, %lo(_start_in_C_linux)\n"
2962 "\tdaddu $25, $9, $10\n"
2967 #elif defined(VGP_nanomips_linux)
2970 ".globl __start \n\t"
2971 ".type __start,@function \n\t"
2974 ".set noreorder \n\t"
2975 "li $t1, vgPlain_interim_stack \n\t"
2976 "li $t0, "VG_STRINGIFY(VG_STACK_GUARD_SZB
)" \n\t"
2977 "addu $t1, $t1, $t0 \n\t"
2978 "li $t0, "VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)"\n\t"
2979 "addu $t1, $t1, $t0 \n\t"
2980 "li $t0, 0xFFFFFF00 \n\t"
2981 "and $t1, $t1, $t0 \n\t"
2982 "move $a0, $sp \n\t"
2983 "move $sp, $t1 \n\t"
2984 "li $t0, _start_in_C_linux \n\t"
2991 # error "Unknown linux platform"
2994 /* --- !!! --- EXTERNAL HEADERS start --- !!! --- */
2996 #define _FILE_OFFSET_BITS 64
2997 /* This is in order to get AT_NULL and AT_PAGESIZE. */
2999 /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */
3001 /* Avoid compiler warnings: this fn _is_ used, but labelling it
3002 'static' causes gcc to complain it isn't.
3003 attribute 'used' also ensures the code is not eliminated at link
3005 __attribute__ ((used
))
3006 void _start_in_C_linux ( UWord
* pArgc
);
3007 __attribute__ ((used
))
3008 void _start_in_C_linux ( UWord
* pArgc
)
3011 Word argc
= pArgc
[0];
3012 HChar
** argv
= (HChar
**)&pArgc
[1];
3013 HChar
** envp
= (HChar
**)&pArgc
[1+argc
+1];
3015 // For an inner Valgrind, register the interim stack asap.
3016 // This is needed to allow the outer valgrind to do stacktraces during init.
3017 // Note that this stack is not unregistered when the main thread
3018 // is switching to the (real) stack. Unregistering this would imply
3019 // to save the stack id in a global variable, and have a "if"
3020 // in run_a_thread_NORETURN to do the unregistration only for the
3021 // main thread. This unregistration is not worth this complexity.
3023 ((void) VALGRIND_STACK_REGISTER
3024 (&VG_(interim_stack
).bytes
[0],
3025 &VG_(interim_stack
).bytes
[0] + sizeof(VG_(interim_stack
))));
3027 VG_(memset
)( &the_iicii
, 0, sizeof(the_iicii
) );
3028 VG_(memset
)( &the_iifii
, 0, sizeof(the_iifii
) );
3030 the_iicii
.sp_at_startup
= (Addr
)pArgc
;
3032 # if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \
3033 || defined(VGP_ppc64le_linux) || defined(VGP_arm64_linux) \
3034 || defined(VGP_mips32_linux) || defined(VGP_mips64_linux) \
3035 || defined(VGP_nanomips_linux)
3037 /* ppc32/ppc64, arm64, mips32/64 can be configured with different
3038 page sizes. Determine this early. This is an ugly hack and really
3039 should be moved into valgrind_main. */
3040 UWord
*sp
= &pArgc
[1+argc
+1];
3043 for (; *sp
!= AT_NULL
&& *sp
!= AT_PAGESZ
; sp
+= 2);
3044 if (*sp
== AT_PAGESZ
) {
3045 VKI_PAGE_SIZE
= sp
[1];
3046 for (VKI_PAGE_SHIFT
= 12;
3047 VKI_PAGE_SHIFT
<= VKI_MAX_PAGE_SHIFT
; VKI_PAGE_SHIFT
++)
3048 if (VKI_PAGE_SIZE
== (1UL << VKI_PAGE_SHIFT
))
3054 r
= valgrind_main( (Int
)argc
, argv
, envp
);
3060 /*====================================================================*/
3061 /*=== Getting to main() alive: darwin ===*/
3062 /*====================================================================*/
3064 #elif defined(VGO_darwin)
3067 Memory layout established by kernel:
3078 executable name (presumably, a pointer to it)
3081 Ditto in the 64-bit case, except all offsets from SP are obviously
3085 /* The kernel hands control to _start, which extracts the initial
3086 stack pointer and calls onwards to _start_in_C_darwin. This also
3087 switches to the new stack. */
3088 #if defined(VGP_x86_darwin)
3092 "\t.globl __start\n"
3094 /* set up the new stack in %eax */
3095 "\tmovl $_vgPlain_interim_stack, %eax\n"
3096 "\taddl $"VG_STRINGIFY(VG_STACK_GUARD_SZB
)", %eax\n"
3097 "\taddl $"VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)", %eax\n"
3098 "\tsubl $16, %eax\n"
3099 "\tandl $~15, %eax\n"
3100 /* install it, and collect the original one */
3101 "\txchgl %eax, %esp\n"
3102 "\tsubl $12, %esp\n" // keep stack 16 aligned; see #295428
3103 /* call _start_in_C_darwin, passing it the startup %esp */
3105 "\tcall __start_in_C_darwin\n"
3109 #elif defined(VGP_amd64_darwin)
3112 "\t.globl __start\n"
3115 /* set up the new stack in %rdi */
3116 "\tmovabsq $_vgPlain_interim_stack, %rdi\n"
3117 "\taddq $"VG_STRINGIFY(VG_STACK_GUARD_SZB
)", %rdi\n"
3118 "\taddq $"VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)", %rdi\n"
3119 "\tandq $~15, %rdi\n"
3120 /* install it, and collect the original one */
3121 "\txchgq %rdi, %rsp\n"
3122 /* call _start_in_C_darwin, passing it the startup %rsp */
3123 "\tcall __start_in_C_darwin\n"
3129 void* __memcpy_chk(void *dest
, const void *src
, SizeT n
, SizeT n2
);
3130 void* __memcpy_chk(void *dest
, const void *src
, SizeT n
, SizeT n2
) {
3132 return VG_(memcpy
)(dest
,src
,n
);
3134 void* __memset_chk(void *s
, int c
, SizeT n
, SizeT n2
);
3135 void* __memset_chk(void *s
, int c
, SizeT n
, SizeT n2
) {
3137 return VG_(memset
)(s
,c
,n
);
3139 void __bzero(void* s
, UWord n
);
3140 void __bzero(void* s
, UWord n
) {
3141 (void)VG_(memset
)(s
,0,n
);
3143 void bzero(void *s
, SizeT n
);
3144 void bzero(void *s
, SizeT n
) {
3148 void* memcpy(void *dest
, const void *src
, SizeT n
);
3149 void* memcpy(void *dest
, const void *src
, SizeT n
) {
3150 return VG_(memcpy
)(dest
,src
,n
);
3152 void* memset(void *s
, int c
, SizeT n
);
3153 void* memset(void *s
, int c
, SizeT n
) {
3154 return VG_(memset
)(s
,c
,n
);
3157 /* Avoid compiler warnings: this fn _is_ used, but labelling it
3158 'static' causes gcc to complain it isn't. */
3159 void _start_in_C_darwin ( UWord
* pArgc
);
3160 void _start_in_C_darwin ( UWord
* pArgc
)
3163 Int argc
= *(Int
*)pArgc
; // not pArgc[0] on LP64
3164 HChar
** argv
= (HChar
**)&pArgc
[1];
3165 HChar
** envp
= (HChar
**)&pArgc
[1+argc
+1];
3167 // See _start_in_C_linux
3169 ((void) VALGRIND_STACK_REGISTER
3170 (&VG_(interim_stack
).bytes
[0],
3171 &VG_(interim_stack
).bytes
[0] + sizeof(VG_(interim_stack
))));
3173 VG_(memset
)( &the_iicii
, 0, sizeof(the_iicii
) );
3174 VG_(memset
)( &the_iifii
, 0, sizeof(the_iifii
) );
3176 the_iicii
.sp_at_startup
= (Addr
)pArgc
;
3178 r
= valgrind_main( (Int
)argc
, argv
, envp
);
3183 /*====================================================================*/
3184 /*=== Getting to main() alive: Solaris ===*/
3185 /*====================================================================*/
3186 #elif defined(VGO_solaris)
3187 #if defined(VGP_x86_solaris)
3188 /* The kernel hands control to _start, which extracts the initial stack
3189 pointer and calls onwards to _start_in_C_solaris. This also switches to
3194 "\t.type _start, @function\n"
3196 /* Set up the new stack in %eax. */
3197 "\tmovl $vgPlain_interim_stack, %eax\n"
3198 "\taddl $"VG_STRINGIFY(VG_STACK_GUARD_SZB
)", %eax\n"
3199 "\taddl $"VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)", %eax\n"
3200 "\tandl $~15, %eax\n"
3201 /* Install it, and collect the original one. */
3202 "\txchgl %eax, %esp\n"
3203 "\tsubl $12, %esp\n" /* Keep stack 16-byte aligned. */
3204 /* Call _start_in_C_solaris, passing it the startup %esp. */
3206 "\tcall _start_in_C_solaris\n"
3211 #elif defined(VGP_amd64_solaris)
3215 "\t.type _start, @function\n"
3217 /* Set up the new stack in %rdi. */
3218 "\tmovq $vgPlain_interim_stack, %rdi\n"
3219 "\taddq $"VG_STRINGIFY(VG_STACK_GUARD_SZB
)", %rdi\n"
3220 "\taddq $"VG_STRINGIFY(VG_DEFAULT_STACK_ACTIVE_SZB
)", %rdi\n"
3221 "\tandq $~15, %rdi\n"
3222 /* Install it, and collect the original one. */
3223 "\txchgq %rdi, %rsp\n"
3224 /* Call _start_in_C_solaris, passing it the startup %rsp. */
3225 "\tcall _start_in_C_solaris\n"
3231 # error "Unknown Solaris platform"
3234 void *memcpy(void *dest
, const void *src
, size_t n
);
3235 void *memcpy(void *dest
, const void *src
, size_t n
) {
3236 return VG_(memcpy
)(dest
, src
, n
);
3239 __attribute__ ((used
))
3240 void _start_in_C_solaris ( UWord
* pArgc
);
3241 __attribute__ ((used
))
3242 void _start_in_C_solaris ( UWord
* pArgc
)
3245 Word argc
= pArgc
[0];
3246 HChar
** argv
= (HChar
**)&pArgc
[1];
3247 HChar
** envp
= (HChar
**)&pArgc
[1 + argc
+ 1];
3249 VG_(memset
)( &the_iicii
, 0, sizeof(the_iicii
) );
3250 VG_(memset
)( &the_iifii
, 0, sizeof(the_iifii
) );
3252 the_iicii
.sp_at_startup
= (Addr
)pArgc
;
3254 r
= valgrind_main((Int
)argc
, argv
, envp
);
3260 # error "Unknown OS"
3264 Addr
VG_(get_initial_client_SP
)( void )
3266 return the_iifii
.initial_client_SP
;
3269 /*====================================================================*/
3270 /*=== {u,}{div,mod}di3 replacements ===*/
3271 /*====================================================================*/
3273 /* For static linking on x86-darwin, we need to supply our own 64-bit
3274 integer division code, else the link dies thusly:
3276 ld_classic: Undefined symbols:
3280 #if defined(VGP_x86_darwin)
3282 /* Routines for doing signed/unsigned 64 x 64 ==> 64 div and mod
3283 (udivdi3, umoddi3, divdi3, moddi3) using only 32 x 32 ==> 32
3284 division. Cobbled together from
3286 http://www.hackersdelight.org/HDcode/divlu.c
3287 http://www.hackersdelight.org/HDcode/divls.c
3288 http://www.hackersdelight.org/HDcode/newCode/divDouble.c
3290 The code from those three files is covered by the following license,
3293 http://www.hackersdelight.org/permissions.htm
3295 You are free to use, copy, and distribute any of the code on
3296 this web site, whether modified by you or not. You need not give
3297 attribution. This includes the algorithms (some of which appear
3298 in Hacker's Delight), the Hacker's Assistant, and any code
3299 submitted by readers. Submitters implicitly agree to this.
3302 /* Long division, unsigned (64/32 ==> 32).
3303 This procedure performs unsigned "long division" i.e., division of a
3304 64-bit unsigned dividend by a 32-bit unsigned divisor, producing a
3305 32-bit quotient. In the overflow cases (divide by 0, or quotient
3306 exceeds 32 bits), it returns a remainder of 0xFFFFFFFF (an impossible
3308 The dividend is u1 and u0, with u1 being the most significant word.
3309 The divisor is parameter v. The value returned is the quotient.
3310 Max line length is 57, to fit in hacker.book. */
3312 static Int
nlz32(UInt x
)
3315 if (x
== 0) return(32);
3317 if (x
<= 0x0000FFFF) {n
= n
+16; x
= x
<<16;}
3318 if (x
<= 0x00FFFFFF) {n
= n
+ 8; x
= x
<< 8;}
3319 if (x
<= 0x0FFFFFFF) {n
= n
+ 4; x
= x
<< 4;}
3320 if (x
<= 0x3FFFFFFF) {n
= n
+ 2; x
= x
<< 2;}
3321 if (x
<= 0x7FFFFFFF) {n
= n
+ 1;}
3325 /* 64 x 32 ==> 32 unsigned division, using only 32 x 32 ==> 32
3326 division as a primitive. */
3327 static UInt
divlu2(UInt u1
, UInt u0
, UInt v
, UInt
*r
)
3329 const UInt b
= 65536; // Number base (16 bits).
3330 UInt un1
, un0
, // Norm. dividend LSD's.
3331 vn1
, vn0
, // Norm. divisor digits.
3332 q1
, q0
, // Quotient digits.
3333 un32
, un21
, un10
, // Dividend digit pairs.
3334 rhat
; // A remainder.
3335 Int s
; // Shift amount for norm.
3337 if (u1
>= v
) { // If overflow, set rem.
3338 if (r
!= NULL
) // to an impossible value,
3339 *r
= 0xFFFFFFFF; // and return the largest
3340 return 0xFFFFFFFF;} // possible quotient.
3342 s
= nlz32(v
); // 0 <= s <= 31.
3343 v
= v
<< s
; // Normalize divisor.
3344 vn1
= v
>> 16; // Break divisor up into
3345 vn0
= v
& 0xFFFF; // two 16-bit digits.
3347 un32
= (u1
<< s
) | ((u0
>> (32 - s
)) & (-s
>> 31));
3348 un10
= u0
<< s
; // Shift dividend left.
3350 un1
= un10
>> 16; // Break right half of
3351 un0
= un10
& 0xFFFF; // dividend into two digits.
3353 q1
= un32
/vn1
; // Compute the first
3354 rhat
= un32
- q1
*vn1
; // quotient digit, q1.
3356 if (q1
>= b
|| q1
*vn0
> b
*rhat
+ un1
) {
3359 if (rhat
< b
) goto again1
;}
3361 un21
= un32
*b
+ un1
- q1
*v
; // Multiply and subtract.
3363 q0
= un21
/vn1
; // Compute the second
3364 rhat
= un21
- q0
*vn1
; // quotient digit, q0.
3366 if (q0
>= b
|| q0
*vn0
> b
*rhat
+ un0
) {
3369 if (rhat
< b
) goto again2
;}
3371 if (r
!= NULL
) // If remainder is wanted,
3372 *r
= (un21
*b
+ un0
- q0
*v
) >> s
; // return it.
3377 /* 64 x 32 ==> 32 signed division, using only 32 x 32 ==> 32 division
3379 static Int
divls(Int u1
, UInt u0
, Int v
, Int
*r
)
3381 Int q
, uneg
, vneg
, diff
, borrow
;
3383 uneg
= u1
>> 31; // -1 if u < 0.
3384 if (uneg
) { // Compute the absolute
3385 u0
= -u0
; // value of the dividend u.
3389 vneg
= v
>> 31; // -1 if v < 0.
3390 v
= (v
^ vneg
) - vneg
; // Absolute value of v.
3392 if ((UInt
)u1
>= (UInt
)v
) goto overflow
;
3394 q
= divlu2(u1
, u0
, v
, (UInt
*)r
);
3396 diff
= uneg
^ vneg
; // Negate q if signs of
3397 q
= (q
^ diff
) - diff
; // u and v differed.
3398 if (uneg
&& r
!= NULL
)
3401 if ((diff
^ q
) < 0 && q
!= 0) { // If overflow,
3402 overflow
: // set remainder
3403 if (r
!= NULL
) // to an impossible value,
3404 *r
= 0x80000000; // and return the largest
3405 q
= 0x80000000;} // possible neg. quotient.
3411 /* This file contains a program for doing 64/64 ==> 64 division, on a
3412 machine that does not have that instruction but that does have
3413 instructions for "long division" (64/32 ==> 32). Code for unsigned
3414 division is given first, followed by a simple program for doing the
3415 signed version by using the unsigned version.
3416 These programs are useful in implementing "long long" (64-bit)
3417 arithmetic on a machine that has the long division instruction. It will
3418 work on 64- and 32-bit machines, provided the compiler implements long
3419 long's (64-bit integers). It is desirable that the machine have the
3420 Count Leading Zeros instruction.
3421 In the GNU world, these programs are known as __divdi3 and __udivdi3,
3422 and similar names are used here.
3423 This material is not in HD, but may be in a future edition.
3424 Max line length is 57, to fit in hacker.book. */
3427 static Int
nlz64(ULong x
)
3430 if (x
== 0) return(64);
3432 if (x
<= 0x00000000FFFFFFFFULL
) {n
= n
+ 32; x
= x
<< 32;}
3433 if (x
<= 0x0000FFFFFFFFFFFFULL
) {n
= n
+ 16; x
= x
<< 16;}
3434 if (x
<= 0x00FFFFFFFFFFFFFFULL
) {n
= n
+ 8; x
= x
<< 8;}
3435 if (x
<= 0x0FFFFFFFFFFFFFFFULL
) {n
= n
+ 4; x
= x
<< 4;}
3436 if (x
<= 0x3FFFFFFFFFFFFFFFULL
) {n
= n
+ 2; x
= x
<< 2;}
3437 if (x
<= 0x7FFFFFFFFFFFFFFFULL
) {n
= n
+ 1;}
3441 // ---------------------------- udivdi3 --------------------------------
3443 /* The variables u0, u1, etc. take on only 32-bit values, but they
3444 are declared long long to avoid some compiler warning messages and to
3445 avoid some unnecessary EXTRs that the compiler would put in, to
3446 convert long longs to ints.
3448 First the procedure takes care of the case in which the divisor is a
3449 32-bit quantity. There are two subcases: (1) If the left half of the
3450 dividend is less than the divisor, one execution of DIVU is all that
3451 is required (overflow is not possible). (2) Otherwise it does two
3452 divisions, using the grade school method, with variables used as
3462 /* These macros must be used with arguments of the appropriate type
3463 (unsigned long long for DIVU and long long for DIVS. They are
3464 simulations of the presumed machines ops. I.e., they look at only the
3465 low-order 32 bits of the divisor, they return garbage if the division
3466 overflows, and they return garbage in the high-order half of the
3467 quotient doubleword.
3468 In practice, these would be replaced with uses of the machine's DIVU
3469 and DIVS instructions (e.g., by using the GNU "asm" facility). */
3471 static UInt
DIVU ( ULong u
, UInt v
)
3473 UInt uHi
= (UInt
)(u
>> 32);
3475 return divlu2(uHi
, uLo
, v
, NULL
);
3478 static Int
DIVS ( Long u
, Int v
)
3480 Int uHi
= (Int
)(u
>> 32);
3482 return divls(uHi
, uLo
, v
, NULL
);
3485 /* 64 x 64 ==> 64 unsigned division, using only 32 x 32 ==> 32
3486 division as a primitive. */
3487 static ULong
udivdi3(ULong u
, ULong v
)
3489 ULong u0
, u1
, v1
, q0
, q1
, k
, n
;
3491 if (v
>> 32 == 0) { // If v < 2**32:
3492 if (u
>> 32 < v
) // If u/v cannot overflow,
3493 return DIVU(u
, v
) // just do one division.
3495 else { // If u/v would overflow:
3496 u1
= u
>> 32; // Break u up into two
3497 u0
= u
& 0xFFFFFFFF; // halves.
3498 q1
= DIVU(u1
, v
) // First quotient digit.
3500 k
= u1
- q1
*v
; // First remainder, < v.
3501 q0
= DIVU((k
<< 32) + u0
, v
) // 2nd quot. digit.
3503 return (q1
<< 32) + q0
;
3507 n
= nlz64(v
); // 0 <= n <= 31.
3508 v1
= (v
<< n
) >> 32; // Normalize the divisor
3510 u1
= u
>> 1; // To ensure no overflow.
3511 q1
= DIVU(u1
, v1
) // Get quotient from
3512 & 0xFFFFFFFF; // divide unsigned insn.
3513 q0
= (q1
<< n
) >> 31; // Undo normalization and
3514 // division of u by 2.
3515 if (q0
!= 0) // Make q0 correct or
3516 q0
= q0
- 1; // too small by 1.
3517 if ((u
- q0
*v
) >= v
)
3518 q0
= q0
+ 1; // Now q0 is correct.
3523 // ----------------------------- divdi3 --------------------------------
3525 /* This routine presumes that smallish cases (those which can be done in
3526 one execution of DIVS) are common. If this is not the case, the test for
3527 this case should be deleted.
3528 Note that the test for when DIVS can be used is not entirely
3529 accurate. For example, DIVS is not used if v = 0xFFFFFFFF8000000,
3530 whereas if could be (if u is sufficiently small in magnitude). */
3532 // ------------------------------ cut ----------------------------------
3534 static ULong
my_llabs ( Long x
)
3540 /* 64 x 64 ==> 64 signed division, using only 32 x 32 ==> 32 division
3542 static Long
divdi3(Long u
, Long v
)
3548 if (av
>> 31 == 0) { // If |v| < 2**31 and
3549 // if (v << 32 >> 32 == v) { // If v is in range and
3550 if (au
< av
<< 31) { // |u|/|v| cannot
3551 q
= DIVS(u
, v
); // overflow, use DIVS.
3552 return (q
<< 32) >> 32;
3555 q
= udivdi3(au
,av
); // Invoke udivdi3.
3556 t
= (u
^ v
) >> 63; // If u, v have different
3557 return (q
^ t
) - t
; // signs, negate q.
3560 // ---------------------------- end cut --------------------------------
3562 ULong
__udivdi3 (ULong u
, ULong v
);
3563 ULong
__udivdi3 (ULong u
, ULong v
)
3565 return udivdi3(u
,v
);
3568 Long
__divdi3 (Long u
, Long v
);
3569 Long
__divdi3 (Long u
, Long v
)
3574 ULong
__umoddi3 (ULong u
, ULong v
);
3575 ULong
__umoddi3 (ULong u
, ULong v
)
3577 ULong q
= __udivdi3(u
, v
);
3578 ULong r
= u
- q
* v
;
3582 Long
__moddi3 (Long u
, Long v
);
3583 Long
__moddi3 (Long u
, Long v
)
3585 Long q
= __divdi3(u
, v
);
3590 /* ------------------------------------------------
3591 ld_classic: Undefined symbols:
3593 ------------------------------------------------
3596 /* ===-- fixunsdfdi.c - Implement __fixunsdfdi -----------------------------===
3598 * The LLVM Compiler Infrastructure
3600 * This file is dual licensed under the MIT and the University of Illinois Open
3601 * Source Licenses. See LICENSE.TXT for details.
3603 * ===----------------------------------------------------------------------===
3605 * This file implements __fixunsdfdi for the compiler_rt library.
3607 * ===----------------------------------------------------------------------===
3610 /* As per http://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses,
3612 the "NCSA/University of Illinois Open Source License" is compatible
3613 with the GPL (both version 2 and 3). What is claimed to be
3616 http://www.opensource.org/licenses/UoI-NCSA.php
3618 and the LLVM documentation at
3620 http://www.llvm.org/docs/DeveloperPolicy.html#license
3622 says all the code in LLVM is available under the University of
3623 Illinois/NCSA Open Source License, at this URL
3625 http://www.opensource.org/licenses/UoI-NCSA.php
3627 viz, the same one that the FSF pages claim is compatible. So I
3628 think it's OK to include it.
3631 /* Returns: convert a to a unsigned long long, rounding toward zero.
3632 * Negative values all become zero.
3635 /* Assumption: double is a IEEE 64 bit floating point type
3636 * du_int is a 64 bit integral type
3637 * value in double is representable in du_int or is negative
3638 * (no range checking performed)
3641 /* seee eeee eeee mmmm mmmm mmmm mmmm mmmm | mmmm mmmm mmmm mmmm mmmm mmmm mmmm mmmm */
3643 typedef unsigned long long du_int
;
3644 typedef unsigned su_int
;
3657 #endif /* VG_LITTLEENDIAN */
3667 du_int
__fixunsdfdi(double a
);
3670 __fixunsdfdi(double a
)
3674 int e
= ((fb
.u
.s
.high
& 0x7FF00000) >> 20) - 1023;
3675 if (e
< 0 || (fb
.u
.s
.high
& 0x80000000))
3678 r
.s
.high
= (fb
.u
.s
.high
& 0x000FFFFF) | 0x00100000;
3679 r
.s
.low
= fb
.u
.s
.low
;
3691 /*====================================================================*/
3692 /*=== Dummy _voucher_mach_msg_set for OSX 10.10 ===*/
3693 /*====================================================================*/
3695 #if defined(VGO_darwin) && DARWIN_VERS >= DARWIN_10_10
3697 /* Builds on MacOSX 10.10+ seem to need this for some reason. */
3698 /* extern boolean_t voucher_mach_msg_set(mach_msg_header_t *msg)
3699 __attribute__((weak_import));
3700 I haven't a clue what the return value means, so just return 0.
3701 Looks like none of the generated uses in the tree look at the
3702 return value anyway.
3704 UWord
voucher_mach_msg_set ( UWord arg1
);
3705 UWord
voucher_mach_msg_set ( UWord arg1
)
3713 /*--------------------------------------------------------------------*/
3715 /*--------------------------------------------------------------------*/