GCC Middle and Back End API Reference
print-rtl-function.cc File Reference
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "rtl.h"
#include "alias.h"
#include "tree.h"
#include "flags.h"
#include "predict.h"
#include "function.h"
#include "basic-block.h"
#include "print-rtl.h"
#include "langhooks.h"
#include "memmodel.h"
#include "emit-rtl.h"
#include "varasm.h"
#include "cfg-flags.def"
Include dependency graph for print-rtl-function.cc:

Macros

#define DEF_EDGE_FLAG(NAME, IDX)
 

Functions

static void print_edge (FILE *outfile, edge e, bool from)
 
static void begin_any_block (FILE *outfile, basic_block bb)
 
static void end_any_block (FILE *outfile, basic_block bb)
 
static bool can_have_basic_block_p (const rtx_insn *insn)
 
static void print_any_param_name (FILE *outfile, tree arg)
 
static void print_param (FILE *outfile, rtx_writer &w, tree arg)
 
DEBUG_FUNCTION void print_rtx_function (FILE *outfile, function *fn, bool compact)
 

Macro Definition Documentation

◆ DEF_EDGE_FLAG

#define DEF_EDGE_FLAG ( NAME,
IDX )
Value:
do { \
if (e->flags & EDGE_##NAME) \
{ \
fprintf (outfile, " | "); \
fprintf (outfile, "%s", (#NAME)); \
seen_flag = true; \
} \
} while (0);
T * ggc_alloc(ALONE_CXX_MEM_STAT_INFO)
Definition ggc.h:184
@ NAME
Definition tree-ssa-pre.cc:242

Function Documentation

◆ begin_any_block()

static void begin_any_block ( FILE * outfile,
basic_block bb )
static
If BB is non-NULL, print the start of a "(block)" directive for it
to OUTFILE, otherwise do nothing.   

References FOR_EACH_EDGE, ggc_alloc(), basic_block_def::index, basic_block_def::preds, and print_edge().

Referenced by print_rtx_function().

◆ can_have_basic_block_p()

static bool can_have_basic_block_p ( const rtx_insn * insn)
static
Determine if INSN is of a kind that can have a basic block.   

References gcc_assert, GET_CODE, GET_RTX_FORMAT, and ggc_alloc().

Referenced by print_rtx_function().

◆ end_any_block()

static void end_any_block ( FILE * outfile,
basic_block bb )
static
If BB is non-NULL, print the end of a "(block)" directive for it
to OUTFILE, otherwise do nothing.   

References FOR_EACH_EDGE, ggc_alloc(), basic_block_def::index, print_edge(), and basic_block_def::succs.

Referenced by print_rtx_function().

◆ print_any_param_name()

static void print_any_param_name ( FILE * outfile,
tree arg )
static
Subroutine of print_param.  Write the name of ARG, if any, to OUTFILE.   

References DECL_NAME, ggc_alloc(), and IDENTIFIER_POINTER.

Referenced by print_param().

◆ print_edge()

static void print_edge ( FILE * outfile,
edge e,
bool from )
static
Print RTL functions for GCC.
   Copyright (C) 2016-2024 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.   
Print an "(edge-from)" or "(edge-to)" directive describing E
to OUTFILE.   

References ENTRY_BLOCK, EXIT_BLOCK, gcc_assert, and ggc_alloc().

Referenced by begin_any_block(), and end_any_block().

◆ print_param()

static void print_param ( FILE * outfile,
rtx_writer & w,
tree arg )
static
Print a "(param)" directive for ARG to OUTFILE.   

References DECL_INCOMING_RTL, DECL_RTL_IF_SET, ggc_alloc(), and print_any_param_name().

Referenced by print_rtx_function().

◆ print_rtx_function()

DEBUG_FUNCTION void print_rtx_function ( FILE * outfile,
function * fn,
bool compact )
Write FN to OUTFILE in a form suitable for parsing, with indentation
  and comments to make the structure easy for a human to grok.  Track
  the basic blocks of insns in the chain, wrapping those that are within
  blocks within "(block)" directives.

  If COMPACT, then instructions are printed in a compact form:
  - INSN_UIDs are omitted, except for jumps and CODE_LABELs,
  - INSN_CODEs are omitted,
  - register numbers are omitted for hard and virtual regs, and
    non-virtual pseudos are offset relative to the first such reg, and
    printed with a '%' sigil e.g. "%0" for (LAST_VIRTUAL_REGISTER + 1),
  - insn names are prefixed with "c" (e.g. "cinsn", "cnote", etc)

  Example output (with COMPACT==true):

  (function "times_two"
    (param "i"
      (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars)
          (const_int -4)) [1 i+0 S4 A32]))
      (DECL_RTL_INCOMING (reg:SI di [ i ])))
    (insn-chain
      (cnote 1 NOTE_INSN_DELETED)
      (block 2
        (edge-from entry (flags "FALLTHRU"))
        (cnote 4 [bb 2] NOTE_INSN_BASIC_BLOCK)
        (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars)
                       (const_int -4)) [1 i+0 S4 A32])
               (reg:SI di [ i ])) "t.c":2)
        (cnote 3 NOTE_INSN_FUNCTION_BEG)
        (cinsn 6 (set (reg:SI <2>)
               (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars)
                       (const_int -4)) [1 i+0 S4 A32])) "t.c":3)
        (cinsn 7 (parallel [
                   (set (reg:SI <0> [ _2 ])
                       (ashift:SI (reg:SI <2>)
                           (const_int 1)))
                   (clobber (reg:CC flags))
               ]) "t.c":3
            (expr_list:REG_EQUAL (ashift:SI (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars)
                           (const_int -4)) [1 i+0 S4 A32])
                   (const_int 1))))
        (cinsn 10 (set (reg:SI <1> [ <retval> ])
               (reg:SI <0> [ _2 ])) "t.c":3)
        (cinsn 14 (set (reg/i:SI ax)
               (reg:SI <1> [ <retval> ])) "t.c":4)
        (cinsn 15 (use (reg/i:SI ax)) "t.c":4)
        (edge-to exit (flags "FALLTHRU"))
      ) ;; block 2
    ) ;; insn-chain
    (crtl
      (return_rtx
        (reg/i:SI ax)
      ) ;; return_rtx
    ) ;; crtl
  ) ;; function "times_two"

References begin_any_block(), BLOCK_FOR_INSN(), can_have_basic_block_p(), crtl, curr_bb, function::decl, DECL_ARGUMENTS, DECL_CHAIN, lang_hooks::decl_printable_name, end_any_block(), get_insns(), ggc_alloc(), NEXT_INSN(), NULL, print_param(), and r.