GCC Middle and Back End API Reference
rtx_reader Class Referenceabstract

#include <read-md.h>

Inheritance diagram for rtx_reader:
Collaboration diagram for rtx_reader:

Public Member Functions

 rtx_reader (bool compact)
 
 ~rtx_reader ()
 
bool read_rtx (const char *rtx_name, vec< rtx > *rtxen)
 
rtx rtx_alloc_for_name (const char *)
 
rtx read_rtx_code (const char *code_name)
 
virtual rtx read_rtx_operand (rtx return_rtx, int idx)
 
rtx read_nested_rtx ()
 
rtx read_rtx_variadic (rtx form)
 
char * read_until (const char *terminator_chars, bool consume_terminator)
 
virtual void handle_any_trailing_information (rtx)
 
virtual rtx postprocess (rtx x)
 
virtual const char * finalize_string (char *stringbuf)
 
bool read_md_files (int, const char **, bool(*)(const char *))
 
bool read_file (const char *filename)
 
bool read_file_fragment (const char *filename, int first_line, int last_line)
 
virtual void handle_unknown_directive (file_location, const char *)=0
 
file_location get_current_location () const
 
bool is_compact () const
 
int read_char (void)
 
void unread_char (int ch)
 
file_location read_name (struct md_name *name)
 
file_location read_name_or_nil (struct md_name *)
 
void read_escape ()
 
char * read_quoted_string ()
 
char * read_braced_string ()
 
char * read_string (int star_if_braced)
 
void read_skip_construct (int depth, file_location loc)
 
void require_char (char expected)
 
void require_char_ws (char expected)
 
void require_word_ws (const char *expected)
 
int peek_char (void)
 
void set_md_ptr_loc (const void *ptr, file_location)
 
const struct ptr_locget_md_ptr_loc (const void *ptr)
 
void copy_md_ptr_loc (const void *new_ptr, const void *old_ptr)
 
void fprint_md_ptr_loc (FILE *outf, const void *ptr)
 
void print_md_ptr_loc (const void *ptr, FILE *=stdout)
 
struct enum_typelookup_enum_type (const char *name)
 
void traverse_enum_types (htab_trav callback, void *info)
 
void handle_constants ()
 
void traverse_md_constants (htab_trav callback, void *info)
 
void handle_enum (file_location loc, bool md_p)
 
const char * join_c_conditions (const char *cond1, const char *cond2)
 
void fprint_c_condition (FILE *outf, const char *cond)
 
void print_c_condition (const char *cond)
 
const char * apply_iterator_to_string (const char *string)
 
rtx copy_rtx_for_iterators (rtx original)
 
void read_conditions ()
 
void record_potential_iterator_use (struct iterator_group *group, file_location loc, rtx x, unsigned int index, const char *name)
 
struct mappingread_mapping (struct iterator_group *group, htab_t table)
 
overloaded_namehandle_overloaded_name (rtx, vec< mapping * > *)
 
const char * get_top_level_filename () const
 
const char * get_filename () const
 
int get_lineno () const
 
int get_colno () const
 
struct obstackget_string_obstack ()
 
htab_t get_md_constants ()
 
overloaded_nameget_overloads () const
 

Protected Attributes

bool m_in_call_function_usage
 
auto_vec< rtxm_reuse_rtx_by_id
 

Private Member Functions

void handle_file ()
 
void handle_toplevel_file ()
 
void handle_include (file_location loc)
 
void add_include_path (const char *arg)
 
bool read_name_1 (struct md_name *name, file_location *out_loc)
 

Private Attributes

bool m_compact
 
const char * m_toplevel_fname
 
char * m_base_dir
 
FILE * m_read_md_file
 
const char * m_read_md_filename
 
int m_read_md_lineno
 
int m_read_md_colno
 
int m_last_line_colno
 
file_name_listm_first_dir_md_include
 
file_name_list ** m_last_dir_md_include_ptr
 
struct obstack m_string_obstack
 
htab_t m_ptr_locs
 
struct obstack m_ptr_loc_obstack
 
htab_t m_joined_conditions
 
struct obstack m_joined_conditions_obstack
 
htab_t m_md_constants
 
htab_t m_enum_types
 
int m_first_line
 
int m_last_line
 
overloaded_namem_first_overload
 
overloaded_name ** m_next_overload_ptr
 
htab_t m_overloads_htab
 

Detailed Description

An md_reader subclass that actually handles full hierarchical
rtx expressions.

Implemented in read-rtl.cc.   

