GCC Wikia
Advertisement

このページを編集する際は,編集に関する方針に従ってください.[]

概要[]

引数[]

実装[]

256 /* Push TIMEVAR onto the timing stack.  No further elapsed time is
257    attributed to the previous topmost timing variable on the stack;
258    subsequent elapsed time is attributed to TIMEVAR, until it is
259    popped or another element is pushed on top.
260 
261    TIMEVAR cannot be running as a standalone timer.  */
262 
263 void
264 timevar_push_1 (timevar_id_t timevar)
265 {
266   struct timevar_def *tv = &timevars[timevar];
267   struct timevar_stack_def *context;
268   struct timevar_time_def now;
269 

  • tvを使用済みである印をつける

270   /* Mark this timing variable as used.  */
271   tv->used = 1;
272 

  • 単独使用のタイマにはプッシュできない

273   /* Can't push a standalone timer.  */
274   gcc_assert (!tv->standalone);
275 

  • 現在の時間を取得

276   /* What time is it?  */
277   get_time (&now);
278 

  • 前回(?)取得した時間との差分から経過した時間を求める
    • ここで経過した時間をくわえるのは前回スタックに積んだデータである

279   /* If the stack isn't empty, attribute the current elapsed time to
280      the old topmost element.  */
281   if (stack)
282     timevar_accumulate (&stack->timevar->elapsed, &start_time, &now);
283 

  • ここで次回のためにセットしておく

284   /* Reset the start time; from now on, time is attributed to
285      TIMEVAR.  */
286   start_time = now;
287 

  • スタックに積む領域を取得
    • 未使用の領域があればそれを使用
    • そうでなければ新たに確保

288   /* See if we have a previously-allocated stack instance.  If so,
289      take it off the list.  If not, malloc a new one.  */
290   if (unused_stack_instances != NULL)
291     {
292       context = unused_stack_instances;
293       unused_stack_instances = unused_stack_instances->next;
294     }
295   else
296     context = xmalloc (sizeof (struct timevar_stack_def));
297 

  • スタックにデータを積む

298   /* Fill it in and put it on the stack.  */
299   context->timevar = tv;
300   context->next = stack;
301   stack = context;
302 }



リンク元

Advertisement