Constructor & Destructor Documentation

◆ rtx_reader()

rtx_reader::rtx_reader ( bool compact)
Constructor for class rtx_reader.   

References one_time_initialization(), and rtx_reader_ptr.

◆ ~rtx_reader()

rtx_reader::~rtx_reader ( )
Destructor for class rtx_reader.   

References NULL, and rtx_reader_ptr.

Member Function Documentation

◆ add_include_path()

void md_reader::add_include_path ( const char * arg)
privateinherited

◆ apply_iterator_to_string()

const char * md_reader::apply_iterator_to_string ( const char * string)
inherited
Apply the current iterator values to STRING.  Return the new string
if any changes were needed, otherwise return STRING itself.   

References md_reader::copy_md_ptr_loc(), end(), md_reader::get_md_ptr_loc(), md_reader::ptr_loc::loc, md_reader::m_string_obstack, map_attr_string(), and map_value::string.

Referenced by md_reader::copy_rtx_for_iterators().

◆ copy_md_ptr_loc()

void md_reader::copy_md_ptr_loc ( const void * new_ptr,
const void * old_ptr )
inherited
Associate NEW_PTR with the same file position as OLD_PTR.   

References md_reader::get_md_ptr_loc(), md_reader::ptr_loc::loc, and md_reader::set_md_ptr_loc().

Referenced by md_reader::apply_iterator_to_string(), attr_string(), process_rtx(), and read_rtx_operand().

◆ copy_rtx_for_iterators()

rtx md_reader::copy_rtx_for_iterators ( rtx original)
inherited
Return a deep copy of X, substituting the current iterator
values into any strings.   

References md_reader::apply_iterator_to_string(), md_reader::copy_rtx_for_iterators(), GET_CODE, GET_RTX_FORMAT, i, rtvec_alloc(), rtx_alloc(), RTX_CODE_SIZE, XEXP, XSTR, XTMPL, XVEC, XVECEXP, and XVECLEN.

Referenced by md_reader::copy_rtx_for_iterators().

◆ finalize_string()

virtual const char * rtx_reader::finalize_string ( char * stringbuf)
inlinevirtual

Reimplemented in function_reader.

Referenced by read_rtx_operand().

◆ fprint_c_condition()

void md_reader::fprint_c_condition ( FILE * outf,
const char * cond )
inherited
Print condition COND to OUTF, wrapped in brackets.  If COND was created
by join_c_conditions, recursively invoke this function for the original
conditions and join the result with "&&".  Otherwise print a #line
directive for COND if its original file position is known.   

References md_reader::fprint_c_condition(), md_reader::fprint_md_ptr_loc(), fputc(), and md_reader::m_joined_conditions.

Referenced by md_reader::fprint_c_condition(), md_reader::print_c_condition(), write_attr_value(), and write_test_expr().

◆ fprint_md_ptr_loc()

void md_reader::fprint_md_ptr_loc ( FILE * outf,
const void * ptr )
inherited
If PTR is associated with a known file position, print a #line
directive for it to OUTF.   

References file_location::filename, md_reader::get_md_ptr_loc(), file_location::lineno, and md_reader::ptr_loc::loc.

Referenced by md_reader::fprint_c_condition(), and md_reader::print_md_ptr_loc().

◆ get_colno()

int md_reader::get_colno ( ) const
inlineinherited

◆ get_current_location()

◆ get_filename()

const char * md_reader::get_filename ( ) const
inlineinherited

◆ get_lineno()

int md_reader::get_lineno ( ) const
inlineinherited

◆ get_md_constants()

htab_t md_reader::get_md_constants ( )
inlineinherited

◆ get_md_ptr_loc()

const md_reader::ptr_loc * md_reader::get_md_ptr_loc ( const void * ptr)
inherited
Return the position associated with pointer PTR.  Return null if no
position was set.   

References md_reader::m_ptr_locs.

Referenced by md_reader::apply_iterator_to_string(), md_reader::copy_md_ptr_loc(), and md_reader::fprint_md_ptr_loc().

◆ get_overloads()

overloaded_name * md_reader::get_overloads ( ) const
inlineinherited

References md_reader::m_first_overload.

Referenced by main().

◆ get_string_obstack()

struct obstack * md_reader::get_string_obstack ( )
inlineinherited

◆ get_top_level_filename()

const char * md_reader::get_top_level_filename ( ) const
inlineinherited

◆ handle_any_trailing_information()

virtual void rtx_reader::handle_any_trailing_information ( rtx )
inlinevirtual

Reimplemented in function_reader.

Referenced by read_rtx_code().

◆ handle_constants()

void md_reader::handle_constants ( )
inherited
Process a define_constants directive, starting with the optional space
after the "define_constants".   

References add_constant(), defs, fatal_expected_char(), md_reader::m_md_constants, md_reader::read_name(), read_skip_spaces(), md_reader::require_char_ws(), and md_name::string.

Referenced by md_reader::handle_file().

◆ handle_enum()

void md_reader::handle_enum ( file_location loc,
bool md_p )
inherited
Process a define_enum or define_c_enum directive, starting with
the optional space after the "define_enum".  LINENO is the line
number on which the directive started and MD_P is true if the
directive is a define_enum rather than a define_c_enum.   

References add_constant(), enum_value::def, error_at(), md_reader::get_md_constants(), md_reader::m_enum_types, md_decimal_string(), enum_value::name, enum_value::next, NULL, md_reader::read_name(), read_skip_spaces(), md_reader::read_string(), md_reader::require_char_ws(), md_name::string, md_reader::unread_char(), and upcase_string().

Referenced by md_reader::handle_file().

◆ handle_file()

◆ handle_include()

void md_reader::handle_include ( file_location loc)
privateinherited
Process an "include" directive, starting with the optional space
after the "include".  Read in the file and use HANDLE_DIRECTIVE
to process each unknown directive.  LINENO is the line number on
which the "include" occurred.   

References DIR_SEPARATOR, error_at(), md_reader::file_name_list::fname, fopen, free(), md_reader::handle_file(), include_callback, md_reader::m_base_dir, md_reader::m_first_dir_md_include, md_reader::m_read_md_colno, md_reader::m_read_md_file, md_reader::m_read_md_filename, md_reader::m_read_md_lineno, md_reader::file_name_list::next, NULL, and md_reader::read_string().

Referenced by md_reader::handle_file().

◆ handle_overloaded_name()

overloaded_name * md_reader::handle_overloaded_name ( rtx ,
vec< mapping * > *  )
inherited

◆ handle_toplevel_file()

void md_reader::handle_toplevel_file ( )
privateinherited
Like handle_file, but for top-level files.  Set up m_toplevel_fname
and m_base_dir accordingly.   

References md_reader::handle_file(), md_reader::m_base_dir, md_reader::m_read_md_filename, md_reader::m_toplevel_fname, and NULL.

Referenced by md_reader::read_file(), and md_reader::read_file_fragment().

◆ handle_unknown_directive()

virtual void md_reader::handle_unknown_directive ( file_location ,
const char *  )
pure virtualinherited

Implemented in function_reader, gen_reader, and noop_reader.

Referenced by md_reader::handle_file().

◆ is_compact()

◆ join_c_conditions()

const char * md_reader::join_c_conditions ( const char * cond1,
const char * cond2 )
inherited
Return a condition that satisfies both COND1 and COND2.  Either string
may be null or empty.   

References md_reader::m_joined_conditions, md_reader::m_joined_conditions_obstack, and NULL.

Referenced by alter_test_for_insn(), process_rtx(), and process_substs_on_one_elem().

◆ lookup_enum_type()

struct enum_type * md_reader::lookup_enum_type ( const char * name)
inherited
Try to find the definition of the given enum.  Return null on failure.   

References md_reader::m_enum_types.

Referenced by gen_attr().

◆ peek_char()

int md_reader::peek_char ( void )
inherited
Peek at the next character from the file without consuming it.   

References md_reader::read_char(), and md_reader::unread_char().

Referenced by function_reader::handle_any_trailing_information(), and read_nested_rtx().

◆ postprocess()

virtual rtx rtx_reader::postprocess ( rtx x)
inlinevirtual

Reimplemented in function_reader.

Referenced by read_nested_rtx().

◆ print_c_condition()

void md_reader::print_c_condition ( const char * cond)
inherited
Special fprint_c_condition for writing to STDOUT.   

References md_reader::fprint_c_condition().

Referenced by def_target_insn(), print_test(), write_init_reg_class_start_regs(), write_one_condition(), and write_predicate_expr().

◆ print_md_ptr_loc()

void md_reader::print_md_ptr_loc ( const void * ptr,
FILE * file = stdout )
inherited
Special fprint_md_ptr_loc for writing to STDOUT.   

References md_reader::fprint_md_ptr_loc().

Referenced by emit_c_code(), process_template(), write_one_condition(), and write_predicate_subfunction().

◆ read_braced_string()

char * md_reader::read_braced_string ( )
inherited
Read a braced string (a la Tcl) onto the string obstack.  Caller
has scanned the leading brace.  Note that unlike quoted strings,
the outermost braces _are_ included in the string constant.   

References fatal_with_file_and_line(), md_reader::get_lineno(), md_reader::m_string_obstack, md_reader::read_char(), and md_reader::read_escape().

Referenced by md_reader::read_string().

◆ read_char()

◆ read_conditions()

void md_reader::read_conditions ( )
inherited

◆ read_escape()

void md_reader::read_escape ( )
inherited
Subroutine of the string readers.  Handles backslash escapes.
Caller has read the backslash, but not placed it into the obstack.   

References md_reader::get_filename(), md_reader::get_lineno(), md_reader::m_string_obstack, and md_reader::read_char().

Referenced by md_reader::read_braced_string(), and md_reader::read_quoted_string().

◆ read_file()

bool md_reader::read_file ( const char * filename)
inherited

◆ read_file_fragment()

bool md_reader::read_file_fragment ( const char * filename,
int first_line,
int last_line )
inherited

◆ read_mapping()

struct mapping * md_reader::read_mapping ( struct iterator_group * group,
htab_t table )
inherited

◆ read_md_files()

bool md_reader::read_md_files ( int ,
const char ** ,
bool(*  )(const char *) )
inherited

Referenced by init_rtx_reader_args_cb(), and main().

◆ read_name()

◆ read_name_1()

bool md_reader::read_name_1 ( struct md_name * name,
file_location * out_loc )
privateinherited

◆ read_name_or_nil()

◆ read_nested_rtx()

rtx rtx_reader::read_nested_rtx ( )
Read a nested rtx construct from the MD file and return it.   

References NULL, NULL_RTX, md_reader::peek_char(), postprocess(), md_reader::read_name(), read_rtx_code(), md_reader::require_char_ws(), and md_name::string.

Referenced by read_rtx_operand(), and read_rtx_variadic().

◆ read_quoted_string()

char * md_reader::read_quoted_string ( )
inherited
Read a double-quoted string onto the obstack.  Caller has scanned
the leading quote.   

References md_reader::m_string_obstack, md_reader::read_char(), and md_reader::read_escape().

Referenced by function_reader::maybe_read_location(), function_reader::parse_edge(), function_reader::parse_param(), and md_reader::read_string().

◆ read_rtx()

bool rtx_reader::read_rtx ( const char * rtx_name,
vec< rtx > * rtxen )

◆ read_rtx_code()

◆ read_rtx_operand()

rtx rtx_reader::read_rtx_operand ( rtx return_rtx,
int idx )
virtual

◆ read_rtx_variadic()

rtx rtx_reader::read_rtx_variadic ( rtx form)
Mutually recursive subroutine of read_rtx which reads
(thing x1 x2 x3 ...) and produces RTL as if
(thing x1 (thing x2 (thing x3 ...)))  had been written.
When called, FORM is (thing x1 x2), and the file position
is just past the leading parenthesis of x3.  Only works
for THINGs which are dyadic expressions, e.g. AND, IOR.   

References GET_CODE, GET_MODE, PUT_MODE(), read_nested_rtx(), read_skip_spaces(), rtx_alloc(), md_reader::unread_char(), and XEXP.

Referenced by read_rtx_code().

◆ read_skip_construct()

void md_reader::read_skip_construct ( int depth,
file_location loc )
inherited
Skip the rest of a construct that started at line LINENO and that
is currently nested by DEPTH levels of parentheses.   

References error_at(), md_reader::read_name(), read_skip_spaces(), md_reader::read_string(), and md_reader::unread_char().

Referenced by noop_reader::handle_unknown_directive(), and md_reader::read_name_or_nil().

◆ read_string()

char * md_reader::read_string ( int star_if_braced)
inherited

◆ read_until()

char * rtx_reader::read_until ( const char * terminator_chars,
bool consume_terminator )
Consume characters until encountering a character in TERMINATOR_CHARS,
consuming the terminator character if CONSUME_TERMINATOR is true.
Return all characters before the terminator as an allocated buffer.   

References md_reader::read_char(), read_skip_spaces(), and md_reader::unread_char().

Referenced by function_reader::handle_any_trailing_information(), and function_reader::read_rtx_operand_r().

◆ record_potential_iterator_use()

void md_reader::record_potential_iterator_use ( struct iterator_group * group,
file_location loc,
rtx x,
unsigned int index,
const char * name )
inherited
Interpret NAME as either a built-in value, iterator or attribute
for group GROUP.  X and INDEX are the values to pass to GROUP's
apply_iterator callback.  LOC is the location of the use.   

References iterator_group::apply_iterator, iterator_group::find_builtin, iterator_group::iterators, md_reader::m_string_obstack, record_attribute_use(), and record_iterator_use().

Referenced by read_rtx_code(), and read_rtx_operand().

◆ require_char()

void md_reader::require_char ( char expected)
inherited

◆ require_char_ws()

◆ require_word_ws()

void md_reader::require_word_ws ( const char * expected)
inherited
Consume any whitespace, then consume the next word (as per read_name),
issuing a fatal error if it is not EXPECTED.   

References fatal_with_file_and_line(), md_reader::read_name(), and md_name::string.

Referenced by function_reader::parse_crtl(), function_reader::parse_edge(), and function_reader::parse_param().

◆ rtx_alloc_for_name()

rtx rtx_reader::rtx_alloc_for_name ( const char * name)
Allocate an rtx for code NAME.  If NAME is a code iterator or an
attribute, record its use for later and use one of its possible
values as an interim rtx code.   

References fatal_with_file_and_line(), md_reader::get_current_location(), md_reader::get_string_obstack(), modes, map_value::number, obstack, record_attribute_use(), record_iterator_use(), rtx_alloc(), and mapping::values.

Referenced by read_rtx_code().

◆ set_md_ptr_loc()

void md_reader::set_md_ptr_loc ( const void * ptr,
file_location file_loc )
inherited
Associate PTR with the file position given by FILE_LOC.   

References md_reader::ptr_loc::loc, md_reader::m_ptr_loc_obstack, md_reader::m_ptr_locs, and md_reader::ptr_loc::ptr.

Referenced by md_reader::copy_md_ptr_loc(), and md_reader::read_string().

◆ traverse_enum_types()

void md_reader::traverse_enum_types ( htab_trav callback,
void * info )
inherited
For every enum definition, call CALLBACK with two arguments:
a pointer to the constant definition and INFO.  Stop when CALLBACK
returns zero.   

References md_reader::m_enum_types.

Referenced by main().

◆ traverse_md_constants()

void md_reader::traverse_md_constants ( htab_trav callback,
void * info )
inherited
For every constant definition, call CALLBACK with two arguments:
a pointer a pointer to the constant definition and INFO.
Stop when CALLBACK returns zero.   

References md_reader::get_md_constants().

Referenced by main().

◆ unread_char()

Field Documentation

◆ m_base_dir

char* md_reader::m_base_dir
privateinherited

◆ m_compact

bool md_reader::m_compact
privateinherited

Referenced by md_reader::is_compact().

◆ m_enum_types

◆ m_first_dir_md_include

file_name_list* md_reader::m_first_dir_md_include
privateinherited

◆ m_first_line

int md_reader::m_first_line
privateinherited

◆ m_first_overload

overloaded_name* md_reader::m_first_overload
privateinherited

◆ m_in_call_function_usage

bool rtx_reader::m_in_call_function_usage
protected

◆ m_joined_conditions

htab_t md_reader::m_joined_conditions
privateinherited

◆ m_joined_conditions_obstack

struct obstack md_reader::m_joined_conditions_obstack
privateinherited

◆ m_last_dir_md_include_ptr

file_name_list** md_reader::m_last_dir_md_include_ptr
privateinherited

◆ m_last_line

int md_reader::m_last_line
privateinherited

◆ m_last_line_colno

int md_reader::m_last_line_colno
privateinherited

◆ m_md_constants

◆ m_next_overload_ptr

overloaded_name** md_reader::m_next_overload_ptr
privateinherited

◆ m_overloads_htab

htab_t md_reader::m_overloads_htab
privateinherited

◆ m_ptr_loc_obstack

struct obstack md_reader::m_ptr_loc_obstack
privateinherited

◆ m_ptr_locs

htab_t md_reader::m_ptr_locs
privateinherited

◆ m_read_md_colno

◆ m_read_md_file

◆ m_read_md_filename

◆ m_read_md_lineno

◆ m_reuse_rtx_by_id

auto_vec<rtx> rtx_reader::m_reuse_rtx_by_id
protected

Referenced by read_rtx_code().

◆ m_string_obstack

◆ m_toplevel_fname

const char* md_reader::m_toplevel_fname
privateinherited

The documentation for this class was generated from the following files: