Home | History | Annotate | Line # | Download | only in config
tc-xtensa.c revision 1.1.1.8
      1      1.1     skrll /* tc-xtensa.c -- Assemble Xtensa instructions.
      2  1.1.1.8  christos    Copyright (C) 2003-2020 Free Software Foundation, Inc.
      3      1.1     skrll 
      4      1.1     skrll    This file is part of GAS, the GNU Assembler.
      5      1.1     skrll 
      6      1.1     skrll    GAS is free software; you can redistribute it and/or modify
      7      1.1     skrll    it under the terms of the GNU General Public License as published by
      8      1.1     skrll    the Free Software Foundation; either version 3, or (at your option)
      9      1.1     skrll    any later version.
     10      1.1     skrll 
     11      1.1     skrll    GAS is distributed in the hope that it will be useful,
     12      1.1     skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1     skrll    GNU General Public License for more details.
     15      1.1     skrll 
     16      1.1     skrll    You should have received a copy of the GNU General Public License
     17      1.1     skrll    along with GAS; see the file COPYING.  If not, write to
     18      1.1     skrll    the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
     19      1.1     skrll    MA 02110-1301, USA.  */
     20      1.1     skrll 
     21      1.1     skrll #include "as.h"
     22  1.1.1.3  christos #include <limits.h>
     23      1.1     skrll #include "sb.h"
     24      1.1     skrll #include "safe-ctype.h"
     25      1.1     skrll #include "tc-xtensa.h"
     26      1.1     skrll #include "subsegs.h"
     27      1.1     skrll #include "xtensa-relax.h"
     28      1.1     skrll #include "dwarf2dbg.h"
     29      1.1     skrll #include "xtensa-istack.h"
     30      1.1     skrll #include "xtensa-config.h"
     31  1.1.1.5  christos #include "elf/xtensa.h"
     32      1.1     skrll 
     33      1.1     skrll /* Provide default values for new configuration settings.  */
     34      1.1     skrll #ifndef XSHAL_ABI
     35      1.1     skrll #define XSHAL_ABI 0
     36      1.1     skrll #endif
     37      1.1     skrll 
     38      1.1     skrll #ifndef uint32
     39      1.1     skrll #define uint32 unsigned int
     40      1.1     skrll #endif
     41      1.1     skrll #ifndef int32
     42      1.1     skrll #define int32 signed int
     43      1.1     skrll #endif
     44      1.1     skrll 
     45      1.1     skrll /* Notes:
     46      1.1     skrll 
     47      1.1     skrll    Naming conventions (used somewhat inconsistently):
     48      1.1     skrll       The xtensa_ functions are exported
     49      1.1     skrll       The xg_ functions are internal
     50      1.1     skrll 
     51      1.1     skrll    We also have a couple of different extensibility mechanisms.
     52      1.1     skrll    1) The idiom replacement:
     53      1.1     skrll       This is used when a line is first parsed to
     54      1.1     skrll       replace an instruction pattern with another instruction
     55      1.1     skrll       It is currently limited to replacements of instructions
     56      1.1     skrll       with constant operands.
     57      1.1     skrll    2) The xtensa-relax.c mechanism that has stronger instruction
     58      1.1     skrll       replacement patterns.  When an instruction's immediate field
     59      1.1     skrll       does not fit the next instruction sequence is attempted.
     60      1.1     skrll       In addition, "narrow" opcodes are supported this way.  */
     61      1.1     skrll 
     62      1.1     skrll 
     63      1.1     skrll /* Define characters with special meanings to GAS.  */
     64      1.1     skrll const char comment_chars[] = "#";
     65      1.1     skrll const char line_comment_chars[] = "#";
     66      1.1     skrll const char line_separator_chars[] = ";";
     67      1.1     skrll const char EXP_CHARS[] = "eE";
     68      1.1     skrll const char FLT_CHARS[] = "rRsSfFdDxXpP";
     69      1.1     skrll 
     70      1.1     skrll 
     71      1.1     skrll /* Flags to indicate whether the hardware supports the density and
     72      1.1     skrll    absolute literals options.  */
     73      1.1     skrll 
     74  1.1.1.6  christos bfd_boolean density_supported;
     75  1.1.1.6  christos bfd_boolean absolute_literals_supported;
     76      1.1     skrll 
     77      1.1     skrll static vliw_insn cur_vinsn;
     78      1.1     skrll 
     79      1.1     skrll unsigned xtensa_num_pipe_stages;
     80  1.1.1.6  christos unsigned xtensa_fetch_width;
     81      1.1     skrll 
     82      1.1     skrll static enum debug_info_type xt_saved_debug_type = DEBUG_NONE;
     83      1.1     skrll 
     84      1.1     skrll /* Some functions are only valid in the front end.  This variable
     85      1.1     skrll    allows us to assert that we haven't crossed over into the
     86      1.1     skrll    back end.  */
     87      1.1     skrll static bfd_boolean past_xtensa_end = FALSE;
     88      1.1     skrll 
     89      1.1     skrll /* Flags for properties of the last instruction in a segment.  */
     90      1.1     skrll #define FLAG_IS_A0_WRITER	0x1
     91      1.1     skrll #define FLAG_IS_BAD_LOOPEND	0x2
     92      1.1     skrll 
     93      1.1     skrll 
     94      1.1     skrll /* We define a special segment names ".literal" to place literals
     95      1.1     skrll    into.  The .fini and .init sections are special because they
     96      1.1     skrll    contain code that is moved together by the linker.  We give them
     97      1.1     skrll    their own special .fini.literal and .init.literal sections.  */
     98      1.1     skrll 
     99      1.1     skrll #define LITERAL_SECTION_NAME		xtensa_section_rename (".literal")
    100      1.1     skrll #define LIT4_SECTION_NAME		xtensa_section_rename (".lit4")
    101      1.1     skrll #define INIT_SECTION_NAME		xtensa_section_rename (".init")
    102      1.1     skrll #define FINI_SECTION_NAME		xtensa_section_rename (".fini")
    103      1.1     skrll 
    104      1.1     skrll 
    105      1.1     skrll /* This type is used for the directive_stack to keep track of the
    106      1.1     skrll    state of the literal collection pools.  If lit_prefix is set, it is
    107      1.1     skrll    used to determine the literal section names; otherwise, the literal
    108      1.1     skrll    sections are determined based on the current text section.  The
    109      1.1     skrll    lit_seg and lit4_seg fields cache these literal sections, with the
    110      1.1     skrll    current_text_seg field used a tag to indicate whether the cached
    111      1.1     skrll    values are valid.  */
    112      1.1     skrll 
    113      1.1     skrll typedef struct lit_state_struct
    114      1.1     skrll {
    115      1.1     skrll   char *lit_prefix;
    116      1.1     skrll   segT current_text_seg;
    117      1.1     skrll   segT lit_seg;
    118      1.1     skrll   segT lit4_seg;
    119      1.1     skrll } lit_state;
    120      1.1     skrll 
    121      1.1     skrll static lit_state default_lit_sections;
    122      1.1     skrll 
    123      1.1     skrll 
    124      1.1     skrll /* We keep a list of literal segments.  The seg_list type is the node
    125      1.1     skrll    for this list.  The literal_head pointer is the head of the list,
    126      1.1     skrll    with the literal_head_h dummy node at the start.  */
    127      1.1     skrll 
    128      1.1     skrll typedef struct seg_list_struct
    129      1.1     skrll {
    130      1.1     skrll   struct seg_list_struct *next;
    131      1.1     skrll   segT seg;
    132      1.1     skrll } seg_list;
    133      1.1     skrll 
    134      1.1     skrll static seg_list literal_head_h;
    135      1.1     skrll static seg_list *literal_head = &literal_head_h;
    136      1.1     skrll 
    137      1.1     skrll 
    138      1.1     skrll /* Lists of symbols.  We keep a list of symbols that label the current
    139      1.1     skrll    instruction, so that we can adjust the symbols when inserting alignment
    140      1.1     skrll    for various instructions.  We also keep a list of all the symbols on
    141      1.1     skrll    literals, so that we can fix up those symbols when the literals are
    142      1.1     skrll    later moved into the text sections.  */
    143      1.1     skrll 
    144      1.1     skrll typedef struct sym_list_struct
    145      1.1     skrll {
    146      1.1     skrll   struct sym_list_struct *next;
    147      1.1     skrll   symbolS *sym;
    148      1.1     skrll } sym_list;
    149      1.1     skrll 
    150      1.1     skrll static sym_list *insn_labels = NULL;
    151      1.1     skrll static sym_list *free_insn_labels = NULL;
    152      1.1     skrll static sym_list *saved_insn_labels = NULL;
    153      1.1     skrll 
    154      1.1     skrll static sym_list *literal_syms;
    155      1.1     skrll 
    156      1.1     skrll 
    157      1.1     skrll /* Flags to determine whether to prefer const16 or l32r
    158      1.1     skrll    if both options are available.  */
    159      1.1     skrll int prefer_const16 = 0;
    160      1.1     skrll int prefer_l32r = 0;
    161      1.1     skrll 
    162      1.1     skrll /* Global flag to indicate when we are emitting literals.  */
    163      1.1     skrll int generating_literals = 0;
    164      1.1     skrll 
    165      1.1     skrll /* The following PROPERTY table definitions are copied from
    166      1.1     skrll    <elf/xtensa.h> and must be kept in sync with the code there.  */
    167      1.1     skrll 
    168      1.1     skrll /* Flags in the property tables to specify whether blocks of memory
    169      1.1     skrll    are literals, instructions, data, or unreachable.  For
    170      1.1     skrll    instructions, blocks that begin loop targets and branch targets are
    171      1.1     skrll    designated.  Blocks that do not allow density, instruction
    172      1.1     skrll    reordering or transformation are also specified.  Finally, for
    173      1.1     skrll    branch targets, branch target alignment priority is included.
    174      1.1     skrll    Alignment of the next block is specified in the current block
    175      1.1     skrll    and the size of the current block does not include any fill required
    176      1.1     skrll    to align to the next block.  */
    177      1.1     skrll 
    178      1.1     skrll #define XTENSA_PROP_LITERAL		0x00000001
    179      1.1     skrll #define XTENSA_PROP_INSN		0x00000002
    180      1.1     skrll #define XTENSA_PROP_DATA		0x00000004
    181      1.1     skrll #define XTENSA_PROP_UNREACHABLE		0x00000008
    182      1.1     skrll /* Instruction only properties at beginning of code.  */
    183      1.1     skrll #define XTENSA_PROP_INSN_LOOP_TARGET	0x00000010
    184      1.1     skrll #define XTENSA_PROP_INSN_BRANCH_TARGET	0x00000020
    185      1.1     skrll /* Instruction only properties about code.  */
    186      1.1     skrll #define XTENSA_PROP_INSN_NO_DENSITY	0x00000040
    187      1.1     skrll #define XTENSA_PROP_INSN_NO_REORDER	0x00000080
    188      1.1     skrll /* Historically, NO_TRANSFORM was a property of instructions,
    189      1.1     skrll    but it should apply to literals under certain circumstances.  */
    190      1.1     skrll #define XTENSA_PROP_NO_TRANSFORM	0x00000100
    191      1.1     skrll 
    192      1.1     skrll /*  Branch target alignment information.  This transmits information
    193      1.1     skrll     to the linker optimization about the priority of aligning a
    194      1.1     skrll     particular block for branch target alignment: None, low priority,
    195      1.1     skrll     high priority, or required.  These only need to be checked in
    196      1.1     skrll     instruction blocks marked as XTENSA_PROP_INSN_BRANCH_TARGET.
    197      1.1     skrll     Common usage is
    198      1.1     skrll 
    199      1.1     skrll     switch (GET_XTENSA_PROP_BT_ALIGN (flags))
    200      1.1     skrll     case XTENSA_PROP_BT_ALIGN_NONE:
    201      1.1     skrll     case XTENSA_PROP_BT_ALIGN_LOW:
    202      1.1     skrll     case XTENSA_PROP_BT_ALIGN_HIGH:
    203      1.1     skrll     case XTENSA_PROP_BT_ALIGN_REQUIRE:
    204      1.1     skrll */
    205      1.1     skrll #define XTENSA_PROP_BT_ALIGN_MASK       0x00000600
    206      1.1     skrll 
    207      1.1     skrll /* No branch target alignment.  */
    208      1.1     skrll #define XTENSA_PROP_BT_ALIGN_NONE       0x0
    209      1.1     skrll /* Low priority branch target alignment.  */
    210      1.1     skrll #define XTENSA_PROP_BT_ALIGN_LOW        0x1
    211      1.1     skrll /* High priority branch target alignment.  */
    212      1.1     skrll #define XTENSA_PROP_BT_ALIGN_HIGH       0x2
    213      1.1     skrll /* Required branch target alignment.  */
    214      1.1     skrll #define XTENSA_PROP_BT_ALIGN_REQUIRE    0x3
    215      1.1     skrll 
    216      1.1     skrll #define SET_XTENSA_PROP_BT_ALIGN(flag, align) \
    217      1.1     skrll   (((flag) & (~XTENSA_PROP_BT_ALIGN_MASK)) | \
    218      1.1     skrll     (((align) << 9) & XTENSA_PROP_BT_ALIGN_MASK))
    219      1.1     skrll 
    220      1.1     skrll 
    221      1.1     skrll /* Alignment is specified in the block BEFORE the one that needs
    222      1.1     skrll    alignment.  Up to 5 bits.  Use GET_XTENSA_PROP_ALIGNMENT(flags) to
    223      1.1     skrll    get the required alignment specified as a power of 2.  Use
    224      1.1     skrll    SET_XTENSA_PROP_ALIGNMENT(flags, pow2) to set the required
    225      1.1     skrll    alignment.  Be careful of side effects since the SET will evaluate
    226      1.1     skrll    flags twice.  Also, note that the SIZE of a block in the property
    227      1.1     skrll    table does not include the alignment size, so the alignment fill
    228      1.1     skrll    must be calculated to determine if two blocks are contiguous.
    229      1.1     skrll    TEXT_ALIGN is not currently implemented but is a placeholder for a
    230      1.1     skrll    possible future implementation.  */
    231      1.1     skrll 
    232      1.1     skrll #define XTENSA_PROP_ALIGN		0x00000800
    233      1.1     skrll 
    234      1.1     skrll #define XTENSA_PROP_ALIGNMENT_MASK      0x0001f000
    235      1.1     skrll 
    236      1.1     skrll #define SET_XTENSA_PROP_ALIGNMENT(flag, align) \
    237      1.1     skrll   (((flag) & (~XTENSA_PROP_ALIGNMENT_MASK)) | \
    238      1.1     skrll     (((align) << 12) & XTENSA_PROP_ALIGNMENT_MASK))
    239      1.1     skrll 
    240      1.1     skrll #define XTENSA_PROP_INSN_ABSLIT 0x00020000
    241      1.1     skrll 
    242      1.1     skrll 
    243      1.1     skrll /* Structure for saving instruction and alignment per-fragment data
    244      1.1     skrll    that will be written to the object file.  This structure is
    245      1.1     skrll    equivalent to the actual data that will be written out to the file
    246      1.1     skrll    but is easier to use.   We provide a conversion to file flags
    247      1.1     skrll    in frag_flags_to_number.  */
    248      1.1     skrll 
    249      1.1     skrll typedef struct frag_flags_struct frag_flags;
    250      1.1     skrll 
    251      1.1     skrll struct frag_flags_struct
    252      1.1     skrll {
    253      1.1     skrll   /* is_literal should only be used after xtensa_move_literals.
    254      1.1     skrll      If you need to check if you are generating a literal fragment,
    255      1.1     skrll      then use the generating_literals global.  */
    256      1.1     skrll 
    257      1.1     skrll   unsigned is_literal : 1;
    258      1.1     skrll   unsigned is_insn : 1;
    259      1.1     skrll   unsigned is_data : 1;
    260      1.1     skrll   unsigned is_unreachable : 1;
    261      1.1     skrll 
    262      1.1     skrll   /* is_specific_opcode implies no_transform.  */
    263      1.1     skrll   unsigned is_no_transform : 1;
    264      1.1     skrll 
    265      1.1     skrll   struct
    266      1.1     skrll   {
    267      1.1     skrll     unsigned is_loop_target : 1;
    268      1.1     skrll     unsigned is_branch_target : 1; /* Branch targets have a priority.  */
    269      1.1     skrll     unsigned bt_align_priority : 2;
    270      1.1     skrll 
    271      1.1     skrll     unsigned is_no_density : 1;
    272      1.1     skrll     /* no_longcalls flag does not need to be placed in the object file.  */
    273      1.1     skrll 
    274      1.1     skrll     unsigned is_no_reorder : 1;
    275      1.1     skrll 
    276      1.1     skrll     /* Uses absolute literal addressing for l32r.  */
    277      1.1     skrll     unsigned is_abslit : 1;
    278      1.1     skrll   } insn;
    279      1.1     skrll   unsigned is_align : 1;
    280      1.1     skrll   unsigned alignment : 5;
    281      1.1     skrll };
    282      1.1     skrll 
    283      1.1     skrll 
    284      1.1     skrll /* Structure for saving information about a block of property data
    285      1.1     skrll    for frags that have the same flags.  */
    286      1.1     skrll struct xtensa_block_info_struct
    287      1.1     skrll {
    288      1.1     skrll   segT sec;
    289      1.1     skrll   bfd_vma offset;
    290      1.1     skrll   size_t size;
    291      1.1     skrll   frag_flags flags;
    292      1.1     skrll   struct xtensa_block_info_struct *next;
    293      1.1     skrll };
    294      1.1     skrll 
    295      1.1     skrll 
    296      1.1     skrll /* Structure for saving the current state before emitting literals.  */
    297      1.1     skrll typedef struct emit_state_struct
    298      1.1     skrll {
    299      1.1     skrll   const char *name;
    300      1.1     skrll   segT now_seg;
    301      1.1     skrll   subsegT now_subseg;
    302      1.1     skrll   int generating_literals;
    303      1.1     skrll } emit_state;
    304      1.1     skrll 
    305      1.1     skrll 
    306      1.1     skrll /* Opcode placement information */
    307      1.1     skrll 
    308      1.1     skrll typedef unsigned long long bitfield;
    309      1.1     skrll #define bit_is_set(bit, bf)	((bf) & (0x01ll << (bit)))
    310      1.1     skrll #define set_bit(bit, bf)	((bf) |= (0x01ll << (bit)))
    311      1.1     skrll #define clear_bit(bit, bf)	((bf) &= ~(0x01ll << (bit)))
    312      1.1     skrll 
    313      1.1     skrll #define MAX_FORMATS 32
    314      1.1     skrll 
    315      1.1     skrll typedef struct op_placement_info_struct
    316      1.1     skrll {
    317      1.1     skrll   int num_formats;
    318      1.1     skrll   /* A number describing how restrictive the issue is for this
    319      1.1     skrll      opcode.  For example, an opcode that fits lots of different
    320      1.1     skrll      formats has a high freedom, as does an opcode that fits
    321      1.1     skrll      only one format but many slots in that format.  The most
    322      1.1     skrll      restrictive is the opcode that fits only one slot in one
    323      1.1     skrll      format.  */
    324      1.1     skrll   int issuef;
    325      1.1     skrll   xtensa_format narrowest;
    326      1.1     skrll   char narrowest_size;
    327      1.1     skrll   char narrowest_slot;
    328      1.1     skrll 
    329      1.1     skrll   /* formats is a bitfield with the Nth bit set
    330      1.1     skrll      if the opcode fits in the Nth xtensa_format.  */
    331      1.1     skrll   bitfield formats;
    332      1.1     skrll 
    333      1.1     skrll   /* slots[N]'s Mth bit is set if the op fits in the
    334      1.1     skrll      Mth slot of the Nth xtensa_format.  */
    335      1.1     skrll   bitfield slots[MAX_FORMATS];
    336      1.1     skrll 
    337      1.1     skrll   /* A count of the number of slots in a given format
    338      1.1     skrll      an op can fit (i.e., the bitcount of the slot field above).  */
    339      1.1     skrll   char slots_in_format[MAX_FORMATS];
    340      1.1     skrll 
    341      1.1     skrll } op_placement_info, *op_placement_info_table;
    342      1.1     skrll 
    343      1.1     skrll op_placement_info_table op_placement_table;
    344      1.1     skrll 
    345      1.1     skrll 
    346      1.1     skrll /* Extra expression types.  */
    347      1.1     skrll 
    348      1.1     skrll #define O_pltrel	O_md1	/* like O_symbol but use a PLT reloc */
    349      1.1     skrll #define O_hi16		O_md2	/* use high 16 bits of symbolic value */
    350      1.1     skrll #define O_lo16		O_md3	/* use low 16 bits of symbolic value */
    351      1.1     skrll #define O_pcrel		O_md4	/* value is a PC-relative offset */
    352      1.1     skrll #define O_tlsfunc	O_md5	/* TLS_FUNC/TLSDESC_FN relocation */
    353      1.1     skrll #define O_tlsarg	O_md6	/* TLS_ARG/TLSDESC_ARG relocation */
    354      1.1     skrll #define O_tlscall	O_md7	/* TLS_CALL relocation */
    355      1.1     skrll #define O_tpoff		O_md8	/* TPOFF relocation */
    356      1.1     skrll #define O_dtpoff	O_md9	/* DTPOFF relocation */
    357      1.1     skrll 
    358      1.1     skrll struct suffix_reloc_map
    359      1.1     skrll {
    360  1.1.1.5  christos   const char *suffix;
    361      1.1     skrll   int length;
    362      1.1     skrll   bfd_reloc_code_real_type reloc;
    363  1.1.1.5  christos   operatorT operator;
    364      1.1     skrll };
    365      1.1     skrll 
    366      1.1     skrll #define SUFFIX_MAP(str, reloc, op) { str, sizeof (str) - 1, reloc, op }
    367      1.1     skrll 
    368      1.1     skrll static struct suffix_reloc_map suffix_relocs[] =
    369      1.1     skrll {
    370      1.1     skrll   SUFFIX_MAP ("l",	BFD_RELOC_LO16,			O_lo16),
    371      1.1     skrll   SUFFIX_MAP ("h",	BFD_RELOC_HI16,			O_hi16),
    372      1.1     skrll   SUFFIX_MAP ("plt",	BFD_RELOC_XTENSA_PLT,		O_pltrel),
    373      1.1     skrll   SUFFIX_MAP ("pcrel",	BFD_RELOC_32_PCREL,		O_pcrel),
    374      1.1     skrll   SUFFIX_MAP ("tlsfunc", BFD_RELOC_XTENSA_TLS_FUNC,	O_tlsfunc),
    375      1.1     skrll   SUFFIX_MAP ("tlsarg",	BFD_RELOC_XTENSA_TLS_ARG,	O_tlsarg),
    376      1.1     skrll   SUFFIX_MAP ("tlscall", BFD_RELOC_XTENSA_TLS_CALL,	O_tlscall),
    377      1.1     skrll   SUFFIX_MAP ("tpoff",	BFD_RELOC_XTENSA_TLS_TPOFF,	O_tpoff),
    378      1.1     skrll   SUFFIX_MAP ("dtpoff",	BFD_RELOC_XTENSA_TLS_DTPOFF,	O_dtpoff),
    379      1.1     skrll };
    380      1.1     skrll 
    381      1.1     skrll 
    382      1.1     skrll /* Directives.  */
    383      1.1     skrll 
    384      1.1     skrll typedef enum
    385      1.1     skrll {
    386      1.1     skrll   directive_none = 0,
    387      1.1     skrll   directive_literal,
    388      1.1     skrll   directive_density,
    389      1.1     skrll   directive_transform,
    390      1.1     skrll   directive_freeregs,
    391      1.1     skrll   directive_longcalls,
    392      1.1     skrll   directive_literal_prefix,
    393      1.1     skrll   directive_schedule,
    394      1.1     skrll   directive_absolute_literals,
    395      1.1     skrll   directive_last_directive
    396      1.1     skrll } directiveE;
    397      1.1     skrll 
    398      1.1     skrll typedef struct
    399      1.1     skrll {
    400      1.1     skrll   const char *name;
    401      1.1     skrll   bfd_boolean can_be_negated;
    402      1.1     skrll } directive_infoS;
    403      1.1     skrll 
    404      1.1     skrll const directive_infoS directive_info[] =
    405      1.1     skrll {
    406      1.1     skrll   { "none",		FALSE },
    407      1.1     skrll   { "literal",		FALSE },
    408      1.1     skrll   { "density",		TRUE },
    409      1.1     skrll   { "transform",	TRUE },
    410      1.1     skrll   { "freeregs",		FALSE },
    411      1.1     skrll   { "longcalls",	TRUE },
    412      1.1     skrll   { "literal_prefix",	FALSE },
    413      1.1     skrll   { "schedule",		TRUE },
    414      1.1     skrll   { "absolute-literals", TRUE }
    415      1.1     skrll };
    416      1.1     skrll 
    417      1.1     skrll bfd_boolean directive_state[] =
    418      1.1     skrll {
    419      1.1     skrll   FALSE,			/* none */
    420      1.1     skrll   FALSE,			/* literal */
    421      1.1     skrll   FALSE,			/* density */
    422      1.1     skrll   TRUE,				/* transform */
    423      1.1     skrll   FALSE,			/* freeregs */
    424      1.1     skrll   FALSE,			/* longcalls */
    425      1.1     skrll   FALSE,			/* literal_prefix */
    426      1.1     skrll   FALSE,			/* schedule */
    427      1.1     skrll   FALSE				/* absolute_literals */
    428      1.1     skrll };
    429      1.1     skrll 
    430  1.1.1.4  christos /* A circular list of all potential and actual literal pool locations
    431  1.1.1.4  christos    in a segment.  */
    432  1.1.1.4  christos struct litpool_frag
    433  1.1.1.4  christos {
    434  1.1.1.4  christos   struct litpool_frag *next;
    435  1.1.1.4  christos   struct litpool_frag *prev;
    436  1.1.1.4  christos   fragS *fragP;
    437  1.1.1.4  christos   addressT addr;
    438  1.1.1.4  christos   short priority; /* 1, 2, or 3 -- 1 is highest  */
    439  1.1.1.4  christos   short original_priority;
    440  1.1.1.7  christos   int literal_count;
    441  1.1.1.4  christos };
    442  1.1.1.4  christos 
    443  1.1.1.4  christos /* Map a segment to its litpool_frag list.  */
    444  1.1.1.4  christos struct litpool_seg
    445  1.1.1.4  christos {
    446  1.1.1.4  christos   struct litpool_seg *next;
    447  1.1.1.4  christos   asection *seg;
    448  1.1.1.4  christos   struct litpool_frag frag_list;
    449  1.1.1.4  christos   int frag_count; /* since last litpool location  */
    450  1.1.1.4  christos };
    451  1.1.1.4  christos 
    452  1.1.1.4  christos static struct litpool_seg litpool_seg_list;
    453  1.1.1.4  christos 
    454  1.1.1.7  christos /* Limit maximal size of auto litpool by half of the j range.  */
    455  1.1.1.7  christos #define MAX_AUTO_POOL_LITERALS 16384
    456  1.1.1.7  christos 
    457  1.1.1.7  christos /* Limit maximal size of explicit literal pool by l32r range.  */
    458  1.1.1.7  christos #define MAX_EXPLICIT_POOL_LITERALS 65536
    459  1.1.1.7  christos 
    460  1.1.1.7  christos #define MAX_POOL_LITERALS \
    461  1.1.1.7  christos   (auto_litpools ? MAX_AUTO_POOL_LITERALS : MAX_EXPLICIT_POOL_LITERALS)
    462      1.1     skrll 
    463      1.1     skrll /* Directive functions.  */
    464      1.1     skrll 
    465      1.1     skrll static void xtensa_begin_directive (int);
    466      1.1     skrll static void xtensa_end_directive (int);
    467      1.1     skrll static void xtensa_literal_prefix (void);
    468      1.1     skrll static void xtensa_literal_position (int);
    469      1.1     skrll static void xtensa_literal_pseudo (int);
    470      1.1     skrll static void xtensa_frequency_pseudo (int);
    471      1.1     skrll static void xtensa_elf_cons (int);
    472      1.1     skrll static void xtensa_leb128 (int);
    473      1.1     skrll 
    474      1.1     skrll /* Parsing and Idiom Translation.  */
    475      1.1     skrll 
    476      1.1     skrll static bfd_reloc_code_real_type xtensa_elf_suffix (char **, expressionS *);
    477      1.1     skrll 
    478      1.1     skrll /* Various Other Internal Functions.  */
    479      1.1     skrll 
    480      1.1     skrll extern bfd_boolean xg_is_single_relaxable_insn (TInsn *, TInsn *, bfd_boolean);
    481      1.1     skrll static bfd_boolean xg_build_to_insn (TInsn *, TInsn *, BuildInstr *);
    482      1.1     skrll static void xtensa_mark_literal_pool_location (void);
    483      1.1     skrll static addressT get_expanded_loop_offset (xtensa_opcode);
    484      1.1     skrll static fragS *get_literal_pool_location (segT);
    485      1.1     skrll static void set_literal_pool_location (segT, fragS *);
    486      1.1     skrll static void xtensa_set_frag_assembly_state (fragS *);
    487      1.1     skrll static void finish_vinsn (vliw_insn *);
    488      1.1     skrll static bfd_boolean emit_single_op (TInsn *);
    489      1.1     skrll static int total_frag_text_expansion (fragS *);
    490  1.1.1.4  christos static bfd_boolean use_trampolines = TRUE;
    491  1.1.1.4  christos static void xtensa_check_frag_count (void);
    492  1.1.1.4  christos static void xtensa_create_trampoline_frag (bfd_boolean);
    493  1.1.1.4  christos static void xtensa_maybe_create_trampoline_frag (void);
    494  1.1.1.4  christos struct trampoline_frag;
    495  1.1.1.6  christos static int init_trampoline_frag (fragS *);
    496  1.1.1.6  christos static fixS *xg_append_jump (fragS *fragP, symbolS *sym, offsetT offset);
    497  1.1.1.4  christos static void xtensa_maybe_create_literal_pool_frag (bfd_boolean, bfd_boolean);
    498  1.1.1.4  christos static bfd_boolean auto_litpools = FALSE;
    499  1.1.1.7  christos static int auto_litpool_limit = 0;
    500  1.1.1.8  christos static bfd_boolean xtensa_is_init_fini (segT seg);
    501      1.1     skrll 
    502      1.1     skrll /* Alignment Functions.  */
    503      1.1     skrll 
    504      1.1     skrll static int get_text_align_power (unsigned);
    505      1.1     skrll static int get_text_align_max_fill_size (int, bfd_boolean, bfd_boolean);
    506      1.1     skrll static int branch_align_power (segT);
    507      1.1     skrll 
    508      1.1     skrll /* Helpers for xtensa_relax_frag().  */
    509      1.1     skrll 
    510      1.1     skrll static long relax_frag_add_nop (fragS *);
    511      1.1     skrll 
    512      1.1     skrll /* Accessors for additional per-subsegment information.  */
    513      1.1     skrll 
    514      1.1     skrll static unsigned get_last_insn_flags (segT, subsegT);
    515      1.1     skrll static void set_last_insn_flags (segT, subsegT, unsigned, bfd_boolean);
    516      1.1     skrll static float get_subseg_total_freq (segT, subsegT);
    517      1.1     skrll static float get_subseg_target_freq (segT, subsegT);
    518      1.1     skrll static void set_subseg_freq (segT, subsegT, float, float);
    519      1.1     skrll 
    520      1.1     skrll /* Segment list functions.  */
    521      1.1     skrll 
    522      1.1     skrll static void xtensa_move_literals (void);
    523      1.1     skrll static void xtensa_reorder_segments (void);
    524      1.1     skrll static void xtensa_switch_to_literal_fragment (emit_state *);
    525      1.1     skrll static void xtensa_switch_to_non_abs_literal_fragment (emit_state *);
    526      1.1     skrll static void xtensa_switch_section_emit_state (emit_state *, segT, subsegT);
    527      1.1     skrll static void xtensa_restore_emit_state (emit_state *);
    528      1.1     skrll static segT cache_literal_section (bfd_boolean);
    529      1.1     skrll 
    530      1.1     skrll /* op_placement_info functions.  */
    531      1.1     skrll 
    532      1.1     skrll static void init_op_placement_info_table (void);
    533      1.1     skrll extern bfd_boolean opcode_fits_format_slot (xtensa_opcode, xtensa_format, int);
    534      1.1     skrll static int xg_get_single_size (xtensa_opcode);
    535      1.1     skrll static xtensa_format xg_get_single_format (xtensa_opcode);
    536      1.1     skrll static int xg_get_single_slot (xtensa_opcode);
    537      1.1     skrll 
    538      1.1     skrll /* TInsn and IStack functions.  */
    539      1.1     skrll 
    540      1.1     skrll static bfd_boolean tinsn_has_symbolic_operands (const TInsn *);
    541      1.1     skrll static bfd_boolean tinsn_has_invalid_symbolic_operands (const TInsn *);
    542      1.1     skrll static bfd_boolean tinsn_has_complex_operands (const TInsn *);
    543      1.1     skrll static bfd_boolean tinsn_to_insnbuf (TInsn *, xtensa_insnbuf);
    544      1.1     skrll static bfd_boolean tinsn_check_arguments (const TInsn *);
    545      1.1     skrll static void tinsn_from_chars (TInsn *, char *, int);
    546      1.1     skrll static void tinsn_immed_from_frag (TInsn *, fragS *, int);
    547      1.1     skrll static int get_num_stack_text_bytes (IStack *);
    548      1.1     skrll static int get_num_stack_literal_bytes (IStack *);
    549  1.1.1.4  christos static bfd_boolean tinsn_to_slotbuf (xtensa_format, int, TInsn *, xtensa_insnbuf);
    550      1.1     skrll 
    551      1.1     skrll /* vliw_insn functions.  */
    552      1.1     skrll 
    553      1.1     skrll static void xg_init_vinsn (vliw_insn *);
    554  1.1.1.2  christos static void xg_copy_vinsn (vliw_insn *, vliw_insn *);
    555      1.1     skrll static void xg_clear_vinsn (vliw_insn *);
    556      1.1     skrll static bfd_boolean vinsn_has_specific_opcodes (vliw_insn *);
    557      1.1     skrll static void xg_free_vinsn (vliw_insn *);
    558      1.1     skrll static bfd_boolean vinsn_to_insnbuf
    559      1.1     skrll   (vliw_insn *, char *, fragS *, bfd_boolean);
    560      1.1     skrll static void vinsn_from_chars (vliw_insn *, char *);
    561      1.1     skrll 
    562      1.1     skrll /* Expression Utilities.  */
    563      1.1     skrll 
    564      1.1     skrll bfd_boolean expr_is_const (const expressionS *);
    565      1.1     skrll offsetT get_expr_const (const expressionS *);
    566      1.1     skrll void set_expr_const (expressionS *, offsetT);
    567      1.1     skrll bfd_boolean expr_is_register (const expressionS *);
    568      1.1     skrll offsetT get_expr_register (const expressionS *);
    569      1.1     skrll void set_expr_symbol_offset (expressionS *, symbolS *, offsetT);
    570      1.1     skrll bfd_boolean expr_is_equal (expressionS *, expressionS *);
    571      1.1     skrll static void copy_expr (expressionS *, const expressionS *);
    572      1.1     skrll 
    573      1.1     skrll /* Section renaming.  */
    574      1.1     skrll 
    575      1.1     skrll static void build_section_rename (const char *);
    576      1.1     skrll 
    577      1.1     skrll 
    578      1.1     skrll /* ISA imported from bfd.  */
    579      1.1     skrll extern xtensa_isa xtensa_default_isa;
    580      1.1     skrll 
    581      1.1     skrll extern int target_big_endian;
    582      1.1     skrll 
    583      1.1     skrll static xtensa_opcode xtensa_addi_opcode;
    584      1.1     skrll static xtensa_opcode xtensa_addmi_opcode;
    585      1.1     skrll static xtensa_opcode xtensa_call0_opcode;
    586      1.1     skrll static xtensa_opcode xtensa_call4_opcode;
    587      1.1     skrll static xtensa_opcode xtensa_call8_opcode;
    588      1.1     skrll static xtensa_opcode xtensa_call12_opcode;
    589      1.1     skrll static xtensa_opcode xtensa_callx0_opcode;
    590      1.1     skrll static xtensa_opcode xtensa_callx4_opcode;
    591      1.1     skrll static xtensa_opcode xtensa_callx8_opcode;
    592      1.1     skrll static xtensa_opcode xtensa_callx12_opcode;
    593      1.1     skrll static xtensa_opcode xtensa_const16_opcode;
    594      1.1     skrll static xtensa_opcode xtensa_entry_opcode;
    595      1.1     skrll static xtensa_opcode xtensa_extui_opcode;
    596      1.1     skrll static xtensa_opcode xtensa_movi_opcode;
    597      1.1     skrll static xtensa_opcode xtensa_movi_n_opcode;
    598      1.1     skrll static xtensa_opcode xtensa_isync_opcode;
    599  1.1.1.2  christos static xtensa_opcode xtensa_j_opcode;
    600      1.1     skrll static xtensa_opcode xtensa_jx_opcode;
    601      1.1     skrll static xtensa_opcode xtensa_l32r_opcode;
    602      1.1     skrll static xtensa_opcode xtensa_loop_opcode;
    603      1.1     skrll static xtensa_opcode xtensa_loopnez_opcode;
    604      1.1     skrll static xtensa_opcode xtensa_loopgtz_opcode;
    605      1.1     skrll static xtensa_opcode xtensa_nop_opcode;
    606      1.1     skrll static xtensa_opcode xtensa_nop_n_opcode;
    607      1.1     skrll static xtensa_opcode xtensa_or_opcode;
    608      1.1     skrll static xtensa_opcode xtensa_ret_opcode;
    609      1.1     skrll static xtensa_opcode xtensa_ret_n_opcode;
    610      1.1     skrll static xtensa_opcode xtensa_retw_opcode;
    611      1.1     skrll static xtensa_opcode xtensa_retw_n_opcode;
    612      1.1     skrll static xtensa_opcode xtensa_rsr_lcount_opcode;
    613      1.1     skrll static xtensa_opcode xtensa_waiti_opcode;
    614  1.1.1.2  christos static int config_max_slots = 0;
    615      1.1     skrll 
    616      1.1     skrll 
    617      1.1     skrll /* Command-line Options.  */
    619      1.1     skrll 
    620  1.1.1.2  christos bfd_boolean use_literal_section = TRUE;
    621      1.1     skrll enum flix_level produce_flix = FLIX_ALL;
    622      1.1     skrll static bfd_boolean align_targets = TRUE;
    623      1.1     skrll static bfd_boolean warn_unaligned_branch_targets = FALSE;
    624      1.1     skrll static bfd_boolean has_a0_b_retw = FALSE;
    625      1.1     skrll static bfd_boolean workaround_a0_b_retw = FALSE;
    626      1.1     skrll static bfd_boolean workaround_b_j_loop_end = FALSE;
    627      1.1     skrll static bfd_boolean workaround_short_loop = FALSE;
    628      1.1     skrll static bfd_boolean maybe_has_short_loop = FALSE;
    629      1.1     skrll static bfd_boolean workaround_close_loop_end = FALSE;
    630      1.1     skrll static bfd_boolean maybe_has_close_loop_end = FALSE;
    631  1.1.1.8  christos static bfd_boolean enforce_three_byte_loop_align = FALSE;
    632      1.1     skrll static bfd_boolean opt_linkrelax = TRUE;
    633      1.1     skrll 
    634      1.1     skrll /* When workaround_short_loops is TRUE, all loops with early exits must
    635      1.1     skrll    have at least 3 instructions.  workaround_all_short_loops is a modifier
    636      1.1     skrll    to the workaround_short_loop flag.  In addition to the
    637      1.1     skrll    workaround_short_loop actions, all straightline loopgtz and loopnez
    638      1.1     skrll    must have at least 3 instructions.  */
    639      1.1     skrll 
    640      1.1     skrll static bfd_boolean workaround_all_short_loops = FALSE;
    641  1.1.1.7  christos 
    642  1.1.1.7  christos /* Generate individual property section for every section.
    643  1.1.1.7  christos    This option is defined in BDF library.  */
    644      1.1     skrll extern bfd_boolean elf32xtensa_separate_props;
    645      1.1     skrll 
    646      1.1     skrll static void
    647      1.1     skrll xtensa_setup_hw_workarounds (int earliest, int latest)
    648      1.1     skrll {
    649      1.1     skrll   if (earliest > latest)
    650      1.1     skrll     as_fatal (_("illegal range of target hardware versions"));
    651      1.1     skrll 
    652      1.1     skrll   /* Enable all workarounds for pre-T1050.0 hardware.  */
    653      1.1     skrll   if (earliest < 105000 || latest < 105000)
    654      1.1     skrll     {
    655      1.1     skrll       workaround_a0_b_retw |= TRUE;
    656      1.1     skrll       workaround_b_j_loop_end |= TRUE;
    657      1.1     skrll       workaround_short_loop |= TRUE;
    658      1.1     skrll       workaround_close_loop_end |= TRUE;
    659      1.1     skrll       workaround_all_short_loops |= TRUE;
    660      1.1     skrll       enforce_three_byte_loop_align = TRUE;
    661      1.1     skrll     }
    662      1.1     skrll }
    663      1.1     skrll 
    664      1.1     skrll 
    665      1.1     skrll enum
    666      1.1     skrll {
    667      1.1     skrll   option_density = OPTION_MD_BASE,
    668      1.1     skrll   option_no_density,
    669  1.1.1.2  christos 
    670  1.1.1.2  christos   option_flix,
    671  1.1.1.2  christos   option_no_generate_flix,
    672  1.1.1.2  christos   option_no_flix,
    673      1.1     skrll 
    674      1.1     skrll   option_relax,
    675      1.1     skrll   option_no_relax,
    676      1.1     skrll 
    677      1.1     skrll   option_link_relax,
    678      1.1     skrll   option_no_link_relax,
    679      1.1     skrll 
    680      1.1     skrll   option_generics,
    681      1.1     skrll   option_no_generics,
    682      1.1     skrll 
    683      1.1     skrll   option_transform,
    684      1.1     skrll   option_no_transform,
    685      1.1     skrll 
    686      1.1     skrll   option_text_section_literals,
    687      1.1     skrll   option_no_text_section_literals,
    688      1.1     skrll 
    689      1.1     skrll   option_absolute_literals,
    690      1.1     skrll   option_no_absolute_literals,
    691      1.1     skrll 
    692      1.1     skrll   option_align_targets,
    693      1.1     skrll   option_no_align_targets,
    694      1.1     skrll 
    695      1.1     skrll   option_warn_unaligned_targets,
    696      1.1     skrll 
    697      1.1     skrll   option_longcalls,
    698      1.1     skrll   option_no_longcalls,
    699      1.1     skrll 
    700      1.1     skrll   option_workaround_a0_b_retw,
    701      1.1     skrll   option_no_workaround_a0_b_retw,
    702      1.1     skrll 
    703      1.1     skrll   option_workaround_b_j_loop_end,
    704      1.1     skrll   option_no_workaround_b_j_loop_end,
    705      1.1     skrll 
    706      1.1     skrll   option_workaround_short_loop,
    707      1.1     skrll   option_no_workaround_short_loop,
    708      1.1     skrll 
    709      1.1     skrll   option_workaround_all_short_loops,
    710      1.1     skrll   option_no_workaround_all_short_loops,
    711      1.1     skrll 
    712      1.1     skrll   option_workaround_close_loop_end,
    713      1.1     skrll   option_no_workaround_close_loop_end,
    714      1.1     skrll 
    715      1.1     skrll   option_no_workarounds,
    716      1.1     skrll 
    717      1.1     skrll   option_rename_section_name,
    718      1.1     skrll 
    719      1.1     skrll   option_prefer_l32r,
    720      1.1     skrll   option_prefer_const16,
    721  1.1.1.4  christos 
    722  1.1.1.4  christos   option_target_hardware,
    723  1.1.1.4  christos 
    724  1.1.1.4  christos   option_trampolines,
    725  1.1.1.4  christos   option_no_trampolines,
    726  1.1.1.4  christos 
    727  1.1.1.4  christos   option_auto_litpools,
    728  1.1.1.4  christos   option_no_auto_litpools,
    729  1.1.1.7  christos   option_auto_litpool_limit,
    730  1.1.1.7  christos 
    731  1.1.1.7  christos   option_separate_props,
    732      1.1     skrll   option_no_separate_props,
    733      1.1     skrll };
    734      1.1     skrll 
    735      1.1     skrll const char *md_shortopts = "";
    736      1.1     skrll 
    737      1.1     skrll struct option md_longopts[] =
    738      1.1     skrll {
    739      1.1     skrll   { "density", no_argument, NULL, option_density },
    740      1.1     skrll   { "no-density", no_argument, NULL, option_no_density },
    741  1.1.1.2  christos 
    742  1.1.1.2  christos   { "flix", no_argument, NULL, option_flix },
    743  1.1.1.2  christos   { "no-generate-flix", no_argument, NULL, option_no_generate_flix },
    744  1.1.1.2  christos   { "no-allow-flix", no_argument, NULL, option_no_flix },
    745      1.1     skrll 
    746      1.1     skrll   /* Both "relax" and "generics" are deprecated and treated as equivalent
    747      1.1     skrll      to the "transform" option.  */
    748      1.1     skrll   { "relax", no_argument, NULL, option_relax },
    749      1.1     skrll   { "no-relax", no_argument, NULL, option_no_relax },
    750      1.1     skrll   { "generics", no_argument, NULL, option_generics },
    751      1.1     skrll   { "no-generics", no_argument, NULL, option_no_generics },
    752      1.1     skrll 
    753      1.1     skrll   { "transform", no_argument, NULL, option_transform },
    754      1.1     skrll   { "no-transform", no_argument, NULL, option_no_transform },
    755      1.1     skrll   { "text-section-literals", no_argument, NULL, option_text_section_literals },
    756      1.1     skrll   { "no-text-section-literals", no_argument, NULL,
    757      1.1     skrll     option_no_text_section_literals },
    758      1.1     skrll   { "absolute-literals", no_argument, NULL, option_absolute_literals },
    759      1.1     skrll   { "no-absolute-literals", no_argument, NULL, option_no_absolute_literals },
    760      1.1     skrll   /* This option was changed from -align-target to -target-align
    761      1.1     skrll      because it conflicted with the "-al" option.  */
    762      1.1     skrll   { "target-align", no_argument, NULL, option_align_targets },
    763      1.1     skrll   { "no-target-align", no_argument, NULL, option_no_align_targets },
    764      1.1     skrll   { "warn-unaligned-targets", no_argument, NULL,
    765      1.1     skrll     option_warn_unaligned_targets },
    766      1.1     skrll   { "longcalls", no_argument, NULL, option_longcalls },
    767      1.1     skrll   { "no-longcalls", no_argument, NULL, option_no_longcalls },
    768      1.1     skrll 
    769      1.1     skrll   { "no-workaround-a0-b-retw", no_argument, NULL,
    770      1.1     skrll     option_no_workaround_a0_b_retw },
    771      1.1     skrll   { "workaround-a0-b-retw", no_argument, NULL, option_workaround_a0_b_retw },
    772      1.1     skrll 
    773      1.1     skrll   { "no-workaround-b-j-loop-end", no_argument, NULL,
    774      1.1     skrll     option_no_workaround_b_j_loop_end },
    775      1.1     skrll   { "workaround-b-j-loop-end", no_argument, NULL,
    776      1.1     skrll     option_workaround_b_j_loop_end },
    777      1.1     skrll 
    778      1.1     skrll   { "no-workaround-short-loops", no_argument, NULL,
    779      1.1     skrll     option_no_workaround_short_loop },
    780      1.1     skrll   { "workaround-short-loops", no_argument, NULL,
    781      1.1     skrll     option_workaround_short_loop },
    782      1.1     skrll 
    783      1.1     skrll   { "no-workaround-all-short-loops", no_argument, NULL,
    784      1.1     skrll     option_no_workaround_all_short_loops },
    785      1.1     skrll   { "workaround-all-short-loop", no_argument, NULL,
    786      1.1     skrll     option_workaround_all_short_loops },
    787      1.1     skrll 
    788      1.1     skrll   { "prefer-l32r", no_argument, NULL, option_prefer_l32r },
    789      1.1     skrll   { "prefer-const16", no_argument, NULL, option_prefer_const16 },
    790      1.1     skrll 
    791      1.1     skrll   { "no-workarounds", no_argument, NULL, option_no_workarounds },
    792      1.1     skrll 
    793      1.1     skrll   { "no-workaround-close-loop-end", no_argument, NULL,
    794      1.1     skrll     option_no_workaround_close_loop_end },
    795      1.1     skrll   { "workaround-close-loop-end", no_argument, NULL,
    796      1.1     skrll     option_workaround_close_loop_end },
    797      1.1     skrll 
    798      1.1     skrll   { "rename-section", required_argument, NULL, option_rename_section_name },
    799      1.1     skrll 
    800      1.1     skrll   { "link-relax", no_argument, NULL, option_link_relax },
    801      1.1     skrll   { "no-link-relax", no_argument, NULL, option_no_link_relax },
    802      1.1     skrll 
    803      1.1     skrll   { "target-hardware", required_argument, NULL, option_target_hardware },
    804  1.1.1.4  christos 
    805  1.1.1.4  christos   { "trampolines", no_argument, NULL, option_trampolines },
    806  1.1.1.4  christos   { "no-trampolines", no_argument, NULL, option_no_trampolines },
    807  1.1.1.4  christos 
    808  1.1.1.4  christos   { "auto-litpools", no_argument, NULL, option_auto_litpools },
    809  1.1.1.4  christos   { "no-auto-litpools", no_argument, NULL, option_no_auto_litpools },
    810  1.1.1.4  christos   { "auto-litpool-limit", required_argument, NULL, option_auto_litpool_limit },
    811  1.1.1.7  christos 
    812  1.1.1.7  christos   { "separate-prop-tables", no_argument, NULL, option_separate_props },
    813      1.1     skrll 
    814      1.1     skrll   { NULL, no_argument, NULL, 0 }
    815      1.1     skrll };
    816      1.1     skrll 
    817      1.1     skrll size_t md_longopts_size = sizeof md_longopts;
    818      1.1     skrll 
    819      1.1     skrll 
    820  1.1.1.5  christos int
    821      1.1     skrll md_parse_option (int c, const char *arg)
    822      1.1     skrll {
    823      1.1     skrll   switch (c)
    824      1.1     skrll     {
    825      1.1     skrll     case option_density:
    826      1.1     skrll       as_warn (_("--density option is ignored"));
    827      1.1     skrll       return 1;
    828      1.1     skrll     case option_no_density:
    829      1.1     skrll       as_warn (_("--no-density option is ignored"));
    830      1.1     skrll       return 1;
    831  1.1.1.8  christos     case option_link_relax:
    832      1.1     skrll       opt_linkrelax = TRUE;
    833      1.1     skrll       return 1;
    834  1.1.1.8  christos     case option_no_link_relax:
    835      1.1     skrll       opt_linkrelax = FALSE;
    836  1.1.1.2  christos       return 1;
    837  1.1.1.2  christos     case option_flix:
    838  1.1.1.2  christos       produce_flix = FLIX_ALL;
    839  1.1.1.2  christos       return 1;
    840  1.1.1.2  christos     case option_no_generate_flix:
    841  1.1.1.2  christos       produce_flix = FLIX_NO_GENERATE;
    842  1.1.1.2  christos       return 1;
    843  1.1.1.2  christos     case option_no_flix:
    844  1.1.1.2  christos       produce_flix = FLIX_NONE;
    845      1.1     skrll       return 1;
    846      1.1     skrll     case option_generics:
    847      1.1     skrll       as_warn (_("--generics is deprecated; use --transform instead"));
    848      1.1     skrll       return md_parse_option (option_transform, arg);
    849      1.1     skrll     case option_no_generics:
    850      1.1     skrll       as_warn (_("--no-generics is deprecated; use --no-transform instead"));
    851      1.1     skrll       return md_parse_option (option_no_transform, arg);
    852      1.1     skrll     case option_relax:
    853      1.1     skrll       as_warn (_("--relax is deprecated; use --transform instead"));
    854      1.1     skrll       return md_parse_option (option_transform, arg);
    855      1.1     skrll     case option_no_relax:
    856      1.1     skrll       as_warn (_("--no-relax is deprecated; use --no-transform instead"));
    857      1.1     skrll       return md_parse_option (option_no_transform, arg);
    858      1.1     skrll     case option_longcalls:
    859      1.1     skrll       directive_state[directive_longcalls] = TRUE;
    860      1.1     skrll       return 1;
    861      1.1     skrll     case option_no_longcalls:
    862      1.1     skrll       directive_state[directive_longcalls] = FALSE;
    863      1.1     skrll       return 1;
    864      1.1     skrll     case option_text_section_literals:
    865      1.1     skrll       use_literal_section = FALSE;
    866      1.1     skrll       return 1;
    867      1.1     skrll     case option_no_text_section_literals:
    868      1.1     skrll       use_literal_section = TRUE;
    869      1.1     skrll       return 1;
    870      1.1     skrll     case option_absolute_literals:
    871      1.1     skrll       if (!absolute_literals_supported)
    872      1.1     skrll 	{
    873      1.1     skrll 	  as_fatal (_("--absolute-literals option not supported in this Xtensa configuration"));
    874      1.1     skrll 	  return 0;
    875      1.1     skrll 	}
    876      1.1     skrll       directive_state[directive_absolute_literals] = TRUE;
    877      1.1     skrll       return 1;
    878      1.1     skrll     case option_no_absolute_literals:
    879      1.1     skrll       directive_state[directive_absolute_literals] = FALSE;
    880      1.1     skrll       return 1;
    881      1.1     skrll 
    882      1.1     skrll     case option_workaround_a0_b_retw:
    883      1.1     skrll       workaround_a0_b_retw = TRUE;
    884      1.1     skrll       return 1;
    885      1.1     skrll     case option_no_workaround_a0_b_retw:
    886      1.1     skrll       workaround_a0_b_retw = FALSE;
    887      1.1     skrll       return 1;
    888      1.1     skrll     case option_workaround_b_j_loop_end:
    889      1.1     skrll       workaround_b_j_loop_end = TRUE;
    890      1.1     skrll       return 1;
    891      1.1     skrll     case option_no_workaround_b_j_loop_end:
    892      1.1     skrll       workaround_b_j_loop_end = FALSE;
    893      1.1     skrll       return 1;
    894      1.1     skrll 
    895      1.1     skrll     case option_workaround_short_loop:
    896      1.1     skrll       workaround_short_loop = TRUE;
    897      1.1     skrll       return 1;
    898      1.1     skrll     case option_no_workaround_short_loop:
    899      1.1     skrll       workaround_short_loop = FALSE;
    900      1.1     skrll       return 1;
    901      1.1     skrll 
    902      1.1     skrll     case option_workaround_all_short_loops:
    903      1.1     skrll       workaround_all_short_loops = TRUE;
    904      1.1     skrll       return 1;
    905      1.1     skrll     case option_no_workaround_all_short_loops:
    906      1.1     skrll       workaround_all_short_loops = FALSE;
    907      1.1     skrll       return 1;
    908      1.1     skrll 
    909      1.1     skrll     case option_workaround_close_loop_end:
    910      1.1     skrll       workaround_close_loop_end = TRUE;
    911      1.1     skrll       return 1;
    912      1.1     skrll     case option_no_workaround_close_loop_end:
    913      1.1     skrll       workaround_close_loop_end = FALSE;
    914      1.1     skrll       return 1;
    915      1.1     skrll 
    916      1.1     skrll     case option_no_workarounds:
    917      1.1     skrll       workaround_a0_b_retw = FALSE;
    918      1.1     skrll       workaround_b_j_loop_end = FALSE;
    919      1.1     skrll       workaround_short_loop = FALSE;
    920      1.1     skrll       workaround_all_short_loops = FALSE;
    921      1.1     skrll       workaround_close_loop_end = FALSE;
    922      1.1     skrll       return 1;
    923      1.1     skrll 
    924      1.1     skrll     case option_align_targets:
    925      1.1     skrll       align_targets = TRUE;
    926      1.1     skrll       return 1;
    927      1.1     skrll     case option_no_align_targets:
    928      1.1     skrll       align_targets = FALSE;
    929      1.1     skrll       return 1;
    930      1.1     skrll 
    931      1.1     skrll     case option_warn_unaligned_targets:
    932      1.1     skrll       warn_unaligned_branch_targets = TRUE;
    933      1.1     skrll       return 1;
    934      1.1     skrll 
    935      1.1     skrll     case option_rename_section_name:
    936      1.1     skrll       build_section_rename (arg);
    937      1.1     skrll       return 1;
    938      1.1     skrll 
    939      1.1     skrll     case 'Q':
    940      1.1     skrll       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
    941      1.1     skrll          should be emitted or not.  FIXME: Not implemented.  */
    942      1.1     skrll       return 1;
    943      1.1     skrll 
    944      1.1     skrll     case option_prefer_l32r:
    945      1.1     skrll       if (prefer_const16)
    946      1.1     skrll 	as_fatal (_("prefer-l32r conflicts with prefer-const16"));
    947      1.1     skrll       prefer_l32r = 1;
    948      1.1     skrll       return 1;
    949      1.1     skrll 
    950      1.1     skrll     case option_prefer_const16:
    951      1.1     skrll       if (prefer_l32r)
    952      1.1     skrll 	as_fatal (_("prefer-const16 conflicts with prefer-l32r"));
    953      1.1     skrll       prefer_const16 = 1;
    954      1.1     skrll       return 1;
    955      1.1     skrll 
    956      1.1     skrll     case option_target_hardware:
    957      1.1     skrll       {
    958  1.1.1.5  christos 	int earliest, latest = 0;
    959      1.1     skrll 	char *end;
    960      1.1     skrll 	if (*arg == 0 || *arg == '-')
    961      1.1     skrll 	  as_fatal (_("invalid target hardware version"));
    962  1.1.1.5  christos 
    963      1.1     skrll 	earliest = strtol (arg, &end, 0);
    964  1.1.1.5  christos 
    965      1.1     skrll 	if (*end == 0)
    966  1.1.1.5  christos 	  latest = earliest;
    967      1.1     skrll 	else if (*end == '-')
    968  1.1.1.5  christos 	  {
    969      1.1     skrll 	    if (*++end == 0)
    970  1.1.1.5  christos 	      as_fatal (_("invalid target hardware version"));
    971      1.1     skrll 	    latest = strtol (end, &end, 0);
    972  1.1.1.5  christos 	  }
    973      1.1     skrll 	if (*end != 0)
    974      1.1     skrll 	  as_fatal (_("invalid target hardware version"));
    975      1.1     skrll 
    976      1.1     skrll 	xtensa_setup_hw_workarounds (earliest, latest);
    977      1.1     skrll 	return 1;
    978      1.1     skrll       }
    979      1.1     skrll 
    980      1.1     skrll     case option_transform:
    981      1.1     skrll       /* This option has no affect other than to use the defaults,
    982      1.1     skrll 	 which are already set.  */
    983      1.1     skrll       return 1;
    984      1.1     skrll 
    985      1.1     skrll     case option_no_transform:
    986      1.1     skrll       /* This option turns off all transformations of any kind.
    987      1.1     skrll 	 However, because we want to preserve the state of other
    988      1.1     skrll 	 directives, we only change its own field.  Thus, before
    989      1.1     skrll 	 you perform any transformation, always check if transform
    990      1.1     skrll 	 is available.  If you use the functions we provide for this
    991      1.1     skrll 	 purpose, you will be ok.  */
    992      1.1     skrll       directive_state[directive_transform] = FALSE;
    993      1.1     skrll       return 1;
    994  1.1.1.4  christos 
    995  1.1.1.4  christos     case option_trampolines:
    996  1.1.1.4  christos       use_trampolines = TRUE;
    997  1.1.1.4  christos       return 1;
    998  1.1.1.4  christos 
    999  1.1.1.4  christos     case option_no_trampolines:
   1000  1.1.1.4  christos       use_trampolines = FALSE;
   1001  1.1.1.4  christos       return 1;
   1002  1.1.1.4  christos 
   1003  1.1.1.4  christos     case option_auto_litpools:
   1004  1.1.1.4  christos       auto_litpools = TRUE;
   1005  1.1.1.7  christos       use_literal_section = FALSE;
   1006  1.1.1.7  christos       if (auto_litpool_limit <= 0)
   1007  1.1.1.4  christos 	auto_litpool_limit = MAX_AUTO_POOL_LITERALS / 2;
   1008  1.1.1.4  christos       return 1;
   1009  1.1.1.4  christos 
   1010  1.1.1.4  christos     case option_no_auto_litpools:
   1011  1.1.1.4  christos       auto_litpools = FALSE;
   1012  1.1.1.4  christos       auto_litpool_limit = -1;
   1013  1.1.1.4  christos       return 1;
   1014  1.1.1.4  christos 
   1015  1.1.1.4  christos     case option_auto_litpool_limit:
   1016  1.1.1.4  christos       {
   1017  1.1.1.5  christos 	int value = 0;
   1018  1.1.1.4  christos 	char *end;
   1019  1.1.1.4  christos 	if (auto_litpool_limit < 0)
   1020  1.1.1.4  christos 	  as_fatal (_("no-auto-litpools is incompatible with auto-litpool-limit"));
   1021  1.1.1.4  christos 	if (*arg == 0 || *arg == '-')
   1022  1.1.1.5  christos 	  as_fatal (_("invalid auto-litpool-limit argument"));
   1023  1.1.1.5  christos 	value = strtol (arg, &end, 10);
   1024  1.1.1.4  christos 	if (*end != 0)
   1025  1.1.1.4  christos 	  as_fatal (_("invalid auto-litpool-limit argument"));
   1026  1.1.1.4  christos 	if (value < 100 || value > 10000)
   1027  1.1.1.4  christos 	  as_fatal (_("invalid auto-litpool-limit argument (range is 100-10000)"));
   1028  1.1.1.4  christos 	auto_litpool_limit = value;
   1029  1.1.1.4  christos 	auto_litpools = TRUE;
   1030  1.1.1.4  christos 	use_literal_section = FALSE;
   1031  1.1.1.4  christos 	return 1;
   1032  1.1.1.4  christos       }
   1033  1.1.1.7  christos 
   1034  1.1.1.7  christos     case option_separate_props:
   1035  1.1.1.7  christos       elf32xtensa_separate_props = TRUE;
   1036  1.1.1.7  christos       return 1;
   1037  1.1.1.7  christos 
   1038  1.1.1.7  christos     case option_no_separate_props:
   1039  1.1.1.7  christos       elf32xtensa_separate_props = FALSE;
   1040  1.1.1.7  christos       return 1;
   1041      1.1     skrll 
   1042      1.1     skrll     default:
   1043      1.1     skrll       return 0;
   1044      1.1     skrll     }
   1045      1.1     skrll }
   1046      1.1     skrll 
   1047      1.1     skrll 
   1048      1.1     skrll void
   1049      1.1     skrll md_show_usage (FILE *stream)
   1050      1.1     skrll {
   1051      1.1     skrll   fputs ("\n\
   1052      1.1     skrll Xtensa options:\n\
   1053      1.1     skrll   --[no-]text-section-literals\n\
   1054      1.1     skrll                           [Do not] put literals in the text section\n\
   1055      1.1     skrll   --[no-]absolute-literals\n\
   1056      1.1     skrll                           [Do not] default to use non-PC-relative literals\n\
   1057      1.1     skrll   --[no-]target-align     [Do not] try to align branch targets\n\
   1058      1.1     skrll   --[no-]longcalls        [Do not] emit 32-bit call sequences\n\
   1059  1.1.1.2  christos   --[no-]transform        [Do not] transform instructions\n\
   1060  1.1.1.2  christos   --flix                  both allow hand-written and generate flix bundles\n\
   1061  1.1.1.2  christos   --no-generate-flix      allow hand-written but do not generate\n\
   1062  1.1.1.2  christos                           flix bundles\n\
   1063  1.1.1.2  christos   --no-allow-flix         neither allow hand-written nor generate\n\
   1064  1.1.1.4  christos                           flix bundles\n\
   1065  1.1.1.4  christos   --rename-section old=new Rename section 'old' to 'new'\n\
   1066  1.1.1.4  christos   --[no-]trampolines      [Do not] generate trampolines (jumps to jumps)\n\
   1067  1.1.1.4  christos                           when jumps do not reach their targets\n\
   1068  1.1.1.4  christos   --[no-]auto-litpools    [Do not] automatically create literal pools\n\
   1069  1.1.1.4  christos   --auto-litpool-limit=<value>\n\
   1070  1.1.1.4  christos                           (range 100-10000) Maximum number of blocks of\n\
   1071  1.1.1.7  christos                           instructions to emit between literal pool\n\
   1072  1.1.1.7  christos                           locations; implies --auto-litpools flag\n\
   1073  1.1.1.7  christos   --[no-]separate-prop-tables\n\
   1074  1.1.1.7  christos                           [Do not] place Xtensa property records into\n\
   1075  1.1.1.7  christos                           individual property sections for each section.\n\
   1076      1.1     skrll                           Default is to generate single property section.\n", stream);
   1077      1.1     skrll }
   1078      1.1     skrll 
   1079      1.1     skrll 
   1080      1.1     skrll /* Functions related to the list of current label symbols.  */
   1082      1.1     skrll 
   1083      1.1     skrll static void
   1084      1.1     skrll xtensa_add_insn_label (symbolS *sym)
   1085      1.1     skrll {
   1086      1.1     skrll   sym_list *l;
   1087  1.1.1.5  christos 
   1088      1.1     skrll   if (!free_insn_labels)
   1089      1.1     skrll     l = XNEW (sym_list);
   1090      1.1     skrll   else
   1091      1.1     skrll     {
   1092      1.1     skrll       l = free_insn_labels;
   1093      1.1     skrll       free_insn_labels = l->next;
   1094      1.1     skrll     }
   1095      1.1     skrll 
   1096      1.1     skrll   l->sym = sym;
   1097      1.1     skrll   l->next = insn_labels;
   1098      1.1     skrll   insn_labels = l;
   1099      1.1     skrll }
   1100      1.1     skrll 
   1101      1.1     skrll 
   1102      1.1     skrll static void
   1103      1.1     skrll xtensa_clear_insn_labels (void)
   1104      1.1     skrll {
   1105      1.1     skrll   sym_list **pl;
   1106      1.1     skrll 
   1107      1.1     skrll   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
   1108      1.1     skrll     ;
   1109      1.1     skrll   *pl = insn_labels;
   1110      1.1     skrll   insn_labels = NULL;
   1111      1.1     skrll }
   1112      1.1     skrll 
   1113      1.1     skrll 
   1114      1.1     skrll static void
   1115      1.1     skrll xtensa_move_labels (fragS *new_frag, valueT new_offset)
   1116      1.1     skrll {
   1117      1.1     skrll   sym_list *lit;
   1118      1.1     skrll 
   1119      1.1     skrll   for (lit = insn_labels; lit; lit = lit->next)
   1120      1.1     skrll     {
   1121      1.1     skrll       symbolS *lit_sym = lit->sym;
   1122      1.1     skrll       S_SET_VALUE (lit_sym, new_offset);
   1123      1.1     skrll       symbol_set_frag (lit_sym, new_frag);
   1124      1.1     skrll     }
   1125      1.1     skrll }
   1126      1.1     skrll 
   1127      1.1     skrll 
   1128      1.1     skrll /* Directive data and functions.  */
   1130      1.1     skrll 
   1131      1.1     skrll typedef struct state_stackS_struct
   1132      1.1     skrll {
   1133      1.1     skrll   directiveE directive;
   1134      1.1     skrll   bfd_boolean negated;
   1135      1.1     skrll   bfd_boolean old_state;
   1136      1.1     skrll   const char *file;
   1137      1.1     skrll   unsigned int line;
   1138      1.1     skrll   const void *datum;
   1139      1.1     skrll   struct state_stackS_struct *prev;
   1140      1.1     skrll } state_stackS;
   1141      1.1     skrll 
   1142      1.1     skrll state_stackS *directive_state_stack;
   1143      1.1     skrll 
   1144      1.1     skrll const pseudo_typeS md_pseudo_table[] =
   1145      1.1     skrll {
   1146      1.1     skrll   { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0).  */
   1147      1.1     skrll   { "literal_position", xtensa_literal_position, 0 },
   1148      1.1     skrll   { "frame", s_ignore, 0 },	/* Formerly used for STABS debugging.  */
   1149      1.1     skrll   { "long", xtensa_elf_cons, 4 },
   1150      1.1     skrll   { "word", xtensa_elf_cons, 4 },
   1151      1.1     skrll   { "4byte", xtensa_elf_cons, 4 },
   1152      1.1     skrll   { "short", xtensa_elf_cons, 2 },
   1153      1.1     skrll   { "2byte", xtensa_elf_cons, 2 },
   1154      1.1     skrll   { "sleb128", xtensa_leb128, 1},
   1155      1.1     skrll   { "uleb128", xtensa_leb128, 0},
   1156      1.1     skrll   { "begin", xtensa_begin_directive, 0 },
   1157      1.1     skrll   { "end", xtensa_end_directive, 0 },
   1158      1.1     skrll   { "literal", xtensa_literal_pseudo, 0 },
   1159      1.1     skrll   { "frequency", xtensa_frequency_pseudo, 0 },
   1160      1.1     skrll   { NULL, 0, 0 },
   1161      1.1     skrll };
   1162      1.1     skrll 
   1163      1.1     skrll 
   1164      1.1     skrll static bfd_boolean
   1165      1.1     skrll use_transform (void)
   1166  1.1.1.2  christos {
   1167      1.1     skrll   /* After md_end, you should be checking frag by frag, rather
   1168      1.1     skrll      than state directives.  */
   1169      1.1     skrll   gas_assert (!past_xtensa_end);
   1170      1.1     skrll   return directive_state[directive_transform];
   1171      1.1     skrll }
   1172      1.1     skrll 
   1173      1.1     skrll 
   1174      1.1     skrll static bfd_boolean
   1175      1.1     skrll do_align_targets (void)
   1176      1.1     skrll {
   1177  1.1.1.2  christos   /* Do not use this function after md_end; just look at align_targets
   1178      1.1     skrll      instead.  There is no target-align directive, so alignment is either
   1179      1.1     skrll      enabled for all frags or not done at all.  */
   1180      1.1     skrll   gas_assert (!past_xtensa_end);
   1181      1.1     skrll   return align_targets && use_transform ();
   1182      1.1     skrll }
   1183      1.1     skrll 
   1184      1.1     skrll 
   1185  1.1.1.5  christos static void
   1186      1.1     skrll directive_push (directiveE directive, bfd_boolean negated, const void *datum)
   1187  1.1.1.5  christos {
   1188      1.1     skrll   const char *file;
   1189  1.1.1.5  christos   unsigned int line;
   1190      1.1     skrll   state_stackS *stack = XNEW (state_stackS);
   1191      1.1     skrll 
   1192      1.1     skrll   file = as_where (&line);
   1193      1.1     skrll 
   1194      1.1     skrll   stack->directive = directive;
   1195      1.1     skrll   stack->negated = negated;
   1196      1.1     skrll   stack->old_state = directive_state[directive];
   1197      1.1     skrll   stack->file = file;
   1198      1.1     skrll   stack->line = line;
   1199      1.1     skrll   stack->datum = datum;
   1200      1.1     skrll   stack->prev = directive_state_stack;
   1201      1.1     skrll   directive_state_stack = stack;
   1202      1.1     skrll 
   1203      1.1     skrll   directive_state[directive] = !negated;
   1204      1.1     skrll }
   1205      1.1     skrll 
   1206      1.1     skrll 
   1207      1.1     skrll static void
   1208      1.1     skrll directive_pop (directiveE *directive,
   1209      1.1     skrll 	       bfd_boolean *negated,
   1210      1.1     skrll 	       const char **file,
   1211      1.1     skrll 	       unsigned int *line,
   1212      1.1     skrll 	       const void **datum)
   1213      1.1     skrll {
   1214      1.1     skrll   state_stackS *top = directive_state_stack;
   1215  1.1.1.6  christos 
   1216      1.1     skrll   if (!directive_state_stack)
   1217      1.1     skrll     {
   1218      1.1     skrll       as_bad (_("unmatched .end directive"));
   1219      1.1     skrll       *directive = directive_none;
   1220      1.1     skrll       return;
   1221      1.1     skrll     }
   1222      1.1     skrll 
   1223      1.1     skrll   directive_state[directive_state_stack->directive] = top->old_state;
   1224      1.1     skrll   *directive = top->directive;
   1225      1.1     skrll   *negated = top->negated;
   1226      1.1     skrll   *file = top->file;
   1227      1.1     skrll   *line = top->line;
   1228      1.1     skrll   *datum = top->datum;
   1229      1.1     skrll   directive_state_stack = top->prev;
   1230      1.1     skrll   free (top);
   1231      1.1     skrll }
   1232      1.1     skrll 
   1233      1.1     skrll 
   1234      1.1     skrll static void
   1235      1.1     skrll directive_balance (void)
   1236      1.1     skrll {
   1237      1.1     skrll   while (directive_state_stack)
   1238      1.1     skrll     {
   1239      1.1     skrll       directiveE directive;
   1240      1.1     skrll       bfd_boolean negated;
   1241      1.1     skrll       const char *file;
   1242      1.1     skrll       unsigned int line;
   1243      1.1     skrll       const void *datum;
   1244      1.1     skrll 
   1245      1.1     skrll       directive_pop (&directive, &negated, &file, &line, &datum);
   1246      1.1     skrll       as_warn_where ((char *) file, line,
   1247      1.1     skrll 		     _(".begin directive with no matching .end directive"));
   1248      1.1     skrll     }
   1249      1.1     skrll }
   1250      1.1     skrll 
   1251      1.1     skrll 
   1252      1.1     skrll static bfd_boolean
   1253      1.1     skrll inside_directive (directiveE dir)
   1254      1.1     skrll {
   1255      1.1     skrll   state_stackS *top = directive_state_stack;
   1256      1.1     skrll 
   1257      1.1     skrll   while (top && top->directive != dir)
   1258      1.1     skrll     top = top->prev;
   1259      1.1     skrll 
   1260      1.1     skrll   return (top != NULL);
   1261      1.1     skrll }
   1262      1.1     skrll 
   1263      1.1     skrll 
   1264      1.1     skrll static void
   1265      1.1     skrll get_directive (directiveE *directive, bfd_boolean *negated)
   1266  1.1.1.5  christos {
   1267      1.1     skrll   int len;
   1268      1.1     skrll   unsigned i;
   1269      1.1     skrll   const char *directive_string;
   1270      1.1     skrll 
   1271      1.1     skrll   if (strncmp (input_line_pointer, "no-", 3) != 0)
   1272      1.1     skrll     *negated = FALSE;
   1273      1.1     skrll   else
   1274      1.1     skrll     {
   1275      1.1     skrll       *negated = TRUE;
   1276      1.1     skrll       input_line_pointer += 3;
   1277      1.1     skrll     }
   1278      1.1     skrll 
   1279      1.1     skrll   len = strspn (input_line_pointer,
   1280      1.1     skrll 		"abcdefghijklmnopqrstuvwxyz_-/0123456789.");
   1281      1.1     skrll 
   1282      1.1     skrll   /* This code is a hack to make .begin [no-][generics|relax] exactly
   1283      1.1     skrll      equivalent to .begin [no-]transform.  We should remove it when
   1284      1.1     skrll      we stop accepting those options.  */
   1285      1.1     skrll 
   1286      1.1     skrll   if (strncmp (input_line_pointer, "generics", strlen ("generics")) == 0)
   1287      1.1     skrll     {
   1288      1.1     skrll       as_warn (_("[no-]generics is deprecated; use [no-]transform instead"));
   1289      1.1     skrll       directive_string = "transform";
   1290      1.1     skrll     }
   1291      1.1     skrll   else if (strncmp (input_line_pointer, "relax", strlen ("relax")) == 0)
   1292      1.1     skrll     {
   1293      1.1     skrll       as_warn (_("[no-]relax is deprecated; use [no-]transform instead"));
   1294      1.1     skrll       directive_string = "transform";
   1295      1.1     skrll     }
   1296      1.1     skrll   else
   1297      1.1     skrll     directive_string = input_line_pointer;
   1298      1.1     skrll 
   1299      1.1     skrll   for (i = 0; i < sizeof (directive_info) / sizeof (*directive_info); ++i)
   1300      1.1     skrll     {
   1301      1.1     skrll       if (strncmp (directive_string, directive_info[i].name, len) == 0)
   1302      1.1     skrll 	{
   1303      1.1     skrll 	  input_line_pointer += len;
   1304      1.1     skrll 	  *directive = (directiveE) i;
   1305      1.1     skrll 	  if (*negated && !directive_info[i].can_be_negated)
   1306      1.1     skrll 	    as_bad (_("directive %s cannot be negated"),
   1307      1.1     skrll 		    directive_info[i].name);
   1308      1.1     skrll 	  return;
   1309      1.1     skrll 	}
   1310      1.1     skrll     }
   1311      1.1     skrll 
   1312      1.1     skrll   as_bad (_("unknown directive"));
   1313      1.1     skrll   *directive = (directiveE) XTENSA_UNDEFINED;
   1314      1.1     skrll }
   1315      1.1     skrll 
   1316      1.1     skrll 
   1317      1.1     skrll static void
   1318      1.1     skrll xtensa_begin_directive (int ignore ATTRIBUTE_UNUSED)
   1319      1.1     skrll {
   1320      1.1     skrll   directiveE directive;
   1321      1.1     skrll   bfd_boolean negated;
   1322      1.1     skrll   emit_state *state;
   1323      1.1     skrll   lit_state *ls;
   1324      1.1     skrll 
   1325      1.1     skrll   get_directive (&directive, &negated);
   1326      1.1     skrll   if (directive == (directiveE) XTENSA_UNDEFINED)
   1327      1.1     skrll     {
   1328      1.1     skrll       discard_rest_of_line ();
   1329      1.1     skrll       return;
   1330      1.1     skrll     }
   1331      1.1     skrll 
   1332      1.1     skrll   if (cur_vinsn.inside_bundle)
   1333      1.1     skrll     as_bad (_("directives are not valid inside bundles"));
   1334      1.1     skrll 
   1335      1.1     skrll   switch (directive)
   1336      1.1     skrll     {
   1337      1.1     skrll     case directive_literal:
   1338      1.1     skrll       if (!inside_directive (directive_literal))
   1339      1.1     skrll 	{
   1340      1.1     skrll 	  /* Previous labels go with whatever follows this directive, not with
   1341      1.1     skrll 	     the literal, so save them now.  */
   1342      1.1     skrll 	  saved_insn_labels = insn_labels;
   1343  1.1.1.5  christos 	  insn_labels = NULL;
   1344      1.1     skrll 	}
   1345      1.1     skrll       as_warn (_(".begin literal is deprecated; use .literal instead"));
   1346      1.1     skrll       state = XNEW (emit_state);
   1347      1.1     skrll       xtensa_switch_to_literal_fragment (state);
   1348      1.1     skrll       directive_push (directive_literal, negated, state);
   1349      1.1     skrll       break;
   1350      1.1     skrll 
   1351      1.1     skrll     case directive_literal_prefix:
   1352      1.1     skrll       /* Have to flush pending output because a movi relaxed to an l32r
   1353      1.1     skrll 	 might produce a literal.  */
   1354      1.1     skrll       md_flush_pending_output ();
   1355      1.1     skrll       /* Check to see if the current fragment is a literal
   1356      1.1     skrll 	 fragment.  If it is, then this operation is not allowed.  */
   1357      1.1     skrll       if (generating_literals)
   1358      1.1     skrll 	{
   1359      1.1     skrll 	  as_bad (_("cannot set literal_prefix inside literal fragment"));
   1360      1.1     skrll 	  return;
   1361      1.1     skrll 	}
   1362  1.1.1.5  christos 
   1363  1.1.1.2  christos       /* Allocate the literal state for this section and push
   1364      1.1     skrll 	 onto the directive stack.  */
   1365      1.1     skrll       ls = XNEW (lit_state);
   1366      1.1     skrll       gas_assert (ls);
   1367      1.1     skrll 
   1368      1.1     skrll       *ls = default_lit_sections;
   1369      1.1     skrll       directive_push (directive_literal_prefix, negated, ls);
   1370      1.1     skrll 
   1371      1.1     skrll       /* Process the new prefix.  */
   1372      1.1     skrll       xtensa_literal_prefix ();
   1373      1.1     skrll       break;
   1374      1.1     skrll 
   1375      1.1     skrll     case directive_freeregs:
   1376      1.1     skrll       /* This information is currently unused, but we'll accept the statement
   1377      1.1     skrll          and just discard the rest of the line.  This won't check the syntax,
   1378      1.1     skrll          but it will accept every correct freeregs directive.  */
   1379      1.1     skrll       input_line_pointer += strcspn (input_line_pointer, "\n");
   1380      1.1     skrll       directive_push (directive_freeregs, negated, 0);
   1381      1.1     skrll       break;
   1382      1.1     skrll 
   1383      1.1     skrll     case directive_schedule:
   1384      1.1     skrll       md_flush_pending_output ();
   1385      1.1     skrll       frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
   1386      1.1     skrll 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
   1387      1.1     skrll       directive_push (directive_schedule, negated, 0);
   1388      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   1389      1.1     skrll       break;
   1390      1.1     skrll 
   1391      1.1     skrll     case directive_density:
   1392      1.1     skrll       as_warn (_(".begin [no-]density is ignored"));
   1393      1.1     skrll       break;
   1394      1.1     skrll 
   1395      1.1     skrll     case directive_absolute_literals:
   1396      1.1     skrll       md_flush_pending_output ();
   1397      1.1     skrll       if (!absolute_literals_supported && !negated)
   1398      1.1     skrll 	{
   1399      1.1     skrll 	  as_warn (_("Xtensa absolute literals option not supported; ignored"));
   1400      1.1     skrll 	  break;
   1401      1.1     skrll 	}
   1402      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   1403      1.1     skrll       directive_push (directive, negated, 0);
   1404      1.1     skrll       break;
   1405      1.1     skrll 
   1406      1.1     skrll     default:
   1407      1.1     skrll       md_flush_pending_output ();
   1408      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   1409      1.1     skrll       directive_push (directive, negated, 0);
   1410      1.1     skrll       break;
   1411      1.1     skrll     }
   1412      1.1     skrll 
   1413      1.1     skrll   demand_empty_rest_of_line ();
   1414      1.1     skrll }
   1415      1.1     skrll 
   1416      1.1     skrll 
   1417      1.1     skrll static void
   1418      1.1     skrll xtensa_end_directive (int ignore ATTRIBUTE_UNUSED)
   1419      1.1     skrll {
   1420      1.1     skrll   directiveE begin_directive, end_directive;
   1421      1.1     skrll   bfd_boolean begin_negated, end_negated;
   1422      1.1     skrll   const char *file;
   1423      1.1     skrll   unsigned int line;
   1424      1.1     skrll   emit_state *state;
   1425      1.1     skrll   emit_state **state_ptr;
   1426      1.1     skrll   lit_state *s;
   1427      1.1     skrll 
   1428      1.1     skrll   if (cur_vinsn.inside_bundle)
   1429      1.1     skrll     as_bad (_("directives are not valid inside bundles"));
   1430      1.1     skrll 
   1431      1.1     skrll   get_directive (&end_directive, &end_negated);
   1432  1.1.1.2  christos 
   1433      1.1     skrll   md_flush_pending_output ();
   1434  1.1.1.2  christos 
   1435      1.1     skrll   switch ((int) end_directive)
   1436      1.1     skrll     {
   1437      1.1     skrll     case XTENSA_UNDEFINED:
   1438  1.1.1.2  christos       discard_rest_of_line ();
   1439      1.1     skrll       return;
   1440      1.1     skrll 
   1441      1.1     skrll     case (int) directive_density:
   1442      1.1     skrll       as_warn (_(".end [no-]density is ignored"));
   1443  1.1.1.2  christos       demand_empty_rest_of_line ();
   1444      1.1     skrll       break;
   1445      1.1     skrll 
   1446      1.1     skrll     case (int) directive_absolute_literals:
   1447      1.1     skrll       if (!absolute_literals_supported && !end_negated)
   1448      1.1     skrll 	{
   1449      1.1     skrll 	  as_warn (_("Xtensa absolute literals option not supported; ignored"));
   1450      1.1     skrll 	  demand_empty_rest_of_line ();
   1451      1.1     skrll 	  return;
   1452      1.1     skrll 	}
   1453      1.1     skrll       break;
   1454      1.1     skrll 
   1455      1.1     skrll     default:
   1456      1.1     skrll       break;
   1457      1.1     skrll     }
   1458      1.1     skrll 
   1459      1.1     skrll   state_ptr = &state; /* use state_ptr to avoid type-punning warning */
   1460      1.1     skrll   directive_pop (&begin_directive, &begin_negated, &file, &line,
   1461      1.1     skrll 		 (const void **) state_ptr);
   1462      1.1     skrll 
   1463      1.1     skrll   if (begin_directive != directive_none)
   1464      1.1     skrll     {
   1465      1.1     skrll       if (begin_directive != end_directive || begin_negated != end_negated)
   1466      1.1     skrll 	{
   1467      1.1     skrll 	  as_bad (_("does not match begin %s%s at %s:%d"),
   1468      1.1     skrll 		  begin_negated ? "no-" : "",
   1469      1.1     skrll 		  directive_info[begin_directive].name, file, line);
   1470      1.1     skrll 	}
   1471      1.1     skrll       else
   1472      1.1     skrll 	{
   1473      1.1     skrll 	  switch (end_directive)
   1474      1.1     skrll 	    {
   1475      1.1     skrll 	    case directive_literal:
   1476      1.1     skrll 	      frag_var (rs_fill, 0, 0, 0, NULL, 0, NULL);
   1477      1.1     skrll 	      xtensa_restore_emit_state (state);
   1478      1.1     skrll 	      xtensa_set_frag_assembly_state (frag_now);
   1479      1.1     skrll 	      free (state);
   1480      1.1     skrll 	      if (!inside_directive (directive_literal))
   1481      1.1     skrll 		{
   1482      1.1     skrll 		  /* Restore the list of current labels.  */
   1483      1.1     skrll 		  xtensa_clear_insn_labels ();
   1484      1.1     skrll 		  insn_labels = saved_insn_labels;
   1485      1.1     skrll 		}
   1486      1.1     skrll 	      break;
   1487      1.1     skrll 
   1488  1.1.1.2  christos 	    case directive_literal_prefix:
   1489      1.1     skrll 	      /* Restore the default collection sections from saved state.  */
   1490      1.1     skrll 	      s = (lit_state *) state;
   1491      1.1     skrll 	      gas_assert (s);
   1492      1.1     skrll 	      default_lit_sections = *s;
   1493      1.1     skrll 
   1494      1.1     skrll 	      /* Free the state storage.  */
   1495      1.1     skrll 	      free (s->lit_prefix);
   1496      1.1     skrll 	      free (s);
   1497      1.1     skrll 	      break;
   1498      1.1     skrll 
   1499      1.1     skrll 	    case directive_schedule:
   1500      1.1     skrll 	    case directive_freeregs:
   1501      1.1     skrll 	      break;
   1502      1.1     skrll 
   1503      1.1     skrll 	    default:
   1504      1.1     skrll 	      xtensa_set_frag_assembly_state (frag_now);
   1505      1.1     skrll 	      break;
   1506      1.1     skrll 	    }
   1507      1.1     skrll 	}
   1508      1.1     skrll     }
   1509      1.1     skrll 
   1510      1.1     skrll   demand_empty_rest_of_line ();
   1511      1.1     skrll }
   1512      1.1     skrll 
   1513      1.1     skrll 
   1514      1.1     skrll /* Place an aligned literal fragment at the current location.  */
   1515      1.1     skrll 
   1516      1.1     skrll static void
   1517      1.1     skrll xtensa_literal_position (int ignore ATTRIBUTE_UNUSED)
   1518      1.1     skrll {
   1519      1.1     skrll   md_flush_pending_output ();
   1520      1.1     skrll 
   1521      1.1     skrll   if (inside_directive (directive_literal))
   1522      1.1     skrll     as_warn (_(".literal_position inside literal directive; ignoring"));
   1523      1.1     skrll   xtensa_mark_literal_pool_location ();
   1524      1.1     skrll 
   1525      1.1     skrll   demand_empty_rest_of_line ();
   1526      1.1     skrll   xtensa_clear_insn_labels ();
   1527      1.1     skrll }
   1528      1.1     skrll 
   1529      1.1     skrll 
   1530      1.1     skrll /* Support .literal label, expr, ...  */
   1531      1.1     skrll 
   1532      1.1     skrll static void
   1533      1.1     skrll xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED)
   1534      1.1     skrll {
   1535      1.1     skrll   emit_state state;
   1536      1.1     skrll   char *p, *base_name;
   1537      1.1     skrll   char c;
   1538      1.1     skrll 
   1539      1.1     skrll   if (inside_directive (directive_literal))
   1540      1.1     skrll     {
   1541      1.1     skrll       as_bad (_(".literal not allowed inside .begin literal region"));
   1542      1.1     skrll       ignore_rest_of_line ();
   1543      1.1     skrll       return;
   1544      1.1     skrll     }
   1545      1.1     skrll 
   1546      1.1     skrll   md_flush_pending_output ();
   1547      1.1     skrll 
   1548      1.1     skrll   /* Previous labels go with whatever follows this directive, not with
   1549      1.1     skrll      the literal, so save them now.  */
   1550      1.1     skrll   saved_insn_labels = insn_labels;
   1551      1.1     skrll   insn_labels = NULL;
   1552      1.1     skrll 
   1553      1.1     skrll   base_name = input_line_pointer;
   1554      1.1     skrll 
   1555      1.1     skrll   xtensa_switch_to_literal_fragment (&state);
   1556      1.1     skrll 
   1557      1.1     skrll   /* All literals are aligned to four-byte boundaries.  */
   1558  1.1.1.4  christos   frag_align (2, 0, 0);
   1559      1.1     skrll   record_alignment (now_seg, 2);
   1560      1.1     skrll 
   1561      1.1     skrll   c = get_symbol_name (&base_name);
   1562  1.1.1.4  christos   /* Just after name is now '\0'.  */
   1563      1.1     skrll   p = input_line_pointer;
   1564      1.1     skrll   *p = c;
   1565      1.1     skrll   SKIP_WHITESPACE_AFTER_NAME ();
   1566      1.1     skrll 
   1567      1.1     skrll   if (*input_line_pointer != ',' && *input_line_pointer != ':')
   1568      1.1     skrll     {
   1569      1.1     skrll       as_bad (_("expected comma or colon after symbol name; "
   1570      1.1     skrll 		"rest of line ignored"));
   1571      1.1     skrll       ignore_rest_of_line ();
   1572      1.1     skrll       xtensa_restore_emit_state (&state);
   1573  1.1.1.4  christos       return;
   1574      1.1     skrll     }
   1575      1.1     skrll 
   1576  1.1.1.4  christos   *p = 0;
   1577      1.1     skrll   colon (base_name);
   1578      1.1     skrll   *p = c;
   1579      1.1     skrll 
   1580      1.1     skrll   input_line_pointer++;		/* skip ',' or ':' */
   1581      1.1     skrll 
   1582      1.1     skrll   xtensa_elf_cons (4);
   1583      1.1     skrll 
   1584      1.1     skrll   xtensa_restore_emit_state (&state);
   1585      1.1     skrll 
   1586      1.1     skrll   /* Restore the list of current labels.  */
   1587      1.1     skrll   xtensa_clear_insn_labels ();
   1588      1.1     skrll   insn_labels = saved_insn_labels;
   1589      1.1     skrll }
   1590      1.1     skrll 
   1591      1.1     skrll 
   1592      1.1     skrll static void
   1593      1.1     skrll xtensa_literal_prefix (void)
   1594      1.1     skrll {
   1595      1.1     skrll   char *name;
   1596      1.1     skrll   int len;
   1597      1.1     skrll 
   1598      1.1     skrll   /* Parse the new prefix from the input_line_pointer.  */
   1599      1.1     skrll   SKIP_WHITESPACE ();
   1600      1.1     skrll   len = strspn (input_line_pointer,
   1601      1.1     skrll 		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   1602  1.1.1.5  christos 		"abcdefghijklmnopqrstuvwxyz_/0123456789.$");
   1603      1.1     skrll 
   1604      1.1     skrll   /* Get a null-terminated copy of the name.  */
   1605      1.1     skrll   name = xmemdup0 (input_line_pointer, len);
   1606      1.1     skrll 
   1607      1.1     skrll   /* Skip the name in the input line.  */
   1608      1.1     skrll   input_line_pointer += len;
   1609      1.1     skrll 
   1610      1.1     skrll   default_lit_sections.lit_prefix = name;
   1611      1.1     skrll 
   1612      1.1     skrll   /* Clear cached literal sections, since the prefix has changed.  */
   1613      1.1     skrll   default_lit_sections.lit_seg = NULL;
   1614      1.1     skrll   default_lit_sections.lit4_seg = NULL;
   1615      1.1     skrll }
   1616      1.1     skrll 
   1617      1.1     skrll 
   1618      1.1     skrll /* Support ".frequency branch_target_frequency fall_through_frequency".  */
   1619      1.1     skrll 
   1620      1.1     skrll static void
   1621      1.1     skrll xtensa_frequency_pseudo (int ignored ATTRIBUTE_UNUSED)
   1622      1.1     skrll {
   1623      1.1     skrll   float fall_through_f, target_f;
   1624      1.1     skrll 
   1625      1.1     skrll   fall_through_f = (float) strtod (input_line_pointer, &input_line_pointer);
   1626      1.1     skrll   if (fall_through_f < 0)
   1627      1.1     skrll     {
   1628      1.1     skrll       as_bad (_("fall through frequency must be greater than 0"));
   1629      1.1     skrll       ignore_rest_of_line ();
   1630      1.1     skrll       return;
   1631      1.1     skrll     }
   1632      1.1     skrll 
   1633      1.1     skrll   target_f = (float) strtod (input_line_pointer, &input_line_pointer);
   1634      1.1     skrll   if (target_f < 0)
   1635      1.1     skrll     {
   1636      1.1     skrll       as_bad (_("branch target frequency must be greater than 0"));
   1637      1.1     skrll       ignore_rest_of_line ();
   1638      1.1     skrll       return;
   1639      1.1     skrll     }
   1640      1.1     skrll 
   1641      1.1     skrll   set_subseg_freq (now_seg, now_subseg, target_f + fall_through_f, target_f);
   1642      1.1     skrll 
   1643      1.1     skrll   demand_empty_rest_of_line ();
   1644      1.1     skrll }
   1645      1.1     skrll 
   1646      1.1     skrll 
   1647      1.1     skrll /* Like normal .long/.short/.word, except support @plt, etc.
   1648      1.1     skrll    Clobbers input_line_pointer, checks end-of-line.  */
   1649      1.1     skrll 
   1650      1.1     skrll static void
   1651      1.1     skrll xtensa_elf_cons (int nbytes)
   1652      1.1     skrll {
   1653      1.1     skrll   expressionS exp;
   1654      1.1     skrll   bfd_reloc_code_real_type reloc;
   1655      1.1     skrll 
   1656      1.1     skrll   md_flush_pending_output ();
   1657      1.1     skrll 
   1658      1.1     skrll   if (cur_vinsn.inside_bundle)
   1659      1.1     skrll     as_bad (_("directives are not valid inside bundles"));
   1660      1.1     skrll 
   1661      1.1     skrll   if (is_it_end_of_statement ())
   1662      1.1     skrll     {
   1663      1.1     skrll       demand_empty_rest_of_line ();
   1664      1.1     skrll       return;
   1665      1.1     skrll     }
   1666      1.1     skrll 
   1667      1.1     skrll   do
   1668      1.1     skrll     {
   1669      1.1     skrll       expression (&exp);
   1670      1.1     skrll       if (exp.X_op == O_symbol
   1671      1.1     skrll 	  && *input_line_pointer == '@'
   1672      1.1     skrll 	  && ((reloc = xtensa_elf_suffix (&input_line_pointer, &exp))
   1673      1.1     skrll 	      != BFD_RELOC_NONE))
   1674      1.1     skrll 	{
   1675      1.1     skrll 	  reloc_howto_type *reloc_howto =
   1676      1.1     skrll 	    bfd_reloc_type_lookup (stdoutput, reloc);
   1677      1.1     skrll 
   1678      1.1     skrll 	  if (reloc == BFD_RELOC_UNUSED || !reloc_howto)
   1679      1.1     skrll 	    as_bad (_("unsupported relocation"));
   1680      1.1     skrll 	  else if ((reloc >= BFD_RELOC_XTENSA_SLOT0_OP
   1681      1.1     skrll 		    && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
   1682      1.1     skrll 		   || (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
   1683      1.1     skrll 		       && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT))
   1684  1.1.1.6  christos 	    as_bad (_("opcode-specific %s relocation used outside "
   1685  1.1.1.6  christos 		      "an instruction"), reloc_howto->name);
   1686  1.1.1.6  christos 	  else if (nbytes != (int) bfd_get_reloc_size (reloc_howto))
   1687      1.1     skrll 	    as_bad (ngettext ("%s relocations do not fit in %d byte",
   1688      1.1     skrll 			      "%s relocations do not fit in %d bytes",
   1689      1.1     skrll 			      nbytes),
   1690      1.1     skrll 		    reloc_howto->name, nbytes);
   1691      1.1     skrll 	  else if (reloc == BFD_RELOC_XTENSA_TLS_FUNC
   1692      1.1     skrll 		   || reloc == BFD_RELOC_XTENSA_TLS_ARG
   1693      1.1     skrll 		   || reloc == BFD_RELOC_XTENSA_TLS_CALL)
   1694      1.1     skrll 	    as_bad (_("invalid use of %s relocation"), reloc_howto->name);
   1695      1.1     skrll 	  else
   1696      1.1     skrll 	    {
   1697      1.1     skrll 	      char *p = frag_more ((int) nbytes);
   1698      1.1     skrll 	      xtensa_set_frag_assembly_state (frag_now);
   1699      1.1     skrll 	      fix_new_exp (frag_now, p - frag_now->fr_literal,
   1700      1.1     skrll 			   nbytes, &exp, reloc_howto->pc_relative, reloc);
   1701      1.1     skrll 	    }
   1702      1.1     skrll 	}
   1703      1.1     skrll       else
   1704      1.1     skrll 	{
   1705      1.1     skrll 	  xtensa_set_frag_assembly_state (frag_now);
   1706      1.1     skrll 	  emit_expr (&exp, (unsigned int) nbytes);
   1707      1.1     skrll 	}
   1708      1.1     skrll     }
   1709      1.1     skrll   while (*input_line_pointer++ == ',');
   1710      1.1     skrll 
   1711      1.1     skrll   input_line_pointer--;		/* Put terminator back into stream.  */
   1712      1.1     skrll   demand_empty_rest_of_line ();
   1713      1.1     skrll }
   1714      1.1     skrll 
   1715      1.1     skrll static bfd_boolean is_leb128_expr;
   1716      1.1     skrll 
   1717      1.1     skrll static void
   1718      1.1     skrll xtensa_leb128 (int sign)
   1719      1.1     skrll {
   1720      1.1     skrll   is_leb128_expr = TRUE;
   1721      1.1     skrll   s_leb128 (sign);
   1722      1.1     skrll   is_leb128_expr = FALSE;
   1723      1.1     skrll }
   1724      1.1     skrll 
   1725      1.1     skrll 
   1726      1.1     skrll /* Parsing and Idiom Translation.  */
   1728      1.1     skrll 
   1729      1.1     skrll /* Parse @plt, etc. and return the desired relocation.  */
   1730      1.1     skrll static bfd_reloc_code_real_type
   1731      1.1     skrll xtensa_elf_suffix (char **str_p, expressionS *exp_p)
   1732      1.1     skrll {
   1733      1.1     skrll   char ident[20];
   1734  1.1.1.5  christos   char *str = *str_p;
   1735      1.1     skrll   char *str2;
   1736      1.1     skrll   int ch;
   1737      1.1     skrll   int len;
   1738      1.1     skrll   unsigned int i;
   1739      1.1     skrll 
   1740      1.1     skrll   if (*str++ != '@')
   1741      1.1     skrll     return BFD_RELOC_NONE;
   1742      1.1     skrll 
   1743      1.1     skrll   for (ch = *str, str2 = ident;
   1744      1.1     skrll        (str2 < ident + sizeof (ident) - 1
   1745      1.1     skrll 	&& (ISALNUM (ch) || ch == '@'));
   1746      1.1     skrll        ch = *++str)
   1747      1.1     skrll     {
   1748      1.1     skrll       *str2++ = (ISLOWER (ch)) ? ch : TOLOWER (ch);
   1749      1.1     skrll     }
   1750      1.1     skrll 
   1751  1.1.1.5  christos   *str2 = '\0';
   1752  1.1.1.5  christos   len = str2 - ident;
   1753  1.1.1.5  christos 
   1754  1.1.1.5  christos   ch = ident[0];
   1755      1.1     skrll   for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
   1756      1.1     skrll     if (ch == suffix_relocs[i].suffix[0]
   1757      1.1     skrll 	&& len == suffix_relocs[i].length
   1758      1.1     skrll 	&& memcmp (ident, suffix_relocs[i].suffix, suffix_relocs[i].length) == 0)
   1759      1.1     skrll       {
   1760      1.1     skrll 	/* Now check for "identifier@suffix+constant".  */
   1761      1.1     skrll 	if (*str == '-' || *str == '+')
   1762      1.1     skrll 	  {
   1763      1.1     skrll 	    char *orig_line = input_line_pointer;
   1764      1.1     skrll 	    expressionS new_exp;
   1765      1.1     skrll 
   1766      1.1     skrll 	    input_line_pointer = str;
   1767      1.1     skrll 	    expression (&new_exp);
   1768      1.1     skrll 	    if (new_exp.X_op == O_constant)
   1769      1.1     skrll 	      {
   1770      1.1     skrll 		exp_p->X_add_number += new_exp.X_add_number;
   1771      1.1     skrll 		str = input_line_pointer;
   1772      1.1     skrll 	      }
   1773      1.1     skrll 
   1774      1.1     skrll 	    if (&input_line_pointer != str_p)
   1775  1.1.1.5  christos 	      input_line_pointer = orig_line;
   1776      1.1     skrll 	  }
   1777      1.1     skrll 
   1778      1.1     skrll 	*str_p = str;
   1779      1.1     skrll 	return suffix_relocs[i].reloc;
   1780      1.1     skrll       }
   1781      1.1     skrll 
   1782      1.1     skrll   return BFD_RELOC_UNUSED;
   1783  1.1.1.5  christos }
   1784      1.1     skrll 
   1785      1.1     skrll 
   1786  1.1.1.5  christos /* Find the matching operator type.  */
   1787  1.1.1.5  christos static operatorT
   1788  1.1.1.4  christos map_suffix_reloc_to_operator (bfd_reloc_code_real_type reloc)
   1789  1.1.1.5  christos {
   1790      1.1     skrll   operatorT operator = O_illegal;
   1791  1.1.1.5  christos   unsigned int i;
   1792      1.1     skrll 
   1793  1.1.1.5  christos   for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
   1794      1.1     skrll     {
   1795      1.1     skrll       if (suffix_relocs[i].reloc == reloc)
   1796      1.1     skrll 	{
   1797  1.1.1.5  christos 	  operator = suffix_relocs[i].operator;
   1798      1.1     skrll 	  break;
   1799      1.1     skrll 	}
   1800      1.1     skrll     }
   1801      1.1     skrll   gas_assert (operator != O_illegal);
   1802      1.1     skrll   return operator;
   1803      1.1     skrll }
   1804      1.1     skrll 
   1805      1.1     skrll 
   1806  1.1.1.5  christos /* Find the matching reloc type.  */
   1807      1.1     skrll static bfd_reloc_code_real_type
   1808      1.1     skrll map_operator_to_reloc (unsigned char operator, bfd_boolean is_literal)
   1809  1.1.1.5  christos {
   1810      1.1     skrll   unsigned int i;
   1811  1.1.1.5  christos   bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
   1812      1.1     skrll 
   1813  1.1.1.5  christos   for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
   1814      1.1     skrll     {
   1815      1.1     skrll       if (suffix_relocs[i].operator == operator)
   1816      1.1     skrll 	{
   1817      1.1     skrll 	  reloc = suffix_relocs[i].reloc;
   1818      1.1     skrll 	  break;
   1819      1.1     skrll 	}
   1820      1.1     skrll     }
   1821      1.1     skrll 
   1822      1.1     skrll   if (is_literal)
   1823      1.1     skrll     {
   1824      1.1     skrll       if (reloc == BFD_RELOC_XTENSA_TLS_FUNC)
   1825      1.1     skrll 	return BFD_RELOC_XTENSA_TLSDESC_FN;
   1826      1.1     skrll       else if (reloc == BFD_RELOC_XTENSA_TLS_ARG)
   1827      1.1     skrll 	return BFD_RELOC_XTENSA_TLSDESC_ARG;
   1828      1.1     skrll     }
   1829      1.1     skrll 
   1830      1.1     skrll   if (reloc == BFD_RELOC_UNUSED)
   1831      1.1     skrll     return BFD_RELOC_32;
   1832      1.1     skrll 
   1833      1.1     skrll   return reloc;
   1834      1.1     skrll }
   1835      1.1     skrll 
   1836      1.1     skrll 
   1837      1.1     skrll static const char *
   1838      1.1     skrll expression_end (const char *name)
   1839      1.1     skrll {
   1840      1.1     skrll   while (1)
   1841      1.1     skrll     {
   1842      1.1     skrll       switch (*name)
   1843      1.1     skrll 	{
   1844      1.1     skrll 	case '}':
   1845      1.1     skrll 	case ';':
   1846      1.1     skrll 	case '\0':
   1847      1.1     skrll 	case ',':
   1848      1.1     skrll 	case ':':
   1849      1.1     skrll 	  return name;
   1850      1.1     skrll 	case ' ':
   1851      1.1     skrll 	case '\t':
   1852      1.1     skrll 	  ++name;
   1853      1.1     skrll 	  continue;
   1854      1.1     skrll 	default:
   1855      1.1     skrll 	  return 0;
   1856      1.1     skrll 	}
   1857      1.1     skrll     }
   1858      1.1     skrll }
   1859      1.1     skrll 
   1860      1.1     skrll 
   1861      1.1     skrll #define ERROR_REG_NUM ((unsigned) -1)
   1862      1.1     skrll 
   1863      1.1     skrll static unsigned
   1864      1.1     skrll tc_get_register (const char *prefix)
   1865      1.1     skrll {
   1866      1.1     skrll   unsigned reg;
   1867      1.1     skrll   const char *next_expr;
   1868      1.1     skrll   const char *old_line_pointer;
   1869      1.1     skrll 
   1870      1.1     skrll   SKIP_WHITESPACE ();
   1871      1.1     skrll   old_line_pointer = input_line_pointer;
   1872      1.1     skrll 
   1873      1.1     skrll   if (*input_line_pointer == '$')
   1874      1.1     skrll     ++input_line_pointer;
   1875      1.1     skrll 
   1876      1.1     skrll   /* Accept "sp" as a synonym for "a1".  */
   1877      1.1     skrll   if (input_line_pointer[0] == 's' && input_line_pointer[1] == 'p'
   1878      1.1     skrll       && expression_end (input_line_pointer + 2))
   1879      1.1     skrll     {
   1880      1.1     skrll       input_line_pointer += 2;
   1881      1.1     skrll       return 1;  /* AR[1] */
   1882      1.1     skrll     }
   1883      1.1     skrll 
   1884      1.1     skrll   while (*input_line_pointer++ == *prefix++)
   1885      1.1     skrll     ;
   1886      1.1     skrll   --input_line_pointer;
   1887      1.1     skrll   --prefix;
   1888      1.1     skrll 
   1889      1.1     skrll   if (*prefix)
   1890      1.1     skrll     {
   1891      1.1     skrll       as_bad (_("bad register name: %s"), old_line_pointer);
   1892      1.1     skrll       return ERROR_REG_NUM;
   1893      1.1     skrll     }
   1894      1.1     skrll 
   1895      1.1     skrll   if (!ISDIGIT ((unsigned char) *input_line_pointer))
   1896      1.1     skrll     {
   1897      1.1     skrll       as_bad (_("bad register number: %s"), input_line_pointer);
   1898      1.1     skrll       return ERROR_REG_NUM;
   1899      1.1     skrll     }
   1900      1.1     skrll 
   1901      1.1     skrll   reg = 0;
   1902      1.1     skrll 
   1903      1.1     skrll   while (ISDIGIT ((int) *input_line_pointer))
   1904      1.1     skrll     reg = reg * 10 + *input_line_pointer++ - '0';
   1905      1.1     skrll 
   1906      1.1     skrll   if (!(next_expr = expression_end (input_line_pointer)))
   1907      1.1     skrll     {
   1908      1.1     skrll       as_bad (_("bad register name: %s"), old_line_pointer);
   1909      1.1     skrll       return ERROR_REG_NUM;
   1910      1.1     skrll     }
   1911      1.1     skrll 
   1912      1.1     skrll   input_line_pointer = (char *) next_expr;
   1913      1.1     skrll 
   1914      1.1     skrll   return reg;
   1915      1.1     skrll }
   1916      1.1     skrll 
   1917      1.1     skrll 
   1918      1.1     skrll static void
   1919      1.1     skrll expression_maybe_register (xtensa_opcode opc, int opnd, expressionS *tok)
   1920      1.1     skrll {
   1921      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   1922      1.1     skrll 
   1923      1.1     skrll   /* Check if this is an immediate operand.  */
   1924  1.1.1.2  christos   if (xtensa_operand_is_register (isa, opc, opnd) == 0)
   1925      1.1     skrll     {
   1926      1.1     skrll       bfd_reloc_code_real_type reloc;
   1927      1.1     skrll       segT t = expression (tok);
   1928  1.1.1.2  christos 
   1929      1.1     skrll       if (t == absolute_section
   1930      1.1     skrll 	  && xtensa_operand_is_PCrelative (isa, opc, opnd) == 1)
   1931      1.1     skrll 	{
   1932      1.1     skrll 	  gas_assert (tok->X_op == O_constant);
   1933      1.1     skrll 	  tok->X_op = O_symbol;
   1934      1.1     skrll 	  tok->X_add_symbol = &abs_symbol;
   1935      1.1     skrll 	}
   1936      1.1     skrll 
   1937      1.1     skrll       if ((tok->X_op == O_constant || tok->X_op == O_symbol)
   1938      1.1     skrll 	  && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
   1939      1.1     skrll 	      != BFD_RELOC_NONE))
   1940      1.1     skrll 	{
   1941      1.1     skrll 	  switch (reloc)
   1942      1.1     skrll 	    {
   1943      1.1     skrll 	    case BFD_RELOC_LO16:
   1944      1.1     skrll 	      if (tok->X_op == O_constant)
   1945      1.1     skrll 		{
   1946      1.1     skrll 		  tok->X_add_number &= 0xffff;
   1947      1.1     skrll 		  return;
   1948      1.1     skrll 		}
   1949      1.1     skrll 	      break;
   1950      1.1     skrll 	    case BFD_RELOC_HI16:
   1951      1.1     skrll 	      if (tok->X_op == O_constant)
   1952      1.1     skrll 		{
   1953      1.1     skrll 		  tok->X_add_number = ((unsigned) tok->X_add_number) >> 16;
   1954      1.1     skrll 		  return;
   1955      1.1     skrll 		}
   1956      1.1     skrll 	      break;
   1957      1.1     skrll 	    case BFD_RELOC_UNUSED:
   1958      1.1     skrll 	      as_bad (_("unsupported relocation"));
   1959      1.1     skrll 	      return;
   1960      1.1     skrll 	    case BFD_RELOC_32_PCREL:
   1961      1.1     skrll 	      as_bad (_("pcrel relocation not allowed in an instruction"));
   1962      1.1     skrll 	      return;
   1963      1.1     skrll 	    default:
   1964      1.1     skrll 	      break;
   1965      1.1     skrll 	    }
   1966      1.1     skrll 	  tok->X_op = map_suffix_reloc_to_operator (reloc);
   1967      1.1     skrll 	}
   1968      1.1     skrll     }
   1969      1.1     skrll   else
   1970      1.1     skrll     {
   1971      1.1     skrll       xtensa_regfile opnd_rf = xtensa_operand_regfile (isa, opc, opnd);
   1972      1.1     skrll       unsigned reg = tc_get_register (xtensa_regfile_shortname (isa, opnd_rf));
   1973      1.1     skrll 
   1974      1.1     skrll       if (reg != ERROR_REG_NUM)	/* Already errored */
   1975      1.1     skrll 	{
   1976      1.1     skrll 	  uint32 buf = reg;
   1977      1.1     skrll 	  if (xtensa_operand_encode (isa, opc, opnd, &buf))
   1978      1.1     skrll 	    as_bad (_("register number out of range"));
   1979      1.1     skrll 	}
   1980      1.1     skrll 
   1981      1.1     skrll       tok->X_op = O_register;
   1982      1.1     skrll       tok->X_add_symbol = 0;
   1983      1.1     skrll       tok->X_add_number = reg;
   1984      1.1     skrll     }
   1985      1.1     skrll }
   1986      1.1     skrll 
   1987      1.1     skrll 
   1988      1.1     skrll /* Split up the arguments for an opcode or pseudo-op.  */
   1989      1.1     skrll 
   1990      1.1     skrll static int
   1991      1.1     skrll tokenize_arguments (char **args, char *str)
   1992      1.1     skrll {
   1993      1.1     skrll   char *old_input_line_pointer;
   1994      1.1     skrll   bfd_boolean saw_comma = FALSE;
   1995      1.1     skrll   bfd_boolean saw_arg = FALSE;
   1996      1.1     skrll   bfd_boolean saw_colon = FALSE;
   1997      1.1     skrll   int num_args = 0;
   1998      1.1     skrll   char *arg_end, *arg;
   1999      1.1     skrll   int arg_len;
   2000      1.1     skrll 
   2001      1.1     skrll   /* Save and restore input_line_pointer around this function.  */
   2002      1.1     skrll   old_input_line_pointer = input_line_pointer;
   2003      1.1     skrll   input_line_pointer = str;
   2004      1.1     skrll 
   2005      1.1     skrll   while (*input_line_pointer)
   2006      1.1     skrll     {
   2007      1.1     skrll       SKIP_WHITESPACE ();
   2008      1.1     skrll       switch (*input_line_pointer)
   2009      1.1     skrll 	{
   2010      1.1     skrll 	case '\0':
   2011      1.1     skrll 	case '}':
   2012      1.1     skrll 	  goto fini;
   2013      1.1     skrll 
   2014      1.1     skrll 	case ':':
   2015      1.1     skrll 	  input_line_pointer++;
   2016      1.1     skrll 	  if (saw_comma || saw_colon || !saw_arg)
   2017      1.1     skrll 	    goto err;
   2018      1.1     skrll 	  saw_colon = TRUE;
   2019      1.1     skrll 	  break;
   2020      1.1     skrll 
   2021      1.1     skrll 	case ',':
   2022      1.1     skrll 	  input_line_pointer++;
   2023      1.1     skrll 	  if (saw_comma || saw_colon || !saw_arg)
   2024      1.1     skrll 	    goto err;
   2025      1.1     skrll 	  saw_comma = TRUE;
   2026      1.1     skrll 	  break;
   2027      1.1     skrll 
   2028      1.1     skrll 	default:
   2029      1.1     skrll 	  if (!saw_comma && !saw_colon && saw_arg)
   2030      1.1     skrll 	    goto err;
   2031      1.1     skrll 
   2032      1.1     skrll 	  arg_end = input_line_pointer + 1;
   2033  1.1.1.5  christos 	  while (!expression_end (arg_end))
   2034      1.1     skrll 	    arg_end += 1;
   2035      1.1     skrll 
   2036      1.1     skrll 	  arg_len = arg_end - input_line_pointer;
   2037      1.1     skrll 	  arg = XNEWVEC (char, (saw_colon ? 1 : 0) + arg_len + 1);
   2038      1.1     skrll 	  args[num_args] = arg;
   2039      1.1     skrll 
   2040      1.1     skrll 	  if (saw_colon)
   2041      1.1     skrll 	    *arg++ = ':';
   2042      1.1     skrll 	  strncpy (arg, input_line_pointer, arg_len);
   2043      1.1     skrll 	  arg[arg_len] = '\0';
   2044      1.1     skrll 
   2045      1.1     skrll 	  input_line_pointer = arg_end;
   2046      1.1     skrll 	  num_args += 1;
   2047      1.1     skrll 	  saw_comma = FALSE;
   2048      1.1     skrll 	  saw_colon = FALSE;
   2049      1.1     skrll 	  saw_arg = TRUE;
   2050      1.1     skrll 	  break;
   2051      1.1     skrll 	}
   2052      1.1     skrll     }
   2053      1.1     skrll 
   2054      1.1     skrll fini:
   2055      1.1     skrll   if (saw_comma || saw_colon)
   2056      1.1     skrll     goto err;
   2057      1.1     skrll   input_line_pointer = old_input_line_pointer;
   2058      1.1     skrll   return num_args;
   2059      1.1     skrll 
   2060      1.1     skrll err:
   2061      1.1     skrll   if (saw_comma)
   2062      1.1     skrll     as_bad (_("extra comma"));
   2063      1.1     skrll   else if (saw_colon)
   2064      1.1     skrll     as_bad (_("extra colon"));
   2065      1.1     skrll   else if (!saw_arg)
   2066      1.1     skrll     as_bad (_("missing argument"));
   2067      1.1     skrll   else
   2068      1.1     skrll     as_bad (_("missing comma or colon"));
   2069      1.1     skrll   input_line_pointer = old_input_line_pointer;
   2070      1.1     skrll   return -1;
   2071      1.1     skrll }
   2072      1.1     skrll 
   2073      1.1     skrll 
   2074      1.1     skrll /* Parse the arguments to an opcode.  Return TRUE on error.  */
   2075      1.1     skrll 
   2076      1.1     skrll static bfd_boolean
   2077      1.1     skrll parse_arguments (TInsn *insn, int num_args, char **arg_strings)
   2078      1.1     skrll {
   2079      1.1     skrll   expressionS *tok, *last_tok;
   2080      1.1     skrll   xtensa_opcode opcode = insn->opcode;
   2081      1.1     skrll   bfd_boolean had_error = TRUE;
   2082      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   2083      1.1     skrll   int n, num_regs = 0;
   2084      1.1     skrll   int opcode_operand_count;
   2085      1.1     skrll   int opnd_cnt, last_opnd_cnt;
   2086      1.1     skrll   unsigned int next_reg = 0;
   2087      1.1     skrll   char *old_input_line_pointer;
   2088      1.1     skrll 
   2089      1.1     skrll   if (insn->insn_type == ITYPE_LITERAL)
   2090      1.1     skrll     opcode_operand_count = 1;
   2091      1.1     skrll   else
   2092      1.1     skrll     opcode_operand_count = xtensa_opcode_num_operands (isa, opcode);
   2093      1.1     skrll 
   2094      1.1     skrll   tok = insn->tok;
   2095      1.1     skrll   memset (tok, 0, sizeof (*tok) * MAX_INSN_ARGS);
   2096      1.1     skrll 
   2097      1.1     skrll   /* Save and restore input_line_pointer around this function.  */
   2098      1.1     skrll   old_input_line_pointer = input_line_pointer;
   2099      1.1     skrll 
   2100      1.1     skrll   last_tok = 0;
   2101      1.1     skrll   last_opnd_cnt = -1;
   2102      1.1     skrll   opnd_cnt = 0;
   2103      1.1     skrll 
   2104      1.1     skrll   /* Skip invisible operands.  */
   2105      1.1     skrll   while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0)
   2106      1.1     skrll     {
   2107      1.1     skrll       opnd_cnt += 1;
   2108      1.1     skrll       tok++;
   2109      1.1     skrll     }
   2110      1.1     skrll 
   2111      1.1     skrll   for (n = 0; n < num_args; n++)
   2112      1.1     skrll     {
   2113      1.1     skrll       input_line_pointer = arg_strings[n];
   2114      1.1     skrll       if (*input_line_pointer == ':')
   2115      1.1     skrll 	{
   2116  1.1.1.2  christos 	  xtensa_regfile opnd_rf;
   2117      1.1     skrll 	  input_line_pointer++;
   2118      1.1     skrll 	  if (num_regs == 0)
   2119      1.1     skrll 	    goto err;
   2120      1.1     skrll 	  gas_assert (opnd_cnt > 0);
   2121      1.1     skrll 	  num_regs--;
   2122      1.1     skrll 	  opnd_rf = xtensa_operand_regfile (isa, opcode, last_opnd_cnt);
   2123      1.1     skrll 	  if (next_reg
   2124      1.1     skrll 	      != tc_get_register (xtensa_regfile_shortname (isa, opnd_rf)))
   2125      1.1     skrll 	    as_warn (_("incorrect register number, ignoring"));
   2126      1.1     skrll 	  next_reg++;
   2127      1.1     skrll 	}
   2128      1.1     skrll       else
   2129      1.1     skrll 	{
   2130      1.1     skrll 	  if (opnd_cnt >= opcode_operand_count)
   2131  1.1.1.2  christos 	    {
   2132      1.1     skrll 	      as_warn (_("too many arguments"));
   2133      1.1     skrll 	      goto err;
   2134      1.1     skrll 	    }
   2135      1.1     skrll 	  gas_assert (opnd_cnt < MAX_INSN_ARGS);
   2136      1.1     skrll 
   2137      1.1     skrll 	  expression_maybe_register (opcode, opnd_cnt, tok);
   2138      1.1     skrll 	  next_reg = tok->X_add_number + 1;
   2139      1.1     skrll 
   2140      1.1     skrll 	  if (tok->X_op == O_illegal || tok->X_op == O_absent)
   2141      1.1     skrll 	    goto err;
   2142      1.1     skrll 	  if (xtensa_operand_is_register (isa, opcode, opnd_cnt) == 1)
   2143      1.1     skrll 	    {
   2144      1.1     skrll 	      num_regs = xtensa_operand_num_regs (isa, opcode, opnd_cnt) - 1;
   2145      1.1     skrll 	      /* minus 1 because we are seeing one right now */
   2146      1.1     skrll 	    }
   2147      1.1     skrll 	  else
   2148  1.1.1.2  christos 	    num_regs = 0;
   2149      1.1     skrll 
   2150      1.1     skrll 	  last_tok = tok;
   2151      1.1     skrll 	  last_opnd_cnt = opnd_cnt;
   2152      1.1     skrll 	  demand_empty_rest_of_line ();
   2153      1.1     skrll 
   2154      1.1     skrll 	  do
   2155      1.1     skrll 	    {
   2156      1.1     skrll 	      opnd_cnt += 1;
   2157      1.1     skrll 	      tok++;
   2158      1.1     skrll 	    }
   2159      1.1     skrll 	  while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0);
   2160      1.1     skrll 	}
   2161      1.1     skrll     }
   2162      1.1     skrll 
   2163      1.1     skrll   if (num_regs > 0 && ((int) next_reg != last_tok->X_add_number + 1))
   2164      1.1     skrll     goto err;
   2165      1.1     skrll 
   2166      1.1     skrll   insn->ntok = tok - insn->tok;
   2167      1.1     skrll   had_error = FALSE;
   2168      1.1     skrll 
   2169      1.1     skrll  err:
   2170      1.1     skrll   input_line_pointer = old_input_line_pointer;
   2171      1.1     skrll   return had_error;
   2172      1.1     skrll }
   2173      1.1     skrll 
   2174      1.1     skrll 
   2175      1.1     skrll static int
   2176      1.1     skrll get_invisible_operands (TInsn *insn)
   2177      1.1     skrll {
   2178      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   2179      1.1     skrll   static xtensa_insnbuf slotbuf = NULL;
   2180      1.1     skrll   xtensa_format fmt;
   2181      1.1     skrll   xtensa_opcode opc = insn->opcode;
   2182      1.1     skrll   int slot, opnd, fmt_found;
   2183      1.1     skrll   unsigned val;
   2184      1.1     skrll 
   2185      1.1     skrll   if (!slotbuf)
   2186      1.1     skrll     slotbuf = xtensa_insnbuf_alloc (isa);
   2187      1.1     skrll 
   2188      1.1     skrll   /* Find format/slot where this can be encoded.  */
   2189      1.1     skrll   fmt_found = 0;
   2190      1.1     skrll   slot = 0;
   2191      1.1     skrll   for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
   2192      1.1     skrll     {
   2193      1.1     skrll       for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
   2194      1.1     skrll 	{
   2195      1.1     skrll 	  if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opc) == 0)
   2196      1.1     skrll 	    {
   2197      1.1     skrll 	      fmt_found = 1;
   2198      1.1     skrll 	      break;
   2199      1.1     skrll 	    }
   2200      1.1     skrll 	}
   2201      1.1     skrll       if (fmt_found) break;
   2202      1.1     skrll     }
   2203      1.1     skrll 
   2204      1.1     skrll   if (!fmt_found)
   2205      1.1     skrll     {
   2206      1.1     skrll       as_bad (_("cannot encode opcode \"%s\""), xtensa_opcode_name (isa, opc));
   2207      1.1     skrll       return -1;
   2208      1.1     skrll     }
   2209      1.1     skrll 
   2210      1.1     skrll   /* First encode all the visible operands
   2211      1.1     skrll      (to deal with shared field operands).  */
   2212      1.1     skrll   for (opnd = 0; opnd < insn->ntok; opnd++)
   2213      1.1     skrll     {
   2214      1.1     skrll       if (xtensa_operand_is_visible (isa, opc, opnd) == 1
   2215      1.1     skrll 	  && (insn->tok[opnd].X_op == O_register
   2216      1.1     skrll 	      || insn->tok[opnd].X_op == O_constant))
   2217      1.1     skrll 	{
   2218      1.1     skrll 	  val = insn->tok[opnd].X_add_number;
   2219      1.1     skrll 	  xtensa_operand_encode (isa, opc, opnd, &val);
   2220      1.1     skrll 	  xtensa_operand_set_field (isa, opc, opnd, fmt, slot, slotbuf, val);
   2221      1.1     skrll 	}
   2222      1.1     skrll     }
   2223      1.1     skrll 
   2224      1.1     skrll   /* Then pull out the values for the invisible ones.  */
   2225      1.1     skrll   for (opnd = 0; opnd < insn->ntok; opnd++)
   2226      1.1     skrll     {
   2227      1.1     skrll       if (xtensa_operand_is_visible (isa, opc, opnd) == 0)
   2228      1.1     skrll 	{
   2229      1.1     skrll 	  xtensa_operand_get_field (isa, opc, opnd, fmt, slot, slotbuf, &val);
   2230      1.1     skrll 	  xtensa_operand_decode (isa, opc, opnd, &val);
   2231      1.1     skrll 	  insn->tok[opnd].X_add_number = val;
   2232      1.1     skrll 	  if (xtensa_operand_is_register (isa, opc, opnd) == 1)
   2233      1.1     skrll 	    insn->tok[opnd].X_op = O_register;
   2234      1.1     skrll 	  else
   2235      1.1     skrll 	    insn->tok[opnd].X_op = O_constant;
   2236      1.1     skrll 	}
   2237      1.1     skrll     }
   2238      1.1     skrll 
   2239      1.1     skrll   return 0;
   2240      1.1     skrll }
   2241      1.1     skrll 
   2242      1.1     skrll 
   2243      1.1     skrll static void
   2244      1.1     skrll xg_reverse_shift_count (char **cnt_argp)
   2245      1.1     skrll {
   2246  1.1.1.6  christos   char *cnt_arg, *new_arg;
   2247      1.1     skrll   cnt_arg = *cnt_argp;
   2248      1.1     skrll 
   2249      1.1     skrll   /* replace the argument with "31-(argument)" */
   2250      1.1     skrll   new_arg = concat ("31-(", cnt_arg, ")", (char *) NULL);
   2251      1.1     skrll 
   2252      1.1     skrll   free (cnt_arg);
   2253      1.1     skrll   *cnt_argp = new_arg;
   2254      1.1     skrll }
   2255      1.1     skrll 
   2256      1.1     skrll 
   2257      1.1     skrll /* If "arg" is a constant expression, return non-zero with the value
   2258      1.1     skrll    in *valp.  */
   2259      1.1     skrll 
   2260      1.1     skrll static int
   2261      1.1     skrll xg_arg_is_constant (char *arg, offsetT *valp)
   2262      1.1     skrll {
   2263      1.1     skrll   expressionS exp;
   2264      1.1     skrll   char *save_ptr = input_line_pointer;
   2265      1.1     skrll 
   2266      1.1     skrll   input_line_pointer = arg;
   2267      1.1     skrll   expression (&exp);
   2268      1.1     skrll   input_line_pointer = save_ptr;
   2269      1.1     skrll 
   2270      1.1     skrll   if (exp.X_op == O_constant)
   2271      1.1     skrll     {
   2272      1.1     skrll       *valp = exp.X_add_number;
   2273      1.1     skrll       return 1;
   2274      1.1     skrll     }
   2275      1.1     skrll 
   2276      1.1     skrll   return 0;
   2277  1.1.1.5  christos }
   2278      1.1     skrll 
   2279      1.1     skrll 
   2280  1.1.1.5  christos static void
   2281      1.1     skrll xg_replace_opname (char **popname, const char *newop)
   2282      1.1     skrll {
   2283      1.1     skrll   free (*popname);
   2284      1.1     skrll   *popname = xstrdup (newop);
   2285      1.1     skrll }
   2286      1.1     skrll 
   2287      1.1     skrll 
   2288      1.1     skrll static int
   2289      1.1     skrll xg_check_num_args (int *pnum_args,
   2290      1.1     skrll 		   int expected_num,
   2291      1.1     skrll 		   char *opname,
   2292      1.1     skrll 		   char **arg_strings)
   2293      1.1     skrll {
   2294      1.1     skrll   int num_args = *pnum_args;
   2295      1.1     skrll 
   2296      1.1     skrll   if (num_args < expected_num)
   2297      1.1     skrll     {
   2298      1.1     skrll       as_bad (_("not enough operands (%d) for '%s'; expected %d"),
   2299      1.1     skrll 	      num_args, opname, expected_num);
   2300      1.1     skrll       return -1;
   2301      1.1     skrll     }
   2302      1.1     skrll 
   2303      1.1     skrll   if (num_args > expected_num)
   2304      1.1     skrll     {
   2305      1.1     skrll       as_warn (_("too many operands (%d) for '%s'; expected %d"),
   2306      1.1     skrll 	       num_args, opname, expected_num);
   2307      1.1     skrll       while (num_args-- > expected_num)
   2308      1.1     skrll 	{
   2309      1.1     skrll 	  free (arg_strings[num_args]);
   2310      1.1     skrll 	  arg_strings[num_args] = 0;
   2311      1.1     skrll 	}
   2312      1.1     skrll       *pnum_args = expected_num;
   2313      1.1     skrll       return -1;
   2314      1.1     skrll     }
   2315      1.1     skrll 
   2316      1.1     skrll   return 0;
   2317      1.1     skrll }
   2318      1.1     skrll 
   2319      1.1     skrll 
   2320      1.1     skrll /* If the register is not specified as part of the opcode,
   2321      1.1     skrll    then get it from the operand and move it to the opcode.  */
   2322      1.1     skrll 
   2323      1.1     skrll static int
   2324      1.1     skrll xg_translate_sysreg_op (char **popname, int *pnum_args, char **arg_strings)
   2325      1.1     skrll {
   2326      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   2327      1.1     skrll   xtensa_sysreg sr;
   2328      1.1     skrll   char *opname, *new_opname;
   2329      1.1     skrll   const char *sr_name;
   2330      1.1     skrll   int is_user, is_write;
   2331      1.1     skrll 
   2332      1.1     skrll   opname = *popname;
   2333      1.1     skrll   if (*opname == '_')
   2334      1.1     skrll     opname += 1;
   2335      1.1     skrll   is_user = (opname[1] == 'u');
   2336      1.1     skrll   is_write = (opname[0] == 'w');
   2337      1.1     skrll 
   2338      1.1     skrll   /* Opname == [rw]ur or [rwx]sr... */
   2339      1.1     skrll 
   2340      1.1     skrll   if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
   2341      1.1     skrll     return -1;
   2342      1.1     skrll 
   2343      1.1     skrll   /* Check if the argument is a symbolic register name.  */
   2344      1.1     skrll   sr = xtensa_sysreg_lookup_name (isa, arg_strings[1]);
   2345      1.1     skrll   /* Handle WSR to "INTSET" as a special case.  */
   2346      1.1     skrll   if (sr == XTENSA_UNDEFINED && is_write && !is_user
   2347      1.1     skrll       && !strcasecmp (arg_strings[1], "intset"))
   2348      1.1     skrll     sr = xtensa_sysreg_lookup_name (isa, "interrupt");
   2349      1.1     skrll   if (sr == XTENSA_UNDEFINED
   2350      1.1     skrll       || (xtensa_sysreg_is_user (isa, sr) == 1) != is_user)
   2351      1.1     skrll     {
   2352      1.1     skrll       /* Maybe it's a register number.... */
   2353      1.1     skrll       offsetT val;
   2354      1.1     skrll       if (!xg_arg_is_constant (arg_strings[1], &val))
   2355      1.1     skrll 	{
   2356      1.1     skrll 	  as_bad (_("invalid register '%s' for '%s' instruction"),
   2357      1.1     skrll 		  arg_strings[1], opname);
   2358      1.1     skrll 	  return -1;
   2359      1.1     skrll 	}
   2360      1.1     skrll       sr = xtensa_sysreg_lookup (isa, val, is_user);
   2361      1.1     skrll       if (sr == XTENSA_UNDEFINED)
   2362      1.1     skrll 	{
   2363      1.1     skrll 	  as_bad (_("invalid register number (%ld) for '%s' instruction"),
   2364      1.1     skrll 		  (long) val, opname);
   2365      1.1     skrll 	  return -1;
   2366      1.1     skrll 	}
   2367      1.1     skrll     }
   2368      1.1     skrll 
   2369      1.1     skrll   /* Remove the last argument, which is now part of the opcode.  */
   2370      1.1     skrll   free (arg_strings[1]);
   2371      1.1     skrll   arg_strings[1] = 0;
   2372      1.1     skrll   *pnum_args = 1;
   2373      1.1     skrll 
   2374      1.1     skrll   /* Translate the opcode.  */
   2375  1.1.1.5  christos   sr_name = xtensa_sysreg_name (isa, sr);
   2376      1.1     skrll   /* Another special case for "WSR.INTSET"....  */
   2377      1.1     skrll   if (is_write && !is_user && !strcasecmp ("interrupt", sr_name))
   2378      1.1     skrll     sr_name = "intset";
   2379      1.1     skrll   new_opname = concat (*popname, ".", sr_name, (char *) NULL);
   2380      1.1     skrll   free (*popname);
   2381      1.1     skrll   *popname = new_opname;
   2382      1.1     skrll 
   2383      1.1     skrll   return 0;
   2384      1.1     skrll }
   2385      1.1     skrll 
   2386      1.1     skrll 
   2387      1.1     skrll static int
   2388      1.1     skrll xtensa_translate_old_userreg_ops (char **popname)
   2389      1.1     skrll {
   2390      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   2391      1.1     skrll   xtensa_sysreg sr;
   2392      1.1     skrll   char *opname, *new_opname;
   2393      1.1     skrll   const char *sr_name;
   2394      1.1     skrll   bfd_boolean has_underbar = FALSE;
   2395      1.1     skrll 
   2396      1.1     skrll   opname = *popname;
   2397      1.1     skrll   if (opname[0] == '_')
   2398      1.1     skrll     {
   2399      1.1     skrll       has_underbar = TRUE;
   2400      1.1     skrll       opname += 1;
   2401      1.1     skrll     }
   2402      1.1     skrll 
   2403      1.1     skrll   sr = xtensa_sysreg_lookup_name (isa, opname + 1);
   2404      1.1     skrll   if (sr != XTENSA_UNDEFINED)
   2405      1.1     skrll     {
   2406      1.1     skrll       /* The new default name ("nnn") is different from the old default
   2407      1.1     skrll 	 name ("URnnn").  The old default is handled below, and we don't
   2408      1.1     skrll 	 want to recognize [RW]nnn, so do nothing if the name is the (new)
   2409      1.1     skrll 	 default.  */
   2410      1.1     skrll       static char namebuf[10];
   2411      1.1     skrll       sprintf (namebuf, "%d", xtensa_sysreg_number (isa, sr));
   2412      1.1     skrll       if (strcmp (namebuf, opname + 1) == 0)
   2413      1.1     skrll 	return 0;
   2414      1.1     skrll     }
   2415      1.1     skrll   else
   2416      1.1     skrll     {
   2417      1.1     skrll       offsetT val;
   2418      1.1     skrll       char *end;
   2419      1.1     skrll 
   2420      1.1     skrll       /* Only continue if the reg name is "URnnn".  */
   2421      1.1     skrll       if (opname[1] != 'u' || opname[2] != 'r')
   2422      1.1     skrll 	return 0;
   2423      1.1     skrll       val = strtoul (opname + 3, &end, 10);
   2424      1.1     skrll       if (*end != '\0')
   2425      1.1     skrll 	return 0;
   2426      1.1     skrll 
   2427      1.1     skrll       sr = xtensa_sysreg_lookup (isa, val, 1);
   2428      1.1     skrll       if (sr == XTENSA_UNDEFINED)
   2429      1.1     skrll 	{
   2430      1.1     skrll 	  as_bad (_("invalid register number (%ld) for '%s'"),
   2431      1.1     skrll 		  (long) val, opname);
   2432      1.1     skrll 	  return -1;
   2433      1.1     skrll 	}
   2434  1.1.1.5  christos     }
   2435      1.1     skrll 
   2436      1.1     skrll   /* Translate the opcode.  */
   2437      1.1     skrll   sr_name = xtensa_sysreg_name (isa, sr);
   2438      1.1     skrll   new_opname = XNEWVEC (char, strlen (sr_name) + 6);
   2439      1.1     skrll   sprintf (new_opname, "%s%cur.%s", (has_underbar ? "_" : ""),
   2440      1.1     skrll 	   opname[0], sr_name);
   2441      1.1     skrll   free (*popname);
   2442      1.1     skrll   *popname = new_opname;
   2443      1.1     skrll 
   2444      1.1     skrll   return 0;
   2445  1.1.1.5  christos }
   2446  1.1.1.5  christos 
   2447      1.1     skrll 
   2448      1.1     skrll static int
   2449      1.1     skrll xtensa_translate_zero_immed (const char *old_op,
   2450      1.1     skrll 			     const char *new_op,
   2451      1.1     skrll 			     char **popname,
   2452      1.1     skrll 			     int *pnum_args,
   2453      1.1     skrll 			     char **arg_strings)
   2454      1.1     skrll {
   2455  1.1.1.2  christos   char *opname;
   2456      1.1     skrll   offsetT val;
   2457      1.1     skrll 
   2458      1.1     skrll   opname = *popname;
   2459      1.1     skrll   gas_assert (opname[0] != '_');
   2460      1.1     skrll 
   2461      1.1     skrll   if (strcmp (opname, old_op) != 0)
   2462      1.1     skrll     return 0;
   2463      1.1     skrll 
   2464      1.1     skrll   if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
   2465      1.1     skrll     return -1;
   2466      1.1     skrll   if (xg_arg_is_constant (arg_strings[1], &val) && val == 0)
   2467      1.1     skrll     {
   2468      1.1     skrll       xg_replace_opname (popname, new_op);
   2469      1.1     skrll       free (arg_strings[1]);
   2470      1.1     skrll       arg_strings[1] = arg_strings[2];
   2471      1.1     skrll       arg_strings[2] = 0;
   2472      1.1     skrll       *pnum_args = 2;
   2473      1.1     skrll     }
   2474      1.1     skrll 
   2475      1.1     skrll   return 0;
   2476      1.1     skrll }
   2477      1.1     skrll 
   2478      1.1     skrll 
   2479      1.1     skrll /* If the instruction is an idiom (i.e., a built-in macro), translate it.
   2480      1.1     skrll    Returns non-zero if an error was found.  */
   2481      1.1     skrll 
   2482      1.1     skrll static int
   2483      1.1     skrll xg_translate_idioms (char **popname, int *pnum_args, char **arg_strings)
   2484      1.1     skrll {
   2485      1.1     skrll   char *opname = *popname;
   2486      1.1     skrll   bfd_boolean has_underbar = FALSE;
   2487      1.1     skrll 
   2488      1.1     skrll   if (*opname == '_')
   2489      1.1     skrll     {
   2490      1.1     skrll       has_underbar = TRUE;
   2491      1.1     skrll       opname += 1;
   2492      1.1     skrll     }
   2493      1.1     skrll 
   2494      1.1     skrll   if (strcmp (opname, "mov") == 0)
   2495      1.1     skrll     {
   2496      1.1     skrll       if (use_transform () && !has_underbar && density_supported)
   2497      1.1     skrll 	xg_replace_opname (popname, "mov.n");
   2498      1.1     skrll       else
   2499  1.1.1.5  christos 	{
   2500      1.1     skrll 	  if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
   2501      1.1     skrll 	    return -1;
   2502      1.1     skrll 	  xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
   2503      1.1     skrll 	  arg_strings[2] = xstrdup (arg_strings[1]);
   2504      1.1     skrll 	  *pnum_args = 3;
   2505      1.1     skrll 	}
   2506      1.1     skrll       return 0;
   2507      1.1     skrll     }
   2508      1.1     skrll 
   2509      1.1     skrll   if (strcmp (opname, "bbsi.l") == 0)
   2510      1.1     skrll     {
   2511      1.1     skrll       if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
   2512      1.1     skrll 	return -1;
   2513      1.1     skrll       xg_replace_opname (popname, (has_underbar ? "_bbsi" : "bbsi"));
   2514      1.1     skrll       if (target_big_endian)
   2515      1.1     skrll 	xg_reverse_shift_count (&arg_strings[1]);
   2516      1.1     skrll       return 0;
   2517      1.1     skrll     }
   2518      1.1     skrll 
   2519      1.1     skrll   if (strcmp (opname, "bbci.l") == 0)
   2520      1.1     skrll     {
   2521      1.1     skrll       if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
   2522      1.1     skrll 	return -1;
   2523      1.1     skrll       xg_replace_opname (popname, (has_underbar ? "_bbci" : "bbci"));
   2524      1.1     skrll       if (target_big_endian)
   2525      1.1     skrll 	xg_reverse_shift_count (&arg_strings[1]);
   2526  1.1.1.4  christos       return 0;
   2527      1.1     skrll     }
   2528      1.1     skrll 
   2529      1.1     skrll   /* Don't do anything special with NOPs inside FLIX instructions.  They
   2530      1.1     skrll      are handled elsewhere.  Real NOP instructions are always available
   2531      1.1     skrll      in configurations with FLIX, so this should never be an issue but
   2532      1.1     skrll      check for it anyway.  */
   2533      1.1     skrll   if (!cur_vinsn.inside_bundle && xtensa_nop_opcode == XTENSA_UNDEFINED
   2534      1.1     skrll       && strcmp (opname, "nop") == 0)
   2535      1.1     skrll     {
   2536      1.1     skrll       if (use_transform () && !has_underbar && density_supported)
   2537      1.1     skrll 	xg_replace_opname (popname, "nop.n");
   2538      1.1     skrll       else
   2539  1.1.1.5  christos 	{
   2540  1.1.1.5  christos 	  if (xg_check_num_args (pnum_args, 0, opname, arg_strings))
   2541  1.1.1.5  christos 	    return -1;
   2542      1.1     skrll 	  xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
   2543      1.1     skrll 	  arg_strings[0] = xstrdup ("a1");
   2544      1.1     skrll 	  arg_strings[1] = xstrdup ("a1");
   2545      1.1     skrll 	  arg_strings[2] = xstrdup ("a1");
   2546      1.1     skrll 	  *pnum_args = 3;
   2547      1.1     skrll 	}
   2548      1.1     skrll       return 0;
   2549      1.1     skrll     }
   2550      1.1     skrll 
   2551      1.1     skrll   /* Recognize [RW]UR and [RWX]SR.  */
   2552      1.1     skrll   if ((((opname[0] == 'r' || opname[0] == 'w')
   2553      1.1     skrll 	&& (opname[1] == 'u' || opname[1] == 's'))
   2554      1.1     skrll        || (opname[0] == 'x' && opname[1] == 's'))
   2555      1.1     skrll       && opname[2] == 'r'
   2556      1.1     skrll       && opname[3] == '\0')
   2557      1.1     skrll     return xg_translate_sysreg_op (popname, pnum_args, arg_strings);
   2558      1.1     skrll 
   2559      1.1     skrll   /* Backward compatibility for RUR and WUR: Recognize [RW]UR<nnn> and
   2560      1.1     skrll      [RW]<name> if <name> is the non-default name of a user register.  */
   2561      1.1     skrll   if ((opname[0] == 'r' || opname[0] == 'w')
   2562      1.1     skrll       && xtensa_opcode_lookup (xtensa_default_isa, opname) == XTENSA_UNDEFINED)
   2563      1.1     skrll     return xtensa_translate_old_userreg_ops (popname);
   2564      1.1     skrll 
   2565      1.1     skrll   /* Relax branches that don't allow comparisons against an immediate value
   2566      1.1     skrll      of zero to the corresponding branches with implicit zero immediates.  */
   2567      1.1     skrll   if (!has_underbar && use_transform ())
   2568      1.1     skrll     {
   2569      1.1     skrll       if (xtensa_translate_zero_immed ("bnei", "bnez", popname,
   2570      1.1     skrll 				       pnum_args, arg_strings))
   2571      1.1     skrll 	return -1;
   2572      1.1     skrll 
   2573      1.1     skrll       if (xtensa_translate_zero_immed ("beqi", "beqz", popname,
   2574      1.1     skrll 				       pnum_args, arg_strings))
   2575      1.1     skrll 	return -1;
   2576      1.1     skrll 
   2577      1.1     skrll       if (xtensa_translate_zero_immed ("bgei", "bgez", popname,
   2578      1.1     skrll 				       pnum_args, arg_strings))
   2579      1.1     skrll 	return -1;
   2580      1.1     skrll 
   2581      1.1     skrll       if (xtensa_translate_zero_immed ("blti", "bltz", popname,
   2582      1.1     skrll 				       pnum_args, arg_strings))
   2583      1.1     skrll 	return -1;
   2584      1.1     skrll     }
   2585      1.1     skrll 
   2586      1.1     skrll   return 0;
   2587      1.1     skrll }
   2588      1.1     skrll 
   2589      1.1     skrll 
   2590      1.1     skrll /* Functions for dealing with the Xtensa ISA.  */
   2592      1.1     skrll 
   2593      1.1     skrll /* Currently the assembler only allows us to use a single target per
   2594      1.1     skrll    fragment.  Because of this, only one operand for a given
   2595      1.1     skrll    instruction may be symbolic.  If there is a PC-relative operand,
   2596      1.1     skrll    the last one is chosen.  Otherwise, the result is the number of the
   2597      1.1     skrll    last immediate operand, and if there are none of those, we fail and
   2598      1.1     skrll    return -1.  */
   2599      1.1     skrll 
   2600      1.1     skrll static int
   2601      1.1     skrll get_relaxable_immed (xtensa_opcode opcode)
   2602      1.1     skrll {
   2603      1.1     skrll   int last_immed = -1;
   2604      1.1     skrll   int noperands, opi;
   2605      1.1     skrll 
   2606      1.1     skrll   if (opcode == XTENSA_UNDEFINED)
   2607      1.1     skrll     return -1;
   2608      1.1     skrll 
   2609      1.1     skrll   noperands = xtensa_opcode_num_operands (xtensa_default_isa, opcode);
   2610      1.1     skrll   for (opi = noperands - 1; opi >= 0; opi--)
   2611      1.1     skrll     {
   2612      1.1     skrll       if (xtensa_operand_is_visible (xtensa_default_isa, opcode, opi) == 0)
   2613      1.1     skrll 	continue;
   2614      1.1     skrll       if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, opi) == 1)
   2615      1.1     skrll 	return opi;
   2616      1.1     skrll       if (last_immed == -1
   2617      1.1     skrll 	  && xtensa_operand_is_register (xtensa_default_isa, opcode, opi) == 0)
   2618      1.1     skrll 	last_immed = opi;
   2619      1.1     skrll     }
   2620      1.1     skrll   return last_immed;
   2621      1.1     skrll }
   2622      1.1     skrll 
   2623      1.1     skrll 
   2624      1.1     skrll static xtensa_opcode
   2625      1.1     skrll get_opcode_from_buf (const char *buf, int slot)
   2626      1.1     skrll {
   2627      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   2628      1.1     skrll   static xtensa_insnbuf slotbuf = NULL;
   2629      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   2630      1.1     skrll   xtensa_format fmt;
   2631      1.1     skrll 
   2632      1.1     skrll   if (!insnbuf)
   2633      1.1     skrll     {
   2634      1.1     skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   2635      1.1     skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   2636      1.1     skrll     }
   2637      1.1     skrll 
   2638      1.1     skrll   xtensa_insnbuf_from_chars (isa, insnbuf, (const unsigned char *) buf, 0);
   2639      1.1     skrll   fmt = xtensa_format_decode (isa, insnbuf);
   2640      1.1     skrll   if (fmt == XTENSA_UNDEFINED)
   2641      1.1     skrll     return XTENSA_UNDEFINED;
   2642      1.1     skrll 
   2643      1.1     skrll   if (slot >= xtensa_format_num_slots (isa, fmt))
   2644      1.1     skrll     return XTENSA_UNDEFINED;
   2645      1.1     skrll 
   2646      1.1     skrll   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
   2647      1.1     skrll   return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   2648      1.1     skrll }
   2649      1.1     skrll 
   2650      1.1     skrll 
   2651      1.1     skrll #ifdef TENSILICA_DEBUG
   2652      1.1     skrll 
   2653      1.1     skrll /* For debugging, print out the mapping of opcode numbers to opcodes.  */
   2654      1.1     skrll 
   2655      1.1     skrll static void
   2656      1.1     skrll xtensa_print_insn_table (void)
   2657      1.1     skrll {
   2658      1.1     skrll   int num_opcodes, num_operands;
   2659      1.1     skrll   xtensa_opcode opcode;
   2660      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   2661      1.1     skrll 
   2662      1.1     skrll   num_opcodes = xtensa_isa_num_opcodes (xtensa_default_isa);
   2663      1.1     skrll   for (opcode = 0; opcode < num_opcodes; opcode++)
   2664      1.1     skrll     {
   2665      1.1     skrll       int opn;
   2666      1.1     skrll       fprintf (stderr, "%d: %s: ", opcode, xtensa_opcode_name (isa, opcode));
   2667      1.1     skrll       num_operands = xtensa_opcode_num_operands (isa, opcode);
   2668      1.1     skrll       for (opn = 0; opn < num_operands; opn++)
   2669      1.1     skrll 	{
   2670      1.1     skrll 	  if (xtensa_operand_is_visible (isa, opcode, opn) == 0)
   2671      1.1     skrll 	    continue;
   2672      1.1     skrll 	  if (xtensa_operand_is_register (isa, opcode, opn) == 1)
   2673      1.1     skrll 	    {
   2674      1.1     skrll 	      xtensa_regfile opnd_rf =
   2675      1.1     skrll 		xtensa_operand_regfile (isa, opcode, opn);
   2676      1.1     skrll 	      fprintf (stderr, "%s ", xtensa_regfile_shortname (isa, opnd_rf));
   2677      1.1     skrll 	    }
   2678      1.1     skrll 	  else if (xtensa_operand_is_PCrelative (isa, opcode, opn) == 1)
   2679      1.1     skrll 	    fputs ("[lLr] ", stderr);
   2680      1.1     skrll 	  else
   2681      1.1     skrll 	    fputs ("i ", stderr);
   2682      1.1     skrll 	}
   2683      1.1     skrll       fprintf (stderr, "\n");
   2684      1.1     skrll     }
   2685      1.1     skrll }
   2686      1.1     skrll 
   2687      1.1     skrll 
   2688      1.1     skrll static void
   2689      1.1     skrll print_vliw_insn (xtensa_insnbuf vbuf)
   2690      1.1     skrll {
   2691      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   2692      1.1     skrll   xtensa_format f = xtensa_format_decode (isa, vbuf);
   2693      1.1     skrll   xtensa_insnbuf sbuf = xtensa_insnbuf_alloc (isa);
   2694      1.1     skrll   int op;
   2695      1.1     skrll 
   2696      1.1     skrll   fprintf (stderr, "format = %d\n", f);
   2697      1.1     skrll 
   2698      1.1     skrll   for (op = 0; op < xtensa_format_num_slots (isa, f); op++)
   2699      1.1     skrll     {
   2700      1.1     skrll       xtensa_opcode opcode;
   2701      1.1     skrll       const char *opname;
   2702      1.1     skrll       int operands;
   2703      1.1     skrll 
   2704      1.1     skrll       xtensa_format_get_slot (isa, f, op, vbuf, sbuf);
   2705      1.1     skrll       opcode = xtensa_opcode_decode (isa, f, op, sbuf);
   2706      1.1     skrll       opname = xtensa_opcode_name (isa, opcode);
   2707      1.1     skrll 
   2708      1.1     skrll       fprintf (stderr, "op in slot %i is %s;\n", op, opname);
   2709      1.1     skrll       fprintf (stderr, "   operands = ");
   2710      1.1     skrll       for (operands = 0;
   2711      1.1     skrll 	   operands < xtensa_opcode_num_operands (isa, opcode);
   2712      1.1     skrll 	   operands++)
   2713      1.1     skrll 	{
   2714      1.1     skrll 	  unsigned int val;
   2715      1.1     skrll 	  if (xtensa_operand_is_visible (isa, opcode, operands) == 0)
   2716      1.1     skrll 	    continue;
   2717      1.1     skrll 	  xtensa_operand_get_field (isa, opcode, operands, f, op, sbuf, &val);
   2718      1.1     skrll 	  xtensa_operand_decode (isa, opcode, operands, &val);
   2719      1.1     skrll 	  fprintf (stderr, "%d ", val);
   2720      1.1     skrll 	}
   2721      1.1     skrll       fprintf (stderr, "\n");
   2722      1.1     skrll     }
   2723      1.1     skrll   xtensa_insnbuf_free (isa, sbuf);
   2724      1.1     skrll }
   2725      1.1     skrll 
   2726      1.1     skrll #endif /* TENSILICA_DEBUG */
   2727      1.1     skrll 
   2728      1.1     skrll 
   2729      1.1     skrll static bfd_boolean
   2730      1.1     skrll is_direct_call_opcode (xtensa_opcode opcode)
   2731      1.1     skrll {
   2732      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   2733      1.1     skrll   int n, num_operands;
   2734      1.1     skrll 
   2735      1.1     skrll   if (xtensa_opcode_is_call (isa, opcode) != 1)
   2736      1.1     skrll     return FALSE;
   2737      1.1     skrll 
   2738      1.1     skrll   num_operands = xtensa_opcode_num_operands (isa, opcode);
   2739      1.1     skrll   for (n = 0; n < num_operands; n++)
   2740      1.1     skrll     {
   2741      1.1     skrll       if (xtensa_operand_is_register (isa, opcode, n) == 0
   2742      1.1     skrll 	  && xtensa_operand_is_PCrelative (isa, opcode, n) == 1)
   2743      1.1     skrll 	return TRUE;
   2744      1.1     skrll     }
   2745      1.1     skrll   return FALSE;
   2746      1.1     skrll }
   2747      1.1     skrll 
   2748      1.1     skrll 
   2749      1.1     skrll /* Convert from BFD relocation type code to slot and operand number.
   2750      1.1     skrll    Returns non-zero on failure.  */
   2751      1.1     skrll 
   2752      1.1     skrll static int
   2753      1.1     skrll decode_reloc (bfd_reloc_code_real_type reloc, int *slot, bfd_boolean *is_alt)
   2754      1.1     skrll {
   2755      1.1     skrll   if (reloc >= BFD_RELOC_XTENSA_SLOT0_OP
   2756      1.1     skrll       && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
   2757      1.1     skrll     {
   2758      1.1     skrll       *slot = reloc - BFD_RELOC_XTENSA_SLOT0_OP;
   2759      1.1     skrll       *is_alt = FALSE;
   2760      1.1     skrll     }
   2761      1.1     skrll   else if (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
   2762      1.1     skrll       && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT)
   2763      1.1     skrll     {
   2764      1.1     skrll       *slot = reloc - BFD_RELOC_XTENSA_SLOT0_ALT;
   2765      1.1     skrll       *is_alt = TRUE;
   2766      1.1     skrll     }
   2767      1.1     skrll   else
   2768      1.1     skrll     return -1;
   2769      1.1     skrll 
   2770      1.1     skrll   return 0;
   2771      1.1     skrll }
   2772      1.1     skrll 
   2773      1.1     skrll 
   2774      1.1     skrll /* Convert from slot number to BFD relocation type code for the
   2775      1.1     skrll    standard PC-relative relocations.  Return BFD_RELOC_NONE on
   2776      1.1     skrll    failure.  */
   2777      1.1     skrll 
   2778      1.1     skrll static bfd_reloc_code_real_type
   2779      1.1     skrll encode_reloc (int slot)
   2780      1.1     skrll {
   2781      1.1     skrll   if (slot < 0 || slot > 14)
   2782      1.1     skrll     return BFD_RELOC_NONE;
   2783      1.1     skrll 
   2784      1.1     skrll   return BFD_RELOC_XTENSA_SLOT0_OP + slot;
   2785      1.1     skrll }
   2786      1.1     skrll 
   2787      1.1     skrll 
   2788      1.1     skrll /* Convert from slot numbers to BFD relocation type code for the
   2789      1.1     skrll    "alternate" relocations.  Return BFD_RELOC_NONE on failure.  */
   2790      1.1     skrll 
   2791      1.1     skrll static bfd_reloc_code_real_type
   2792      1.1     skrll encode_alt_reloc (int slot)
   2793      1.1     skrll {
   2794      1.1     skrll   if (slot < 0 || slot > 14)
   2795      1.1     skrll     return BFD_RELOC_NONE;
   2796      1.1     skrll 
   2797      1.1     skrll   return BFD_RELOC_XTENSA_SLOT0_ALT + slot;
   2798      1.1     skrll }
   2799      1.1     skrll 
   2800      1.1     skrll 
   2801      1.1     skrll static void
   2802      1.1     skrll xtensa_insnbuf_set_operand (xtensa_insnbuf slotbuf,
   2803      1.1     skrll 			    xtensa_format fmt,
   2804      1.1     skrll 			    int slot,
   2805      1.1     skrll 			    xtensa_opcode opcode,
   2806      1.1     skrll 			    int operand,
   2807      1.1     skrll 			    uint32 value,
   2808      1.1     skrll 			    const char *file,
   2809      1.1     skrll 			    unsigned int line)
   2810      1.1     skrll {
   2811      1.1     skrll   uint32 valbuf = value;
   2812      1.1     skrll 
   2813  1.1.1.4  christos   if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
   2814      1.1     skrll     {
   2815      1.1     skrll       if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, operand)
   2816      1.1     skrll 	  == 1)
   2817      1.1     skrll 	as_bad_where ((char *) file, line,
   2818      1.1     skrll 		      _("operand %d of '%s' has out of range value '%u'"),
   2819      1.1     skrll 		      operand + 1,
   2820      1.1     skrll 		      xtensa_opcode_name (xtensa_default_isa, opcode),
   2821      1.1     skrll 		      value);
   2822      1.1     skrll       else
   2823      1.1     skrll 	as_bad_where ((char *) file, line,
   2824      1.1     skrll 		      _("operand %d of '%s' has invalid value '%u'"),
   2825      1.1     skrll 		      operand + 1,
   2826      1.1     skrll 		      xtensa_opcode_name (xtensa_default_isa, opcode),
   2827      1.1     skrll 		      value);
   2828      1.1     skrll       return;
   2829      1.1     skrll     }
   2830      1.1     skrll 
   2831      1.1     skrll   xtensa_operand_set_field (xtensa_default_isa, opcode, operand, fmt, slot,
   2832      1.1     skrll 			    slotbuf, valbuf);
   2833      1.1     skrll }
   2834      1.1     skrll 
   2835      1.1     skrll 
   2836      1.1     skrll static uint32
   2837      1.1     skrll xtensa_insnbuf_get_operand (xtensa_insnbuf slotbuf,
   2838      1.1     skrll 			    xtensa_format fmt,
   2839      1.1     skrll 			    int slot,
   2840      1.1     skrll 			    xtensa_opcode opcode,
   2841      1.1     skrll 			    int opnum)
   2842      1.1     skrll {
   2843      1.1     skrll   uint32 val = 0;
   2844      1.1     skrll   (void) xtensa_operand_get_field (xtensa_default_isa, opcode, opnum,
   2845      1.1     skrll 				   fmt, slot, slotbuf, &val);
   2846      1.1     skrll   (void) xtensa_operand_decode (xtensa_default_isa, opcode, opnum, &val);
   2847      1.1     skrll   return val;
   2848      1.1     skrll }
   2849      1.1     skrll 
   2850  1.1.1.2  christos 
   2851      1.1     skrll /* Checks for rules from xtensa-relax tables.  */
   2853  1.1.1.2  christos 
   2854      1.1     skrll /* The routine xg_instruction_matches_option_term must return TRUE
   2855      1.1     skrll    when a given option term is true.  The meaning of all of the option
   2856      1.1     skrll    terms is given interpretation by this function.  */
   2857      1.1     skrll 
   2858      1.1     skrll static bfd_boolean
   2859      1.1     skrll xg_instruction_matches_option_term (TInsn *insn, const ReqOrOption *option)
   2860      1.1     skrll {
   2861      1.1     skrll   if (strcmp (option->option_name, "realnop") == 0
   2862  1.1.1.2  christos       || strncmp (option->option_name, "IsaUse", 6) == 0)
   2863  1.1.1.2  christos     {
   2864      1.1     skrll       /* These conditions were evaluated statically when building the
   2865      1.1     skrll 	 relaxation table.  There's no need to reevaluate them now.  */
   2866      1.1     skrll       return TRUE;
   2867      1.1     skrll     }
   2868      1.1     skrll   else if (strcmp (option->option_name, "FREEREG") == 0)
   2869      1.1     skrll     return insn->extra_arg.X_op == O_register;
   2870      1.1     skrll   else
   2871      1.1     skrll     {
   2872      1.1     skrll       as_fatal (_("internal error: unknown option name '%s'"),
   2873      1.1     skrll 		option->option_name);
   2874      1.1     skrll     }
   2875      1.1     skrll }
   2876      1.1     skrll 
   2877      1.1     skrll 
   2878      1.1     skrll static bfd_boolean
   2879      1.1     skrll xg_instruction_matches_or_options (TInsn *insn,
   2880      1.1     skrll 				   const ReqOrOptionList *or_option)
   2881      1.1     skrll {
   2882      1.1     skrll   const ReqOrOption *option;
   2883      1.1     skrll   /* Must match each of the AND terms.  */
   2884      1.1     skrll   for (option = or_option; option != NULL; option = option->next)
   2885      1.1     skrll     {
   2886      1.1     skrll       if (xg_instruction_matches_option_term (insn, option))
   2887      1.1     skrll 	return TRUE;
   2888      1.1     skrll     }
   2889      1.1     skrll   return FALSE;
   2890      1.1     skrll }
   2891      1.1     skrll 
   2892      1.1     skrll 
   2893      1.1     skrll static bfd_boolean
   2894      1.1     skrll xg_instruction_matches_options (TInsn *insn, const ReqOptionList *options)
   2895      1.1     skrll {
   2896      1.1     skrll   const ReqOption *req_options;
   2897      1.1     skrll   /* Must match each of the AND terms.  */
   2898      1.1     skrll   for (req_options = options;
   2899      1.1     skrll        req_options != NULL;
   2900      1.1     skrll        req_options = req_options->next)
   2901      1.1     skrll     {
   2902      1.1     skrll       /* Must match one of the OR clauses.  */
   2903      1.1     skrll       if (!xg_instruction_matches_or_options (insn,
   2904      1.1     skrll 					      req_options->or_option_terms))
   2905      1.1     skrll 	return FALSE;
   2906      1.1     skrll     }
   2907      1.1     skrll   return TRUE;
   2908      1.1     skrll }
   2909      1.1     skrll 
   2910      1.1     skrll 
   2911      1.1     skrll /* Return the transition rule that matches or NULL if none matches.  */
   2912      1.1     skrll 
   2913      1.1     skrll static bfd_boolean
   2914      1.1     skrll xg_instruction_matches_rule (TInsn *insn, TransitionRule *rule)
   2915      1.1     skrll {
   2916      1.1     skrll   PreconditionList *condition_l;
   2917      1.1     skrll 
   2918      1.1     skrll   if (rule->opcode != insn->opcode)
   2919      1.1     skrll     return FALSE;
   2920      1.1     skrll 
   2921      1.1     skrll   for (condition_l = rule->conditions;
   2922      1.1     skrll        condition_l != NULL;
   2923      1.1     skrll        condition_l = condition_l->next)
   2924      1.1     skrll     {
   2925      1.1     skrll       expressionS *exp1;
   2926      1.1     skrll       expressionS *exp2;
   2927  1.1.1.2  christos       Precondition *cond = condition_l->precond;
   2928      1.1     skrll 
   2929      1.1     skrll       switch (cond->typ)
   2930      1.1     skrll 	{
   2931      1.1     skrll 	case OP_CONSTANT:
   2932      1.1     skrll 	  /* The expression must be the constant.  */
   2933      1.1     skrll 	  gas_assert (cond->op_num < insn->ntok);
   2934      1.1     skrll 	  exp1 = &insn->tok[cond->op_num];
   2935      1.1     skrll 	  if (expr_is_const (exp1))
   2936      1.1     skrll 	    {
   2937      1.1     skrll 	      switch (cond->cmp)
   2938      1.1     skrll 		{
   2939      1.1     skrll 		case OP_EQUAL:
   2940      1.1     skrll 		  if (get_expr_const (exp1) != cond->op_data)
   2941      1.1     skrll 		    return FALSE;
   2942      1.1     skrll 		  break;
   2943      1.1     skrll 		case OP_NOTEQUAL:
   2944      1.1     skrll 		  if (get_expr_const (exp1) == cond->op_data)
   2945      1.1     skrll 		    return FALSE;
   2946      1.1     skrll 		  break;
   2947      1.1     skrll 		default:
   2948      1.1     skrll 		  return FALSE;
   2949      1.1     skrll 		}
   2950      1.1     skrll 	    }
   2951      1.1     skrll 	  else if (expr_is_register (exp1))
   2952      1.1     skrll 	    {
   2953      1.1     skrll 	      switch (cond->cmp)
   2954      1.1     skrll 		{
   2955      1.1     skrll 		case OP_EQUAL:
   2956      1.1     skrll 		  if (get_expr_register (exp1) != cond->op_data)
   2957      1.1     skrll 		    return FALSE;
   2958      1.1     skrll 		  break;
   2959      1.1     skrll 		case OP_NOTEQUAL:
   2960      1.1     skrll 		  if (get_expr_register (exp1) == cond->op_data)
   2961      1.1     skrll 		    return FALSE;
   2962      1.1     skrll 		  break;
   2963      1.1     skrll 		default:
   2964      1.1     skrll 		  return FALSE;
   2965      1.1     skrll 		}
   2966  1.1.1.2  christos 	    }
   2967  1.1.1.2  christos 	  else
   2968      1.1     skrll 	    return FALSE;
   2969      1.1     skrll 	  break;
   2970      1.1     skrll 
   2971      1.1     skrll 	case OP_OPERAND:
   2972      1.1     skrll 	  gas_assert (cond->op_num < insn->ntok);
   2973      1.1     skrll 	  gas_assert (cond->op_data < insn->ntok);
   2974      1.1     skrll 	  exp1 = &insn->tok[cond->op_num];
   2975      1.1     skrll 	  exp2 = &insn->tok[cond->op_data];
   2976      1.1     skrll 
   2977      1.1     skrll 	  switch (cond->cmp)
   2978      1.1     skrll 	    {
   2979      1.1     skrll 	    case OP_EQUAL:
   2980      1.1     skrll 	      if (!expr_is_equal (exp1, exp2))
   2981      1.1     skrll 		return FALSE;
   2982      1.1     skrll 	      break;
   2983      1.1     skrll 	    case OP_NOTEQUAL:
   2984      1.1     skrll 	      if (expr_is_equal (exp1, exp2))
   2985      1.1     skrll 		return FALSE;
   2986      1.1     skrll 	      break;
   2987      1.1     skrll 	    }
   2988      1.1     skrll 	  break;
   2989      1.1     skrll 
   2990      1.1     skrll 	case OP_LITERAL:
   2991      1.1     skrll 	case OP_LABEL:
   2992      1.1     skrll 	default:
   2993      1.1     skrll 	  return FALSE;
   2994      1.1     skrll 	}
   2995      1.1     skrll     }
   2996      1.1     skrll   if (!xg_instruction_matches_options (insn, rule->options))
   2997      1.1     skrll     return FALSE;
   2998      1.1     skrll 
   2999      1.1     skrll   return TRUE;
   3000      1.1     skrll }
   3001      1.1     skrll 
   3002      1.1     skrll 
   3003      1.1     skrll static int
   3004      1.1     skrll transition_rule_cmp (const TransitionRule *a, const TransitionRule *b)
   3005      1.1     skrll {
   3006      1.1     skrll   bfd_boolean a_greater = FALSE;
   3007      1.1     skrll   bfd_boolean b_greater = FALSE;
   3008      1.1     skrll 
   3009      1.1     skrll   ReqOptionList *l_a = a->options;
   3010      1.1     skrll   ReqOptionList *l_b = b->options;
   3011      1.1     skrll 
   3012      1.1     skrll   /* We only care if they both are the same except for
   3013      1.1     skrll      a const16 vs. an l32r.  */
   3014      1.1     skrll 
   3015      1.1     skrll   while (l_a && l_b && ((l_a->next == NULL) == (l_b->next == NULL)))
   3016      1.1     skrll     {
   3017      1.1     skrll       ReqOrOptionList *l_or_a = l_a->or_option_terms;
   3018      1.1     skrll       ReqOrOptionList *l_or_b = l_b->or_option_terms;
   3019      1.1     skrll       while (l_or_a && l_or_b && ((l_a->next == NULL) == (l_b->next == NULL)))
   3020      1.1     skrll 	{
   3021      1.1     skrll 	  if (l_or_a->is_true != l_or_b->is_true)
   3022      1.1     skrll 	    return 0;
   3023      1.1     skrll 	  if (strcmp (l_or_a->option_name, l_or_b->option_name) != 0)
   3024      1.1     skrll 	    {
   3025      1.1     skrll 	      /* This is the case we care about.  */
   3026      1.1     skrll 	      if (strcmp (l_or_a->option_name, "IsaUseConst16") == 0
   3027      1.1     skrll 		  && strcmp (l_or_b->option_name, "IsaUseL32R") == 0)
   3028      1.1     skrll 		{
   3029      1.1     skrll 		  if (prefer_const16)
   3030      1.1     skrll 		    a_greater = TRUE;
   3031      1.1     skrll 		  else
   3032      1.1     skrll 		    b_greater = TRUE;
   3033      1.1     skrll 		}
   3034      1.1     skrll 	      else if (strcmp (l_or_a->option_name, "IsaUseL32R") == 0
   3035      1.1     skrll 		       && strcmp (l_or_b->option_name, "IsaUseConst16") == 0)
   3036      1.1     skrll 		{
   3037      1.1     skrll 		  if (prefer_const16)
   3038      1.1     skrll 		    b_greater = TRUE;
   3039      1.1     skrll 		  else
   3040      1.1     skrll 		    a_greater = TRUE;
   3041      1.1     skrll 		}
   3042      1.1     skrll 	      else
   3043      1.1     skrll 		return 0;
   3044      1.1     skrll 	    }
   3045      1.1     skrll 	  l_or_a = l_or_a->next;
   3046      1.1     skrll 	  l_or_b = l_or_b->next;
   3047      1.1     skrll 	}
   3048      1.1     skrll       if (l_or_a || l_or_b)
   3049      1.1     skrll 	return 0;
   3050      1.1     skrll 
   3051      1.1     skrll       l_a = l_a->next;
   3052      1.1     skrll       l_b = l_b->next;
   3053      1.1     skrll     }
   3054      1.1     skrll   if (l_a || l_b)
   3055      1.1     skrll     return 0;
   3056      1.1     skrll 
   3057      1.1     skrll   /* Incomparable if the substitution was used differently in two cases.  */
   3058      1.1     skrll   if (a_greater && b_greater)
   3059      1.1     skrll     return 0;
   3060      1.1     skrll 
   3061      1.1     skrll   if (b_greater)
   3062      1.1     skrll     return 1;
   3063      1.1     skrll   if (a_greater)
   3064      1.1     skrll     return -1;
   3065      1.1     skrll 
   3066      1.1     skrll   return 0;
   3067      1.1     skrll }
   3068      1.1     skrll 
   3069  1.1.1.2  christos 
   3070      1.1     skrll static TransitionRule *
   3071      1.1     skrll xg_instruction_match (TInsn *insn)
   3072      1.1     skrll {
   3073      1.1     skrll   TransitionTable *table = xg_build_simplify_table (&transition_rule_cmp);
   3074      1.1     skrll   TransitionList *l;
   3075      1.1     skrll   gas_assert (insn->opcode < table->num_opcodes);
   3076      1.1     skrll 
   3077      1.1     skrll   /* Walk through all of the possible transitions.  */
   3078      1.1     skrll   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
   3079      1.1     skrll     {
   3080      1.1     skrll       TransitionRule *rule = l->rule;
   3081      1.1     skrll       if (xg_instruction_matches_rule (insn, rule))
   3082      1.1     skrll 	return rule;
   3083      1.1     skrll     }
   3084      1.1     skrll   return NULL;
   3085      1.1     skrll }
   3086      1.1     skrll 
   3087      1.1     skrll 
   3088      1.1     skrll /* Various Other Internal Functions.  */
   3090      1.1     skrll 
   3091      1.1     skrll static bfd_boolean
   3092      1.1     skrll is_unique_insn_expansion (TransitionRule *r)
   3093      1.1     skrll {
   3094      1.1     skrll   if (!r->to_instr || r->to_instr->next != NULL)
   3095      1.1     skrll     return FALSE;
   3096      1.1     skrll   if (r->to_instr->typ != INSTR_INSTR)
   3097      1.1     skrll     return FALSE;
   3098      1.1     skrll   return TRUE;
   3099      1.1     skrll }
   3100      1.1     skrll 
   3101      1.1     skrll 
   3102      1.1     skrll /* Check if there is exactly one relaxation for INSN that converts it to
   3103      1.1     skrll    another instruction of equal or larger size.  If so, and if TARG is
   3104      1.1     skrll    non-null, go ahead and generate the relaxed instruction into TARG.  If
   3105      1.1     skrll    NARROW_ONLY is true, then only consider relaxations that widen a narrow
   3106      1.1     skrll    instruction, i.e., ignore relaxations that convert to an instruction of
   3107      1.1     skrll    equal size.  In some contexts where this function is used, only
   3108      1.1     skrll    a single widening is allowed and the NARROW_ONLY argument is used to
   3109      1.1     skrll    exclude cases like ADDI being "widened" to an ADDMI, which may
   3110      1.1     skrll    later be relaxed to an ADDMI/ADDI pair.  */
   3111      1.1     skrll 
   3112  1.1.1.2  christos bfd_boolean
   3113  1.1.1.2  christos xg_is_single_relaxable_insn (TInsn *insn, TInsn *targ, bfd_boolean narrow_only)
   3114      1.1     skrll {
   3115      1.1     skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3116      1.1     skrll   TransitionList *l;
   3117      1.1     skrll   TransitionRule *match = 0;
   3118      1.1     skrll 
   3119      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   3120      1.1     skrll   gas_assert (insn->opcode < table->num_opcodes);
   3121      1.1     skrll 
   3122      1.1     skrll   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
   3123      1.1     skrll     {
   3124      1.1     skrll       TransitionRule *rule = l->rule;
   3125      1.1     skrll 
   3126      1.1     skrll       if (xg_instruction_matches_rule (insn, rule)
   3127      1.1     skrll 	  && is_unique_insn_expansion (rule)
   3128      1.1     skrll 	  && (xg_get_single_size (insn->opcode) + (narrow_only ? 1 : 0)
   3129      1.1     skrll 	      <= xg_get_single_size (rule->to_instr->opcode)))
   3130      1.1     skrll 	{
   3131      1.1     skrll 	  if (match)
   3132      1.1     skrll 	    return FALSE;
   3133      1.1     skrll 	  match = rule;
   3134      1.1     skrll 	}
   3135      1.1     skrll     }
   3136      1.1     skrll   if (!match)
   3137      1.1     skrll     return FALSE;
   3138      1.1     skrll 
   3139      1.1     skrll   if (targ)
   3140      1.1     skrll     xg_build_to_insn (targ, insn, match->to_instr);
   3141      1.1     skrll   return TRUE;
   3142      1.1     skrll }
   3143      1.1     skrll 
   3144      1.1     skrll 
   3145      1.1     skrll /* Return the maximum number of bytes this opcode can expand to.  */
   3146      1.1     skrll 
   3147  1.1.1.2  christos static int
   3148      1.1     skrll xg_get_max_insn_widen_size (xtensa_opcode opcode)
   3149      1.1     skrll {
   3150      1.1     skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3151      1.1     skrll   TransitionList *l;
   3152      1.1     skrll   int max_size = xg_get_single_size (opcode);
   3153      1.1     skrll 
   3154      1.1     skrll   gas_assert (opcode < table->num_opcodes);
   3155      1.1     skrll 
   3156      1.1     skrll   for (l = table->table[opcode]; l != NULL; l = l->next)
   3157      1.1     skrll     {
   3158      1.1     skrll       TransitionRule *rule = l->rule;
   3159      1.1     skrll       BuildInstr *build_list;
   3160  1.1.1.2  christos       int this_size = 0;
   3161      1.1     skrll 
   3162      1.1     skrll       if (!rule)
   3163      1.1     skrll 	continue;
   3164      1.1     skrll       build_list = rule->to_instr;
   3165      1.1     skrll       if (is_unique_insn_expansion (rule))
   3166      1.1     skrll 	{
   3167      1.1     skrll 	  gas_assert (build_list->typ == INSTR_INSTR);
   3168      1.1     skrll 	  this_size = xg_get_max_insn_widen_size (build_list->opcode);
   3169      1.1     skrll 	}
   3170      1.1     skrll       else
   3171      1.1     skrll 	for (; build_list != NULL; build_list = build_list->next)
   3172      1.1     skrll 	  {
   3173      1.1     skrll 	    switch (build_list->typ)
   3174      1.1     skrll 	      {
   3175      1.1     skrll 	      case INSTR_INSTR:
   3176      1.1     skrll 		this_size += xg_get_single_size (build_list->opcode);
   3177      1.1     skrll 		break;
   3178      1.1     skrll 	      case INSTR_LITERAL_DEF:
   3179      1.1     skrll 	      case INSTR_LABEL_DEF:
   3180      1.1     skrll 	      default:
   3181      1.1     skrll 		break;
   3182      1.1     skrll 	      }
   3183      1.1     skrll 	  }
   3184      1.1     skrll       if (this_size > max_size)
   3185      1.1     skrll 	max_size = this_size;
   3186      1.1     skrll     }
   3187      1.1     skrll   return max_size;
   3188      1.1     skrll }
   3189      1.1     skrll 
   3190      1.1     skrll 
   3191      1.1     skrll /* Return the maximum number of literal bytes this opcode can generate.  */
   3192      1.1     skrll 
   3193  1.1.1.2  christos static int
   3194      1.1     skrll xg_get_max_insn_widen_literal_size (xtensa_opcode opcode)
   3195      1.1     skrll {
   3196      1.1     skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3197      1.1     skrll   TransitionList *l;
   3198      1.1     skrll   int max_size = 0;
   3199      1.1     skrll 
   3200      1.1     skrll   gas_assert (opcode < table->num_opcodes);
   3201      1.1     skrll 
   3202      1.1     skrll   for (l = table->table[opcode]; l != NULL; l = l->next)
   3203      1.1     skrll     {
   3204      1.1     skrll       TransitionRule *rule = l->rule;
   3205      1.1     skrll       BuildInstr *build_list;
   3206  1.1.1.2  christos       int this_size = 0;
   3207      1.1     skrll 
   3208      1.1     skrll       if (!rule)
   3209      1.1     skrll 	continue;
   3210      1.1     skrll       build_list = rule->to_instr;
   3211      1.1     skrll       if (is_unique_insn_expansion (rule))
   3212      1.1     skrll 	{
   3213      1.1     skrll 	  gas_assert (build_list->typ == INSTR_INSTR);
   3214      1.1     skrll 	  this_size = xg_get_max_insn_widen_literal_size (build_list->opcode);
   3215      1.1     skrll 	}
   3216      1.1     skrll       else
   3217      1.1     skrll 	for (; build_list != NULL; build_list = build_list->next)
   3218      1.1     skrll 	  {
   3219      1.1     skrll 	    switch (build_list->typ)
   3220      1.1     skrll 	      {
   3221      1.1     skrll 	      case INSTR_LITERAL_DEF:
   3222      1.1     skrll 		/* Hard-coded 4-byte literal.  */
   3223      1.1     skrll 		this_size += 4;
   3224      1.1     skrll 		break;
   3225      1.1     skrll 	      case INSTR_INSTR:
   3226      1.1     skrll 	      case INSTR_LABEL_DEF:
   3227      1.1     skrll 	      default:
   3228      1.1     skrll 		break;
   3229      1.1     skrll 	      }
   3230      1.1     skrll 	  }
   3231      1.1     skrll       if (this_size > max_size)
   3232      1.1     skrll 	max_size = this_size;
   3233      1.1     skrll     }
   3234      1.1     skrll   return max_size;
   3235      1.1     skrll }
   3236      1.1     skrll 
   3237      1.1     skrll 
   3238  1.1.1.2  christos static bfd_boolean
   3239  1.1.1.2  christos xg_is_relaxable_insn (TInsn *insn, int lateral_steps)
   3240      1.1     skrll {
   3241      1.1     skrll   int steps_taken = 0;
   3242      1.1     skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3243      1.1     skrll   TransitionList *l;
   3244      1.1     skrll 
   3245      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   3246      1.1     skrll   gas_assert (insn->opcode < table->num_opcodes);
   3247      1.1     skrll 
   3248      1.1     skrll   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
   3249      1.1     skrll     {
   3250      1.1     skrll       TransitionRule *rule = l->rule;
   3251      1.1     skrll 
   3252      1.1     skrll       if (xg_instruction_matches_rule (insn, rule))
   3253      1.1     skrll 	{
   3254      1.1     skrll 	  if (steps_taken == lateral_steps)
   3255      1.1     skrll 	    return TRUE;
   3256      1.1     skrll 	  steps_taken++;
   3257      1.1     skrll 	}
   3258      1.1     skrll     }
   3259      1.1     skrll   return FALSE;
   3260      1.1     skrll }
   3261      1.1     skrll 
   3262      1.1     skrll 
   3263      1.1     skrll static symbolS *
   3264      1.1     skrll get_special_literal_symbol (void)
   3265      1.1     skrll {
   3266      1.1     skrll   static symbolS *sym = NULL;
   3267      1.1     skrll 
   3268      1.1     skrll   if (sym == NULL)
   3269      1.1     skrll     sym = symbol_find_or_make ("SPECIAL_LITERAL0\001");
   3270      1.1     skrll   return sym;
   3271      1.1     skrll }
   3272      1.1     skrll 
   3273      1.1     skrll 
   3274      1.1     skrll static symbolS *
   3275      1.1     skrll get_special_label_symbol (void)
   3276      1.1     skrll {
   3277      1.1     skrll   static symbolS *sym = NULL;
   3278      1.1     skrll 
   3279      1.1     skrll   if (sym == NULL)
   3280      1.1     skrll     sym = symbol_find_or_make ("SPECIAL_LABEL0\001");
   3281      1.1     skrll   return sym;
   3282      1.1     skrll }
   3283      1.1     skrll 
   3284      1.1     skrll 
   3285      1.1     skrll static bfd_boolean
   3286      1.1     skrll xg_valid_literal_expression (const expressionS *exp)
   3287      1.1     skrll {
   3288      1.1     skrll   switch (exp->X_op)
   3289      1.1     skrll     {
   3290      1.1     skrll     case O_constant:
   3291      1.1     skrll     case O_symbol:
   3292      1.1     skrll     case O_big:
   3293      1.1     skrll     case O_uminus:
   3294      1.1     skrll     case O_subtract:
   3295      1.1     skrll     case O_pltrel:
   3296      1.1     skrll     case O_pcrel:
   3297      1.1     skrll     case O_tlsfunc:
   3298      1.1     skrll     case O_tlsarg:
   3299      1.1     skrll     case O_tpoff:
   3300      1.1     skrll     case O_dtpoff:
   3301      1.1     skrll       return TRUE;
   3302      1.1     skrll     default:
   3303      1.1     skrll       return FALSE;
   3304      1.1     skrll     }
   3305      1.1     skrll }
   3306      1.1     skrll 
   3307      1.1     skrll 
   3308      1.1     skrll /* This will check to see if the value can be converted into the
   3309      1.1     skrll    operand type.  It will return TRUE if it does not fit.  */
   3310      1.1     skrll 
   3311      1.1     skrll static bfd_boolean
   3312      1.1     skrll xg_check_operand (int32 value, xtensa_opcode opcode, int operand)
   3313      1.1     skrll {
   3314      1.1     skrll   uint32 valbuf = value;
   3315      1.1     skrll   if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
   3316      1.1     skrll     return TRUE;
   3317      1.1     skrll   return FALSE;
   3318      1.1     skrll }
   3319      1.1     skrll 
   3320      1.1     skrll 
   3321      1.1     skrll /* Assumes: All immeds are constants.  Check that all constants fit
   3322      1.1     skrll    into their immeds; return FALSE if not.  */
   3323      1.1     skrll 
   3324  1.1.1.2  christos static bfd_boolean
   3325      1.1     skrll xg_immeds_fit (const TInsn *insn)
   3326      1.1     skrll {
   3327  1.1.1.2  christos   xtensa_isa isa = xtensa_default_isa;
   3328  1.1.1.2  christos   int i;
   3329      1.1     skrll 
   3330      1.1     skrll   int n = insn->ntok;
   3331      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   3332  1.1.1.2  christos   for (i = 0; i < n; ++i)
   3333      1.1     skrll     {
   3334      1.1     skrll       const expressionS *exp = &insn->tok[i];
   3335      1.1     skrll 
   3336  1.1.1.2  christos       if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
   3337      1.1     skrll 	continue;
   3338      1.1     skrll 
   3339      1.1     skrll       switch (exp->X_op)
   3340      1.1     skrll 	{
   3341      1.1     skrll 	case O_register:
   3342  1.1.1.2  christos 	case O_constant:
   3343      1.1     skrll 	  if (xg_check_operand (exp->X_add_number, insn->opcode, i))
   3344      1.1     skrll 	    return FALSE;
   3345      1.1     skrll 	  break;
   3346      1.1     skrll 
   3347      1.1     skrll 	default:
   3348      1.1     skrll 	  /* The symbol should have a fixup associated with it.  */
   3349      1.1     skrll 	  gas_assert (FALSE);
   3350      1.1     skrll 	  break;
   3351      1.1     skrll 	}
   3352      1.1     skrll     }
   3353      1.1     skrll   return TRUE;
   3354      1.1     skrll }
   3355      1.1     skrll 
   3356      1.1     skrll 
   3357      1.1     skrll /* This should only be called after we have an initial
   3358      1.1     skrll    estimate of the addresses.  */
   3359      1.1     skrll 
   3360      1.1     skrll static bfd_boolean
   3361      1.1     skrll xg_symbolic_immeds_fit (const TInsn *insn,
   3362      1.1     skrll 			segT pc_seg,
   3363      1.1     skrll 			fragS *pc_frag,
   3364      1.1     skrll 			offsetT pc_offset,
   3365      1.1     skrll 			long stretch)
   3366      1.1     skrll {
   3367      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   3368  1.1.1.2  christos   symbolS *symbolP;
   3369      1.1     skrll   fragS *sym_frag;
   3370      1.1     skrll   offsetT target, pc;
   3371      1.1     skrll   uint32 new_offset;
   3372  1.1.1.2  christos   int i;
   3373  1.1.1.2  christos   int n = insn->ntok;
   3374      1.1     skrll 
   3375      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   3376      1.1     skrll 
   3377  1.1.1.2  christos   for (i = 0; i < n; ++i)
   3378      1.1     skrll     {
   3379      1.1     skrll       const expressionS *exp = &insn->tok[i];
   3380      1.1     skrll 
   3381  1.1.1.2  christos       if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
   3382      1.1     skrll 	continue;
   3383      1.1     skrll 
   3384      1.1     skrll       switch (exp->X_op)
   3385      1.1     skrll 	{
   3386      1.1     skrll 	case O_register:
   3387      1.1     skrll 	case O_constant:
   3388      1.1     skrll 	  if (xg_check_operand (exp->X_add_number, insn->opcode, i))
   3389      1.1     skrll 	    return FALSE;
   3390      1.1     skrll 	  break;
   3391      1.1     skrll 
   3392      1.1     skrll 	case O_lo16:
   3393      1.1     skrll 	case O_hi16:
   3394      1.1     skrll 	  /* Check for the worst case.  */
   3395      1.1     skrll 	  if (xg_check_operand (0xffff, insn->opcode, i))
   3396      1.1     skrll 	    return FALSE;
   3397      1.1     skrll 	  break;
   3398      1.1     skrll 
   3399      1.1     skrll 	case O_symbol:
   3400      1.1     skrll 	  /* We only allow symbols for PC-relative references.
   3401  1.1.1.2  christos 	     If pc_frag == 0, then we don't have frag locations yet.  */
   3402  1.1.1.2  christos 	  if (pc_frag == 0
   3403      1.1     skrll 	      || xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 0)
   3404      1.1     skrll 	    return FALSE;
   3405      1.1     skrll 
   3406      1.1     skrll 	  /* If it is a weak symbol or a symbol in a different section,
   3407      1.1     skrll 	     it cannot be known to fit at assembly time.  */
   3408      1.1     skrll 	  if (S_IS_WEAK (exp->X_add_symbol)
   3409      1.1     skrll 	      || S_GET_SEGMENT (exp->X_add_symbol) != pc_seg)
   3410      1.1     skrll 	    {
   3411      1.1     skrll 	      /* For a direct call with --no-longcalls, be optimistic and
   3412  1.1.1.2  christos 		 assume it will be in range.  If the symbol is weak and
   3413  1.1.1.2  christos 		 undefined, it may remain undefined at link-time, in which
   3414      1.1     skrll 		 case it will have a zero value and almost certainly be out
   3415      1.1     skrll 		 of range for a direct call; thus, relax for undefined weak
   3416      1.1     skrll 		 symbols even if longcalls is not enabled.  */
   3417      1.1     skrll 	      if (is_direct_call_opcode (insn->opcode)
   3418      1.1     skrll 		  && ! pc_frag->tc_frag_data.use_longcalls
   3419  1.1.1.2  christos 		  && (! S_IS_WEAK (exp->X_add_symbol)
   3420      1.1     skrll 		      || S_IS_DEFINED (exp->X_add_symbol)))
   3421  1.1.1.2  christos 		return TRUE;
   3422      1.1     skrll 
   3423      1.1     skrll 	      return FALSE;
   3424      1.1     skrll 	    }
   3425      1.1     skrll 
   3426      1.1     skrll 	  symbolP = exp->X_add_symbol;
   3427      1.1     skrll 	  sym_frag = symbol_get_frag (symbolP);
   3428      1.1     skrll 	  target = S_GET_VALUE (symbolP) + exp->X_add_number;
   3429      1.1     skrll 	  pc = pc_frag->fr_address + pc_offset;
   3430      1.1     skrll 
   3431      1.1     skrll 	  /* If frag has yet to be reached on this pass, assume it
   3432      1.1     skrll 	     will move by STRETCH just as we did.  If this is not so,
   3433      1.1     skrll 	     it will be because some frag between grows, and that will
   3434      1.1     skrll 	     force another pass.  Beware zero-length frags.  There
   3435      1.1     skrll 	     should be a faster way to do this.  */
   3436      1.1     skrll 
   3437      1.1     skrll 	  if (stretch != 0
   3438      1.1     skrll 	      && sym_frag->relax_marker != pc_frag->relax_marker
   3439      1.1     skrll 	      && S_GET_SEGMENT (symbolP) == pc_seg)
   3440      1.1     skrll 	    {
   3441      1.1     skrll 	      target += stretch;
   3442      1.1     skrll 	    }
   3443      1.1     skrll 
   3444      1.1     skrll 	  new_offset = target;
   3445      1.1     skrll 	  xtensa_operand_do_reloc (isa, insn->opcode, i, &new_offset, pc);
   3446      1.1     skrll 	  if (xg_check_operand (new_offset, insn->opcode, i))
   3447      1.1     skrll 	    return FALSE;
   3448      1.1     skrll 	  break;
   3449      1.1     skrll 
   3450      1.1     skrll 	default:
   3451      1.1     skrll 	  /* The symbol should have a fixup associated with it.  */
   3452      1.1     skrll 	  return FALSE;
   3453      1.1     skrll 	}
   3454      1.1     skrll     }
   3455      1.1     skrll 
   3456      1.1     skrll   return TRUE;
   3457      1.1     skrll }
   3458      1.1     skrll 
   3459      1.1     skrll 
   3460      1.1     skrll /* Return TRUE on success.  */
   3461      1.1     skrll 
   3462      1.1     skrll static bfd_boolean
   3463      1.1     skrll xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
   3464      1.1     skrll {
   3465      1.1     skrll   BuildOp *op;
   3466      1.1     skrll   symbolS *sym;
   3467      1.1     skrll 
   3468      1.1     skrll   tinsn_init (targ);
   3469      1.1     skrll   targ->debug_line = insn->debug_line;
   3470      1.1     skrll   targ->loc_directive_seen = insn->loc_directive_seen;
   3471      1.1     skrll   switch (bi->typ)
   3472      1.1     skrll     {
   3473      1.1     skrll     case INSTR_INSTR:
   3474      1.1     skrll       op = bi->ops;
   3475      1.1     skrll       targ->opcode = bi->opcode;
   3476      1.1     skrll       targ->insn_type = ITYPE_INSN;
   3477  1.1.1.2  christos       targ->is_specific_opcode = FALSE;
   3478      1.1     skrll 
   3479      1.1     skrll       for (; op != NULL; op = op->next)
   3480      1.1     skrll 	{
   3481      1.1     skrll 	  int op_num = op->op_num;
   3482      1.1     skrll 	  int op_data = op->op_data;
   3483      1.1     skrll 
   3484      1.1     skrll 	  gas_assert (op->op_num < MAX_INSN_ARGS);
   3485      1.1     skrll 
   3486      1.1     skrll 	  if (targ->ntok <= op_num)
   3487      1.1     skrll 	    targ->ntok = op_num + 1;
   3488  1.1.1.2  christos 
   3489      1.1     skrll 	  switch (op->typ)
   3490      1.1     skrll 	    {
   3491  1.1.1.2  christos 	    case OP_CONSTANT:
   3492  1.1.1.2  christos 	      set_expr_const (&targ->tok[op_num], op_data);
   3493  1.1.1.2  christos 	      break;
   3494  1.1.1.2  christos 	    case OP_OPERAND:
   3495  1.1.1.2  christos 	      gas_assert (op_data < insn->ntok);
   3496      1.1     skrll 	      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3497      1.1     skrll 	      break;
   3498      1.1     skrll 	    case OP_FREEREG:
   3499      1.1     skrll 	      if (insn->extra_arg.X_op != O_register)
   3500      1.1     skrll 		return FALSE;
   3501  1.1.1.2  christos 	      copy_expr (&targ->tok[op_num], &insn->extra_arg);
   3502      1.1     skrll 	      break;
   3503      1.1     skrll 	    case OP_LITERAL:
   3504      1.1     skrll 	      sym = get_special_literal_symbol ();
   3505      1.1     skrll 	      set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
   3506      1.1     skrll 	      if (insn->tok[op_data].X_op == O_tlsfunc
   3507      1.1     skrll 		  || insn->tok[op_data].X_op == O_tlsarg)
   3508      1.1     skrll 		copy_expr (&targ->extra_arg, &insn->tok[op_data]);
   3509  1.1.1.2  christos 	      break;
   3510      1.1     skrll 	    case OP_LABEL:
   3511      1.1     skrll 	      sym = get_special_label_symbol ();
   3512      1.1     skrll 	      set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
   3513      1.1     skrll 	      break;
   3514      1.1     skrll 	    case OP_OPERAND_HI16U:
   3515      1.1     skrll 	    case OP_OPERAND_LOW16U:
   3516      1.1     skrll 	      gas_assert (op_data < insn->ntok);
   3517      1.1     skrll 	      if (expr_is_const (&insn->tok[op_data]))
   3518      1.1     skrll 		{
   3519      1.1     skrll 		  long val;
   3520      1.1     skrll 		  copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3521      1.1     skrll 		  val = xg_apply_userdef_op_fn (op->typ,
   3522      1.1     skrll 						targ->tok[op_num].
   3523      1.1     skrll 						X_add_number);
   3524      1.1     skrll 		  targ->tok[op_num].X_add_number = val;
   3525  1.1.1.2  christos 		}
   3526      1.1     skrll 	      else
   3527      1.1     skrll 		{
   3528      1.1     skrll 		  /* For const16 we can create relocations for these.  */
   3529      1.1     skrll 		  if (targ->opcode == XTENSA_UNDEFINED
   3530      1.1     skrll 		      || (targ->opcode != xtensa_const16_opcode))
   3531      1.1     skrll 		    return FALSE;
   3532      1.1     skrll 		  gas_assert (op_data < insn->ntok);
   3533      1.1     skrll 		  /* Need to build a O_lo16 or O_hi16.  */
   3534      1.1     skrll 		  copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3535      1.1     skrll 		  if (targ->tok[op_num].X_op == O_symbol)
   3536      1.1     skrll 		    {
   3537      1.1     skrll 		      if (op->typ == OP_OPERAND_HI16U)
   3538      1.1     skrll 			targ->tok[op_num].X_op = O_hi16;
   3539      1.1     skrll 		      else if (op->typ == OP_OPERAND_LOW16U)
   3540      1.1     skrll 			targ->tok[op_num].X_op = O_lo16;
   3541      1.1     skrll 		      else
   3542      1.1     skrll 			return FALSE;
   3543      1.1     skrll 		    }
   3544      1.1     skrll 		}
   3545      1.1     skrll 	      break;
   3546  1.1.1.2  christos 	    default:
   3547      1.1     skrll 	      /* currently handles:
   3548      1.1     skrll 		 OP_OPERAND_LOW8
   3549      1.1     skrll 		 OP_OPERAND_HI24S
   3550      1.1     skrll 		 OP_OPERAND_F32MINUS */
   3551      1.1     skrll 	      if (xg_has_userdef_op_fn (op->typ))
   3552      1.1     skrll 		{
   3553      1.1     skrll 		  gas_assert (op_data < insn->ntok);
   3554      1.1     skrll 		  if (expr_is_const (&insn->tok[op_data]))
   3555      1.1     skrll 		    {
   3556      1.1     skrll 		      long val;
   3557      1.1     skrll 		      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3558      1.1     skrll 		      val = xg_apply_userdef_op_fn (op->typ,
   3559      1.1     skrll 						    targ->tok[op_num].
   3560  1.1.1.2  christos 						    X_add_number);
   3561      1.1     skrll 		      targ->tok[op_num].X_add_number = val;
   3562      1.1     skrll 		    }
   3563      1.1     skrll 		  else
   3564      1.1     skrll 		    return FALSE; /* We cannot use a relocation for this.  */
   3565      1.1     skrll 		  break;
   3566      1.1     skrll 		}
   3567      1.1     skrll 	      gas_assert (0);
   3568      1.1     skrll 	      break;
   3569      1.1     skrll 	    }
   3570      1.1     skrll 	}
   3571      1.1     skrll       break;
   3572      1.1     skrll 
   3573      1.1     skrll     case INSTR_LITERAL_DEF:
   3574      1.1     skrll       op = bi->ops;
   3575  1.1.1.2  christos       targ->opcode = XTENSA_UNDEFINED;
   3576      1.1     skrll       targ->insn_type = ITYPE_LITERAL;
   3577      1.1     skrll       targ->is_specific_opcode = FALSE;
   3578      1.1     skrll       for (; op != NULL; op = op->next)
   3579      1.1     skrll 	{
   3580      1.1     skrll 	  int op_num = op->op_num;
   3581      1.1     skrll 	  int op_data = op->op_data;
   3582      1.1     skrll 	  gas_assert (op->op_num < MAX_INSN_ARGS);
   3583  1.1.1.2  christos 
   3584      1.1     skrll 	  if (targ->ntok <= op_num)
   3585      1.1     skrll 	    targ->ntok = op_num + 1;
   3586      1.1     skrll 
   3587      1.1     skrll 	  switch (op->typ)
   3588      1.1     skrll 	    {
   3589      1.1     skrll 	    case OP_OPERAND:
   3590      1.1     skrll 	      gas_assert (op_data < insn->ntok);
   3591      1.1     skrll 	      /* We can only pass resolvable literals through.  */
   3592      1.1     skrll 	      if (!xg_valid_literal_expression (&insn->tok[op_data]))
   3593  1.1.1.2  christos 		return FALSE;
   3594      1.1     skrll 	      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3595      1.1     skrll 	      break;
   3596      1.1     skrll 	    case OP_LITERAL:
   3597      1.1     skrll 	    case OP_CONSTANT:
   3598      1.1     skrll 	    case OP_LABEL:
   3599      1.1     skrll 	    default:
   3600      1.1     skrll 	      gas_assert (0);
   3601      1.1     skrll 	      break;
   3602      1.1     skrll 	    }
   3603      1.1     skrll 	}
   3604      1.1     skrll       break;
   3605  1.1.1.2  christos 
   3606      1.1     skrll     case INSTR_LABEL_DEF:
   3607      1.1     skrll       op = bi->ops;
   3608      1.1     skrll       targ->opcode = XTENSA_UNDEFINED;
   3609  1.1.1.2  christos       targ->insn_type = ITYPE_LABEL;
   3610      1.1     skrll       targ->is_specific_opcode = FALSE;
   3611      1.1     skrll       /* Literal with no ops is a label?  */
   3612      1.1     skrll       gas_assert (op == NULL);
   3613      1.1     skrll       break;
   3614      1.1     skrll 
   3615      1.1     skrll     default:
   3616      1.1     skrll       gas_assert (0);
   3617      1.1     skrll     }
   3618      1.1     skrll 
   3619      1.1     skrll   return TRUE;
   3620      1.1     skrll }
   3621      1.1     skrll 
   3622      1.1     skrll 
   3623      1.1     skrll /* Return TRUE on success.  */
   3624      1.1     skrll 
   3625      1.1     skrll static bfd_boolean
   3626      1.1     skrll xg_build_to_stack (IStack *istack, TInsn *insn, BuildInstr *bi)
   3627      1.1     skrll {
   3628      1.1     skrll   for (; bi != NULL; bi = bi->next)
   3629      1.1     skrll     {
   3630      1.1     skrll       TInsn *next_insn = istack_push_space (istack);
   3631      1.1     skrll 
   3632      1.1     skrll       if (!xg_build_to_insn (next_insn, insn, bi))
   3633      1.1     skrll 	return FALSE;
   3634      1.1     skrll     }
   3635      1.1     skrll   return TRUE;
   3636      1.1     skrll }
   3637      1.1     skrll 
   3638      1.1     skrll 
   3639      1.1     skrll /* Return TRUE on valid expansion.  */
   3640      1.1     skrll 
   3641      1.1     skrll static bfd_boolean
   3642  1.1.1.2  christos xg_expand_to_stack (IStack *istack, TInsn *insn, int lateral_steps)
   3643  1.1.1.2  christos {
   3644      1.1     skrll   int stack_size = istack->ninsn;
   3645      1.1     skrll   int steps_taken = 0;
   3646      1.1     skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3647      1.1     skrll   TransitionList *l;
   3648      1.1     skrll 
   3649      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   3650      1.1     skrll   gas_assert (insn->opcode < table->num_opcodes);
   3651      1.1     skrll 
   3652      1.1     skrll   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
   3653      1.1     skrll     {
   3654      1.1     skrll       TransitionRule *rule = l->rule;
   3655      1.1     skrll 
   3656      1.1     skrll       if (xg_instruction_matches_rule (insn, rule))
   3657      1.1     skrll 	{
   3658      1.1     skrll 	  if (lateral_steps == steps_taken)
   3659      1.1     skrll 	    {
   3660      1.1     skrll 	      int i;
   3661      1.1     skrll 
   3662  1.1.1.2  christos 	      /* This is it.  Expand the rule to the stack.  */
   3663      1.1     skrll 	      if (!xg_build_to_stack (istack, insn, rule->to_instr))
   3664  1.1.1.2  christos 		return FALSE;
   3665  1.1.1.2  christos 
   3666  1.1.1.2  christos 	      /* Check to see if it fits.  */
   3667      1.1     skrll 	      for (i = stack_size; i < istack->ninsn; i++)
   3668      1.1     skrll 		{
   3669      1.1     skrll 		  TInsn *tinsn = &istack->insn[i];
   3670      1.1     skrll 
   3671      1.1     skrll 		  if (tinsn->insn_type == ITYPE_INSN
   3672      1.1     skrll 		      && !tinsn_has_symbolic_operands (tinsn)
   3673      1.1     skrll 		      && !xg_immeds_fit (tinsn))
   3674      1.1     skrll 		    {
   3675      1.1     skrll 		      istack->ninsn = stack_size;
   3676      1.1     skrll 		      return FALSE;
   3677      1.1     skrll 		    }
   3678      1.1     skrll 		}
   3679      1.1     skrll 	      return TRUE;
   3680      1.1     skrll 	    }
   3681      1.1     skrll 	  steps_taken++;
   3682      1.1     skrll 	}
   3683      1.1     skrll     }
   3684      1.1     skrll   return FALSE;
   3685      1.1     skrll }
   3686      1.1     skrll 
   3687      1.1     skrll 
   3688      1.1     skrll /* Relax the assembly instruction at least "min_steps".
   3690      1.1     skrll    Return the number of steps taken.
   3691      1.1     skrll 
   3692      1.1     skrll    For relaxation to correctly terminate, every relaxation chain must
   3693      1.1     skrll    terminate in one of two ways:
   3694      1.1     skrll 
   3695      1.1     skrll    1.  If the chain from one instruction to the next consists entirely of
   3696      1.1     skrll        single instructions, then the chain *must* handle all possible
   3697      1.1     skrll        immediates without failing.  It must not ever fail because an
   3698      1.1     skrll        immediate is out of range.  The MOVI.N -> MOVI -> L32R relaxation
   3699      1.1     skrll        chain is one example.  L32R loads 32 bits, and there cannot be an
   3700      1.1     skrll        immediate larger than 32 bits, so it satisfies this condition.
   3701      1.1     skrll        Single instruction relaxation chains are as defined by
   3702      1.1     skrll        xg_is_single_relaxable_instruction.
   3703      1.1     skrll 
   3704      1.1     skrll    2.  Otherwise, the chain must end in a multi-instruction expansion: e.g.,
   3705      1.1     skrll        BNEZ.N -> BNEZ -> BNEZ.W15 -> BENZ.N/J
   3706      1.1     skrll 
   3707      1.1     skrll    Strictly speaking, in most cases you can violate condition 1 and be OK
   3708      1.1     skrll    -- in particular when the last two instructions have the same single
   3709      1.1     skrll    size.  But nevertheless, you should guarantee the above two conditions.
   3710      1.1     skrll 
   3711      1.1     skrll    We could fix this so that single-instruction expansions correctly
   3712      1.1     skrll    terminate when they can't handle the range, but the error messages are
   3713      1.1     skrll    worse, and it actually turns out that in every case but one (18-bit wide
   3714      1.1     skrll    branches), you need a multi-instruction expansion to get the full range
   3715      1.1     skrll    anyway.  And because 18-bit branches are handled identically to 15-bit
   3716      1.1     skrll    branches, there isn't any point in changing it.  */
   3717      1.1     skrll 
   3718      1.1     skrll static int
   3719      1.1     skrll xg_assembly_relax (IStack *istack,
   3720      1.1     skrll 		   TInsn *insn,
   3721      1.1     skrll 		   segT pc_seg,
   3722      1.1     skrll 		   fragS *pc_frag,	/* if pc_frag == 0, not pc-relative */
   3723      1.1     skrll 		   offsetT pc_offset,	/* offset in fragment */
   3724      1.1     skrll 		   int min_steps,	/* minimum conversion steps */
   3725      1.1     skrll 		   long stretch)	/* number of bytes stretched so far */
   3726      1.1     skrll {
   3727      1.1     skrll   int steps_taken = 0;
   3728      1.1     skrll 
   3729      1.1     skrll   /* Some of its immeds don't fit.  Try to build a relaxed version.
   3730      1.1     skrll      This may go through a couple of stages of single instruction
   3731      1.1     skrll      transformations before we get there.  */
   3732      1.1     skrll 
   3733      1.1     skrll   TInsn single_target;
   3734      1.1     skrll   TInsn current_insn;
   3735      1.1     skrll   int lateral_steps = 0;
   3736      1.1     skrll   int istack_size = istack->ninsn;
   3737      1.1     skrll 
   3738      1.1     skrll   if (xg_symbolic_immeds_fit (insn, pc_seg, pc_frag, pc_offset, stretch)
   3739      1.1     skrll       && steps_taken >= min_steps)
   3740      1.1     skrll     {
   3741      1.1     skrll       istack_push (istack, insn);
   3742      1.1     skrll       return steps_taken;
   3743      1.1     skrll     }
   3744      1.1     skrll   current_insn = *insn;
   3745      1.1     skrll 
   3746      1.1     skrll   /* Walk through all of the single instruction expansions.  */
   3747      1.1     skrll   while (xg_is_single_relaxable_insn (&current_insn, &single_target, FALSE))
   3748      1.1     skrll     {
   3749      1.1     skrll       steps_taken++;
   3750      1.1     skrll       if (xg_symbolic_immeds_fit (&single_target, pc_seg, pc_frag, pc_offset,
   3751      1.1     skrll 				  stretch))
   3752      1.1     skrll 	{
   3753      1.1     skrll 	  if (steps_taken >= min_steps)
   3754      1.1     skrll 	    {
   3755      1.1     skrll 	      istack_push (istack, &single_target);
   3756      1.1     skrll 	      return steps_taken;
   3757      1.1     skrll 	    }
   3758      1.1     skrll 	}
   3759      1.1     skrll       current_insn = single_target;
   3760      1.1     skrll     }
   3761      1.1     skrll 
   3762      1.1     skrll   /* Now check for a multi-instruction expansion.  */
   3763      1.1     skrll   while (xg_is_relaxable_insn (&current_insn, lateral_steps))
   3764      1.1     skrll     {
   3765      1.1     skrll       if (xg_symbolic_immeds_fit (&current_insn, pc_seg, pc_frag, pc_offset,
   3766      1.1     skrll 				  stretch))
   3767      1.1     skrll 	{
   3768      1.1     skrll 	  if (steps_taken >= min_steps)
   3769      1.1     skrll 	    {
   3770      1.1     skrll 	      istack_push (istack, &current_insn);
   3771      1.1     skrll 	      return steps_taken;
   3772      1.1     skrll 	    }
   3773      1.1     skrll 	}
   3774      1.1     skrll       steps_taken++;
   3775      1.1     skrll       if (xg_expand_to_stack (istack, &current_insn, lateral_steps))
   3776      1.1     skrll 	{
   3777      1.1     skrll 	  if (steps_taken >= min_steps)
   3778      1.1     skrll 	    return steps_taken;
   3779      1.1     skrll 	}
   3780      1.1     skrll       lateral_steps++;
   3781      1.1     skrll       istack->ninsn = istack_size;
   3782      1.1     skrll     }
   3783      1.1     skrll 
   3784      1.1     skrll   /* It's not going to work -- use the original.  */
   3785      1.1     skrll   istack_push (istack, insn);
   3786      1.1     skrll   return steps_taken;
   3787      1.1     skrll }
   3788      1.1     skrll 
   3789      1.1     skrll 
   3790      1.1     skrll static void
   3791      1.1     skrll xg_finish_frag (char *last_insn,
   3792      1.1     skrll 		enum xtensa_relax_statesE frag_state,
   3793      1.1     skrll 		enum xtensa_relax_statesE slot0_state,
   3794      1.1     skrll 		int max_growth,
   3795      1.1     skrll 		bfd_boolean is_insn)
   3796      1.1     skrll {
   3797      1.1     skrll   /* Finish off this fragment so that it has at LEAST the desired
   3798      1.1     skrll      max_growth.  If it doesn't fit in this fragment, close this one
   3799      1.1     skrll      and start a new one.  In either case, return a pointer to the
   3800      1.1     skrll      beginning of the growth area.  */
   3801      1.1     skrll 
   3802      1.1     skrll   fragS *old_frag;
   3803      1.1     skrll 
   3804      1.1     skrll   frag_grow (max_growth);
   3805      1.1     skrll   old_frag = frag_now;
   3806      1.1     skrll 
   3807      1.1     skrll   frag_now->fr_opcode = last_insn;
   3808      1.1     skrll   if (is_insn)
   3809      1.1     skrll     frag_now->tc_frag_data.is_insn = TRUE;
   3810  1.1.1.2  christos 
   3811      1.1     skrll   frag_var (rs_machine_dependent, max_growth, max_growth,
   3812      1.1     skrll 	    frag_state, frag_now->fr_symbol, frag_now->fr_offset, last_insn);
   3813      1.1     skrll 
   3814      1.1     skrll   old_frag->tc_frag_data.slot_subtypes[0] = slot0_state;
   3815      1.1     skrll   xtensa_set_frag_assembly_state (frag_now);
   3816      1.1     skrll 
   3817      1.1     skrll   /* Just to make sure that we did not split it up.  */
   3818      1.1     skrll   gas_assert (old_frag->fr_next == frag_now);
   3819      1.1     skrll }
   3820      1.1     skrll 
   3821      1.1     skrll 
   3822      1.1     skrll /* Return TRUE if the target frag is one of the next non-empty frags.  */
   3823      1.1     skrll 
   3824      1.1     skrll static bfd_boolean
   3825      1.1     skrll is_next_frag_target (const fragS *fragP, const fragS *target)
   3826      1.1     skrll {
   3827      1.1     skrll   if (fragP == NULL)
   3828      1.1     skrll     return FALSE;
   3829      1.1     skrll 
   3830      1.1     skrll   for (; fragP; fragP = fragP->fr_next)
   3831      1.1     skrll     {
   3832      1.1     skrll       if (fragP == target)
   3833      1.1     skrll 	return TRUE;
   3834      1.1     skrll       if (fragP->fr_fix != 0)
   3835      1.1     skrll 	return FALSE;
   3836      1.1     skrll       if (fragP->fr_type == rs_fill && fragP->fr_offset != 0)
   3837      1.1     skrll 	return FALSE;
   3838      1.1     skrll       if ((fragP->fr_type == rs_align || fragP->fr_type == rs_align_code)
   3839      1.1     skrll 	  && ((fragP->fr_address % (1 << fragP->fr_offset)) != 0))
   3840      1.1     skrll 	return FALSE;
   3841      1.1     skrll       if (fragP->fr_type == rs_space)
   3842      1.1     skrll 	return FALSE;
   3843      1.1     skrll     }
   3844      1.1     skrll   return FALSE;
   3845      1.1     skrll }
   3846      1.1     skrll 
   3847      1.1     skrll 
   3848      1.1     skrll static bfd_boolean
   3849      1.1     skrll is_branch_jmp_to_next (TInsn *insn, fragS *fragP)
   3850      1.1     skrll {
   3851      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   3852      1.1     skrll   int i;
   3853      1.1     skrll   int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
   3854      1.1     skrll   int target_op = -1;
   3855      1.1     skrll   symbolS *sym;
   3856      1.1     skrll   fragS *target_frag;
   3857      1.1     skrll 
   3858      1.1     skrll   if (xtensa_opcode_is_branch (isa, insn->opcode) != 1
   3859      1.1     skrll       && xtensa_opcode_is_jump (isa, insn->opcode) != 1)
   3860      1.1     skrll     return FALSE;
   3861      1.1     skrll 
   3862      1.1     skrll   for (i = 0; i < num_ops; i++)
   3863      1.1     skrll     {
   3864      1.1     skrll       if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1)
   3865      1.1     skrll 	{
   3866      1.1     skrll 	  target_op = i;
   3867      1.1     skrll 	  break;
   3868      1.1     skrll 	}
   3869      1.1     skrll     }
   3870      1.1     skrll   if (target_op == -1)
   3871      1.1     skrll     return FALSE;
   3872      1.1     skrll 
   3873      1.1     skrll   if (insn->ntok <= target_op)
   3874      1.1     skrll     return FALSE;
   3875      1.1     skrll 
   3876      1.1     skrll   if (insn->tok[target_op].X_op != O_symbol)
   3877      1.1     skrll     return FALSE;
   3878      1.1     skrll 
   3879      1.1     skrll   sym = insn->tok[target_op].X_add_symbol;
   3880      1.1     skrll   if (sym == NULL)
   3881      1.1     skrll     return FALSE;
   3882      1.1     skrll 
   3883      1.1     skrll   if (insn->tok[target_op].X_add_number != 0)
   3884      1.1     skrll     return FALSE;
   3885      1.1     skrll 
   3886      1.1     skrll   target_frag = symbol_get_frag (sym);
   3887      1.1     skrll   if (target_frag == NULL)
   3888      1.1     skrll     return FALSE;
   3889      1.1     skrll 
   3890      1.1     skrll   if (is_next_frag_target (fragP->fr_next, target_frag)
   3891      1.1     skrll       && S_GET_VALUE (sym) == target_frag->fr_address)
   3892      1.1     skrll     return TRUE;
   3893      1.1     skrll 
   3894      1.1     skrll   return FALSE;
   3895      1.1     skrll }
   3896      1.1     skrll 
   3897      1.1     skrll 
   3898      1.1     skrll static void
   3899      1.1     skrll xg_add_branch_and_loop_targets (TInsn *insn)
   3900      1.1     skrll {
   3901      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   3902      1.1     skrll   int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
   3903      1.1     skrll 
   3904      1.1     skrll   if (xtensa_opcode_is_loop (isa, insn->opcode) == 1)
   3905      1.1     skrll     {
   3906      1.1     skrll       int i = 1;
   3907      1.1     skrll       if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
   3908      1.1     skrll 	  && insn->tok[i].X_op == O_symbol)
   3909      1.1     skrll 	symbol_get_tc (insn->tok[i].X_add_symbol)->is_loop_target = TRUE;
   3910      1.1     skrll       return;
   3911      1.1     skrll     }
   3912      1.1     skrll 
   3913      1.1     skrll   if (xtensa_opcode_is_branch (isa, insn->opcode) == 1
   3914      1.1     skrll       || xtensa_opcode_is_loop (isa, insn->opcode) == 1)
   3915      1.1     skrll     {
   3916      1.1     skrll       int i;
   3917      1.1     skrll 
   3918      1.1     skrll       for (i = 0; i < insn->ntok && i < num_ops; i++)
   3919      1.1     skrll 	{
   3920      1.1     skrll 	  if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
   3921      1.1     skrll 	      && insn->tok[i].X_op == O_symbol)
   3922      1.1     skrll 	    {
   3923      1.1     skrll 	      symbolS *sym = insn->tok[i].X_add_symbol;
   3924      1.1     skrll 	      symbol_get_tc (sym)->is_branch_target = TRUE;
   3925      1.1     skrll 	      if (S_IS_DEFINED (sym))
   3926      1.1     skrll 		symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
   3927      1.1     skrll 	    }
   3928      1.1     skrll 	}
   3929      1.1     skrll     }
   3930      1.1     skrll }
   3931      1.1     skrll 
   3932      1.1     skrll 
   3933      1.1     skrll /* Return FALSE if no error.  */
   3934      1.1     skrll 
   3935      1.1     skrll static bfd_boolean
   3936      1.1     skrll xg_build_token_insn (BuildInstr *instr_spec, TInsn *old_insn, TInsn *new_insn)
   3937      1.1     skrll {
   3938      1.1     skrll   int num_ops = 0;
   3939      1.1     skrll   BuildOp *b_op;
   3940      1.1     skrll 
   3941      1.1     skrll   switch (instr_spec->typ)
   3942      1.1     skrll     {
   3943      1.1     skrll     case INSTR_INSTR:
   3944      1.1     skrll       new_insn->insn_type = ITYPE_INSN;
   3945      1.1     skrll       new_insn->opcode = instr_spec->opcode;
   3946      1.1     skrll       break;
   3947      1.1     skrll     case INSTR_LITERAL_DEF:
   3948      1.1     skrll       new_insn->insn_type = ITYPE_LITERAL;
   3949      1.1     skrll       new_insn->opcode = XTENSA_UNDEFINED;
   3950      1.1     skrll       break;
   3951      1.1     skrll     case INSTR_LABEL_DEF:
   3952      1.1     skrll       abort ();
   3953      1.1     skrll     }
   3954      1.1     skrll   new_insn->is_specific_opcode = FALSE;
   3955      1.1     skrll   new_insn->debug_line = old_insn->debug_line;
   3956      1.1     skrll   new_insn->loc_directive_seen = old_insn->loc_directive_seen;
   3957      1.1     skrll 
   3958      1.1     skrll   for (b_op = instr_spec->ops; b_op != NULL; b_op = b_op->next)
   3959      1.1     skrll     {
   3960  1.1.1.2  christos       expressionS *exp;
   3961      1.1     skrll       const expressionS *src_exp;
   3962      1.1     skrll 
   3963      1.1     skrll       num_ops++;
   3964      1.1     skrll       switch (b_op->typ)
   3965      1.1     skrll 	{
   3966  1.1.1.2  christos 	case OP_CONSTANT:
   3967  1.1.1.2  christos 	  /* The expression must be the constant.  */
   3968      1.1     skrll 	  gas_assert (b_op->op_num < MAX_INSN_ARGS);
   3969      1.1     skrll 	  exp = &new_insn->tok[b_op->op_num];
   3970      1.1     skrll 	  set_expr_const (exp, b_op->op_data);
   3971      1.1     skrll 	  break;
   3972      1.1     skrll 
   3973      1.1     skrll 	case OP_OPERAND:
   3974      1.1     skrll 	  gas_assert (b_op->op_num < MAX_INSN_ARGS);
   3975      1.1     skrll 	  gas_assert (b_op->op_data < (unsigned) old_insn->ntok);
   3976  1.1.1.2  christos 	  src_exp = &old_insn->tok[b_op->op_data];
   3977      1.1     skrll 	  exp = &new_insn->tok[b_op->op_num];
   3978      1.1     skrll 	  copy_expr (exp, src_exp);
   3979      1.1     skrll 	  break;
   3980  1.1.1.2  christos 
   3981      1.1     skrll 	case OP_LITERAL:
   3982      1.1     skrll 	case OP_LABEL:
   3983      1.1     skrll 	  as_bad (_("can't handle generation of literal/labels yet"));
   3984      1.1     skrll 	  gas_assert (0);
   3985      1.1     skrll 
   3986      1.1     skrll 	default:
   3987      1.1     skrll 	  as_bad (_("can't handle undefined OP TYPE"));
   3988      1.1     skrll 	  gas_assert (0);
   3989      1.1     skrll 	}
   3990      1.1     skrll     }
   3991      1.1     skrll 
   3992      1.1     skrll   new_insn->ntok = num_ops;
   3993      1.1     skrll   return FALSE;
   3994      1.1     skrll }
   3995      1.1     skrll 
   3996      1.1     skrll 
   3997      1.1     skrll /* Return TRUE if it was simplified.  */
   3998      1.1     skrll 
   3999      1.1     skrll static bfd_boolean
   4000      1.1     skrll xg_simplify_insn (TInsn *old_insn, TInsn *new_insn)
   4001      1.1     skrll {
   4002      1.1     skrll   TransitionRule *rule;
   4003      1.1     skrll   BuildInstr *insn_spec;
   4004      1.1     skrll 
   4005      1.1     skrll   if (old_insn->is_specific_opcode || !density_supported)
   4006  1.1.1.2  christos     return FALSE;
   4007  1.1.1.2  christos 
   4008      1.1     skrll   rule = xg_instruction_match (old_insn);
   4009      1.1     skrll   if (rule == NULL)
   4010      1.1     skrll     return FALSE;
   4011      1.1     skrll 
   4012      1.1     skrll   insn_spec = rule->to_instr;
   4013      1.1     skrll   /* There should only be one.  */
   4014      1.1     skrll   gas_assert (insn_spec != NULL);
   4015      1.1     skrll   gas_assert (insn_spec->next == NULL);
   4016      1.1     skrll   if (insn_spec->next != NULL)
   4017      1.1     skrll     return FALSE;
   4018      1.1     skrll 
   4019      1.1     skrll   xg_build_token_insn (insn_spec, old_insn, new_insn);
   4020      1.1     skrll 
   4021      1.1     skrll   return TRUE;
   4022      1.1     skrll }
   4023      1.1     skrll 
   4024      1.1     skrll 
   4025      1.1     skrll /* xg_expand_assembly_insn: (1) Simplify the instruction, i.e., l32i ->
   4026      1.1     skrll    l32i.n. (2) Check the number of operands.  (3) Place the instruction
   4027      1.1     skrll    tokens into the stack or relax it and place multiple
   4028      1.1     skrll    instructions/literals onto the stack.  Return FALSE if no error.  */
   4029      1.1     skrll 
   4030      1.1     skrll static bfd_boolean
   4031      1.1     skrll xg_expand_assembly_insn (IStack *istack, TInsn *orig_insn)
   4032      1.1     skrll {
   4033      1.1     skrll   int noperands;
   4034      1.1     skrll   TInsn new_insn;
   4035      1.1     skrll   bfd_boolean do_expand;
   4036      1.1     skrll 
   4037      1.1     skrll   tinsn_init (&new_insn);
   4038      1.1     skrll 
   4039      1.1     skrll   /* Narrow it if we can.  xg_simplify_insn now does all the
   4040  1.1.1.6  christos      appropriate checking (e.g., for the density option).  */
   4041  1.1.1.6  christos   if (xg_simplify_insn (orig_insn, &new_insn))
   4042  1.1.1.6  christos     orig_insn = &new_insn;
   4043      1.1     skrll 
   4044      1.1     skrll   noperands = xtensa_opcode_num_operands (xtensa_default_isa,
   4045      1.1     skrll 					  orig_insn->opcode);
   4046      1.1     skrll   if (orig_insn->ntok < noperands)
   4047      1.1     skrll     {
   4048      1.1     skrll       as_bad (ngettext ("found %d operand for '%s':  Expected %d",
   4049  1.1.1.6  christos 			"found %d operands for '%s':  Expected %d",
   4050  1.1.1.6  christos 			orig_insn->ntok),
   4051  1.1.1.6  christos 	      orig_insn->ntok,
   4052      1.1     skrll 	      xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
   4053      1.1     skrll 	      noperands);
   4054      1.1     skrll       return TRUE;
   4055      1.1     skrll     }
   4056      1.1     skrll   if (orig_insn->ntok > noperands)
   4057      1.1     skrll     as_warn (ngettext ("found %d operand for '%s':  Expected %d",
   4058      1.1     skrll 		       "found %d operands for '%s':  Expected %d",
   4059      1.1     skrll 		       orig_insn->ntok),
   4060      1.1     skrll 	     orig_insn->ntok,
   4061      1.1     skrll 	     xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
   4062      1.1     skrll 	     noperands);
   4063      1.1     skrll 
   4064      1.1     skrll   /* If there are not enough operands, we will assert above.  If there
   4065      1.1     skrll      are too many, just cut out the extras here.  */
   4066      1.1     skrll   orig_insn->ntok = noperands;
   4067      1.1     skrll 
   4068      1.1     skrll   if (tinsn_has_invalid_symbolic_operands (orig_insn))
   4069      1.1     skrll     return TRUE;
   4070      1.1     skrll 
   4071      1.1     skrll   /* Special case for extui opcode which has constraints not handled
   4072      1.1     skrll      by the ordinary operand encoding checks.  The number of operands
   4073      1.1     skrll      and related syntax issues have already been checked.  */
   4074      1.1     skrll   if (orig_insn->opcode == xtensa_extui_opcode)
   4075      1.1     skrll     {
   4076      1.1     skrll       int shiftimm = orig_insn->tok[2].X_add_number;
   4077      1.1     skrll       int maskimm = orig_insn->tok[3].X_add_number;
   4078      1.1     skrll       if (shiftimm + maskimm > 32)
   4079      1.1     skrll 	{
   4080      1.1     skrll 	  as_bad (_("immediate operands sum to greater than 32"));
   4081      1.1     skrll 	  return TRUE;
   4082      1.1     skrll 	}
   4083      1.1     skrll     }
   4084      1.1     skrll 
   4085      1.1     skrll   /* If the instruction will definitely need to be relaxed, it is better
   4086      1.1     skrll      to expand it now for better scheduling.  Decide whether to expand
   4087      1.1     skrll      now....  */
   4088      1.1     skrll   do_expand = (!orig_insn->is_specific_opcode && use_transform ());
   4089      1.1     skrll 
   4090      1.1     skrll   /* Calls should be expanded to longcalls only in the backend relaxation
   4091      1.1     skrll      so that the assembly scheduler will keep the L32R/CALLX instructions
   4092      1.1     skrll      adjacent.  */
   4093      1.1     skrll   if (is_direct_call_opcode (orig_insn->opcode))
   4094      1.1     skrll     do_expand = FALSE;
   4095      1.1     skrll 
   4096      1.1     skrll   if (tinsn_has_symbolic_operands (orig_insn))
   4097      1.1     skrll     {
   4098      1.1     skrll       /* The values of symbolic operands are not known yet, so only expand
   4099      1.1     skrll 	 now if an operand is "complex" (e.g., difference of symbols) and
   4100      1.1     skrll 	 will have to be stored as a literal regardless of the value.  */
   4101      1.1     skrll       if (!tinsn_has_complex_operands (orig_insn))
   4102      1.1     skrll 	do_expand = FALSE;
   4103      1.1     skrll     }
   4104      1.1     skrll   else if (xg_immeds_fit (orig_insn))
   4105      1.1     skrll     do_expand = FALSE;
   4106      1.1     skrll 
   4107      1.1     skrll   if (do_expand)
   4108      1.1     skrll     xg_assembly_relax (istack, orig_insn, 0, 0, 0, 0, 0);
   4109      1.1     skrll   else
   4110      1.1     skrll     istack_push (istack, orig_insn);
   4111      1.1     skrll 
   4112      1.1     skrll   return FALSE;
   4113      1.1     skrll }
   4114      1.1     skrll 
   4115      1.1     skrll 
   4116      1.1     skrll /* Return TRUE if the section flags are marked linkonce
   4117      1.1     skrll    or the name is .gnu.linkonce.*.  */
   4118  1.1.1.8  christos 
   4119      1.1     skrll static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
   4120      1.1     skrll 
   4121      1.1     skrll static bfd_boolean
   4122      1.1     skrll get_is_linkonce_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec)
   4123      1.1     skrll {
   4124      1.1     skrll   flagword flags, link_once_flags;
   4125      1.1     skrll 
   4126      1.1     skrll   flags = bfd_section_flags (sec);
   4127      1.1     skrll   link_once_flags = (flags & SEC_LINK_ONCE);
   4128      1.1     skrll 
   4129      1.1     skrll   /* Flags might not be set yet.  */
   4130      1.1     skrll   if (!link_once_flags
   4131      1.1     skrll       && strncmp (segment_name (sec), ".gnu.linkonce.", linkonce_len) == 0)
   4132      1.1     skrll     link_once_flags = SEC_LINK_ONCE;
   4133      1.1     skrll 
   4134      1.1     skrll   return (link_once_flags != 0);
   4135  1.1.1.5  christos }
   4136      1.1     skrll 
   4137      1.1     skrll 
   4138      1.1     skrll static void
   4139      1.1     skrll xtensa_add_literal_sym (symbolS *sym)
   4140      1.1     skrll {
   4141      1.1     skrll   sym_list *l;
   4142      1.1     skrll 
   4143      1.1     skrll   l = XNEW (sym_list);
   4144      1.1     skrll   l->sym = sym;
   4145      1.1     skrll   l->next = literal_syms;
   4146      1.1     skrll   literal_syms = l;
   4147      1.1     skrll }
   4148      1.1     skrll 
   4149      1.1     skrll 
   4150      1.1     skrll static symbolS *
   4151      1.1     skrll xtensa_create_literal_symbol (segT sec, fragS *frag)
   4152      1.1     skrll {
   4153      1.1     skrll   static int lit_num = 0;
   4154      1.1     skrll   static char name[256];
   4155      1.1     skrll   symbolS *symbolP;
   4156      1.1     skrll 
   4157      1.1     skrll   sprintf (name, ".L_lit_sym%d", lit_num);
   4158      1.1     skrll 
   4159      1.1     skrll   /* Create a local symbol.  If it is in a linkonce section, we have to
   4160      1.1     skrll      be careful to make sure that if it is used in a relocation that the
   4161      1.1     skrll      symbol will be in the output file.  */
   4162      1.1     skrll   if (get_is_linkonce_section (stdoutput, sec))
   4163      1.1     skrll     {
   4164      1.1     skrll       symbolP = symbol_new (name, sec, 0, frag);
   4165      1.1     skrll       S_CLEAR_EXTERNAL (symbolP);
   4166      1.1     skrll       /* symbolP->local = 1; */
   4167      1.1     skrll     }
   4168      1.1     skrll   else
   4169      1.1     skrll     symbolP = symbol_new (name, sec, 0, frag);
   4170      1.1     skrll 
   4171      1.1     skrll   xtensa_add_literal_sym (symbolP);
   4172      1.1     skrll 
   4173      1.1     skrll   lit_num++;
   4174      1.1     skrll   return symbolP;
   4175      1.1     skrll }
   4176      1.1     skrll 
   4177      1.1     skrll 
   4178      1.1     skrll /* Currently all literals that are generated here are 32-bit L32R targets.  */
   4179      1.1     skrll 
   4180      1.1     skrll static symbolS *
   4181      1.1     skrll xg_assemble_literal (/* const */ TInsn *insn)
   4182      1.1     skrll {
   4183      1.1     skrll   emit_state state;
   4184      1.1     skrll   symbolS *lit_sym = NULL;
   4185      1.1     skrll   bfd_reloc_code_real_type reloc;
   4186      1.1     skrll   bfd_boolean pcrel = FALSE;
   4187      1.1     skrll   char *p;
   4188      1.1     skrll 
   4189      1.1     skrll   /* size = 4 for L32R.  It could easily be larger when we move to
   4190  1.1.1.2  christos      larger constants.  Add a parameter later.  */
   4191  1.1.1.2  christos   offsetT litsize = 4;
   4192      1.1     skrll   offsetT litalign = 2;		/* 2^2 = 4 */
   4193      1.1     skrll   expressionS saved_loc;
   4194      1.1     skrll   expressionS * emit_val;
   4195      1.1     skrll 
   4196      1.1     skrll   set_expr_symbol_offset (&saved_loc, frag_now->fr_symbol, frag_now_fix ());
   4197      1.1     skrll 
   4198      1.1     skrll   gas_assert (insn->insn_type == ITYPE_LITERAL);
   4199      1.1     skrll   gas_assert (insn->ntok == 1);	/* must be only one token here */
   4200      1.1     skrll 
   4201      1.1     skrll   xtensa_switch_to_literal_fragment (&state);
   4202      1.1     skrll 
   4203      1.1     skrll   emit_val = &insn->tok[0];
   4204      1.1     skrll   if (emit_val->X_op == O_big)
   4205      1.1     skrll     {
   4206      1.1     skrll       int size = emit_val->X_add_number * CHARS_PER_LITTLENUM;
   4207      1.1     skrll       if (size > litsize)
   4208      1.1     skrll 	{
   4209      1.1     skrll 	  /* This happens when someone writes a "movi a2, big_number".  */
   4210      1.1     skrll 	  as_bad_where (frag_now->fr_file, frag_now->fr_line,
   4211      1.1     skrll 			_("invalid immediate"));
   4212      1.1     skrll 	  xtensa_restore_emit_state (&state);
   4213      1.1     skrll 	  return NULL;
   4214      1.1     skrll 	}
   4215      1.1     skrll     }
   4216      1.1     skrll 
   4217      1.1     skrll   /* Force a 4-byte align here.  Note that this opens a new frag, so all
   4218      1.1     skrll      literals done with this function have a frag to themselves.  That's
   4219      1.1     skrll      important for the way text section literals work.  */
   4220      1.1     skrll   frag_align (litalign, 0, 0);
   4221      1.1     skrll   record_alignment (now_seg, litalign);
   4222      1.1     skrll 
   4223      1.1     skrll   switch (emit_val->X_op)
   4224      1.1     skrll     {
   4225      1.1     skrll     case O_pcrel:
   4226      1.1     skrll       pcrel = TRUE;
   4227      1.1     skrll       /* fall through */
   4228      1.1     skrll     case O_pltrel:
   4229      1.1     skrll     case O_tlsfunc:
   4230      1.1     skrll     case O_tlsarg:
   4231      1.1     skrll     case O_tpoff:
   4232      1.1     skrll     case O_dtpoff:
   4233      1.1     skrll       p = frag_more (litsize);
   4234      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   4235      1.1     skrll       reloc = map_operator_to_reloc (emit_val->X_op, TRUE);
   4236      1.1     skrll       if (emit_val->X_add_symbol)
   4237      1.1     skrll 	emit_val->X_op = O_symbol;
   4238      1.1     skrll       else
   4239      1.1     skrll 	emit_val->X_op = O_constant;
   4240      1.1     skrll       fix_new_exp (frag_now, p - frag_now->fr_literal,
   4241  1.1.1.2  christos 		   litsize, emit_val, pcrel, reloc);
   4242      1.1     skrll       break;
   4243      1.1     skrll 
   4244      1.1     skrll     default:
   4245      1.1     skrll       emit_expr (emit_val, litsize);
   4246      1.1     skrll       break;
   4247      1.1     skrll     }
   4248      1.1     skrll 
   4249      1.1     skrll   gas_assert (frag_now->tc_frag_data.literal_frag == NULL);
   4250      1.1     skrll   frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
   4251      1.1     skrll   frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
   4252      1.1     skrll   lit_sym = frag_now->fr_symbol;
   4253      1.1     skrll 
   4254      1.1     skrll   /* Go back.  */
   4255      1.1     skrll   xtensa_restore_emit_state (&state);
   4256      1.1     skrll   return lit_sym;
   4257      1.1     skrll }
   4258      1.1     skrll 
   4259      1.1     skrll 
   4260      1.1     skrll static void
   4261  1.1.1.2  christos xg_assemble_literal_space (/* const */ int size, int slot)
   4262      1.1     skrll {
   4263      1.1     skrll   emit_state state;
   4264      1.1     skrll   /* We might have to do something about this alignment.  It only
   4265      1.1     skrll      takes effect if something is placed here.  */
   4266      1.1     skrll   offsetT litalign = 2;		/* 2^2 = 4 */
   4267      1.1     skrll   fragS *lit_saved_frag;
   4268      1.1     skrll 
   4269      1.1     skrll   gas_assert (size % 4 == 0);
   4270      1.1     skrll 
   4271      1.1     skrll   xtensa_switch_to_literal_fragment (&state);
   4272      1.1     skrll 
   4273      1.1     skrll   /* Force a 4-byte align here.  */
   4274      1.1     skrll   frag_align (litalign, 0, 0);
   4275      1.1     skrll   record_alignment (now_seg, litalign);
   4276      1.1     skrll 
   4277      1.1     skrll   frag_grow (size);
   4278      1.1     skrll 
   4279      1.1     skrll   lit_saved_frag = frag_now;
   4280      1.1     skrll   frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
   4281      1.1     skrll   frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
   4282      1.1     skrll   xg_finish_frag (0, RELAX_LITERAL, 0, size, FALSE);
   4283      1.1     skrll 
   4284      1.1     skrll   /* Go back.  */
   4285      1.1     skrll   xtensa_restore_emit_state (&state);
   4286      1.1     skrll   frag_now->tc_frag_data.literal_frags[slot] = lit_saved_frag;
   4287      1.1     skrll }
   4288      1.1     skrll 
   4289      1.1     skrll 
   4290  1.1.1.2  christos /* Put in a fixup record based on the opcode.
   4291      1.1     skrll    Return TRUE on success.  */
   4292      1.1     skrll 
   4293      1.1     skrll static bfd_boolean
   4294      1.1     skrll xg_add_opcode_fix (TInsn *tinsn,
   4295      1.1     skrll 		   int opnum,
   4296      1.1     skrll 		   xtensa_format fmt,
   4297      1.1     skrll 		   int slot,
   4298      1.1     skrll 		   expressionS *exp,
   4299      1.1     skrll 		   fragS *fragP,
   4300      1.1     skrll 		   offsetT offset)
   4301      1.1     skrll {
   4302      1.1     skrll   xtensa_opcode opcode = tinsn->opcode;
   4303      1.1     skrll   bfd_reloc_code_real_type reloc;
   4304      1.1     skrll   reloc_howto_type *howto;
   4305      1.1     skrll   int fmt_length;
   4306      1.1     skrll   fixS *the_fix;
   4307      1.1     skrll 
   4308      1.1     skrll   reloc = BFD_RELOC_NONE;
   4309      1.1     skrll 
   4310  1.1.1.2  christos   /* First try the special cases for "alternate" relocs.  */
   4311      1.1     skrll   if (opcode == xtensa_l32r_opcode)
   4312      1.1     skrll     {
   4313  1.1.1.2  christos       if (fragP->tc_frag_data.use_absolute_literals)
   4314      1.1     skrll 	reloc = encode_alt_reloc (slot);
   4315  1.1.1.2  christos     }
   4316      1.1     skrll   else if (opcode == xtensa_const16_opcode)
   4317      1.1     skrll     {
   4318  1.1.1.2  christos       if (exp->X_op == O_lo16)
   4319      1.1     skrll 	{
   4320      1.1     skrll 	  reloc = encode_reloc (slot);
   4321      1.1     skrll 	  exp->X_op = O_symbol;
   4322      1.1     skrll 	}
   4323      1.1     skrll       else if (exp->X_op == O_hi16)
   4324      1.1     skrll 	{
   4325      1.1     skrll 	  reloc = encode_alt_reloc (slot);
   4326      1.1     skrll 	  exp->X_op = O_symbol;
   4327      1.1     skrll 	}
   4328      1.1     skrll     }
   4329      1.1     skrll 
   4330      1.1     skrll   if (opnum != get_relaxable_immed (opcode))
   4331      1.1     skrll     {
   4332  1.1.1.2  christos       as_bad (_("invalid relocation for operand %i of '%s'"),
   4333      1.1     skrll 	      opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
   4334      1.1     skrll       return FALSE;
   4335      1.1     skrll     }
   4336      1.1     skrll 
   4337      1.1     skrll   /* Handle erroneous "@h" and "@l" expressions here before they propagate
   4338      1.1     skrll      into the symbol table where the generic portions of the assembler
   4339      1.1     skrll      won't know what to do with them.  */
   4340      1.1     skrll   if (exp->X_op == O_lo16 || exp->X_op == O_hi16)
   4341      1.1     skrll     {
   4342      1.1     skrll       as_bad (_("invalid expression for operand %i of '%s'"),
   4343      1.1     skrll 	      opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
   4344      1.1     skrll       return FALSE;
   4345      1.1     skrll     }
   4346      1.1     skrll 
   4347      1.1     skrll   /* Next try the generic relocs.  */
   4348      1.1     skrll   if (reloc == BFD_RELOC_NONE)
   4349      1.1     skrll     reloc = encode_reloc (slot);
   4350      1.1     skrll   if (reloc == BFD_RELOC_NONE)
   4351      1.1     skrll     {
   4352      1.1     skrll       as_bad (_("invalid relocation in instruction slot %i"), slot);
   4353      1.1     skrll       return FALSE;
   4354      1.1     skrll     }
   4355      1.1     skrll 
   4356      1.1     skrll   howto = bfd_reloc_type_lookup (stdoutput, reloc);
   4357  1.1.1.2  christos   if (!howto)
   4358      1.1     skrll     {
   4359      1.1     skrll       as_bad (_("undefined symbol for opcode \"%s\""),
   4360  1.1.1.2  christos 	      xtensa_opcode_name (xtensa_default_isa, opcode));
   4361  1.1.1.2  christos       return FALSE;
   4362      1.1     skrll     }
   4363      1.1     skrll 
   4364      1.1     skrll   fmt_length = xtensa_format_length (xtensa_default_isa, fmt);
   4365      1.1     skrll   the_fix = fix_new_exp (fragP, offset, fmt_length, exp,
   4366      1.1     skrll 			 howto->pc_relative, reloc);
   4367      1.1     skrll   the_fix->fx_no_overflow = 1;
   4368      1.1     skrll   the_fix->tc_fix_data.X_add_symbol = exp->X_add_symbol;
   4369      1.1     skrll   the_fix->tc_fix_data.X_add_number = exp->X_add_number;
   4370      1.1     skrll   the_fix->tc_fix_data.slot = slot;
   4371      1.1     skrll 
   4372      1.1     skrll   return TRUE;
   4373      1.1     skrll }
   4374      1.1     skrll 
   4375      1.1     skrll 
   4376      1.1     skrll static bfd_boolean
   4377      1.1     skrll xg_emit_insn_to_buf (TInsn *tinsn,
   4378      1.1     skrll 		     char *buf,
   4379      1.1     skrll 		     fragS *fragP,
   4380      1.1     skrll 		     offsetT offset,
   4381      1.1     skrll 		     bfd_boolean build_fix)
   4382      1.1     skrll {
   4383      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   4384      1.1     skrll   bfd_boolean has_symbolic_immed = FALSE;
   4385      1.1     skrll   bfd_boolean ok = TRUE;
   4386      1.1     skrll 
   4387      1.1     skrll   if (!insnbuf)
   4388      1.1     skrll     insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
   4389      1.1     skrll 
   4390      1.1     skrll   has_symbolic_immed = tinsn_to_insnbuf (tinsn, insnbuf);
   4391      1.1     skrll   if (has_symbolic_immed && build_fix)
   4392      1.1     skrll     {
   4393      1.1     skrll       /* Add a fixup.  */
   4394      1.1     skrll       xtensa_format fmt = xg_get_single_format (tinsn->opcode);
   4395      1.1     skrll       int slot = xg_get_single_slot (tinsn->opcode);
   4396      1.1     skrll       int opnum = get_relaxable_immed (tinsn->opcode);
   4397      1.1     skrll       expressionS *exp = &tinsn->tok[opnum];
   4398      1.1     skrll 
   4399      1.1     skrll       if (!xg_add_opcode_fix (tinsn, opnum, fmt, slot, exp, fragP, offset))
   4400      1.1     skrll 	ok = FALSE;
   4401      1.1     skrll     }
   4402      1.1     skrll   fragP->tc_frag_data.is_insn = TRUE;
   4403      1.1     skrll   xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
   4404      1.1     skrll 			   (unsigned char *) buf, 0);
   4405      1.1     skrll   return ok;
   4406      1.1     skrll }
   4407      1.1     skrll 
   4408  1.1.1.2  christos 
   4409      1.1     skrll static void
   4410      1.1     skrll xg_resolve_literals (TInsn *insn, symbolS *lit_sym)
   4411      1.1     skrll {
   4412      1.1     skrll   symbolS *sym = get_special_literal_symbol ();
   4413      1.1     skrll   int i;
   4414      1.1     skrll   if (lit_sym == 0)
   4415      1.1     skrll     return;
   4416      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   4417      1.1     skrll   for (i = 0; i < insn->ntok; i++)
   4418      1.1     skrll     if (insn->tok[i].X_add_symbol == sym)
   4419      1.1     skrll       insn->tok[i].X_add_symbol = lit_sym;
   4420      1.1     skrll 
   4421      1.1     skrll }
   4422      1.1     skrll 
   4423      1.1     skrll 
   4424      1.1     skrll static void
   4425      1.1     skrll xg_resolve_labels (TInsn *insn, symbolS *label_sym)
   4426      1.1     skrll {
   4427      1.1     skrll   symbolS *sym = get_special_label_symbol ();
   4428      1.1     skrll   int i;
   4429      1.1     skrll   for (i = 0; i < insn->ntok; i++)
   4430      1.1     skrll     if (insn->tok[i].X_add_symbol == sym)
   4431      1.1     skrll       insn->tok[i].X_add_symbol = label_sym;
   4432      1.1     skrll 
   4433      1.1     skrll }
   4434      1.1     skrll 
   4435      1.1     skrll 
   4436      1.1     skrll /* Return TRUE if the instruction can write to the specified
   4437      1.1     skrll    integer register.  */
   4438      1.1     skrll 
   4439      1.1     skrll static bfd_boolean
   4440      1.1     skrll is_register_writer (const TInsn *insn, const char *regset, int regnum)
   4441      1.1     skrll {
   4442      1.1     skrll   int i;
   4443      1.1     skrll   int num_ops;
   4444      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   4445      1.1     skrll 
   4446      1.1     skrll   num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
   4447      1.1     skrll 
   4448      1.1     skrll   for (i = 0; i < num_ops; i++)
   4449      1.1     skrll     {
   4450      1.1     skrll       char inout;
   4451      1.1     skrll       inout = xtensa_operand_inout (isa, insn->opcode, i);
   4452      1.1     skrll       if ((inout == 'o' || inout == 'm')
   4453      1.1     skrll 	  && xtensa_operand_is_register (isa, insn->opcode, i) == 1)
   4454      1.1     skrll 	{
   4455      1.1     skrll 	  xtensa_regfile opnd_rf =
   4456      1.1     skrll 	    xtensa_operand_regfile (isa, insn->opcode, i);
   4457      1.1     skrll 	  if (!strcmp (xtensa_regfile_shortname (isa, opnd_rf), regset))
   4458      1.1     skrll 	    {
   4459      1.1     skrll 	      if ((insn->tok[i].X_op == O_register)
   4460      1.1     skrll 		  && (insn->tok[i].X_add_number == regnum))
   4461      1.1     skrll 		return TRUE;
   4462      1.1     skrll 	    }
   4463      1.1     skrll 	}
   4464      1.1     skrll     }
   4465      1.1     skrll   return FALSE;
   4466      1.1     skrll }
   4467      1.1     skrll 
   4468      1.1     skrll 
   4469      1.1     skrll static bfd_boolean
   4470      1.1     skrll is_bad_loopend_opcode (const TInsn *tinsn)
   4471      1.1     skrll {
   4472      1.1     skrll   xtensa_opcode opcode = tinsn->opcode;
   4473      1.1     skrll 
   4474      1.1     skrll   if (opcode == XTENSA_UNDEFINED)
   4475      1.1     skrll     return FALSE;
   4476      1.1     skrll 
   4477      1.1     skrll   if (opcode == xtensa_call0_opcode
   4478      1.1     skrll       || opcode == xtensa_callx0_opcode
   4479      1.1     skrll       || opcode == xtensa_call4_opcode
   4480      1.1     skrll       || opcode == xtensa_callx4_opcode
   4481      1.1     skrll       || opcode == xtensa_call8_opcode
   4482      1.1     skrll       || opcode == xtensa_callx8_opcode
   4483      1.1     skrll       || opcode == xtensa_call12_opcode
   4484      1.1     skrll       || opcode == xtensa_callx12_opcode
   4485      1.1     skrll       || opcode == xtensa_isync_opcode
   4486      1.1     skrll       || opcode == xtensa_ret_opcode
   4487      1.1     skrll       || opcode == xtensa_ret_n_opcode
   4488      1.1     skrll       || opcode == xtensa_retw_opcode
   4489      1.1     skrll       || opcode == xtensa_retw_n_opcode
   4490      1.1     skrll       || opcode == xtensa_waiti_opcode
   4491      1.1     skrll       || opcode == xtensa_rsr_lcount_opcode)
   4492      1.1     skrll     return TRUE;
   4493      1.1     skrll 
   4494      1.1     skrll   return FALSE;
   4495      1.1     skrll }
   4496      1.1     skrll 
   4497      1.1     skrll 
   4498      1.1     skrll /* Labels that begin with ".Ln" or ".LM"  are unaligned.
   4499      1.1     skrll    This allows the debugger to add unaligned labels.
   4500      1.1     skrll    Also, the assembler generates stabs labels that need
   4501      1.1     skrll    not be aligned:  FAKE_LABEL_NAME . {"F", "L", "endfunc"}.  */
   4502      1.1     skrll 
   4503      1.1     skrll static bfd_boolean
   4504      1.1     skrll is_unaligned_label (symbolS *sym)
   4505      1.1     skrll {
   4506      1.1     skrll   const char *name = S_GET_NAME (sym);
   4507      1.1     skrll   static size_t fake_size = 0;
   4508      1.1     skrll 
   4509      1.1     skrll   if (name
   4510      1.1     skrll       && name[0] == '.'
   4511      1.1     skrll       && name[1] == 'L' && (name[2] == 'n' || name[2] == 'M'))
   4512      1.1     skrll     return TRUE;
   4513      1.1     skrll 
   4514      1.1     skrll   /* FAKE_LABEL_NAME followed by "F", "L" or "endfunc" */
   4515      1.1     skrll   if (fake_size == 0)
   4516      1.1     skrll     fake_size = strlen (FAKE_LABEL_NAME);
   4517      1.1     skrll 
   4518      1.1     skrll   if (name
   4519      1.1     skrll       && strncmp (FAKE_LABEL_NAME, name, fake_size) == 0
   4520      1.1     skrll       && (name[fake_size] == 'F'
   4521      1.1     skrll 	  || name[fake_size] == 'L'
   4522      1.1     skrll 	  || (name[fake_size] == 'e'
   4523      1.1     skrll 	      && strncmp ("endfunc", name+fake_size, 7) == 0)))
   4524      1.1     skrll     return TRUE;
   4525      1.1     skrll 
   4526      1.1     skrll   return FALSE;
   4527      1.1     skrll }
   4528      1.1     skrll 
   4529      1.1     skrll 
   4530      1.1     skrll static fragS *
   4531      1.1     skrll next_non_empty_frag (const fragS *fragP)
   4532      1.1     skrll {
   4533      1.1     skrll   fragS *next_fragP = fragP->fr_next;
   4534      1.1     skrll 
   4535      1.1     skrll   /* Sometimes an empty will end up here due storage allocation issues.
   4536      1.1     skrll      So we have to skip until we find something legit.  */
   4537      1.1     skrll   while (next_fragP && next_fragP->fr_fix == 0)
   4538      1.1     skrll     next_fragP = next_fragP->fr_next;
   4539      1.1     skrll 
   4540      1.1     skrll   if (next_fragP == NULL || next_fragP->fr_fix == 0)
   4541      1.1     skrll     return NULL;
   4542      1.1     skrll 
   4543      1.1     skrll   return next_fragP;
   4544      1.1     skrll }
   4545      1.1     skrll 
   4546      1.1     skrll 
   4547      1.1     skrll static bfd_boolean
   4548      1.1     skrll next_frag_opcode_is_loop (const fragS *fragP, xtensa_opcode *opcode)
   4549      1.1     skrll {
   4550      1.1     skrll   xtensa_opcode out_opcode;
   4551      1.1     skrll   const fragS *next_fragP = next_non_empty_frag (fragP);
   4552      1.1     skrll 
   4553      1.1     skrll   if (next_fragP == NULL)
   4554      1.1     skrll     return FALSE;
   4555      1.1     skrll 
   4556      1.1     skrll   out_opcode = get_opcode_from_buf (next_fragP->fr_literal, 0);
   4557      1.1     skrll   if (xtensa_opcode_is_loop (xtensa_default_isa, out_opcode) == 1)
   4558      1.1     skrll     {
   4559      1.1     skrll       *opcode = out_opcode;
   4560      1.1     skrll       return TRUE;
   4561      1.1     skrll     }
   4562      1.1     skrll   return FALSE;
   4563      1.1     skrll }
   4564      1.1     skrll 
   4565      1.1     skrll 
   4566      1.1     skrll static int
   4567      1.1     skrll frag_format_size (const fragS *fragP)
   4568      1.1     skrll {
   4569      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   4570      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   4571      1.1     skrll   xtensa_format fmt;
   4572      1.1     skrll   int fmt_size;
   4573      1.1     skrll 
   4574      1.1     skrll   if (!insnbuf)
   4575      1.1     skrll     insnbuf = xtensa_insnbuf_alloc (isa);
   4576      1.1     skrll 
   4577      1.1     skrll   if (fragP == NULL)
   4578      1.1     skrll     return XTENSA_UNDEFINED;
   4579      1.1     skrll 
   4580      1.1     skrll   xtensa_insnbuf_from_chars (isa, insnbuf,
   4581      1.1     skrll 			     (unsigned char *) fragP->fr_literal, 0);
   4582      1.1     skrll 
   4583      1.1     skrll   fmt = xtensa_format_decode (isa, insnbuf);
   4584      1.1     skrll   if (fmt == XTENSA_UNDEFINED)
   4585      1.1     skrll     return XTENSA_UNDEFINED;
   4586      1.1     skrll   fmt_size = xtensa_format_length (isa, fmt);
   4587      1.1     skrll 
   4588      1.1     skrll   /* If the next format won't be changing due to relaxation, just
   4589      1.1     skrll      return the length of the first format.  */
   4590      1.1     skrll   if (fragP->fr_opcode != fragP->fr_literal)
   4591      1.1     skrll     return fmt_size;
   4592      1.1     skrll 
   4593      1.1     skrll   /* If during relaxation we have to pull an instruction out of a
   4594      1.1     skrll      multi-slot instruction, we will return the more conservative
   4595      1.1     skrll      number.  This works because alignment on bigger instructions
   4596      1.1     skrll      is more restrictive than alignment on smaller instructions.
   4597      1.1     skrll      This is more conservative than we would like, but it happens
   4598      1.1     skrll      infrequently.  */
   4599      1.1     skrll 
   4600      1.1     skrll   if (xtensa_format_num_slots (xtensa_default_isa, fmt) > 1)
   4601      1.1     skrll     return fmt_size;
   4602      1.1     skrll 
   4603      1.1     skrll   /* If we aren't doing one of our own relaxations or it isn't
   4604      1.1     skrll      slot-based, then the insn size won't change.  */
   4605      1.1     skrll   if (fragP->fr_type != rs_machine_dependent)
   4606      1.1     skrll     return fmt_size;
   4607      1.1     skrll   if (fragP->fr_subtype != RELAX_SLOTS)
   4608      1.1     skrll     return fmt_size;
   4609      1.1     skrll 
   4610      1.1     skrll   /* If an instruction is about to grow, return the longer size.  */
   4611      1.1     skrll   if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP1
   4612      1.1     skrll       || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP2
   4613      1.1     skrll       || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP3)
   4614      1.1     skrll     {
   4615      1.1     skrll       /* For most frags at RELAX_IMMED_STEPX, with X > 0, the first
   4616      1.1     skrll 	 instruction in the relaxed version is of length 3.  (The case
   4617      1.1     skrll 	 where we have to pull the instruction out of a FLIX bundle
   4618      1.1     skrll 	 is handled conservatively above.)  However, frags with opcodes
   4619  1.1.1.2  christos 	 that are expanding to wide branches end up having formats that
   4620      1.1     skrll 	 are not determinable by the RELAX_IMMED_STEPX enumeration, and
   4621  1.1.1.2  christos 	 we can't tell directly what format the relaxer picked.  This
   4622  1.1.1.2  christos 	 is a wart in the design of the relaxer that should someday be
   4623  1.1.1.2  christos 	 fixed, but would require major changes, or at least should
   4624  1.1.1.2  christos 	 be accompanied by major changes to make use of that data.
   4625  1.1.1.2  christos 
   4626  1.1.1.2  christos 	 In any event, we can tell that we are expanding from a single-slot
   4627  1.1.1.2  christos 	 format to a wider one with the logic below.  */
   4628  1.1.1.2  christos 
   4629  1.1.1.2  christos       int i;
   4630  1.1.1.2  christos       int relaxed_size = fmt_size + fragP->tc_frag_data.text_expansion[0];
   4631      1.1     skrll 
   4632      1.1     skrll       for (i = 0; i < xtensa_isa_num_formats (isa); i++)
   4633      1.1     skrll 	{
   4634      1.1     skrll 	  if (relaxed_size == xtensa_format_length (isa, i))
   4635      1.1     skrll 	    return relaxed_size;
   4636      1.1     skrll 	}
   4637      1.1     skrll 
   4638      1.1     skrll       return 3;
   4639      1.1     skrll     }
   4640      1.1     skrll 
   4641      1.1     skrll   if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
   4642      1.1     skrll     return 2 + fragP->tc_frag_data.text_expansion[0];
   4643      1.1     skrll 
   4644      1.1     skrll   return fmt_size;
   4645      1.1     skrll }
   4646      1.1     skrll 
   4647      1.1     skrll 
   4648      1.1     skrll static int
   4649      1.1     skrll next_frag_format_size (const fragS *fragP)
   4650      1.1     skrll {
   4651      1.1     skrll   const fragS *next_fragP = next_non_empty_frag (fragP);
   4652      1.1     skrll   return frag_format_size (next_fragP);
   4653      1.1     skrll }
   4654      1.1     skrll 
   4655      1.1     skrll 
   4656      1.1     skrll /* In early Xtensa Processors, for reasons that are unclear, the ISA
   4657      1.1     skrll    required two-byte instructions to be treated as three-byte instructions
   4658      1.1     skrll    for loop instruction alignment.  This restriction was removed beginning
   4659      1.1     skrll    with Xtensa LX.  Now the only requirement on loop instruction alignment
   4660      1.1     skrll    is that the first instruction of the loop must appear at an address that
   4661      1.1     skrll    does not cross a fetch boundary.  */
   4662      1.1     skrll 
   4663      1.1     skrll static int
   4664      1.1     skrll get_loop_align_size (int insn_size)
   4665      1.1     skrll {
   4666      1.1     skrll   if (insn_size == XTENSA_UNDEFINED)
   4667      1.1     skrll     return xtensa_fetch_width;
   4668      1.1     skrll 
   4669      1.1     skrll   if (enforce_three_byte_loop_align && insn_size == 2)
   4670      1.1     skrll     return 3;
   4671      1.1     skrll 
   4672      1.1     skrll   return insn_size;
   4673      1.1     skrll }
   4674      1.1     skrll 
   4675      1.1     skrll 
   4676      1.1     skrll /* If the next legit fragment is an end-of-loop marker,
   4677      1.1     skrll    switch its state so it will instantiate a NOP.  */
   4678      1.1     skrll 
   4679      1.1     skrll static void
   4680      1.1     skrll update_next_frag_state (fragS *fragP)
   4681      1.1     skrll {
   4682      1.1     skrll   fragS *next_fragP = fragP->fr_next;
   4683      1.1     skrll   fragS *new_target = NULL;
   4684      1.1     skrll 
   4685  1.1.1.2  christos   if (align_targets)
   4686      1.1     skrll     {
   4687      1.1     skrll       /* We are guaranteed there will be one of these...   */
   4688      1.1     skrll       while (!(next_fragP->fr_type == rs_machine_dependent
   4689      1.1     skrll 	       && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
   4690      1.1     skrll 		   || next_fragP->fr_subtype == RELAX_UNREACHABLE)))
   4691      1.1     skrll 	next_fragP = next_fragP->fr_next;
   4692      1.1     skrll 
   4693      1.1     skrll       gas_assert (next_fragP->fr_type == rs_machine_dependent
   4694      1.1     skrll 	      && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
   4695      1.1     skrll 		  || next_fragP->fr_subtype == RELAX_UNREACHABLE));
   4696  1.1.1.2  christos 
   4697      1.1     skrll       /* ...and one of these.  */
   4698      1.1     skrll       new_target = next_fragP->fr_next;
   4699      1.1     skrll       while (!(new_target->fr_type == rs_machine_dependent
   4700      1.1     skrll 	       && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
   4701      1.1     skrll 		   || new_target->fr_subtype == RELAX_DESIRE_ALIGN)))
   4702      1.1     skrll 	new_target = new_target->fr_next;
   4703      1.1     skrll 
   4704      1.1     skrll       gas_assert (new_target->fr_type == rs_machine_dependent
   4705      1.1     skrll 	      && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
   4706      1.1     skrll 		  || new_target->fr_subtype == RELAX_DESIRE_ALIGN));
   4707      1.1     skrll     }
   4708      1.1     skrll 
   4709      1.1     skrll   while (next_fragP && next_fragP->fr_fix == 0)
   4710      1.1     skrll     {
   4711      1.1     skrll       if (next_fragP->fr_type == rs_machine_dependent
   4712      1.1     skrll 	  && next_fragP->fr_subtype == RELAX_LOOP_END)
   4713      1.1     skrll 	{
   4714      1.1     skrll 	  next_fragP->fr_subtype = RELAX_LOOP_END_ADD_NOP;
   4715      1.1     skrll 	  return;
   4716      1.1     skrll 	}
   4717      1.1     skrll 
   4718      1.1     skrll       next_fragP = next_fragP->fr_next;
   4719      1.1     skrll     }
   4720      1.1     skrll }
   4721      1.1     skrll 
   4722      1.1     skrll 
   4723      1.1     skrll static bfd_boolean
   4724      1.1     skrll next_frag_is_branch_target (const fragS *fragP)
   4725      1.1     skrll {
   4726      1.1     skrll   /* Sometimes an empty will end up here due to storage allocation issues,
   4727      1.1     skrll      so we have to skip until we find something legit.  */
   4728      1.1     skrll   for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
   4729      1.1     skrll     {
   4730      1.1     skrll       if (fragP->tc_frag_data.is_branch_target)
   4731      1.1     skrll 	return TRUE;
   4732      1.1     skrll       if (fragP->fr_fix != 0)
   4733      1.1     skrll 	break;
   4734      1.1     skrll     }
   4735      1.1     skrll   return FALSE;
   4736      1.1     skrll }
   4737      1.1     skrll 
   4738      1.1     skrll 
   4739      1.1     skrll static bfd_boolean
   4740      1.1     skrll next_frag_is_loop_target (const fragS *fragP)
   4741      1.1     skrll {
   4742      1.1     skrll   /* Sometimes an empty will end up here due storage allocation issues.
   4743      1.1     skrll      So we have to skip until we find something legit. */
   4744      1.1     skrll   for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
   4745      1.1     skrll     {
   4746      1.1     skrll       if (fragP->tc_frag_data.is_loop_target)
   4747  1.1.1.2  christos 	return TRUE;
   4748  1.1.1.2  christos       if (fragP->fr_fix != 0)
   4749  1.1.1.2  christos 	break;
   4750  1.1.1.2  christos     }
   4751  1.1.1.2  christos   return FALSE;
   4752  1.1.1.2  christos }
   4753      1.1     skrll 
   4754      1.1     skrll 
   4755      1.1     skrll /* As specified in the relaxation table, when a loop instruction is
   4756      1.1     skrll    relaxed, there are 24 bytes between the loop instruction itself and
   4757      1.1     skrll    the first instruction in the loop.  */
   4758      1.1     skrll 
   4759      1.1     skrll #define RELAXED_LOOP_INSN_BYTES 24
   4760      1.1     skrll 
   4761      1.1     skrll static addressT
   4762      1.1     skrll next_frag_pre_opcode_bytes (const fragS *fragp)
   4763      1.1     skrll {
   4764      1.1     skrll   const fragS *next_fragp = fragp->fr_next;
   4765      1.1     skrll   xtensa_opcode next_opcode;
   4766      1.1     skrll 
   4767      1.1     skrll   if (!next_frag_opcode_is_loop (fragp, &next_opcode))
   4768      1.1     skrll     return 0;
   4769      1.1     skrll 
   4770      1.1     skrll   /* Sometimes an empty will end up here due to storage allocation issues,
   4771      1.1     skrll      so we have to skip until we find something legit.  */
   4772      1.1     skrll   while (next_fragp->fr_fix == 0)
   4773      1.1     skrll     next_fragp = next_fragp->fr_next;
   4774      1.1     skrll 
   4775  1.1.1.2  christos   if (next_fragp->fr_type != rs_machine_dependent)
   4776      1.1     skrll     return 0;
   4777      1.1     skrll 
   4778      1.1     skrll   /* There is some implicit knowledge encoded in here.
   4779      1.1     skrll      The LOOP instructions that are NOT RELAX_IMMED have
   4780      1.1     skrll      been relaxed.  Note that we can assume that the LOOP
   4781      1.1     skrll      instruction is in slot 0 because loops aren't bundleable.  */
   4782      1.1     skrll   if (next_fragp->tc_frag_data.slot_subtypes[0] > RELAX_IMMED)
   4783      1.1     skrll       return get_expanded_loop_offset (next_opcode) + RELAXED_LOOP_INSN_BYTES;
   4784      1.1     skrll 
   4785      1.1     skrll   return 0;
   4786      1.1     skrll }
   4787      1.1     skrll 
   4788      1.1     skrll 
   4789      1.1     skrll /* Mark a location where we can later insert literal frags.  Update
   4790      1.1     skrll    the section's literal_pool_loc, so subsequent literals can be
   4791      1.1     skrll    placed nearest to their use.  */
   4792      1.1     skrll 
   4793      1.1     skrll static void
   4794      1.1     skrll xtensa_mark_literal_pool_location (void)
   4795      1.1     skrll {
   4796      1.1     skrll   /* Any labels pointing to the current location need
   4797      1.1     skrll      to be adjusted to after the literal pool.  */
   4798      1.1     skrll   fragS *pool_location;
   4799      1.1     skrll 
   4800  1.1.1.4  christos   if (use_literal_section)
   4801  1.1.1.4  christos     return;
   4802      1.1     skrll 
   4803      1.1     skrll   /* We stash info in these frags so we can later move the literal's
   4804      1.1     skrll      fixes into this frchain's fix list.  */
   4805      1.1     skrll   pool_location = frag_now;
   4806      1.1     skrll   frag_now->tc_frag_data.lit_frchain = frchain_now;
   4807      1.1     skrll   frag_now->tc_frag_data.literal_frag = frag_now;
   4808      1.1     skrll   /* Just record this frag.  */
   4809      1.1     skrll   xtensa_maybe_create_literal_pool_frag (FALSE, FALSE);
   4810      1.1     skrll   frag_variant (rs_machine_dependent, 0, 0,
   4811      1.1     skrll 		RELAX_LITERAL_POOL_BEGIN, NULL, 0, NULL);
   4812      1.1     skrll   xtensa_set_frag_assembly_state (frag_now);
   4813      1.1     skrll   frag_now->tc_frag_data.lit_seg = now_seg;
   4814      1.1     skrll   frag_variant (rs_machine_dependent, 0, 0,
   4815      1.1     skrll 		RELAX_LITERAL_POOL_END, NULL, 0, NULL);
   4816      1.1     skrll   xtensa_set_frag_assembly_state (frag_now);
   4817      1.1     skrll 
   4818      1.1     skrll   set_literal_pool_location (now_seg, pool_location);
   4819      1.1     skrll }
   4820      1.1     skrll 
   4821      1.1     skrll 
   4822      1.1     skrll /* Build a nop of the correct size into tinsn.  */
   4823      1.1     skrll 
   4824      1.1     skrll static void
   4825      1.1     skrll build_nop (TInsn *tinsn, int size)
   4826      1.1     skrll {
   4827      1.1     skrll   tinsn_init (tinsn);
   4828      1.1     skrll   switch (size)
   4829      1.1     skrll     {
   4830      1.1     skrll     case 2:
   4831      1.1     skrll       tinsn->opcode = xtensa_nop_n_opcode;
   4832      1.1     skrll       tinsn->ntok = 0;
   4833      1.1     skrll       if (tinsn->opcode == XTENSA_UNDEFINED)
   4834      1.1     skrll 	as_fatal (_("opcode 'NOP.N' unavailable in this configuration"));
   4835      1.1     skrll       break;
   4836      1.1     skrll 
   4837      1.1     skrll     case 3:
   4838      1.1     skrll       if (xtensa_nop_opcode == XTENSA_UNDEFINED)
   4839      1.1     skrll 	{
   4840      1.1     skrll 	  tinsn->opcode = xtensa_or_opcode;
   4841  1.1.1.2  christos 	  set_expr_const (&tinsn->tok[0], 1);
   4842      1.1     skrll 	  set_expr_const (&tinsn->tok[1], 1);
   4843      1.1     skrll 	  set_expr_const (&tinsn->tok[2], 1);
   4844      1.1     skrll 	  tinsn->ntok = 3;
   4845      1.1     skrll 	}
   4846      1.1     skrll       else
   4847      1.1     skrll 	tinsn->opcode = xtensa_nop_opcode;
   4848      1.1     skrll 
   4849      1.1     skrll       gas_assert (tinsn->opcode != XTENSA_UNDEFINED);
   4850      1.1     skrll     }
   4851      1.1     skrll }
   4852      1.1     skrll 
   4853      1.1     skrll 
   4854      1.1     skrll /* Assemble a NOP of the requested size in the buffer.  User must have
   4855      1.1     skrll    allocated "buf" with at least "size" bytes.  */
   4856      1.1     skrll 
   4857      1.1     skrll static void
   4858      1.1     skrll assemble_nop (int size, char *buf)
   4859      1.1     skrll {
   4860      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   4861      1.1     skrll   TInsn tinsn;
   4862      1.1     skrll 
   4863      1.1     skrll   build_nop (&tinsn, size);
   4864      1.1     skrll 
   4865      1.1     skrll   if (!insnbuf)
   4866      1.1     skrll     insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
   4867      1.1     skrll 
   4868      1.1     skrll   tinsn_to_insnbuf (&tinsn, insnbuf);
   4869      1.1     skrll   xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
   4870      1.1     skrll 			   (unsigned char *) buf, 0);
   4871      1.1     skrll }
   4872      1.1     skrll 
   4873      1.1     skrll 
   4874      1.1     skrll /* Return the number of bytes for the offset of the expanded loop
   4875      1.1     skrll    instruction.  This should be incorporated into the relaxation
   4876      1.1     skrll    specification but is hard-coded here.  This is used to auto-align
   4877      1.1     skrll    the loop instruction.  It is invalid to call this function if the
   4878      1.1     skrll    configuration does not have loops or if the opcode is not a loop
   4879  1.1.1.2  christos    opcode.  */
   4880      1.1     skrll 
   4881      1.1     skrll static addressT
   4882      1.1     skrll get_expanded_loop_offset (xtensa_opcode opcode)
   4883      1.1     skrll {
   4884      1.1     skrll   /* This is the OFFSET of the loop instruction in the expanded loop.
   4885      1.1     skrll      This MUST correspond directly to the specification of the loop
   4886      1.1     skrll      expansion.  It will be validated on fragment conversion.  */
   4887      1.1     skrll   gas_assert (opcode != XTENSA_UNDEFINED);
   4888      1.1     skrll   if (opcode == xtensa_loop_opcode)
   4889      1.1     skrll     return 0;
   4890      1.1     skrll   if (opcode == xtensa_loopnez_opcode)
   4891      1.1     skrll     return 3;
   4892      1.1     skrll   if (opcode == xtensa_loopgtz_opcode)
   4893      1.1     skrll     return 6;
   4894  1.1.1.8  christos   as_fatal (_("get_expanded_loop_offset: invalid opcode"));
   4895  1.1.1.4  christos   return 0;
   4896  1.1.1.8  christos }
   4897  1.1.1.8  christos 
   4898  1.1.1.8  christos 
   4899  1.1.1.8  christos static fragS *
   4900  1.1.1.8  christos get_literal_pool_location (segT seg)
   4901  1.1.1.8  christos {
   4902  1.1.1.8  christos   if (auto_litpools)
   4903  1.1.1.8  christos     {
   4904  1.1.1.8  christos       struct litpool_seg *lps = litpool_seg_list.next;
   4905  1.1.1.8  christos       struct litpool_frag *lpf;
   4906  1.1.1.8  christos       for ( ; lps && lps->seg->id != seg->id; lps = lps->next)
   4907  1.1.1.8  christos 	;
   4908  1.1.1.8  christos       if (lps)
   4909  1.1.1.8  christos 	{
   4910  1.1.1.8  christos 	  for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
   4911  1.1.1.8  christos 	    { /* Skip "candidates" for now.  */
   4912  1.1.1.8  christos 	      if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN &&
   4913  1.1.1.8  christos 		  lpf->priority == 1)
   4914  1.1.1.8  christos 		return lpf->fragP;
   4915  1.1.1.8  christos 	    }
   4916  1.1.1.8  christos 	  /* Must convert a lower-priority pool.  */
   4917  1.1.1.8  christos 	  for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
   4918  1.1.1.8  christos 	    {
   4919  1.1.1.8  christos 	      if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN)
   4920  1.1.1.4  christos 		return lpf->fragP;
   4921  1.1.1.4  christos 	    }
   4922      1.1     skrll 	  /* Still no match -- try for a low priority pool.  */
   4923      1.1     skrll 	  for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
   4924      1.1     skrll 	    {
   4925      1.1     skrll 	      if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN)
   4926      1.1     skrll 		return lpf->fragP;
   4927      1.1     skrll 	    }
   4928      1.1     skrll 	}
   4929      1.1     skrll     }
   4930      1.1     skrll   return seg_info (seg)->tc_segment_info_data.literal_pool_loc;
   4931      1.1     skrll }
   4932      1.1     skrll 
   4933      1.1     skrll 
   4934      1.1     skrll static void
   4935      1.1     skrll set_literal_pool_location (segT seg, fragS *literal_pool_loc)
   4936      1.1     skrll {
   4937      1.1     skrll   seg_info (seg)->tc_segment_info_data.literal_pool_loc = literal_pool_loc;
   4938      1.1     skrll }
   4939      1.1     skrll 
   4940      1.1     skrll 
   4941      1.1     skrll /* Set frag assembly state should be called when a new frag is
   4942      1.1     skrll    opened and after a frag has been closed.  */
   4943      1.1     skrll 
   4944      1.1     skrll static void
   4945      1.1     skrll xtensa_set_frag_assembly_state (fragS *fragP)
   4946      1.1     skrll {
   4947      1.1     skrll   if (!density_supported)
   4948      1.1     skrll     fragP->tc_frag_data.is_no_density = TRUE;
   4949      1.1     skrll 
   4950      1.1     skrll   /* This function is called from subsegs_finish, which is called
   4951      1.1     skrll      after xtensa_end, so we can't use "use_transform" or
   4952      1.1     skrll      "use_schedule" here.  */
   4953      1.1     skrll   if (!directive_state[directive_transform])
   4954      1.1     skrll     fragP->tc_frag_data.is_no_transform = TRUE;
   4955      1.1     skrll   if (directive_state[directive_longcalls])
   4956      1.1     skrll     fragP->tc_frag_data.use_longcalls = TRUE;
   4957      1.1     skrll   fragP->tc_frag_data.use_absolute_literals =
   4958      1.1     skrll     directive_state[directive_absolute_literals];
   4959      1.1     skrll   fragP->tc_frag_data.is_assembly_state_set = TRUE;
   4960      1.1     skrll }
   4961      1.1     skrll 
   4962      1.1     skrll 
   4963      1.1     skrll static bfd_boolean
   4964      1.1     skrll relaxable_section (asection *sec)
   4965      1.1     skrll {
   4966      1.1     skrll   return ((sec->flags & SEC_DEBUGGING) == 0
   4967      1.1     skrll 	  && strcmp (sec->name, ".eh_frame") != 0);
   4968      1.1     skrll }
   4969      1.1     skrll 
   4970      1.1     skrll 
   4971      1.1     skrll static void
   4972      1.1     skrll xtensa_mark_frags_for_org (void)
   4973      1.1     skrll {
   4974      1.1     skrll   segT *seclist;
   4975      1.1     skrll 
   4976      1.1     skrll   /* Walk over each fragment of all of the current segments.  If we find
   4977      1.1     skrll      a .org frag in any of the segments, mark all frags prior to it as
   4978      1.1     skrll      "no transform", which will prevent linker optimizations from messing
   4979      1.1     skrll      up the .org distance.  This should be done after
   4980      1.1     skrll      xtensa_find_unmarked_state_frags, because we don't want to worry here
   4981      1.1     skrll      about that function trashing the data we save here.  */
   4982      1.1     skrll 
   4983  1.1.1.8  christos   for (seclist = &stdoutput->sections;
   4984      1.1     skrll        seclist && *seclist;
   4985      1.1     skrll        seclist = &(*seclist)->next)
   4986      1.1     skrll     {
   4987      1.1     skrll       segT sec = *seclist;
   4988      1.1     skrll       segment_info_type *seginfo;
   4989      1.1     skrll       fragS *fragP;
   4990      1.1     skrll       flagword flags;
   4991      1.1     skrll       flags = bfd_section_flags (sec);
   4992      1.1     skrll       if (flags & SEC_DEBUGGING)
   4993      1.1     skrll 	continue;
   4994      1.1     skrll       if (!(flags & SEC_ALLOC))
   4995      1.1     skrll 	continue;
   4996      1.1     skrll 
   4997      1.1     skrll       seginfo = seg_info (sec);
   4998      1.1     skrll       if (seginfo && seginfo->frchainP)
   4999      1.1     skrll 	{
   5000      1.1     skrll 	  fragS *last_fragP = seginfo->frchainP->frch_root;
   5001      1.1     skrll 	  for (fragP = seginfo->frchainP->frch_root; fragP;
   5002      1.1     skrll 	       fragP = fragP->fr_next)
   5003      1.1     skrll 	    {
   5004      1.1     skrll 	      /* cvt_frag_to_fill has changed the fr_type of org frags to
   5005      1.1     skrll 		 rs_fill, so use the value as cached in rs_subtype here.  */
   5006      1.1     skrll 	      if (fragP->fr_subtype == RELAX_ORG)
   5007      1.1     skrll 		{
   5008      1.1     skrll 		  while (last_fragP != fragP->fr_next)
   5009      1.1     skrll 		    {
   5010      1.1     skrll 		      last_fragP->tc_frag_data.is_no_transform = TRUE;
   5011      1.1     skrll 		      last_fragP = last_fragP->fr_next;
   5012      1.1     skrll 		    }
   5013      1.1     skrll 		}
   5014      1.1     skrll 	    }
   5015      1.1     skrll 	}
   5016      1.1     skrll     }
   5017      1.1     skrll }
   5018      1.1     skrll 
   5019      1.1     skrll 
   5020      1.1     skrll static void
   5021      1.1     skrll xtensa_find_unmarked_state_frags (void)
   5022      1.1     skrll {
   5023      1.1     skrll   segT *seclist;
   5024      1.1     skrll 
   5025      1.1     skrll   /* Walk over each fragment of all of the current segments.  For each
   5026      1.1     skrll      unmarked fragment, mark it with the same info as the previous
   5027      1.1     skrll      fragment.  */
   5028  1.1.1.8  christos   for (seclist = &stdoutput->sections;
   5029      1.1     skrll        seclist && *seclist;
   5030      1.1     skrll        seclist = &(*seclist)->next)
   5031      1.1     skrll     {
   5032      1.1     skrll       segT sec = *seclist;
   5033      1.1     skrll       segment_info_type *seginfo;
   5034      1.1     skrll       fragS *fragP;
   5035      1.1     skrll       flagword flags;
   5036      1.1     skrll       flags = bfd_section_flags (sec);
   5037      1.1     skrll       if (flags & SEC_DEBUGGING)
   5038      1.1     skrll 	continue;
   5039      1.1     skrll       if (!(flags & SEC_ALLOC))
   5040      1.1     skrll 	continue;
   5041      1.1     skrll 
   5042      1.1     skrll       seginfo = seg_info (sec);
   5043      1.1     skrll       if (seginfo && seginfo->frchainP)
   5044      1.1     skrll 	{
   5045      1.1     skrll 	  fragS *last_fragP = 0;
   5046      1.1     skrll 	  for (fragP = seginfo->frchainP->frch_root; fragP;
   5047      1.1     skrll 	       fragP = fragP->fr_next)
   5048      1.1     skrll 	    {
   5049      1.1     skrll 	      if (fragP->fr_fix != 0
   5050      1.1     skrll 		  && !fragP->tc_frag_data.is_assembly_state_set)
   5051      1.1     skrll 		{
   5052      1.1     skrll 		  if (last_fragP == 0)
   5053      1.1     skrll 		    {
   5054      1.1     skrll 		      as_warn_where (fragP->fr_file, fragP->fr_line,
   5055      1.1     skrll 				     _("assembly state not set for first frag in section %s"),
   5056      1.1     skrll 				     sec->name);
   5057      1.1     skrll 		    }
   5058      1.1     skrll 		  else
   5059      1.1     skrll 		    {
   5060      1.1     skrll 		      fragP->tc_frag_data.is_assembly_state_set = TRUE;
   5061      1.1     skrll 		      fragP->tc_frag_data.is_no_density =
   5062      1.1     skrll 			last_fragP->tc_frag_data.is_no_density;
   5063      1.1     skrll 		      fragP->tc_frag_data.is_no_transform =
   5064      1.1     skrll 			last_fragP->tc_frag_data.is_no_transform;
   5065      1.1     skrll 		      fragP->tc_frag_data.use_longcalls =
   5066      1.1     skrll 			last_fragP->tc_frag_data.use_longcalls;
   5067      1.1     skrll 		      fragP->tc_frag_data.use_absolute_literals =
   5068      1.1     skrll 			last_fragP->tc_frag_data.use_absolute_literals;
   5069      1.1     skrll 		    }
   5070      1.1     skrll 		}
   5071      1.1     skrll 	      if (fragP->tc_frag_data.is_assembly_state_set)
   5072      1.1     skrll 		last_fragP = fragP;
   5073      1.1     skrll 	    }
   5074      1.1     skrll 	}
   5075      1.1     skrll     }
   5076  1.1.1.8  christos }
   5077      1.1     skrll 
   5078      1.1     skrll 
   5079      1.1     skrll static void
   5080      1.1     skrll xtensa_find_unaligned_branch_targets (bfd *abfd ATTRIBUTE_UNUSED,
   5081      1.1     skrll 				      asection *sec,
   5082      1.1     skrll 				      void *unused ATTRIBUTE_UNUSED)
   5083      1.1     skrll {
   5084      1.1     skrll   flagword flags = bfd_section_flags (sec);
   5085      1.1     skrll   segment_info_type *seginfo = seg_info (sec);
   5086      1.1     skrll   fragS *frag = seginfo->frchainP->frch_root;
   5087      1.1     skrll 
   5088      1.1     skrll   if (flags & SEC_CODE)
   5089      1.1     skrll     {
   5090      1.1     skrll       xtensa_isa isa = xtensa_default_isa;
   5091      1.1     skrll       xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
   5092      1.1     skrll       while (frag != NULL)
   5093      1.1     skrll 	{
   5094      1.1     skrll 	  if (frag->tc_frag_data.is_branch_target)
   5095      1.1     skrll 	    {
   5096      1.1     skrll 	      int op_size;
   5097      1.1     skrll 	      addressT branch_align, frag_addr;
   5098      1.1     skrll 	      xtensa_format fmt;
   5099      1.1     skrll 
   5100      1.1     skrll 	      xtensa_insnbuf_from_chars
   5101      1.1     skrll 		(isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
   5102      1.1     skrll 	      fmt = xtensa_format_decode (isa, insnbuf);
   5103      1.1     skrll 	      op_size = xtensa_format_length (isa, fmt);
   5104      1.1     skrll 	      branch_align = 1 << branch_align_power (sec);
   5105      1.1     skrll 	      frag_addr = frag->fr_address % branch_align;
   5106      1.1     skrll 	      if (frag_addr + op_size > branch_align)
   5107      1.1     skrll 		as_warn_where (frag->fr_file, frag->fr_line,
   5108      1.1     skrll 			       _("unaligned branch target: %d bytes at 0x%lx"),
   5109      1.1     skrll 			       op_size, (long) frag->fr_address);
   5110      1.1     skrll 	    }
   5111      1.1     skrll 	  frag = frag->fr_next;
   5112      1.1     skrll 	}
   5113      1.1     skrll       xtensa_insnbuf_free (isa, insnbuf);
   5114      1.1     skrll     }
   5115  1.1.1.8  christos }
   5116      1.1     skrll 
   5117      1.1     skrll 
   5118      1.1     skrll static void
   5119      1.1     skrll xtensa_find_unaligned_loops (bfd *abfd ATTRIBUTE_UNUSED,
   5120      1.1     skrll 			     asection *sec,
   5121      1.1     skrll 			     void *unused ATTRIBUTE_UNUSED)
   5122      1.1     skrll {
   5123      1.1     skrll   flagword flags = bfd_section_flags (sec);
   5124      1.1     skrll   segment_info_type *seginfo = seg_info (sec);
   5125      1.1     skrll   fragS *frag = seginfo->frchainP->frch_root;
   5126      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   5127      1.1     skrll 
   5128      1.1     skrll   if (flags & SEC_CODE)
   5129      1.1     skrll     {
   5130      1.1     skrll       xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
   5131  1.1.1.2  christos       while (frag != NULL)
   5132  1.1.1.2  christos 	{
   5133  1.1.1.4  christos 	  if (frag->tc_frag_data.is_first_loop_insn)
   5134  1.1.1.2  christos 	    {
   5135  1.1.1.2  christos 	      int op_size;
   5136  1.1.1.2  christos 	      addressT frag_addr;
   5137  1.1.1.2  christos 	      xtensa_format fmt;
   5138  1.1.1.2  christos 
   5139  1.1.1.2  christos 	      if (frag->fr_fix == 0)
   5140  1.1.1.2  christos 		frag = next_non_empty_frag (frag);
   5141  1.1.1.4  christos 
   5142  1.1.1.2  christos 	      if (frag)
   5143  1.1.1.2  christos 		{
   5144  1.1.1.2  christos 		  xtensa_insnbuf_from_chars
   5145  1.1.1.2  christos 		    (isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
   5146  1.1.1.2  christos 		  fmt = xtensa_format_decode (isa, insnbuf);
   5147      1.1     skrll 		  op_size = xtensa_format_length (isa, fmt);
   5148      1.1     skrll 		  frag_addr = frag->fr_address % xtensa_fetch_width;
   5149      1.1     skrll 
   5150      1.1     skrll 		  if (frag_addr + op_size > xtensa_fetch_width)
   5151      1.1     skrll 		    as_warn_where (frag->fr_file, frag->fr_line,
   5152      1.1     skrll 				   _("unaligned loop: %d bytes at 0x%lx"),
   5153      1.1     skrll 				   op_size, (long) frag->fr_address);
   5154      1.1     skrll 		}
   5155      1.1     skrll 	    }
   5156      1.1     skrll 	  frag = frag->fr_next;
   5157      1.1     skrll 	}
   5158      1.1     skrll       xtensa_insnbuf_free (isa, insnbuf);
   5159      1.1     skrll     }
   5160      1.1     skrll }
   5161      1.1     skrll 
   5162      1.1     skrll 
   5163      1.1     skrll static int
   5164      1.1     skrll xg_apply_fix_value (fixS *fixP, valueT val)
   5165      1.1     skrll {
   5166      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   5167      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   5168      1.1     skrll   static xtensa_insnbuf slotbuf = NULL;
   5169      1.1     skrll   xtensa_format fmt;
   5170      1.1     skrll   int slot;
   5171      1.1     skrll   bfd_boolean alt_reloc;
   5172      1.1     skrll   xtensa_opcode opcode;
   5173      1.1     skrll   char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
   5174      1.1     skrll 
   5175      1.1     skrll   if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc)
   5176      1.1     skrll       || alt_reloc)
   5177      1.1     skrll     as_fatal (_("unexpected fix"));
   5178      1.1     skrll 
   5179      1.1     skrll   if (!insnbuf)
   5180      1.1     skrll     {
   5181      1.1     skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   5182      1.1     skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   5183      1.1     skrll     }
   5184      1.1     skrll 
   5185      1.1     skrll   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
   5186      1.1     skrll   fmt = xtensa_format_decode (isa, insnbuf);
   5187      1.1     skrll   if (fmt == XTENSA_UNDEFINED)
   5188      1.1     skrll     as_fatal (_("undecodable fix"));
   5189      1.1     skrll   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
   5190      1.1     skrll   opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   5191      1.1     skrll   if (opcode == XTENSA_UNDEFINED)
   5192      1.1     skrll     as_fatal (_("undecodable fix"));
   5193      1.1     skrll 
   5194      1.1     skrll   /* CONST16 immediates are not PC-relative, despite the fact that we
   5195      1.1     skrll      reuse the normal PC-relative operand relocations for the low part
   5196      1.1     skrll      of a CONST16 operand.  */
   5197      1.1     skrll   if (opcode == xtensa_const16_opcode)
   5198      1.1     skrll     return 0;
   5199      1.1     skrll 
   5200      1.1     skrll   xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode,
   5201      1.1     skrll 			      get_relaxable_immed (opcode), val,
   5202      1.1     skrll 			      fixP->fx_file, fixP->fx_line);
   5203      1.1     skrll 
   5204      1.1     skrll   xtensa_format_set_slot (isa, fmt, slot, insnbuf, slotbuf);
   5205      1.1     skrll   xtensa_insnbuf_to_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
   5206      1.1     skrll 
   5207      1.1     skrll   return 1;
   5208      1.1     skrll }
   5209      1.1     skrll 
   5210      1.1     skrll 
   5211      1.1     skrll /* External Functions and Other GAS Hooks.  */
   5213      1.1     skrll 
   5214      1.1     skrll const char *
   5215      1.1     skrll xtensa_target_format (void)
   5216      1.1     skrll {
   5217      1.1     skrll   return (target_big_endian ? "elf32-xtensa-be" : "elf32-xtensa-le");
   5218      1.1     skrll }
   5219      1.1     skrll 
   5220      1.1     skrll 
   5221      1.1     skrll void
   5222      1.1     skrll xtensa_file_arch_init (bfd *abfd)
   5223      1.1     skrll {
   5224      1.1     skrll   bfd_set_private_flags (abfd, 0x100 | 0x200);
   5225      1.1     skrll }
   5226      1.1     skrll 
   5227      1.1     skrll 
   5228  1.1.1.6  christos void
   5229  1.1.1.6  christos md_number_to_chars (char *buf, valueT val, int n)
   5230  1.1.1.6  christos {
   5231  1.1.1.6  christos   if (target_big_endian)
   5232  1.1.1.6  christos     number_to_chars_bigendian (buf, val, n);
   5233  1.1.1.6  christos   else
   5234  1.1.1.6  christos     number_to_chars_littleendian (buf, val, n);
   5235  1.1.1.6  christos }
   5236  1.1.1.6  christos 
   5237  1.1.1.6  christos static void
   5238  1.1.1.6  christos xg_init_global_config (void)
   5239  1.1.1.6  christos {
   5240  1.1.1.6  christos   target_big_endian = XCHAL_HAVE_BE;
   5241  1.1.1.6  christos 
   5242  1.1.1.6  christos   density_supported = XCHAL_HAVE_DENSITY;
   5243  1.1.1.6  christos   absolute_literals_supported = XSHAL_USE_ABSOLUTE_LITERALS;
   5244  1.1.1.6  christos   xtensa_fetch_width = XCHAL_INST_FETCH_WIDTH;
   5245  1.1.1.6  christos 
   5246      1.1     skrll   directive_state[directive_density] = XCHAL_HAVE_DENSITY;
   5247      1.1     skrll   directive_state[directive_absolute_literals] = XSHAL_USE_ABSOLUTE_LITERALS;
   5248      1.1     skrll }
   5249      1.1     skrll 
   5250      1.1     skrll void
   5251      1.1     skrll xtensa_init (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
   5252      1.1     skrll {
   5253      1.1     skrll   xg_init_global_config ();
   5254      1.1     skrll }
   5255      1.1     skrll 
   5256      1.1     skrll /* This function is called once, at assembler startup time.  It should
   5257  1.1.1.2  christos    set up all the tables, etc. that the MD part of the assembler will
   5258      1.1     skrll    need.  */
   5259      1.1     skrll 
   5260      1.1     skrll void
   5261      1.1     skrll md_begin (void)
   5262  1.1.1.8  christos {
   5263      1.1     skrll   segT current_section = now_seg;
   5264      1.1     skrll   int current_subsec = now_subseg;
   5265      1.1     skrll   xtensa_isa isa;
   5266      1.1     skrll   int i;
   5267      1.1     skrll 
   5268      1.1     skrll   xtensa_default_isa = xtensa_isa_init (0, 0);
   5269      1.1     skrll   isa = xtensa_default_isa;
   5270      1.1     skrll 
   5271      1.1     skrll   linkrelax = opt_linkrelax;
   5272      1.1     skrll 
   5273      1.1     skrll   /* Set up the literal sections.  */
   5274      1.1     skrll   memset (&default_lit_sections, 0, sizeof (default_lit_sections));
   5275      1.1     skrll 
   5276      1.1     skrll   subseg_set (current_section, current_subsec);
   5277      1.1     skrll 
   5278      1.1     skrll   xtensa_addi_opcode = xtensa_opcode_lookup (isa, "addi");
   5279      1.1     skrll   xtensa_addmi_opcode = xtensa_opcode_lookup (isa, "addmi");
   5280      1.1     skrll   xtensa_call0_opcode = xtensa_opcode_lookup (isa, "call0");
   5281      1.1     skrll   xtensa_call4_opcode = xtensa_opcode_lookup (isa, "call4");
   5282      1.1     skrll   xtensa_call8_opcode = xtensa_opcode_lookup (isa, "call8");
   5283      1.1     skrll   xtensa_call12_opcode = xtensa_opcode_lookup (isa, "call12");
   5284      1.1     skrll   xtensa_callx0_opcode = xtensa_opcode_lookup (isa, "callx0");
   5285  1.1.1.2  christos   xtensa_callx4_opcode = xtensa_opcode_lookup (isa, "callx4");
   5286      1.1     skrll   xtensa_callx8_opcode = xtensa_opcode_lookup (isa, "callx8");
   5287      1.1     skrll   xtensa_callx12_opcode = xtensa_opcode_lookup (isa, "callx12");
   5288      1.1     skrll   xtensa_const16_opcode = xtensa_opcode_lookup (isa, "const16");
   5289      1.1     skrll   xtensa_entry_opcode = xtensa_opcode_lookup (isa, "entry");
   5290      1.1     skrll   xtensa_extui_opcode = xtensa_opcode_lookup (isa, "extui");
   5291      1.1     skrll   xtensa_movi_opcode = xtensa_opcode_lookup (isa, "movi");
   5292      1.1     skrll   xtensa_movi_n_opcode = xtensa_opcode_lookup (isa, "movi.n");
   5293      1.1     skrll   xtensa_isync_opcode = xtensa_opcode_lookup (isa, "isync");
   5294      1.1     skrll   xtensa_j_opcode = xtensa_opcode_lookup (isa, "j");
   5295      1.1     skrll   xtensa_jx_opcode = xtensa_opcode_lookup (isa, "jx");
   5296      1.1     skrll   xtensa_l32r_opcode = xtensa_opcode_lookup (isa, "l32r");
   5297      1.1     skrll   xtensa_loop_opcode = xtensa_opcode_lookup (isa, "loop");
   5298      1.1     skrll   xtensa_loopnez_opcode = xtensa_opcode_lookup (isa, "loopnez");
   5299      1.1     skrll   xtensa_loopgtz_opcode = xtensa_opcode_lookup (isa, "loopgtz");
   5300      1.1     skrll   xtensa_nop_opcode = xtensa_opcode_lookup (isa, "nop");
   5301  1.1.1.4  christos   xtensa_nop_n_opcode = xtensa_opcode_lookup (isa, "nop.n");
   5302  1.1.1.2  christos   xtensa_or_opcode = xtensa_opcode_lookup (isa, "or");
   5303  1.1.1.2  christos   xtensa_ret_opcode = xtensa_opcode_lookup (isa, "ret");
   5304  1.1.1.2  christos   xtensa_ret_n_opcode = xtensa_opcode_lookup (isa, "ret.n");
   5305  1.1.1.2  christos   xtensa_retw_opcode = xtensa_opcode_lookup (isa, "retw");
   5306  1.1.1.2  christos   xtensa_retw_n_opcode = xtensa_opcode_lookup (isa, "retw.n");
   5307  1.1.1.2  christos   xtensa_rsr_lcount_opcode = xtensa_opcode_lookup (isa, "rsr.lcount");
   5308  1.1.1.2  christos   xtensa_waiti_opcode = xtensa_opcode_lookup (isa, "waiti");
   5309  1.1.1.2  christos 
   5310      1.1     skrll   for (i = 0; i < xtensa_isa_num_formats (isa); i++)
   5311      1.1     skrll     {
   5312      1.1     skrll       int format_slots = xtensa_format_num_slots (isa, i);
   5313      1.1     skrll       if (format_slots > config_max_slots)
   5314      1.1     skrll 	config_max_slots = format_slots;
   5315      1.1     skrll     }
   5316      1.1     skrll 
   5317  1.1.1.8  christos   xg_init_vinsn (&cur_vinsn);
   5318  1.1.1.8  christos 
   5319  1.1.1.8  christos   xtensa_num_pipe_stages = xtensa_isa_num_pipe_stages (isa);
   5320      1.1     skrll 
   5321      1.1     skrll   init_op_placement_info_table ();
   5322      1.1     skrll 
   5323      1.1     skrll   /* Set up the assembly state.  */
   5324      1.1     skrll   if (!frag_now->tc_frag_data.is_assembly_state_set)
   5325      1.1     skrll     xtensa_set_frag_assembly_state (frag_now);
   5326      1.1     skrll 
   5327      1.1     skrll   if (!use_literal_section)
   5328      1.1     skrll     xtensa_mark_literal_pool_location ();
   5329      1.1     skrll }
   5330      1.1     skrll 
   5331      1.1     skrll 
   5332      1.1     skrll /* TC_INIT_FIX_DATA hook */
   5333      1.1     skrll 
   5334      1.1     skrll void
   5335      1.1     skrll xtensa_init_fix_data (fixS *x)
   5336      1.1     skrll {
   5337      1.1     skrll   x->tc_fix_data.slot = 0;
   5338      1.1     skrll   x->tc_fix_data.X_add_symbol = NULL;
   5339      1.1     skrll   x->tc_fix_data.X_add_number = 0;
   5340      1.1     skrll }
   5341      1.1     skrll 
   5342      1.1     skrll 
   5343      1.1     skrll /* tc_frob_label hook */
   5344      1.1     skrll 
   5345      1.1     skrll void
   5346      1.1     skrll xtensa_frob_label (symbolS *sym)
   5347      1.1     skrll {
   5348      1.1     skrll   float freq;
   5349      1.1     skrll 
   5350      1.1     skrll   if (cur_vinsn.inside_bundle)
   5351      1.1     skrll     {
   5352      1.1     skrll       as_bad (_("labels are not valid inside bundles"));
   5353      1.1     skrll       return;
   5354      1.1     skrll     }
   5355      1.1     skrll 
   5356      1.1     skrll   freq = get_subseg_target_freq (now_seg, now_subseg);
   5357      1.1     skrll 
   5358      1.1     skrll   /* Since the label was already attached to a frag associated with the
   5359      1.1     skrll      previous basic block, it now needs to be reset to the current frag.  */
   5360      1.1     skrll   symbol_set_frag (sym, frag_now);
   5361      1.1     skrll   S_SET_VALUE (sym, (valueT) frag_now_fix ());
   5362      1.1     skrll 
   5363      1.1     skrll   if (generating_literals)
   5364      1.1     skrll     xtensa_add_literal_sym (sym);
   5365      1.1     skrll   else
   5366      1.1     skrll     xtensa_add_insn_label (sym);
   5367      1.1     skrll 
   5368      1.1     skrll   if (symbol_get_tc (sym)->is_loop_target)
   5369      1.1     skrll     {
   5370      1.1     skrll       if ((get_last_insn_flags (now_seg, now_subseg)
   5371      1.1     skrll 	  & FLAG_IS_BAD_LOOPEND) != 0)
   5372      1.1     skrll 	as_bad (_("invalid last instruction for a zero-overhead loop"));
   5373      1.1     skrll 
   5374      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   5375      1.1     skrll       frag_var (rs_machine_dependent, 4, 4, RELAX_LOOP_END,
   5376      1.1     skrll 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
   5377      1.1     skrll 
   5378      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   5379      1.1     skrll       xtensa_move_labels (frag_now, 0);
   5380  1.1.1.2  christos     }
   5381  1.1.1.2  christos 
   5382  1.1.1.2  christos   /* No target aligning in the absolute section.  */
   5383  1.1.1.2  christos   if (now_seg != absolute_section
   5384  1.1.1.2  christos       && !is_unaligned_label (sym)
   5385  1.1.1.2  christos       && !generating_literals)
   5386  1.1.1.2  christos     {
   5387      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   5388      1.1     skrll 
   5389      1.1     skrll       if (do_align_targets ())
   5390      1.1     skrll 	frag_var (rs_machine_dependent, 0, (int) freq,
   5391      1.1     skrll 		  RELAX_DESIRE_ALIGN_IF_TARGET, frag_now->fr_symbol,
   5392      1.1     skrll 		  frag_now->fr_offset, NULL);
   5393      1.1     skrll       else
   5394      1.1     skrll 	frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
   5395      1.1     skrll 		  frag_now->fr_symbol, frag_now->fr_offset, NULL);
   5396      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   5397      1.1     skrll       xtensa_move_labels (frag_now, 0);
   5398      1.1     skrll     }
   5399      1.1     skrll 
   5400      1.1     skrll   /* We need to mark the following properties even if we aren't aligning.  */
   5401      1.1     skrll 
   5402      1.1     skrll   /* If the label is already known to be a branch target, i.e., a
   5403      1.1     skrll      forward branch, mark the frag accordingly.  Backward branches
   5404      1.1     skrll      are handled by xg_add_branch_and_loop_targets.  */
   5405      1.1     skrll   if (symbol_get_tc (sym)->is_branch_target)
   5406      1.1     skrll     symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
   5407      1.1     skrll 
   5408      1.1     skrll   /* Loops only go forward, so they can be identified here.  */
   5409      1.1     skrll   if (symbol_get_tc (sym)->is_loop_target)
   5410      1.1     skrll     symbol_get_frag (sym)->tc_frag_data.is_loop_target = TRUE;
   5411      1.1     skrll 
   5412      1.1     skrll   dwarf2_emit_label (sym);
   5413      1.1     skrll }
   5414      1.1     skrll 
   5415      1.1     skrll 
   5416      1.1     skrll /* tc_unrecognized_line hook */
   5417      1.1     skrll 
   5418      1.1     skrll int
   5419      1.1     skrll xtensa_unrecognized_line (int ch)
   5420      1.1     skrll {
   5421      1.1     skrll   switch (ch)
   5422      1.1     skrll     {
   5423      1.1     skrll     case '{' :
   5424      1.1     skrll       if (cur_vinsn.inside_bundle == 0)
   5425      1.1     skrll 	{
   5426      1.1     skrll 	  /* PR8110: Cannot emit line number info inside a FLIX bundle
   5427      1.1     skrll 	     when using --gstabs.  Temporarily disable debug info.  */
   5428      1.1     skrll 	  generate_lineno_debug ();
   5429      1.1     skrll 	  if (debug_type == DEBUG_STABS)
   5430      1.1     skrll 	    {
   5431      1.1     skrll 	      xt_saved_debug_type = debug_type;
   5432      1.1     skrll 	      debug_type = DEBUG_NONE;
   5433      1.1     skrll 	    }
   5434      1.1     skrll 
   5435      1.1     skrll 	  cur_vinsn.inside_bundle = 1;
   5436      1.1     skrll 	}
   5437      1.1     skrll       else
   5438      1.1     skrll 	{
   5439      1.1     skrll 	  as_bad (_("extra opening brace"));
   5440      1.1     skrll 	  return 0;
   5441      1.1     skrll 	}
   5442      1.1     skrll       break;
   5443      1.1     skrll 
   5444      1.1     skrll     case '}' :
   5445      1.1     skrll       if (cur_vinsn.inside_bundle)
   5446      1.1     skrll 	finish_vinsn (&cur_vinsn);
   5447      1.1     skrll       else
   5448      1.1     skrll 	{
   5449      1.1     skrll 	  as_bad (_("extra closing brace"));
   5450      1.1     skrll 	  return 0;
   5451      1.1     skrll 	}
   5452      1.1     skrll       break;
   5453      1.1     skrll     default:
   5454      1.1     skrll       as_bad (_("syntax error"));
   5455      1.1     skrll       return 0;
   5456      1.1     skrll     }
   5457      1.1     skrll   return 1;
   5458      1.1     skrll }
   5459      1.1     skrll 
   5460      1.1     skrll 
   5461      1.1     skrll /* md_flush_pending_output hook */
   5462      1.1     skrll 
   5463      1.1     skrll void
   5464      1.1     skrll xtensa_flush_pending_output (void)
   5465      1.1     skrll {
   5466      1.1     skrll   /* This line fixes a bug where automatically generated gstabs info
   5467      1.1     skrll      separates a function label from its entry instruction, ending up
   5468      1.1     skrll      with the literal position between the function label and the entry
   5469      1.1     skrll      instruction and crashing code.  It only happens with --gstabs and
   5470      1.1     skrll      --text-section-literals, and when several other obscure relaxation
   5471      1.1     skrll      conditions are met.  */
   5472      1.1     skrll   if (outputting_stabs_line_debug)
   5473      1.1     skrll     return;
   5474      1.1     skrll 
   5475      1.1     skrll   if (cur_vinsn.inside_bundle)
   5476      1.1     skrll     as_bad (_("missing closing brace"));
   5477      1.1     skrll 
   5478      1.1     skrll   /* If there is a non-zero instruction fragment, close it.  */
   5479      1.1     skrll   if (frag_now_fix () != 0 && frag_now->tc_frag_data.is_insn)
   5480      1.1     skrll     {
   5481      1.1     skrll       frag_wane (frag_now);
   5482      1.1     skrll       frag_new (0);
   5483      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   5484      1.1     skrll     }
   5485      1.1     skrll   frag_now->tc_frag_data.is_insn = FALSE;
   5486      1.1     skrll 
   5487      1.1     skrll   xtensa_clear_insn_labels ();
   5488      1.1     skrll }
   5489      1.1     skrll 
   5490      1.1     skrll 
   5491      1.1     skrll /* We had an error while parsing an instruction.  The string might look
   5492      1.1     skrll    like this: "insn arg1, arg2 }".  If so, we need to see the closing
   5493      1.1     skrll    brace and reset some fields.  Otherwise, the vinsn never gets closed
   5494      1.1     skrll    and the num_slots field will grow past the end of the array of slots,
   5495      1.1     skrll    and bad things happen.  */
   5496      1.1     skrll 
   5497      1.1     skrll static void
   5498      1.1     skrll error_reset_cur_vinsn (void)
   5499      1.1     skrll {
   5500      1.1     skrll   if (cur_vinsn.inside_bundle)
   5501      1.1     skrll     {
   5502      1.1     skrll       if (*input_line_pointer == '}'
   5503      1.1     skrll 	  || *(input_line_pointer - 1) == '}'
   5504      1.1     skrll 	  || *(input_line_pointer - 2) == '}')
   5505      1.1     skrll 	xg_clear_vinsn (&cur_vinsn);
   5506      1.1     skrll     }
   5507      1.1     skrll }
   5508      1.1     skrll 
   5509      1.1     skrll 
   5510      1.1     skrll void
   5511      1.1     skrll md_assemble (char *str)
   5512      1.1     skrll {
   5513      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   5514      1.1     skrll   char *opname;
   5515      1.1     skrll   unsigned opnamelen;
   5516  1.1.1.5  christos   bfd_boolean has_underbar = FALSE;
   5517      1.1     skrll   char *arg_strings[MAX_INSN_ARGS];
   5518      1.1     skrll   int num_args;
   5519      1.1     skrll   TInsn orig_insn;		/* Original instruction from the input.  */
   5520      1.1     skrll 
   5521      1.1     skrll   tinsn_init (&orig_insn);
   5522      1.1     skrll 
   5523      1.1     skrll   /* Split off the opcode.  */
   5524      1.1     skrll   opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/0123456789.");
   5525      1.1     skrll   opname = xstrndup (str, opnamelen);
   5526      1.1     skrll 
   5527      1.1     skrll   num_args = tokenize_arguments (arg_strings, str + opnamelen);
   5528      1.1     skrll   if (num_args == -1)
   5529      1.1     skrll     {
   5530      1.1     skrll       as_bad (_("syntax error"));
   5531      1.1     skrll       return;
   5532      1.1     skrll     }
   5533      1.1     skrll 
   5534      1.1     skrll   if (xg_translate_idioms (&opname, &num_args, arg_strings))
   5535      1.1     skrll     return;
   5536      1.1     skrll 
   5537      1.1     skrll   /* Check for an underbar prefix.  */
   5538      1.1     skrll   if (*opname == '_')
   5539      1.1     skrll     {
   5540  1.1.1.6  christos       has_underbar = TRUE;
   5541      1.1     skrll       opname += 1;
   5542      1.1     skrll     }
   5543      1.1     skrll 
   5544      1.1     skrll   orig_insn.insn_type = ITYPE_INSN;
   5545      1.1     skrll   orig_insn.ntok = 0;
   5546      1.1     skrll   orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
   5547      1.1     skrll   orig_insn.opcode = xtensa_opcode_lookup (isa, opname);
   5548      1.1     skrll 
   5549      1.1     skrll   /* Special case: Check for "CALLXn.TLS" pseudo op.  If found, grab its
   5550      1.1     skrll      extra argument and set the opcode to "CALLXn".  */
   5551      1.1     skrll   if (orig_insn.opcode == XTENSA_UNDEFINED
   5552      1.1     skrll       && strncasecmp (opname, "callx", 5) == 0)
   5553      1.1     skrll     {
   5554      1.1     skrll       unsigned long window_size;
   5555      1.1     skrll       char *suffix;
   5556      1.1     skrll 
   5557      1.1     skrll       window_size = strtoul (opname + 5, &suffix, 10);
   5558      1.1     skrll       if (suffix != opname + 5
   5559      1.1     skrll 	  && (window_size == 0
   5560      1.1     skrll 	      || window_size == 4
   5561      1.1     skrll 	      || window_size == 8
   5562      1.1     skrll 	      || window_size == 12)
   5563      1.1     skrll 	  && strcasecmp (suffix, ".tls") == 0)
   5564      1.1     skrll 	{
   5565      1.1     skrll 	  switch (window_size)
   5566      1.1     skrll 	    {
   5567      1.1     skrll 	    case 0: orig_insn.opcode = xtensa_callx0_opcode; break;
   5568      1.1     skrll 	    case 4: orig_insn.opcode = xtensa_callx4_opcode; break;
   5569      1.1     skrll 	    case 8: orig_insn.opcode = xtensa_callx8_opcode; break;
   5570  1.1.1.2  christos 	    case 12: orig_insn.opcode = xtensa_callx12_opcode; break;
   5571      1.1     skrll 	    }
   5572      1.1     skrll 
   5573      1.1     skrll 	  if (num_args != 2)
   5574      1.1     skrll 	    as_bad (_("wrong number of operands for '%s'"), opname);
   5575  1.1.1.2  christos 	  else
   5576      1.1     skrll 	    {
   5577      1.1     skrll 	      bfd_reloc_code_real_type reloc;
   5578      1.1     skrll 	      char *old_input_line_pointer;
   5579      1.1     skrll 	      expressionS *tok = &orig_insn.extra_arg;
   5580      1.1     skrll 
   5581      1.1     skrll 	      old_input_line_pointer = input_line_pointer;
   5582      1.1     skrll 	      input_line_pointer = arg_strings[num_args - 1];
   5583      1.1     skrll 
   5584      1.1     skrll 	      expression (tok);
   5585      1.1     skrll 	      if (tok->X_op == O_symbol
   5586      1.1     skrll 		  && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
   5587      1.1     skrll 		      == BFD_RELOC_XTENSA_TLS_CALL))
   5588      1.1     skrll 		tok->X_op = map_suffix_reloc_to_operator (reloc);
   5589  1.1.1.6  christos 	      else
   5590  1.1.1.2  christos 		as_bad (_("bad relocation expression for '%s'"), opname);
   5591  1.1.1.2  christos 
   5592  1.1.1.2  christos 	      input_line_pointer = old_input_line_pointer;
   5593  1.1.1.2  christos 	      num_args -= 1;
   5594  1.1.1.2  christos 	    }
   5595  1.1.1.2  christos 	}
   5596  1.1.1.2  christos     }
   5597  1.1.1.2  christos 
   5598  1.1.1.2  christos   /* Special case: Check for "j.l" pseudo op.  */
   5599  1.1.1.2  christos   if (orig_insn.opcode == XTENSA_UNDEFINED
   5600  1.1.1.2  christos       && strncasecmp (opname, "j.l", 3) == 0)
   5601  1.1.1.2  christos     {
   5602  1.1.1.2  christos       if (num_args != 2)
   5603  1.1.1.2  christos 	as_bad (_("wrong number of operands for '%s'"), opname);
   5604  1.1.1.2  christos       else
   5605  1.1.1.2  christos 	{
   5606  1.1.1.2  christos 	  char *old_input_line_pointer;
   5607  1.1.1.2  christos 	  expressionS *tok = &orig_insn.extra_arg;
   5608  1.1.1.2  christos 
   5609  1.1.1.2  christos 	  old_input_line_pointer = input_line_pointer;
   5610  1.1.1.2  christos 	  input_line_pointer = arg_strings[num_args - 1];
   5611      1.1     skrll 
   5612      1.1     skrll 	  expression_maybe_register (xtensa_jx_opcode, 0, tok);
   5613      1.1     skrll 	  input_line_pointer = old_input_line_pointer;
   5614      1.1     skrll 
   5615      1.1     skrll 	  num_args -= 1;
   5616      1.1     skrll 	  orig_insn.opcode = xtensa_j_opcode;
   5617      1.1     skrll 	}
   5618      1.1     skrll     }
   5619      1.1     skrll 
   5620      1.1     skrll   if (orig_insn.opcode == XTENSA_UNDEFINED)
   5621      1.1     skrll     {
   5622      1.1     skrll       xtensa_format fmt = xtensa_format_lookup (isa, opname);
   5623      1.1     skrll       if (fmt == XTENSA_UNDEFINED)
   5624      1.1     skrll 	{
   5625      1.1     skrll 	  as_bad (_("unknown opcode or format name '%s'"), opname);
   5626      1.1     skrll 	  error_reset_cur_vinsn ();
   5627      1.1     skrll 	  return;
   5628      1.1     skrll 	}
   5629      1.1     skrll       if (!cur_vinsn.inside_bundle)
   5630      1.1     skrll 	{
   5631      1.1     skrll 	  as_bad (_("format names only valid inside bundles"));
   5632      1.1     skrll 	  error_reset_cur_vinsn ();
   5633      1.1     skrll 	  return;
   5634      1.1     skrll 	}
   5635      1.1     skrll       if (cur_vinsn.format != XTENSA_UNDEFINED)
   5636      1.1     skrll 	as_warn (_("multiple formats specified for one bundle; using '%s'"),
   5637      1.1     skrll 		 opname);
   5638      1.1     skrll       cur_vinsn.format = fmt;
   5639      1.1     skrll       free (has_underbar ? opname - 1 : opname);
   5640      1.1     skrll       error_reset_cur_vinsn ();
   5641      1.1     skrll       return;
   5642      1.1     skrll     }
   5643      1.1     skrll 
   5644      1.1     skrll   /* Parse the arguments.  */
   5645      1.1     skrll   if (parse_arguments (&orig_insn, num_args, arg_strings))
   5646      1.1     skrll     {
   5647      1.1     skrll       as_bad (_("syntax error"));
   5648      1.1     skrll       error_reset_cur_vinsn ();
   5649      1.1     skrll       return;
   5650      1.1     skrll     }
   5651      1.1     skrll 
   5652      1.1     skrll   /* Free the opcode and argument strings, now that they've been parsed.  */
   5653      1.1     skrll   free (has_underbar ? opname - 1 : opname);
   5654      1.1     skrll   opname = 0;
   5655      1.1     skrll   while (num_args-- > 0)
   5656      1.1     skrll     free (arg_strings[num_args]);
   5657      1.1     skrll 
   5658      1.1     skrll   /* Get expressions for invisible operands.  */
   5659      1.1     skrll   if (get_invisible_operands (&orig_insn))
   5660      1.1     skrll     {
   5661      1.1     skrll       error_reset_cur_vinsn ();
   5662      1.1     skrll       return;
   5663      1.1     skrll     }
   5664      1.1     skrll 
   5665      1.1     skrll   /* Check for the right number and type of arguments.  */
   5666      1.1     skrll   if (tinsn_check_arguments (&orig_insn))
   5667      1.1     skrll     {
   5668      1.1     skrll       error_reset_cur_vinsn ();
   5669      1.1     skrll       return;
   5670      1.1     skrll     }
   5671      1.1     skrll 
   5672      1.1     skrll   /* Record the line number for each TInsn, because a FLIX bundle may be
   5673      1.1     skrll      spread across multiple input lines and individual instructions may be
   5674      1.1     skrll      moved around in some cases.  */
   5675      1.1     skrll   orig_insn.loc_directive_seen = dwarf2_loc_directive_seen;
   5676      1.1     skrll   dwarf2_where (&orig_insn.debug_line);
   5677      1.1     skrll   dwarf2_consume_line_info ();
   5678      1.1     skrll 
   5679      1.1     skrll   xg_add_branch_and_loop_targets (&orig_insn);
   5680      1.1     skrll 
   5681      1.1     skrll   /* Check that immediate value for ENTRY is >= 16.  */
   5682      1.1     skrll   if (orig_insn.opcode == xtensa_entry_opcode && orig_insn.ntok >= 3)
   5683      1.1     skrll     {
   5684      1.1     skrll       expressionS *exp = &orig_insn.tok[2];
   5685      1.1     skrll       if (exp->X_op == O_constant && exp->X_add_number < 16)
   5686      1.1     skrll 	as_warn (_("entry instruction with stack decrement < 16"));
   5687      1.1     skrll     }
   5688      1.1     skrll 
   5689      1.1     skrll   /* Finish it off:
   5690      1.1     skrll      assemble_tokens (opcode, tok, ntok);
   5691      1.1     skrll      expand the tokens from the orig_insn into the
   5692      1.1     skrll      stack of instructions that will not expand
   5693      1.1     skrll      unless required at relaxation time.  */
   5694      1.1     skrll 
   5695      1.1     skrll   if (!cur_vinsn.inside_bundle)
   5696      1.1     skrll     emit_single_op (&orig_insn);
   5697      1.1     skrll   else /* We are inside a bundle.  */
   5698      1.1     skrll     {
   5699      1.1     skrll       cur_vinsn.slots[cur_vinsn.num_slots] = orig_insn;
   5700  1.1.1.4  christos       cur_vinsn.num_slots++;
   5701  1.1.1.4  christos       if (*input_line_pointer == '}'
   5702      1.1     skrll 	  || *(input_line_pointer - 1) == '}'
   5703      1.1     skrll 	  || *(input_line_pointer - 2) == '}')
   5704      1.1     skrll 	finish_vinsn (&cur_vinsn);
   5705      1.1     skrll     }
   5706      1.1     skrll 
   5707      1.1     skrll   /* We've just emitted a new instruction so clear the list of labels.  */
   5708      1.1     skrll   xtensa_clear_insn_labels ();
   5709      1.1     skrll 
   5710      1.1     skrll   xtensa_check_frag_count ();
   5711      1.1     skrll }
   5712      1.1     skrll 
   5713      1.1     skrll 
   5714      1.1     skrll /* HANDLE_ALIGN hook */
   5715      1.1     skrll 
   5716      1.1     skrll /* For a .align directive, we mark the previous block with the alignment
   5717      1.1     skrll    information.  This will be placed in the object file in the
   5718      1.1     skrll    property section corresponding to this section.  */
   5719      1.1     skrll 
   5720      1.1     skrll void
   5721      1.1     skrll xtensa_handle_align (fragS *fragP)
   5722      1.1     skrll {
   5723      1.1     skrll   if (linkrelax
   5724      1.1     skrll       && ! fragP->tc_frag_data.is_literal
   5725      1.1     skrll       && (fragP->fr_type == rs_align
   5726      1.1     skrll 	  || fragP->fr_type == rs_align_code)
   5727      1.1     skrll       && fragP->fr_offset > 0
   5728      1.1     skrll       && now_seg != bss_section)
   5729      1.1     skrll     {
   5730      1.1     skrll       fragP->tc_frag_data.is_align = TRUE;
   5731      1.1     skrll       fragP->tc_frag_data.alignment = fragP->fr_offset;
   5732      1.1     skrll     }
   5733      1.1     skrll 
   5734      1.1     skrll   if (fragP->fr_type == rs_align_test)
   5735      1.1     skrll     {
   5736      1.1     skrll       int count;
   5737      1.1     skrll       count = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
   5738      1.1     skrll       if (count != 0)
   5739      1.1     skrll 	as_bad_where (fragP->fr_file, fragP->fr_line,
   5740      1.1     skrll 		      _("unaligned entry instruction"));
   5741      1.1     skrll     }
   5742      1.1     skrll 
   5743      1.1     skrll   if (linkrelax && fragP->fr_type == rs_org)
   5744      1.1     skrll     fragP->fr_subtype = RELAX_ORG;
   5745      1.1     skrll }
   5746      1.1     skrll 
   5747      1.1     skrll 
   5748      1.1     skrll /* TC_FRAG_INIT hook */
   5749      1.1     skrll 
   5750      1.1     skrll void
   5751      1.1     skrll xtensa_frag_init (fragS *frag)
   5752      1.1     skrll {
   5753      1.1     skrll   xtensa_set_frag_assembly_state (frag);
   5754      1.1     skrll }
   5755      1.1     skrll 
   5756      1.1     skrll 
   5757      1.1     skrll symbolS *
   5758      1.1     skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   5759      1.1     skrll {
   5760      1.1     skrll   return NULL;
   5761      1.1     skrll }
   5762      1.1     skrll 
   5763      1.1     skrll 
   5764      1.1     skrll /* Round up a section size to the appropriate boundary.  */
   5765      1.1     skrll 
   5766      1.1     skrll valueT
   5767      1.1     skrll md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
   5768      1.1     skrll {
   5769      1.1     skrll   return size;			/* Byte alignment is fine.  */
   5770      1.1     skrll }
   5771      1.1     skrll 
   5772      1.1     skrll 
   5773      1.1     skrll long
   5774      1.1     skrll md_pcrel_from (fixS *fixP)
   5775      1.1     skrll {
   5776      1.1     skrll   char *insn_p;
   5777      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   5778      1.1     skrll   static xtensa_insnbuf slotbuf = NULL;
   5779      1.1     skrll   int opnum;
   5780      1.1     skrll   uint32 opnd_value;
   5781      1.1     skrll   xtensa_opcode opcode;
   5782      1.1     skrll   xtensa_format fmt;
   5783      1.1     skrll   int slot;
   5784      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   5785      1.1     skrll   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
   5786      1.1     skrll   bfd_boolean alt_reloc;
   5787      1.1     skrll 
   5788      1.1     skrll   if (fixP->fx_r_type == BFD_RELOC_XTENSA_ASM_EXPAND)
   5789      1.1     skrll     return 0;
   5790      1.1     skrll 
   5791      1.1     skrll   if (fixP->fx_r_type == BFD_RELOC_32_PCREL)
   5792      1.1     skrll     return addr;
   5793      1.1     skrll 
   5794      1.1     skrll   if (!insnbuf)
   5795      1.1     skrll     {
   5796      1.1     skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   5797      1.1     skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   5798      1.1     skrll     }
   5799      1.1     skrll 
   5800      1.1     skrll   insn_p = &fixP->fx_frag->fr_literal[fixP->fx_where];
   5801      1.1     skrll   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) insn_p, 0);
   5802      1.1     skrll   fmt = xtensa_format_decode (isa, insnbuf);
   5803      1.1     skrll 
   5804      1.1     skrll   if (fmt == XTENSA_UNDEFINED)
   5805      1.1     skrll     as_fatal (_("bad instruction format"));
   5806      1.1     skrll 
   5807      1.1     skrll   if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc) != 0)
   5808      1.1     skrll     as_fatal (_("invalid relocation"));
   5809      1.1     skrll 
   5810      1.1     skrll   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
   5811      1.1     skrll   opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   5812      1.1     skrll 
   5813      1.1     skrll   /* Check for "alternate" relocations (operand not specified).  None
   5814      1.1     skrll      of the current uses for these are really PC-relative.  */
   5815      1.1     skrll   if (alt_reloc || opcode == xtensa_const16_opcode)
   5816      1.1     skrll     {
   5817      1.1     skrll       if (opcode != xtensa_l32r_opcode
   5818      1.1     skrll 	  && opcode != xtensa_const16_opcode)
   5819      1.1     skrll 	as_fatal (_("invalid relocation for '%s' instruction"),
   5820      1.1     skrll 		  xtensa_opcode_name (isa, opcode));
   5821      1.1     skrll       return 0;
   5822      1.1     skrll     }
   5823      1.1     skrll 
   5824      1.1     skrll   opnum = get_relaxable_immed (opcode);
   5825      1.1     skrll   opnd_value = 0;
   5826      1.1     skrll   if (xtensa_operand_is_PCrelative (isa, opcode, opnum) != 1
   5827      1.1     skrll       || xtensa_operand_do_reloc (isa, opcode, opnum, &opnd_value, addr))
   5828      1.1     skrll     {
   5829      1.1     skrll       as_bad_where (fixP->fx_file,
   5830      1.1     skrll 		    fixP->fx_line,
   5831      1.1     skrll 		    _("invalid relocation for operand %d of '%s'"),
   5832      1.1     skrll 		    opnum, xtensa_opcode_name (isa, opcode));
   5833      1.1     skrll       return 0;
   5834      1.1     skrll     }
   5835      1.1     skrll   return 0 - opnd_value;
   5836      1.1     skrll }
   5837      1.1     skrll 
   5838      1.1     skrll 
   5839      1.1     skrll /* TC_FORCE_RELOCATION hook */
   5840      1.1     skrll 
   5841      1.1     skrll int
   5842      1.1     skrll xtensa_force_relocation (fixS *fix)
   5843      1.1     skrll {
   5844      1.1     skrll   switch (fix->fx_r_type)
   5845      1.1     skrll     {
   5846      1.1     skrll     case BFD_RELOC_XTENSA_ASM_EXPAND:
   5847      1.1     skrll     case BFD_RELOC_XTENSA_SLOT0_ALT:
   5848      1.1     skrll     case BFD_RELOC_XTENSA_SLOT1_ALT:
   5849      1.1     skrll     case BFD_RELOC_XTENSA_SLOT2_ALT:
   5850      1.1     skrll     case BFD_RELOC_XTENSA_SLOT3_ALT:
   5851      1.1     skrll     case BFD_RELOC_XTENSA_SLOT4_ALT:
   5852      1.1     skrll     case BFD_RELOC_XTENSA_SLOT5_ALT:
   5853      1.1     skrll     case BFD_RELOC_XTENSA_SLOT6_ALT:
   5854      1.1     skrll     case BFD_RELOC_XTENSA_SLOT7_ALT:
   5855      1.1     skrll     case BFD_RELOC_XTENSA_SLOT8_ALT:
   5856      1.1     skrll     case BFD_RELOC_XTENSA_SLOT9_ALT:
   5857      1.1     skrll     case BFD_RELOC_XTENSA_SLOT10_ALT:
   5858      1.1     skrll     case BFD_RELOC_XTENSA_SLOT11_ALT:
   5859      1.1     skrll     case BFD_RELOC_XTENSA_SLOT12_ALT:
   5860      1.1     skrll     case BFD_RELOC_XTENSA_SLOT13_ALT:
   5861      1.1     skrll     case BFD_RELOC_XTENSA_SLOT14_ALT:
   5862      1.1     skrll       return 1;
   5863      1.1     skrll     default:
   5864      1.1     skrll       break;
   5865      1.1     skrll     }
   5866      1.1     skrll 
   5867      1.1     skrll   if (linkrelax && fix->fx_addsy
   5868      1.1     skrll       && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
   5869      1.1     skrll     return 1;
   5870      1.1     skrll 
   5871      1.1     skrll   return generic_force_reloc (fix);
   5872      1.1     skrll }
   5873      1.1     skrll 
   5874      1.1     skrll 
   5875      1.1     skrll /* TC_VALIDATE_FIX_SUB hook */
   5876      1.1     skrll 
   5877      1.1     skrll int
   5878      1.1     skrll xtensa_validate_fix_sub (fixS *fix)
   5879      1.1     skrll {
   5880      1.1     skrll   segT add_symbol_segment, sub_symbol_segment;
   5881      1.1     skrll 
   5882      1.1     skrll   /* The difference of two symbols should be resolved by the assembler when
   5883      1.1     skrll      linkrelax is not set.  If the linker may relax the section containing
   5884      1.1     skrll      the symbols, then an Xtensa DIFF relocation must be generated so that
   5885      1.1     skrll      the linker knows to adjust the difference value.  */
   5886      1.1     skrll   if (!linkrelax || fix->fx_addsy == NULL)
   5887      1.1     skrll     return 0;
   5888      1.1     skrll 
   5889      1.1     skrll   /* Make sure both symbols are in the same segment, and that segment is
   5890      1.1     skrll      "normal" and relaxable.  If the segment is not "normal", then the
   5891      1.1     skrll      fix is not valid.  If the segment is not "relaxable", then the fix
   5892      1.1     skrll      should have been handled earlier.  */
   5893      1.1     skrll   add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
   5894      1.1     skrll   if (! SEG_NORMAL (add_symbol_segment) ||
   5895      1.1     skrll       ! relaxable_section (add_symbol_segment))
   5896      1.1     skrll     return 0;
   5897      1.1     skrll   sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
   5898      1.1     skrll   return (sub_symbol_segment == add_symbol_segment);
   5899      1.1     skrll }
   5900      1.1     skrll 
   5901      1.1     skrll 
   5902      1.1     skrll /* NO_PSEUDO_DOT hook */
   5903      1.1     skrll 
   5904      1.1     skrll /* This function has nothing to do with pseudo dots, but this is the
   5905      1.1     skrll    nearest macro to where the check needs to take place.  FIXME: This
   5906      1.1     skrll    seems wrong.  */
   5907      1.1     skrll 
   5908      1.1     skrll bfd_boolean
   5909      1.1     skrll xtensa_check_inside_bundle (void)
   5910      1.1     skrll {
   5911      1.1     skrll   if (cur_vinsn.inside_bundle && input_line_pointer[-1] == '.')
   5912      1.1     skrll     as_bad (_("directives are not valid inside bundles"));
   5913      1.1     skrll 
   5914      1.1     skrll   /* This function must always return FALSE because it is called via a
   5915      1.1     skrll      macro that has nothing to do with bundling.  */
   5916      1.1     skrll   return FALSE;
   5917      1.1     skrll }
   5918      1.1     skrll 
   5919  1.1.1.8  christos 
   5920  1.1.1.8  christos /* md_elf_section_change_hook */
   5921  1.1.1.8  christos 
   5922  1.1.1.8  christos void
   5923  1.1.1.8  christos xtensa_elf_section_change_hook (void)
   5924      1.1     skrll {
   5925      1.1     skrll   /* Set up the assembly state.  */
   5926      1.1     skrll   if (!frag_now->tc_frag_data.is_assembly_state_set)
   5927      1.1     skrll     xtensa_set_frag_assembly_state (frag_now);
   5928      1.1     skrll 
   5929      1.1     skrll   if (!use_literal_section
   5930      1.1     skrll       && seg_info (now_seg)->tc_segment_info_data.literal_pool_loc == NULL
   5931      1.1     skrll       && !xtensa_is_init_fini (now_seg))
   5932      1.1     skrll     xtensa_mark_literal_pool_location ();
   5933      1.1     skrll }
   5934      1.1     skrll 
   5935      1.1     skrll 
   5936      1.1     skrll /* tc_fix_adjustable hook */
   5937      1.1     skrll 
   5938      1.1     skrll bfd_boolean
   5939      1.1     skrll xtensa_fix_adjustable (fixS *fixP)
   5940      1.1     skrll {
   5941      1.1     skrll   /* We need the symbol name for the VTABLE entries.  */
   5942      1.1     skrll   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
   5943      1.1     skrll       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
   5944      1.1     skrll     return 0;
   5945  1.1.1.4  christos 
   5946      1.1     skrll   return 1;
   5947      1.1     skrll }
   5948      1.1     skrll 
   5949      1.1     skrll 
   5950      1.1     skrll /* tc_symbol_new_hook */
   5951      1.1     skrll 
   5952      1.1     skrll symbolS *expr_symbols = NULL;
   5953      1.1     skrll 
   5954      1.1     skrll void
   5955      1.1     skrll xtensa_symbol_new_hook (symbolS *sym)
   5956      1.1     skrll {
   5957      1.1     skrll   if (is_leb128_expr && S_GET_SEGMENT (sym) == expr_section)
   5958      1.1     skrll     {
   5959      1.1     skrll       symbol_get_tc (sym)->next_expr_symbol = expr_symbols;
   5960      1.1     skrll       expr_symbols = sym;
   5961      1.1     skrll     }
   5962      1.1     skrll }
   5963      1.1     skrll 
   5964      1.1     skrll 
   5965      1.1     skrll void
   5966      1.1     skrll md_apply_fix (fixS *fixP, valueT *valP, segT seg)
   5967      1.1     skrll {
   5968      1.1     skrll   char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
   5969      1.1     skrll   valueT val = 0;
   5970      1.1     skrll 
   5971      1.1     skrll   /* Subtracted symbols are only allowed for a few relocation types, and
   5972      1.1     skrll      unless linkrelax is enabled, they should not make it to this point.  */
   5973      1.1     skrll   if (fixP->fx_subsy && !(linkrelax && (fixP->fx_r_type == BFD_RELOC_32
   5974      1.1     skrll 					|| fixP->fx_r_type == BFD_RELOC_16
   5975      1.1     skrll 					|| fixP->fx_r_type == BFD_RELOC_8)))
   5976      1.1     skrll     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
   5977      1.1     skrll 
   5978      1.1     skrll   switch (fixP->fx_r_type)
   5979      1.1     skrll     {
   5980      1.1     skrll     case BFD_RELOC_32_PCREL:
   5981  1.1.1.5  christos     case BFD_RELOC_32:
   5982      1.1     skrll     case BFD_RELOC_16:
   5983      1.1     skrll     case BFD_RELOC_8:
   5984      1.1     skrll       if (fixP->fx_subsy)
   5985  1.1.1.5  christos 	{
   5986      1.1     skrll 	  switch (fixP->fx_r_type)
   5987      1.1     skrll 	    {
   5988      1.1     skrll 	    case BFD_RELOC_8:
   5989  1.1.1.5  christos 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF8;
   5990      1.1     skrll 	      fixP->fx_signed = 0;
   5991      1.1     skrll 	      break;
   5992      1.1     skrll 	    case BFD_RELOC_16:
   5993      1.1     skrll 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF16;
   5994      1.1     skrll 	      fixP->fx_signed = 0;
   5995      1.1     skrll 	      break;
   5996      1.1     skrll 	    case BFD_RELOC_32:
   5997      1.1     skrll 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF32;
   5998      1.1     skrll 	      fixP->fx_signed = 0;
   5999      1.1     skrll 	      break;
   6000      1.1     skrll 	    default:
   6001      1.1     skrll 	      break;
   6002      1.1     skrll 	    }
   6003      1.1     skrll 
   6004      1.1     skrll 	  val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
   6005      1.1     skrll 		 - S_GET_VALUE (fixP->fx_subsy));
   6006      1.1     skrll 
   6007      1.1     skrll 	  /* The difference value gets written out, and the DIFF reloc
   6008      1.1     skrll 	     identifies the address of the subtracted symbol (i.e., the one
   6009      1.1     skrll 	     with the lowest address).  */
   6010  1.1.1.8  christos 	  *valP = val;
   6011  1.1.1.8  christos 	  fixP->fx_offset -= val;
   6012  1.1.1.8  christos 	  fixP->fx_subsy = NULL;
   6013  1.1.1.8  christos 	}
   6014  1.1.1.8  christos       else if (! fixP->fx_addsy)
   6015  1.1.1.8  christos 	{
   6016      1.1     skrll 	  val = *valP;
   6017      1.1     skrll 	  fixP->fx_done = 1;
   6018      1.1     skrll 	}
   6019      1.1     skrll       else if (S_GET_SEGMENT (fixP->fx_addsy) == absolute_section)
   6020      1.1     skrll 	{
   6021      1.1     skrll 	  val = S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset;
   6022      1.1     skrll 	  *valP = val;
   6023      1.1     skrll 	  fixP->fx_done = 1;
   6024      1.1     skrll 	}
   6025      1.1     skrll       /* fall through */
   6026      1.1     skrll 
   6027      1.1     skrll     case BFD_RELOC_XTENSA_PLT:
   6028      1.1     skrll       md_number_to_chars (fixpos, val, fixP->fx_size);
   6029      1.1     skrll       fixP->fx_no_overflow = 0; /* Use the standard overflow check.  */
   6030      1.1     skrll       break;
   6031      1.1     skrll 
   6032      1.1     skrll     case BFD_RELOC_XTENSA_TLSDESC_FN:
   6033      1.1     skrll     case BFD_RELOC_XTENSA_TLSDESC_ARG:
   6034      1.1     skrll     case BFD_RELOC_XTENSA_TLS_TPOFF:
   6035      1.1     skrll     case BFD_RELOC_XTENSA_TLS_DTPOFF:
   6036      1.1     skrll       S_SET_THREAD_LOCAL (fixP->fx_addsy);
   6037      1.1     skrll       md_number_to_chars (fixpos, 0, fixP->fx_size);
   6038      1.1     skrll       fixP->fx_no_overflow = 0; /* Use the standard overflow check.  */
   6039      1.1     skrll       break;
   6040      1.1     skrll 
   6041      1.1     skrll     case BFD_RELOC_XTENSA_SLOT0_OP:
   6042      1.1     skrll     case BFD_RELOC_XTENSA_SLOT1_OP:
   6043      1.1     skrll     case BFD_RELOC_XTENSA_SLOT2_OP:
   6044      1.1     skrll     case BFD_RELOC_XTENSA_SLOT3_OP:
   6045      1.1     skrll     case BFD_RELOC_XTENSA_SLOT4_OP:
   6046      1.1     skrll     case BFD_RELOC_XTENSA_SLOT5_OP:
   6047      1.1     skrll     case BFD_RELOC_XTENSA_SLOT6_OP:
   6048      1.1     skrll     case BFD_RELOC_XTENSA_SLOT7_OP:
   6049      1.1     skrll     case BFD_RELOC_XTENSA_SLOT8_OP:
   6050      1.1     skrll     case BFD_RELOC_XTENSA_SLOT9_OP:
   6051      1.1     skrll     case BFD_RELOC_XTENSA_SLOT10_OP:
   6052      1.1     skrll     case BFD_RELOC_XTENSA_SLOT11_OP:
   6053      1.1     skrll     case BFD_RELOC_XTENSA_SLOT12_OP:
   6054  1.1.1.2  christos     case BFD_RELOC_XTENSA_SLOT13_OP:
   6055      1.1     skrll     case BFD_RELOC_XTENSA_SLOT14_OP:
   6056      1.1     skrll       if (linkrelax)
   6057      1.1     skrll 	{
   6058      1.1     skrll 	  /* Write the tentative value of a PC-relative relocation to a
   6059      1.1     skrll 	     local symbol into the instruction.  The value will be ignored
   6060      1.1     skrll 	     by the linker, and it makes the object file disassembly
   6061      1.1     skrll 	     readable when all branch targets are encoded in relocations.  */
   6062      1.1     skrll 
   6063      1.1     skrll 	  gas_assert (fixP->fx_addsy);
   6064      1.1     skrll 	  if (S_GET_SEGMENT (fixP->fx_addsy) == seg
   6065      1.1     skrll 	      && !S_FORCE_RELOC (fixP->fx_addsy, 1))
   6066      1.1     skrll 	    {
   6067      1.1     skrll 	      val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
   6068      1.1     skrll 		     - md_pcrel_from (fixP));
   6069      1.1     skrll 	      (void) xg_apply_fix_value (fixP, val);
   6070      1.1     skrll 	    }
   6071      1.1     skrll 	}
   6072      1.1     skrll       else if (! fixP->fx_addsy)
   6073      1.1     skrll 	{
   6074      1.1     skrll 	  val = *valP;
   6075      1.1     skrll 	  if (xg_apply_fix_value (fixP, val))
   6076      1.1     skrll 	    fixP->fx_done = 1;
   6077      1.1     skrll 	}
   6078      1.1     skrll       break;
   6079      1.1     skrll 
   6080      1.1     skrll     case BFD_RELOC_XTENSA_ASM_EXPAND:
   6081      1.1     skrll     case BFD_RELOC_XTENSA_TLS_FUNC:
   6082      1.1     skrll     case BFD_RELOC_XTENSA_TLS_ARG:
   6083      1.1     skrll     case BFD_RELOC_XTENSA_TLS_CALL:
   6084      1.1     skrll     case BFD_RELOC_XTENSA_SLOT0_ALT:
   6085      1.1     skrll     case BFD_RELOC_XTENSA_SLOT1_ALT:
   6086      1.1     skrll     case BFD_RELOC_XTENSA_SLOT2_ALT:
   6087      1.1     skrll     case BFD_RELOC_XTENSA_SLOT3_ALT:
   6088      1.1     skrll     case BFD_RELOC_XTENSA_SLOT4_ALT:
   6089      1.1     skrll     case BFD_RELOC_XTENSA_SLOT5_ALT:
   6090      1.1     skrll     case BFD_RELOC_XTENSA_SLOT6_ALT:
   6091      1.1     skrll     case BFD_RELOC_XTENSA_SLOT7_ALT:
   6092      1.1     skrll     case BFD_RELOC_XTENSA_SLOT8_ALT:
   6093      1.1     skrll     case BFD_RELOC_XTENSA_SLOT9_ALT:
   6094      1.1     skrll     case BFD_RELOC_XTENSA_SLOT10_ALT:
   6095      1.1     skrll     case BFD_RELOC_XTENSA_SLOT11_ALT:
   6096      1.1     skrll     case BFD_RELOC_XTENSA_SLOT12_ALT:
   6097      1.1     skrll     case BFD_RELOC_XTENSA_SLOT13_ALT:
   6098      1.1     skrll     case BFD_RELOC_XTENSA_SLOT14_ALT:
   6099      1.1     skrll       /* These all need to be resolved at link-time.  Do nothing now.  */
   6100      1.1     skrll       break;
   6101      1.1     skrll 
   6102      1.1     skrll     case BFD_RELOC_VTABLE_INHERIT:
   6103      1.1     skrll     case BFD_RELOC_VTABLE_ENTRY:
   6104      1.1     skrll       fixP->fx_done = 0;
   6105  1.1.1.5  christos       break;
   6106      1.1     skrll 
   6107      1.1     skrll     default:
   6108      1.1     skrll       as_bad (_("unhandled local relocation fix %s"),
   6109      1.1     skrll 	      bfd_get_reloc_code_name (fixP->fx_r_type));
   6110      1.1     skrll     }
   6111      1.1     skrll }
   6112      1.1     skrll 
   6113      1.1     skrll 
   6114      1.1     skrll const char *
   6115      1.1     skrll md_atof (int type, char *litP, int *sizeP)
   6116      1.1     skrll {
   6117      1.1     skrll   return ieee_md_atof (type, litP, sizeP, target_big_endian);
   6118      1.1     skrll }
   6119      1.1     skrll 
   6120      1.1     skrll 
   6121      1.1     skrll int
   6122      1.1     skrll md_estimate_size_before_relax (fragS *fragP, segT seg ATTRIBUTE_UNUSED)
   6123      1.1     skrll {
   6124      1.1     skrll   return total_frag_text_expansion (fragP);
   6125      1.1     skrll }
   6126      1.1     skrll 
   6127  1.1.1.5  christos 
   6128  1.1.1.5  christos /* Translate internal representation of relocation info to BFD target
   6129      1.1     skrll    format.  */
   6130      1.1     skrll 
   6131      1.1     skrll arelent *
   6132      1.1     skrll tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
   6133      1.1     skrll {
   6134  1.1.1.2  christos   arelent *reloc;
   6135      1.1     skrll 
   6136      1.1     skrll   reloc = XNEW (arelent);
   6137      1.1     skrll   reloc->sym_ptr_ptr = XNEW (asymbol *);
   6138      1.1     skrll   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   6139      1.1     skrll   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   6140      1.1     skrll 
   6141      1.1     skrll   /* Make sure none of our internal relocations make it this far.
   6142      1.1     skrll      They'd better have been fully resolved by this point.  */
   6143      1.1     skrll   gas_assert ((int) fixp->fx_r_type > 0);
   6144      1.1     skrll 
   6145      1.1     skrll   reloc->addend = fixp->fx_offset;
   6146      1.1     skrll 
   6147      1.1     skrll   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
   6148      1.1     skrll   if (reloc->howto == NULL)
   6149      1.1     skrll     {
   6150      1.1     skrll       as_bad_where (fixp->fx_file, fixp->fx_line,
   6151      1.1     skrll 		    _("cannot represent `%s' relocation in object file"),
   6152      1.1     skrll 		    bfd_get_reloc_code_name (fixp->fx_r_type));
   6153      1.1     skrll       free (reloc->sym_ptr_ptr);
   6154      1.1     skrll       free (reloc);
   6155      1.1     skrll       return NULL;
   6156      1.1     skrll     }
   6157      1.1     skrll 
   6158      1.1     skrll   if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
   6159      1.1     skrll     as_fatal (_("internal error; cannot generate `%s' relocation"),
   6160      1.1     skrll 	      bfd_get_reloc_code_name (fixp->fx_r_type));
   6161      1.1     skrll 
   6162      1.1     skrll   return reloc;
   6163      1.1     skrll }
   6164      1.1     skrll 
   6165      1.1     skrll 
   6166      1.1     skrll /* Checks for resource conflicts between instructions.  */
   6168      1.1     skrll 
   6169      1.1     skrll /* The func unit stuff could be implemented as bit-vectors rather
   6170      1.1     skrll    than the iterative approach here.  If it ends up being too
   6171      1.1     skrll    slow, we will switch it.  */
   6172      1.1     skrll 
   6173  1.1.1.5  christos resource_table *
   6174      1.1     skrll new_resource_table (void *data,
   6175      1.1     skrll 		    int cycles,
   6176      1.1     skrll 		    int nu,
   6177      1.1     skrll 		    unit_num_copies_func uncf,
   6178      1.1     skrll 		    opcode_num_units_func onuf,
   6179      1.1     skrll 		    opcode_funcUnit_use_unit_func ouuf,
   6180      1.1     skrll 		    opcode_funcUnit_use_stage_func ousf)
   6181      1.1     skrll {
   6182      1.1     skrll   int i;
   6183  1.1.1.5  christos   resource_table *rt = XNEW (resource_table);
   6184      1.1     skrll   rt->data = data;
   6185  1.1.1.5  christos   rt->cycles = cycles;
   6186      1.1     skrll   rt->allocated_cycles = cycles;
   6187      1.1     skrll   rt->num_units = nu;
   6188      1.1     skrll   rt->unit_num_copies = uncf;
   6189      1.1     skrll   rt->opcode_num_units = onuf;
   6190      1.1     skrll   rt->opcode_unit_use = ouuf;
   6191      1.1     skrll   rt->opcode_unit_stage = ousf;
   6192      1.1     skrll 
   6193      1.1     skrll   rt->units = XCNEWVEC (unsigned char *, cycles);
   6194      1.1     skrll   for (i = 0; i < cycles; i++)
   6195      1.1     skrll     rt->units[i] = XCNEWVEC (unsigned char, nu);
   6196      1.1     skrll 
   6197      1.1     skrll   return rt;
   6198      1.1     skrll }
   6199      1.1     skrll 
   6200      1.1     skrll 
   6201      1.1     skrll void
   6202      1.1     skrll clear_resource_table (resource_table *rt)
   6203      1.1     skrll {
   6204      1.1     skrll   int i, j;
   6205      1.1     skrll   for (i = 0; i < rt->allocated_cycles; i++)
   6206      1.1     skrll     for (j = 0; j < rt->num_units; j++)
   6207      1.1     skrll       rt->units[i][j] = 0;
   6208      1.1     skrll }
   6209      1.1     skrll 
   6210      1.1     skrll 
   6211      1.1     skrll /* We never shrink it, just fake it into thinking so.  */
   6212      1.1     skrll 
   6213      1.1     skrll void
   6214      1.1     skrll resize_resource_table (resource_table *rt, int cycles)
   6215  1.1.1.5  christos {
   6216      1.1     skrll   int i, old_cycles;
   6217  1.1.1.5  christos 
   6218      1.1     skrll   rt->cycles = cycles;
   6219  1.1.1.5  christos   if (cycles <= rt->allocated_cycles)
   6220      1.1     skrll     return;
   6221      1.1     skrll 
   6222      1.1     skrll   old_cycles = rt->allocated_cycles;
   6223      1.1     skrll   rt->allocated_cycles = cycles;
   6224      1.1     skrll 
   6225      1.1     skrll   rt->units = XRESIZEVEC (unsigned char *, rt->units, rt->allocated_cycles);
   6226      1.1     skrll   for (i = 0; i < old_cycles; i++)
   6227      1.1     skrll     rt->units[i] = XRESIZEVEC (unsigned char, rt->units[i], rt->num_units);
   6228      1.1     skrll   for (i = old_cycles; i < cycles; i++)
   6229      1.1     skrll     rt->units[i] = XCNEWVEC (unsigned char, rt->num_units);
   6230      1.1     skrll }
   6231      1.1     skrll 
   6232      1.1     skrll 
   6233      1.1     skrll bfd_boolean
   6234      1.1     skrll resources_available (resource_table *rt, xtensa_opcode opcode, int cycle)
   6235      1.1     skrll {
   6236      1.1     skrll   int i;
   6237      1.1     skrll   int uses = (rt->opcode_num_units) (rt->data, opcode);
   6238      1.1     skrll 
   6239      1.1     skrll   for (i = 0; i < uses; i++)
   6240      1.1     skrll     {
   6241      1.1     skrll       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
   6242      1.1     skrll       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
   6243      1.1     skrll       int copies_in_use = rt->units[stage + cycle][unit];
   6244      1.1     skrll       int copies = (rt->unit_num_copies) (rt->data, unit);
   6245      1.1     skrll       if (copies_in_use >= copies)
   6246      1.1     skrll 	return FALSE;
   6247      1.1     skrll     }
   6248      1.1     skrll   return TRUE;
   6249      1.1     skrll }
   6250      1.1     skrll 
   6251      1.1     skrll 
   6252      1.1     skrll void
   6253      1.1     skrll reserve_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
   6254      1.1     skrll {
   6255      1.1     skrll   int i;
   6256      1.1     skrll   int uses = (rt->opcode_num_units) (rt->data, opcode);
   6257      1.1     skrll 
   6258      1.1     skrll   for (i = 0; i < uses; i++)
   6259      1.1     skrll     {
   6260      1.1     skrll       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
   6261      1.1     skrll       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
   6262      1.1     skrll       /* Note that this allows resources to be oversubscribed.  That's
   6263      1.1     skrll 	 essential to the way the optional scheduler works.
   6264      1.1     skrll 	 resources_available reports when a resource is over-subscribed,
   6265      1.1     skrll 	 so it's easy to tell.  */
   6266      1.1     skrll       rt->units[stage + cycle][unit]++;
   6267      1.1     skrll     }
   6268      1.1     skrll }
   6269      1.1     skrll 
   6270      1.1     skrll 
   6271  1.1.1.2  christos void
   6272      1.1     skrll release_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
   6273      1.1     skrll {
   6274      1.1     skrll   int i;
   6275      1.1     skrll   int uses = (rt->opcode_num_units) (rt->data, opcode);
   6276      1.1     skrll 
   6277      1.1     skrll   for (i = 0; i < uses; i++)
   6278      1.1     skrll     {
   6279      1.1     skrll       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
   6280      1.1     skrll       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
   6281      1.1     skrll       gas_assert (rt->units[stage + cycle][unit] > 0);
   6282      1.1     skrll       rt->units[stage + cycle][unit]--;
   6283      1.1     skrll     }
   6284      1.1     skrll }
   6285      1.1     skrll 
   6286      1.1     skrll 
   6287      1.1     skrll /* Wrapper functions make parameterized resource reservation
   6288      1.1     skrll    more convenient.  */
   6289      1.1     skrll 
   6290      1.1     skrll int
   6291      1.1     skrll opcode_funcUnit_use_unit (void *data, xtensa_opcode opcode, int idx)
   6292      1.1     skrll {
   6293      1.1     skrll   xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
   6294      1.1     skrll   return use->unit;
   6295      1.1     skrll }
   6296      1.1     skrll 
   6297      1.1     skrll 
   6298      1.1     skrll int
   6299      1.1     skrll opcode_funcUnit_use_stage (void *data, xtensa_opcode opcode, int idx)
   6300      1.1     skrll {
   6301      1.1     skrll   xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
   6302      1.1     skrll   return use->stage;
   6303      1.1     skrll }
   6304      1.1     skrll 
   6305      1.1     skrll 
   6306      1.1     skrll /* Note that this function does not check issue constraints, but
   6307      1.1     skrll    solely whether the hardware is available to execute the given
   6308      1.1     skrll    instructions together.  It also doesn't check if the tinsns
   6309      1.1     skrll    write the same state, or access the same tieports.  That is
   6310      1.1     skrll    checked by check_t1_t2_reads_and_writes.  */
   6311      1.1     skrll 
   6312      1.1     skrll static bfd_boolean
   6313      1.1     skrll resources_conflict (vliw_insn *vinsn)
   6314      1.1     skrll {
   6315      1.1     skrll   int i;
   6316      1.1     skrll   static resource_table *rt = NULL;
   6317      1.1     skrll 
   6318      1.1     skrll   /* This is the most common case by far.  Optimize it.  */
   6319      1.1     skrll   if (vinsn->num_slots == 1)
   6320      1.1     skrll     return FALSE;
   6321      1.1     skrll 
   6322      1.1     skrll   if (rt == NULL)
   6323      1.1     skrll     {
   6324      1.1     skrll       xtensa_isa isa = xtensa_default_isa;
   6325      1.1     skrll       rt = new_resource_table
   6326      1.1     skrll 	(isa, xtensa_num_pipe_stages,
   6327      1.1     skrll 	 xtensa_isa_num_funcUnits (isa),
   6328      1.1     skrll 	 (unit_num_copies_func) xtensa_funcUnit_num_copies,
   6329      1.1     skrll 	 (opcode_num_units_func) xtensa_opcode_num_funcUnit_uses,
   6330      1.1     skrll 	 opcode_funcUnit_use_unit,
   6331      1.1     skrll 	 opcode_funcUnit_use_stage);
   6332      1.1     skrll     }
   6333      1.1     skrll 
   6334      1.1     skrll   clear_resource_table (rt);
   6335      1.1     skrll 
   6336      1.1     skrll   for (i = 0; i < vinsn->num_slots; i++)
   6337      1.1     skrll     {
   6338      1.1     skrll       if (!resources_available (rt, vinsn->slots[i].opcode, 0))
   6339      1.1     skrll 	return TRUE;
   6340      1.1     skrll       reserve_resources (rt, vinsn->slots[i].opcode, 0);
   6341      1.1     skrll     }
   6342      1.1     skrll 
   6343      1.1     skrll   return FALSE;
   6344      1.1     skrll }
   6345      1.1     skrll 
   6346      1.1     skrll 
   6347      1.1     skrll /* finish_vinsn, emit_single_op and helper functions.  */
   6349      1.1     skrll 
   6350      1.1     skrll static bfd_boolean find_vinsn_conflicts (vliw_insn *);
   6351  1.1.1.6  christos static xtensa_format xg_find_narrowest_format (vliw_insn *);
   6352      1.1     skrll static void xg_assemble_vliw_tokens (vliw_insn *);
   6353      1.1     skrll 
   6354      1.1     skrll 
   6355      1.1     skrll /* We have reached the end of a bundle; emit into the frag.  */
   6356      1.1     skrll 
   6357      1.1     skrll static void
   6358      1.1     skrll finish_vinsn (vliw_insn *vinsn)
   6359      1.1     skrll {
   6360      1.1     skrll   IStack slotstack;
   6361      1.1     skrll   int i;
   6362      1.1     skrll   int slots;
   6363  1.1.1.6  christos 
   6364  1.1.1.6  christos   if (find_vinsn_conflicts (vinsn))
   6365  1.1.1.2  christos     {
   6366  1.1.1.2  christos       xg_clear_vinsn (vinsn);
   6367  1.1.1.2  christos       return;
   6368  1.1.1.2  christos     }
   6369  1.1.1.2  christos 
   6370  1.1.1.2  christos   /* First, find a format that works.  */
   6371  1.1.1.2  christos   if (vinsn->format == XTENSA_UNDEFINED)
   6372      1.1     skrll     vinsn->format = xg_find_narrowest_format (vinsn);
   6373      1.1     skrll 
   6374  1.1.1.5  christos   slots = xtensa_format_num_slots (xtensa_default_isa, vinsn->format);
   6375      1.1     skrll   if (slots > 1
   6376      1.1     skrll       && produce_flix == FLIX_NONE)
   6377      1.1     skrll     {
   6378      1.1     skrll       as_bad (_("The option \"--no-allow-flix\" prohibits multi-slot flix."));
   6379      1.1     skrll       xg_clear_vinsn (vinsn);
   6380      1.1     skrll       return;
   6381      1.1     skrll     }
   6382      1.1     skrll 
   6383      1.1     skrll   if (vinsn->format == XTENSA_UNDEFINED)
   6384      1.1     skrll     {
   6385  1.1.1.6  christos       as_bad (_("couldn't find a valid instruction format"));
   6386      1.1     skrll       fprintf (stderr, _("    ops were: "));
   6387  1.1.1.6  christos       for (i = 0; i < vinsn->num_slots; i++)
   6388      1.1     skrll 	fprintf (stderr, _(" %s;"),
   6389  1.1.1.6  christos 		 xtensa_opcode_name (xtensa_default_isa,
   6390      1.1     skrll 				     vinsn->slots[i].opcode));
   6391      1.1     skrll       fprintf (stderr, _("\n"));
   6392      1.1     skrll       xg_clear_vinsn (vinsn);
   6393      1.1     skrll       return;
   6394      1.1     skrll     }
   6395      1.1     skrll 
   6396  1.1.1.5  christos   if (vinsn->num_slots != slots)
   6397      1.1     skrll     {
   6398      1.1     skrll       as_bad (_("mismatch for format '%s': #slots = %d, #opcodes = %d"),
   6399      1.1     skrll 	      xtensa_format_name (xtensa_default_isa, vinsn->format),
   6400      1.1     skrll 	      slots, vinsn->num_slots);
   6401      1.1     skrll       xg_clear_vinsn (vinsn);
   6402      1.1     skrll       return;
   6403      1.1     skrll     }
   6404      1.1     skrll 
   6405      1.1     skrll   if (resources_conflict (vinsn))
   6406      1.1     skrll     {
   6407      1.1     skrll       as_bad (_("illegal resource usage in bundle"));
   6408      1.1     skrll       fprintf (stderr, "    ops were: ");
   6409      1.1     skrll       for (i = 0; i < vinsn->num_slots; i++)
   6410      1.1     skrll 	fprintf (stderr, " %s;",
   6411      1.1     skrll 		 xtensa_opcode_name (xtensa_default_isa,
   6412      1.1     skrll 				     vinsn->slots[i].opcode));
   6413      1.1     skrll       fprintf (stderr, "\n");
   6414      1.1     skrll       xg_clear_vinsn (vinsn);
   6415      1.1     skrll       return;
   6416      1.1     skrll     }
   6417      1.1     skrll 
   6418      1.1     skrll   for (i = 0; i < vinsn->num_slots; i++)
   6419      1.1     skrll     {
   6420      1.1     skrll       if (vinsn->slots[i].opcode != XTENSA_UNDEFINED)
   6421      1.1     skrll 	{
   6422      1.1     skrll 	  symbolS *lit_sym = NULL;
   6423      1.1     skrll 	  int j;
   6424      1.1     skrll 	  bfd_boolean e = FALSE;
   6425      1.1     skrll 	  bfd_boolean saved_density = density_supported;
   6426      1.1     skrll 
   6427      1.1     skrll 	  /* We don't want to narrow ops inside multi-slot bundles.  */
   6428      1.1     skrll 	  if (vinsn->num_slots > 1)
   6429      1.1     skrll 	    density_supported = FALSE;
   6430      1.1     skrll 
   6431      1.1     skrll 	  istack_init (&slotstack);
   6432      1.1     skrll 	  if (vinsn->slots[i].opcode == xtensa_nop_opcode)
   6433      1.1     skrll 	    {
   6434      1.1     skrll 	      vinsn->slots[i].opcode =
   6435      1.1     skrll 		xtensa_format_slot_nop_opcode (xtensa_default_isa,
   6436      1.1     skrll 					       vinsn->format, i);
   6437      1.1     skrll 	      vinsn->slots[i].ntok = 0;
   6438      1.1     skrll 	    }
   6439      1.1     skrll 
   6440      1.1     skrll 	  if (xg_expand_assembly_insn (&slotstack, &vinsn->slots[i]))
   6441      1.1     skrll 	    {
   6442      1.1     skrll 	      e = TRUE;
   6443      1.1     skrll 	      continue;
   6444      1.1     skrll 	    }
   6445      1.1     skrll 
   6446      1.1     skrll 	  density_supported = saved_density;
   6447      1.1     skrll 
   6448  1.1.1.2  christos 	  if (e)
   6449      1.1     skrll 	    {
   6450      1.1     skrll 	      xg_clear_vinsn (vinsn);
   6451      1.1     skrll 	      return;
   6452      1.1     skrll 	    }
   6453  1.1.1.2  christos 
   6454      1.1     skrll 	  for (j = 0; j < slotstack.ninsn; j++)
   6455      1.1     skrll 	    {
   6456      1.1     skrll 	      TInsn *insn = &slotstack.insn[j];
   6457      1.1     skrll 	      if (insn->insn_type == ITYPE_LITERAL)
   6458      1.1     skrll 		{
   6459      1.1     skrll 		  gas_assert (lit_sym == NULL);
   6460      1.1     skrll 		  lit_sym = xg_assemble_literal (insn);
   6461      1.1     skrll 		}
   6462      1.1     skrll 	      else
   6463      1.1     skrll 		{
   6464      1.1     skrll 		  gas_assert (insn->insn_type == ITYPE_INSN);
   6465      1.1     skrll 		  if (lit_sym)
   6466      1.1     skrll 		    xg_resolve_literals (insn, lit_sym);
   6467      1.1     skrll 		  if (j != slotstack.ninsn - 1)
   6468      1.1     skrll 		    emit_single_op (insn);
   6469      1.1     skrll 		}
   6470      1.1     skrll 	    }
   6471      1.1     skrll 
   6472      1.1     skrll 	  if (vinsn->num_slots > 1)
   6473      1.1     skrll 	    {
   6474      1.1     skrll 	      if (opcode_fits_format_slot
   6475      1.1     skrll 		  (slotstack.insn[slotstack.ninsn - 1].opcode,
   6476      1.1     skrll 		   vinsn->format, i))
   6477      1.1     skrll 		{
   6478      1.1     skrll 		  vinsn->slots[i] = slotstack.insn[slotstack.ninsn - 1];
   6479      1.1     skrll 		}
   6480      1.1     skrll 	      else
   6481      1.1     skrll 		{
   6482      1.1     skrll 		  emit_single_op (&slotstack.insn[slotstack.ninsn - 1]);
   6483      1.1     skrll 		  if (vinsn->format == XTENSA_UNDEFINED)
   6484      1.1     skrll 		    vinsn->slots[i].opcode = xtensa_nop_opcode;
   6485      1.1     skrll 		  else
   6486      1.1     skrll 		    vinsn->slots[i].opcode
   6487      1.1     skrll 		      = xtensa_format_slot_nop_opcode (xtensa_default_isa,
   6488      1.1     skrll 						       vinsn->format, i);
   6489      1.1     skrll 
   6490      1.1     skrll 		  vinsn->slots[i].ntok = 0;
   6491      1.1     skrll 		}
   6492      1.1     skrll 	    }
   6493  1.1.1.5  christos 	  else
   6494      1.1     skrll 	    {
   6495      1.1     skrll 	      vinsn->slots[0] = slotstack.insn[slotstack.ninsn - 1];
   6496      1.1     skrll 	      vinsn->format = XTENSA_UNDEFINED;
   6497      1.1     skrll 	    }
   6498      1.1     skrll 	}
   6499      1.1     skrll     }
   6500      1.1     skrll 
   6501      1.1     skrll   /* Now check resource conflicts on the modified bundle.  */
   6502      1.1     skrll   if (resources_conflict (vinsn))
   6503      1.1     skrll     {
   6504      1.1     skrll       as_bad (_("illegal resource usage in bundle"));
   6505      1.1     skrll       fprintf (stderr, "    ops were: ");
   6506      1.1     skrll       for (i = 0; i < vinsn->num_slots; i++)
   6507      1.1     skrll 	fprintf (stderr, " %s;",
   6508      1.1     skrll 		 xtensa_opcode_name (xtensa_default_isa,
   6509      1.1     skrll 				     vinsn->slots[i].opcode));
   6510      1.1     skrll       fprintf (stderr, "\n");
   6511  1.1.1.4  christos       xg_clear_vinsn (vinsn);
   6512  1.1.1.4  christos       return;
   6513      1.1     skrll     }
   6514      1.1     skrll 
   6515      1.1     skrll   /* First, find a format that works.  */
   6516      1.1     skrll   if (vinsn->format == XTENSA_UNDEFINED)
   6517      1.1     skrll       vinsn->format = xg_find_narrowest_format (vinsn);
   6518      1.1     skrll 
   6519      1.1     skrll   xg_assemble_vliw_tokens (vinsn);
   6520      1.1     skrll 
   6521      1.1     skrll   xg_clear_vinsn (vinsn);
   6522      1.1     skrll 
   6523      1.1     skrll   xtensa_check_frag_count ();
   6524      1.1     skrll }
   6525      1.1     skrll 
   6526      1.1     skrll 
   6527      1.1     skrll /* Given an vliw instruction, what conflicts are there in register
   6528      1.1     skrll    usage and in writes to states and queues?
   6529      1.1     skrll 
   6530      1.1     skrll    This function does two things:
   6531      1.1     skrll    1. Reports an error when a vinsn contains illegal combinations
   6532      1.1     skrll       of writes to registers states or queues.
   6533      1.1     skrll    2. Marks individual tinsns as not relaxable if the combination
   6534      1.1     skrll       contains antidependencies.
   6535      1.1     skrll 
   6536      1.1     skrll    Job 2 handles things like swap semantics in instructions that need
   6537      1.1     skrll    to be relaxed.  For example,
   6538      1.1     skrll 
   6539      1.1     skrll 	addi a0, a1, 100000
   6540      1.1     skrll 
   6541      1.1     skrll    normally would be relaxed to
   6542      1.1     skrll 
   6543      1.1     skrll 	l32r a0, some_label
   6544      1.1     skrll 	add a0, a1, a0
   6545      1.1     skrll 
   6546      1.1     skrll    _but_, if the above instruction is bundled with an a0 reader, e.g.,
   6547      1.1     skrll 
   6548      1.1     skrll 	{ addi a0, a1, 10000 ; add a2, a0, a4 ; }
   6549      1.1     skrll 
   6550      1.1     skrll    then we can't relax it into
   6551      1.1     skrll 
   6552      1.1     skrll 	l32r a0, some_label
   6553      1.1     skrll 	{ add a0, a1, a0 ; add a2, a0, a4 ; }
   6554      1.1     skrll 
   6555  1.1.1.2  christos    because the value of a0 is trashed before the second add can read it.  */
   6556      1.1     skrll 
   6557      1.1     skrll static char check_t1_t2_reads_and_writes (TInsn *, TInsn *);
   6558      1.1     skrll 
   6559      1.1     skrll static bfd_boolean
   6560      1.1     skrll find_vinsn_conflicts (vliw_insn *vinsn)
   6561      1.1     skrll {
   6562      1.1     skrll   int i, j;
   6563      1.1     skrll   int branches = 0;
   6564      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   6565      1.1     skrll 
   6566      1.1     skrll   gas_assert (!past_xtensa_end);
   6567      1.1     skrll 
   6568      1.1     skrll   for (i = 0 ; i < vinsn->num_slots; i++)
   6569      1.1     skrll     {
   6570      1.1     skrll       TInsn *op1 = &vinsn->slots[i];
   6571      1.1     skrll       if (op1->is_specific_opcode)
   6572      1.1     skrll 	op1->keep_wide = TRUE;
   6573      1.1     skrll       else
   6574      1.1     skrll 	op1->keep_wide = FALSE;
   6575      1.1     skrll     }
   6576      1.1     skrll 
   6577      1.1     skrll   for (i = 0 ; i < vinsn->num_slots; i++)
   6578      1.1     skrll     {
   6579      1.1     skrll       TInsn *op1 = &vinsn->slots[i];
   6580      1.1     skrll 
   6581      1.1     skrll       if (xtensa_opcode_is_branch (isa, op1->opcode) == 1)
   6582      1.1     skrll 	branches++;
   6583      1.1     skrll 
   6584      1.1     skrll       for (j = 0; j < vinsn->num_slots; j++)
   6585      1.1     skrll 	{
   6586      1.1     skrll 	  if (i != j)
   6587      1.1     skrll 	    {
   6588      1.1     skrll 	      TInsn *op2 = &vinsn->slots[j];
   6589      1.1     skrll 	      char conflict_type = check_t1_t2_reads_and_writes (op1, op2);
   6590      1.1     skrll 	      switch (conflict_type)
   6591      1.1     skrll 		{
   6592      1.1     skrll 		case 'c':
   6593      1.1     skrll 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same register"),
   6594      1.1     skrll 			  xtensa_opcode_name (isa, op1->opcode), i,
   6595      1.1     skrll 			  xtensa_opcode_name (isa, op2->opcode), j);
   6596      1.1     skrll 		  return TRUE;
   6597      1.1     skrll 		case 'd':
   6598      1.1     skrll 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same state"),
   6599      1.1     skrll 			  xtensa_opcode_name (isa, op1->opcode), i,
   6600      1.1     skrll 			  xtensa_opcode_name (isa, op2->opcode), j);
   6601      1.1     skrll 		  return TRUE;
   6602      1.1     skrll 		case 'e':
   6603      1.1     skrll 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same port"),
   6604      1.1     skrll 			  xtensa_opcode_name (isa, op1->opcode), i,
   6605      1.1     skrll 			  xtensa_opcode_name (isa, op2->opcode), j);
   6606      1.1     skrll 		  return TRUE;
   6607      1.1     skrll 		case 'f':
   6608      1.1     skrll 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) both have volatile port accesses"),
   6609      1.1     skrll 			  xtensa_opcode_name (isa, op1->opcode), i,
   6610      1.1     skrll 			  xtensa_opcode_name (isa, op2->opcode), j);
   6611      1.1     skrll 		  return TRUE;
   6612      1.1     skrll 		default:
   6613      1.1     skrll 		  /* Everything is OK.  */
   6614      1.1     skrll 		  break;
   6615      1.1     skrll 		}
   6616      1.1     skrll 	      op2->is_specific_opcode = (op2->is_specific_opcode
   6617      1.1     skrll 					 || conflict_type == 'a');
   6618      1.1     skrll 	    }
   6619      1.1     skrll 	}
   6620      1.1     skrll     }
   6621      1.1     skrll 
   6622      1.1     skrll   if (branches > 1)
   6623      1.1     skrll     {
   6624      1.1     skrll       as_bad (_("multiple branches or jumps in the same bundle"));
   6625      1.1     skrll       return TRUE;
   6626      1.1     skrll     }
   6627      1.1     skrll 
   6628      1.1     skrll   return FALSE;
   6629      1.1     skrll }
   6630      1.1     skrll 
   6631      1.1     skrll 
   6632      1.1     skrll /* Check how the state used by t1 and t2 relate.
   6633      1.1     skrll    Cases found are:
   6634      1.1     skrll 
   6635      1.1     skrll    case A: t1 reads a register t2 writes (an antidependency within a bundle)
   6636      1.1     skrll    case B: no relationship between what is read and written (both could
   6637      1.1     skrll            read the same reg though)
   6638      1.1     skrll    case C: t1 writes a register t2 writes (a register conflict within a
   6639      1.1     skrll            bundle)
   6640      1.1     skrll    case D: t1 writes a state that t2 also writes
   6641      1.1     skrll    case E: t1 writes a tie queue that t2 also writes
   6642      1.1     skrll    case F: two volatile queue accesses
   6643      1.1     skrll */
   6644      1.1     skrll 
   6645      1.1     skrll static char
   6646      1.1     skrll check_t1_t2_reads_and_writes (TInsn *t1, TInsn *t2)
   6647      1.1     skrll {
   6648      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   6649      1.1     skrll   xtensa_regfile t1_regfile, t2_regfile;
   6650      1.1     skrll   int t1_reg, t2_reg;
   6651      1.1     skrll   int t1_base_reg, t1_last_reg;
   6652      1.1     skrll   int t2_base_reg, t2_last_reg;
   6653      1.1     skrll   char t1_inout, t2_inout;
   6654      1.1     skrll   int i, j;
   6655      1.1     skrll   char conflict = 'b';
   6656      1.1     skrll   int t1_states;
   6657      1.1     skrll   int t2_states;
   6658      1.1     skrll   int t1_interfaces;
   6659      1.1     skrll   int t2_interfaces;
   6660      1.1     skrll   bfd_boolean t1_volatile = FALSE;
   6661      1.1     skrll   bfd_boolean t2_volatile = FALSE;
   6662      1.1     skrll 
   6663      1.1     skrll   /* Check registers.  */
   6664      1.1     skrll   for (j = 0; j < t2->ntok; j++)
   6665      1.1     skrll     {
   6666      1.1     skrll       if (xtensa_operand_is_register (isa, t2->opcode, j) != 1)
   6667      1.1     skrll 	continue;
   6668      1.1     skrll 
   6669      1.1     skrll       t2_regfile = xtensa_operand_regfile (isa, t2->opcode, j);
   6670      1.1     skrll       t2_base_reg = t2->tok[j].X_add_number;
   6671      1.1     skrll       t2_last_reg = t2_base_reg + xtensa_operand_num_regs (isa, t2->opcode, j);
   6672      1.1     skrll 
   6673      1.1     skrll       for (i = 0; i < t1->ntok; i++)
   6674      1.1     skrll 	{
   6675      1.1     skrll 	  if (xtensa_operand_is_register (isa, t1->opcode, i) != 1)
   6676      1.1     skrll 	    continue;
   6677      1.1     skrll 
   6678      1.1     skrll 	  t1_regfile = xtensa_operand_regfile (isa, t1->opcode, i);
   6679      1.1     skrll 
   6680      1.1     skrll 	  if (t1_regfile != t2_regfile)
   6681      1.1     skrll 	    continue;
   6682      1.1     skrll 
   6683      1.1     skrll 	  t1_inout = xtensa_operand_inout (isa, t1->opcode, i);
   6684      1.1     skrll 	  t2_inout = xtensa_operand_inout (isa, t2->opcode, j);
   6685      1.1     skrll 
   6686      1.1     skrll 	  if (xtensa_operand_is_known_reg (isa, t1->opcode, i) == 0
   6687      1.1     skrll 	      || xtensa_operand_is_known_reg (isa, t2->opcode, j) == 0)
   6688      1.1     skrll 	    {
   6689      1.1     skrll 	      if (t1_inout == 'm' || t1_inout == 'o'
   6690      1.1     skrll 		  || t2_inout == 'm' || t2_inout == 'o')
   6691      1.1     skrll 		{
   6692      1.1     skrll 		  conflict = 'a';
   6693      1.1     skrll 		  continue;
   6694      1.1     skrll 		}
   6695      1.1     skrll 	    }
   6696      1.1     skrll 
   6697      1.1     skrll 	  t1_base_reg = t1->tok[i].X_add_number;
   6698      1.1     skrll 	  t1_last_reg = (t1_base_reg
   6699      1.1     skrll 			 + xtensa_operand_num_regs (isa, t1->opcode, i));
   6700      1.1     skrll 
   6701      1.1     skrll 	  for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
   6702      1.1     skrll 	    {
   6703      1.1     skrll 	      for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
   6704      1.1     skrll 		{
   6705      1.1     skrll 		  if (t1_reg != t2_reg)
   6706      1.1     skrll 		    continue;
   6707      1.1     skrll 
   6708      1.1     skrll 		  if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
   6709      1.1     skrll 		    {
   6710      1.1     skrll 		      conflict = 'a';
   6711      1.1     skrll 		      continue;
   6712      1.1     skrll 		    }
   6713      1.1     skrll 
   6714      1.1     skrll 		  if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
   6715      1.1     skrll 		    {
   6716      1.1     skrll 		      conflict = 'a';
   6717      1.1     skrll 		      continue;
   6718      1.1     skrll 		    }
   6719      1.1     skrll 
   6720      1.1     skrll 		  if (t1_inout != 'i' && t2_inout != 'i')
   6721      1.1     skrll 		    return 'c';
   6722      1.1     skrll 		}
   6723      1.1     skrll 	    }
   6724      1.1     skrll 	}
   6725      1.1     skrll     }
   6726      1.1     skrll 
   6727  1.1.1.2  christos   /* Check states.  */
   6728      1.1     skrll   t1_states = xtensa_opcode_num_stateOperands (isa, t1->opcode);
   6729      1.1     skrll   t2_states = xtensa_opcode_num_stateOperands (isa, t2->opcode);
   6730      1.1     skrll   for (j = 0; j < t2_states; j++)
   6731      1.1     skrll     {
   6732      1.1     skrll       xtensa_state t2_so = xtensa_stateOperand_state (isa, t2->opcode, j);
   6733      1.1     skrll       t2_inout = xtensa_stateOperand_inout (isa, t2->opcode, j);
   6734      1.1     skrll       for (i = 0; i < t1_states; i++)
   6735      1.1     skrll 	{
   6736      1.1     skrll 	  xtensa_state t1_so = xtensa_stateOperand_state (isa, t1->opcode, i);
   6737      1.1     skrll 	  t1_inout = xtensa_stateOperand_inout (isa, t1->opcode, i);
   6738      1.1     skrll 	  if (t1_so != t2_so || xtensa_state_is_shared_or (isa, t1_so) == 1)
   6739      1.1     skrll 	    continue;
   6740      1.1     skrll 
   6741      1.1     skrll 	  if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
   6742      1.1     skrll 	    {
   6743      1.1     skrll 	      conflict = 'a';
   6744      1.1     skrll 	      continue;
   6745      1.1     skrll 	    }
   6746      1.1     skrll 
   6747      1.1     skrll 	  if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
   6748      1.1     skrll 	    {
   6749      1.1     skrll 	      conflict = 'a';
   6750      1.1     skrll 	      continue;
   6751      1.1     skrll 	    }
   6752      1.1     skrll 
   6753      1.1     skrll 	  if (t1_inout != 'i' && t2_inout != 'i')
   6754      1.1     skrll 	    return 'd';
   6755      1.1     skrll 	}
   6756      1.1     skrll     }
   6757      1.1     skrll 
   6758      1.1     skrll   /* Check tieports.  */
   6759      1.1     skrll   t1_interfaces = xtensa_opcode_num_interfaceOperands (isa, t1->opcode);
   6760      1.1     skrll   t2_interfaces = xtensa_opcode_num_interfaceOperands (isa, t2->opcode);
   6761      1.1     skrll   for (j = 0; j < t2_interfaces; j++)
   6762      1.1     skrll     {
   6763      1.1     skrll       xtensa_interface t2_int
   6764      1.1     skrll 	= xtensa_interfaceOperand_interface (isa, t2->opcode, j);
   6765      1.1     skrll       int t2_class = xtensa_interface_class_id (isa, t2_int);
   6766      1.1     skrll 
   6767      1.1     skrll       t2_inout = xtensa_interface_inout (isa, t2_int);
   6768      1.1     skrll       if (xtensa_interface_has_side_effect (isa, t2_int) == 1)
   6769      1.1     skrll 	t2_volatile = TRUE;
   6770      1.1     skrll 
   6771      1.1     skrll       for (i = 0; i < t1_interfaces; i++)
   6772      1.1     skrll 	{
   6773      1.1     skrll 	  xtensa_interface t1_int
   6774      1.1     skrll 	    = xtensa_interfaceOperand_interface (isa, t1->opcode, j);
   6775      1.1     skrll 	  int t1_class = xtensa_interface_class_id (isa, t1_int);
   6776      1.1     skrll 
   6777      1.1     skrll 	  t1_inout = xtensa_interface_inout (isa, t1_int);
   6778      1.1     skrll 	  if (xtensa_interface_has_side_effect (isa, t1_int) == 1)
   6779      1.1     skrll 	    t1_volatile = TRUE;
   6780      1.1     skrll 
   6781      1.1     skrll 	  if (t1_volatile && t2_volatile && (t1_class == t2_class))
   6782      1.1     skrll 	    return 'f';
   6783      1.1     skrll 
   6784      1.1     skrll 	  if (t1_int != t2_int)
   6785      1.1     skrll 	    continue;
   6786      1.1     skrll 
   6787      1.1     skrll 	  if (t2_inout == 'i' && t1_inout == 'o')
   6788      1.1     skrll 	    {
   6789      1.1     skrll 	      conflict = 'a';
   6790      1.1     skrll 	      continue;
   6791      1.1     skrll 	    }
   6792      1.1     skrll 
   6793      1.1     skrll 	  if (t1_inout == 'i' && t2_inout == 'o')
   6794      1.1     skrll 	    {
   6795      1.1     skrll 	      conflict = 'a';
   6796      1.1     skrll 	      continue;
   6797      1.1     skrll 	    }
   6798      1.1     skrll 
   6799      1.1     skrll 	  if (t1_inout != 'i' && t2_inout != 'i')
   6800      1.1     skrll 	    return 'e';
   6801      1.1     skrll 	}
   6802      1.1     skrll     }
   6803      1.1     skrll 
   6804      1.1     skrll   return conflict;
   6805      1.1     skrll }
   6806      1.1     skrll 
   6807      1.1     skrll 
   6808      1.1     skrll static xtensa_format
   6809      1.1     skrll xg_find_narrowest_format (vliw_insn *vinsn)
   6810      1.1     skrll {
   6811      1.1     skrll   /* Right now we assume that the ops within the vinsn are properly
   6812      1.1     skrll      ordered for the slots that the programmer wanted them in.  In
   6813      1.1     skrll      other words, we don't rearrange the ops in hopes of finding a
   6814  1.1.1.2  christos      better format.  The scheduler handles that.  */
   6815  1.1.1.2  christos 
   6816      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   6817      1.1     skrll   xtensa_format format;
   6818      1.1     skrll   xtensa_opcode nop_opcode = xtensa_nop_opcode;
   6819      1.1     skrll 
   6820      1.1     skrll   if (vinsn->num_slots == 1)
   6821      1.1     skrll     return xg_get_single_format (vinsn->slots[0].opcode);
   6822      1.1     skrll 
   6823      1.1     skrll   for (format = 0; format < xtensa_isa_num_formats (isa); format++)
   6824      1.1     skrll     {
   6825      1.1     skrll       vliw_insn v_copy;
   6826      1.1     skrll       xg_copy_vinsn (&v_copy, vinsn);
   6827      1.1     skrll       if (xtensa_format_num_slots (isa, format) == v_copy.num_slots)
   6828      1.1     skrll 	{
   6829      1.1     skrll 	  int slot;
   6830      1.1     skrll 	  int fit = 0;
   6831      1.1     skrll 	  for (slot = 0; slot < v_copy.num_slots; slot++)
   6832      1.1     skrll 	    {
   6833      1.1     skrll 	      if (v_copy.slots[slot].opcode == nop_opcode)
   6834      1.1     skrll 		{
   6835      1.1     skrll 		  v_copy.slots[slot].opcode =
   6836      1.1     skrll 		    xtensa_format_slot_nop_opcode (isa, format, slot);
   6837      1.1     skrll 		  v_copy.slots[slot].ntok = 0;
   6838      1.1     skrll 		}
   6839      1.1     skrll 
   6840      1.1     skrll 	      if (opcode_fits_format_slot (v_copy.slots[slot].opcode,
   6841      1.1     skrll 					   format, slot))
   6842      1.1     skrll 		fit++;
   6843      1.1     skrll 	      else if (v_copy.num_slots > 1)
   6844      1.1     skrll 		{
   6845      1.1     skrll 		  TInsn widened;
   6846      1.1     skrll 		  /* Try the widened version.  */
   6847      1.1     skrll 		  if (!v_copy.slots[slot].keep_wide
   6848      1.1     skrll 		      && !v_copy.slots[slot].is_specific_opcode
   6849      1.1     skrll 		      && xg_is_single_relaxable_insn (&v_copy.slots[slot],
   6850  1.1.1.2  christos 						      &widened, TRUE)
   6851      1.1     skrll 		      && opcode_fits_format_slot (widened.opcode,
   6852      1.1     skrll 						  format, slot))
   6853      1.1     skrll 		    {
   6854      1.1     skrll 		      v_copy.slots[slot] = widened;
   6855      1.1     skrll 		      fit++;
   6856      1.1     skrll 		    }
   6857      1.1     skrll 		}
   6858      1.1     skrll 	    }
   6859      1.1     skrll 	  if (fit == v_copy.num_slots)
   6860      1.1     skrll 	    {
   6861      1.1     skrll 	      xg_copy_vinsn (vinsn, &v_copy);
   6862      1.1     skrll 	      xtensa_format_encode (isa, format, vinsn->insnbuf);
   6863      1.1     skrll 	      vinsn->format = format;
   6864      1.1     skrll 	      break;
   6865      1.1     skrll 	    }
   6866      1.1     skrll 	}
   6867      1.1     skrll     }
   6868      1.1     skrll 
   6869      1.1     skrll   if (format == xtensa_isa_num_formats (isa))
   6870      1.1     skrll     return XTENSA_UNDEFINED;
   6871      1.1     skrll 
   6872      1.1     skrll   return format;
   6873      1.1     skrll }
   6874      1.1     skrll 
   6875      1.1     skrll 
   6876      1.1     skrll /* Return the additional space needed in a frag
   6877      1.1     skrll    for possible relaxations of any ops in a VLIW insn.
   6878      1.1     skrll    Also fill out the relaxations that might be required of
   6879      1.1     skrll    each tinsn in the vinsn.  */
   6880      1.1     skrll 
   6881      1.1     skrll static int
   6882      1.1     skrll relaxation_requirements (vliw_insn *vinsn, bfd_boolean *pfinish_frag)
   6883      1.1     skrll {
   6884      1.1     skrll   bfd_boolean finish_frag = FALSE;
   6885      1.1     skrll   int extra_space = 0;
   6886      1.1     skrll   int slot;
   6887      1.1     skrll 
   6888      1.1     skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   6889      1.1     skrll     {
   6890      1.1     skrll       TInsn *tinsn = &vinsn->slots[slot];
   6891      1.1     skrll       if (!tinsn_has_symbolic_operands (tinsn))
   6892      1.1     skrll 	{
   6893      1.1     skrll 	  /* A narrow instruction could be widened later to help
   6894      1.1     skrll 	     alignment issues.  */
   6895      1.1     skrll 	  if (xg_is_single_relaxable_insn (tinsn, 0, TRUE)
   6896      1.1     skrll 	      && !tinsn->is_specific_opcode
   6897      1.1     skrll 	      && vinsn->num_slots == 1)
   6898      1.1     skrll 	    {
   6899      1.1     skrll 	      /* Difference in bytes between narrow and wide insns...  */
   6900      1.1     skrll 	      extra_space += 1;
   6901      1.1     skrll 	      tinsn->subtype = RELAX_NARROW;
   6902      1.1     skrll 	    }
   6903      1.1     skrll 	}
   6904      1.1     skrll       else
   6905      1.1     skrll 	{
   6906      1.1     skrll 	  if (workaround_b_j_loop_end
   6907      1.1     skrll 	      && tinsn->opcode == xtensa_jx_opcode
   6908      1.1     skrll 	      && use_transform ())
   6909      1.1     skrll 	    {
   6910      1.1     skrll 	      /* Add 2 of these.  */
   6911      1.1     skrll 	      extra_space += 3; /* for the nop size */
   6912      1.1     skrll 	      tinsn->subtype = RELAX_ADD_NOP_IF_PRE_LOOP_END;
   6913      1.1     skrll 	    }
   6914      1.1     skrll 
   6915      1.1     skrll 	  /* Need to assemble it with space for the relocation.  */
   6916      1.1     skrll 	  if (xg_is_relaxable_insn (tinsn, 0)
   6917      1.1     skrll 	      && !tinsn->is_specific_opcode)
   6918      1.1     skrll 	    {
   6919      1.1     skrll 	      int max_size = xg_get_max_insn_widen_size (tinsn->opcode);
   6920      1.1     skrll 	      int max_literal_size =
   6921      1.1     skrll 		xg_get_max_insn_widen_literal_size (tinsn->opcode);
   6922      1.1     skrll 
   6923      1.1     skrll 	      tinsn->literal_space = max_literal_size;
   6924      1.1     skrll 
   6925      1.1     skrll 	      tinsn->subtype = RELAX_IMMED;
   6926      1.1     skrll 	      extra_space += max_size;
   6927      1.1     skrll 	    }
   6928      1.1     skrll 	  else
   6929      1.1     skrll 	    {
   6930      1.1     skrll 	      /* A fix record will be added for this instruction prior
   6931      1.1     skrll 		 to relaxation, so make it end the frag.  */
   6932      1.1     skrll 	      finish_frag = TRUE;
   6933      1.1     skrll 	    }
   6934      1.1     skrll 	}
   6935      1.1     skrll     }
   6936      1.1     skrll   *pfinish_frag = finish_frag;
   6937  1.1.1.2  christos   return extra_space;
   6938      1.1     skrll }
   6939      1.1     skrll 
   6940      1.1     skrll 
   6941      1.1     skrll static void
   6942      1.1     skrll bundle_tinsn (TInsn *tinsn, vliw_insn *vinsn)
   6943      1.1     skrll {
   6944      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   6945      1.1     skrll   int slot, chosen_slot;
   6946      1.1     skrll 
   6947      1.1     skrll   vinsn->format = xg_get_single_format (tinsn->opcode);
   6948      1.1     skrll   gas_assert (vinsn->format != XTENSA_UNDEFINED);
   6949      1.1     skrll   vinsn->num_slots = xtensa_format_num_slots (isa, vinsn->format);
   6950      1.1     skrll 
   6951      1.1     skrll   chosen_slot = xg_get_single_slot (tinsn->opcode);
   6952      1.1     skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   6953      1.1     skrll     {
   6954      1.1     skrll       if (slot == chosen_slot)
   6955      1.1     skrll 	vinsn->slots[slot] = *tinsn;
   6956      1.1     skrll       else
   6957      1.1     skrll 	{
   6958      1.1     skrll 	  vinsn->slots[slot].opcode =
   6959      1.1     skrll 	    xtensa_format_slot_nop_opcode (isa, vinsn->format, slot);
   6960      1.1     skrll 	  vinsn->slots[slot].ntok = 0;
   6961      1.1     skrll 	  vinsn->slots[slot].insn_type = ITYPE_INSN;
   6962      1.1     skrll 	}
   6963      1.1     skrll     }
   6964      1.1     skrll }
   6965      1.1     skrll 
   6966      1.1     skrll 
   6967      1.1     skrll static bfd_boolean
   6968      1.1     skrll emit_single_op (TInsn *orig_insn)
   6969      1.1     skrll {
   6970      1.1     skrll   int i;
   6971      1.1     skrll   IStack istack;		/* put instructions into here */
   6972      1.1     skrll   symbolS *lit_sym = NULL;
   6973      1.1     skrll   symbolS *label_sym = NULL;
   6974      1.1     skrll 
   6975      1.1     skrll   istack_init (&istack);
   6976      1.1     skrll 
   6977      1.1     skrll   /* Special-case for "movi aX, foo" which is guaranteed to need relaxing.
   6978      1.1     skrll      Because the scheduling and bundling characteristics of movi and
   6979      1.1     skrll      l32r or const16 are so different, we can do much better if we relax
   6980      1.1     skrll      it prior to scheduling and bundling, rather than after.  */
   6981      1.1     skrll   if ((orig_insn->opcode == xtensa_movi_opcode
   6982      1.1     skrll        || orig_insn->opcode == xtensa_movi_n_opcode)
   6983      1.1     skrll       && !cur_vinsn.inside_bundle
   6984      1.1     skrll       && (orig_insn->tok[1].X_op == O_symbol
   6985      1.1     skrll 	  || orig_insn->tok[1].X_op == O_pltrel
   6986      1.1     skrll 	  || orig_insn->tok[1].X_op == O_tlsfunc
   6987      1.1     skrll 	  || orig_insn->tok[1].X_op == O_tlsarg
   6988      1.1     skrll 	  || orig_insn->tok[1].X_op == O_tpoff
   6989      1.1     skrll 	  || orig_insn->tok[1].X_op == O_dtpoff)
   6990      1.1     skrll       && !orig_insn->is_specific_opcode && use_transform ())
   6991  1.1.1.2  christos     xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
   6992      1.1     skrll   else
   6993      1.1     skrll     if (xg_expand_assembly_insn (&istack, orig_insn))
   6994      1.1     skrll       return TRUE;
   6995      1.1     skrll 
   6996      1.1     skrll   for (i = 0; i < istack.ninsn; i++)
   6997  1.1.1.5  christos     {
   6998      1.1     skrll       TInsn *insn = &istack.insn[i];
   6999      1.1     skrll       switch (insn->insn_type)
   7000  1.1.1.2  christos 	{
   7001      1.1     skrll 	case ITYPE_LITERAL:
   7002  1.1.1.2  christos 	  gas_assert (lit_sym == NULL);
   7003      1.1     skrll 	  lit_sym = xg_assemble_literal (insn);
   7004      1.1     skrll 	  break;
   7005      1.1     skrll 	case ITYPE_LABEL:
   7006      1.1     skrll 	  {
   7007      1.1     skrll 	    static int relaxed_sym_idx = 0;
   7008      1.1     skrll 	    char *label = XNEWVEC (char, strlen (FAKE_LABEL_NAME) + 12);
   7009      1.1     skrll 	    sprintf (label, "%s_rl_%x", FAKE_LABEL_NAME, relaxed_sym_idx++);
   7010      1.1     skrll 	    colon (label);
   7011      1.1     skrll 	    gas_assert (label_sym == NULL);
   7012      1.1     skrll 	    label_sym = symbol_find_or_make (label);
   7013      1.1     skrll 	    gas_assert (label_sym);
   7014      1.1     skrll 	    free (label);
   7015      1.1     skrll 	  }
   7016      1.1     skrll 	  break;
   7017      1.1     skrll 	case ITYPE_INSN:
   7018      1.1     skrll 	  {
   7019      1.1     skrll 	    vliw_insn v;
   7020  1.1.1.2  christos 	    if (lit_sym)
   7021      1.1     skrll 	      xg_resolve_literals (insn, lit_sym);
   7022      1.1     skrll 	    if (label_sym)
   7023      1.1     skrll 	      xg_resolve_labels (insn, label_sym);
   7024      1.1     skrll 	    xg_init_vinsn (&v);
   7025      1.1     skrll 	    bundle_tinsn (insn, &v);
   7026      1.1     skrll 	    finish_vinsn (&v);
   7027      1.1     skrll 	    xg_free_vinsn (&v);
   7028      1.1     skrll 	  }
   7029      1.1     skrll 	  break;
   7030      1.1     skrll 	default:
   7031      1.1     skrll 	  gas_assert (0);
   7032      1.1     skrll 	  break;
   7033      1.1     skrll 	}
   7034  1.1.1.2  christos     }
   7035      1.1     skrll   return FALSE;
   7036      1.1     skrll }
   7037      1.1     skrll 
   7038      1.1     skrll 
   7039      1.1     skrll static int
   7040      1.1     skrll total_frag_text_expansion (fragS *fragP)
   7041      1.1     skrll {
   7042      1.1     skrll   int slot;
   7043      1.1     skrll   int total_expansion = 0;
   7044      1.1     skrll 
   7045      1.1     skrll   for (slot = 0; slot < config_max_slots; slot++)
   7046      1.1     skrll     total_expansion += fragP->tc_frag_data.text_expansion[slot];
   7047      1.1     skrll 
   7048      1.1     skrll   return total_expansion;
   7049      1.1     skrll }
   7050      1.1     skrll 
   7051      1.1     skrll 
   7052      1.1     skrll /* Emit a vliw instruction to the current fragment.  */
   7053      1.1     skrll 
   7054      1.1     skrll static void
   7055      1.1     skrll xg_assemble_vliw_tokens (vliw_insn *vinsn)
   7056      1.1     skrll {
   7057      1.1     skrll   bfd_boolean finish_frag;
   7058      1.1     skrll   bfd_boolean is_jump = FALSE;
   7059      1.1     skrll   bfd_boolean is_branch = FALSE;
   7060      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   7061      1.1     skrll   int insn_size;
   7062      1.1     skrll   int extra_space;
   7063      1.1     skrll   char *f = NULL;
   7064      1.1     skrll   int slot;
   7065      1.1     skrll   struct dwarf2_line_info debug_line;
   7066      1.1     skrll   bfd_boolean loc_directive_seen = FALSE;
   7067      1.1     skrll   TInsn *tinsn;
   7068      1.1     skrll 
   7069      1.1     skrll   memset (&debug_line, 0, sizeof (struct dwarf2_line_info));
   7070      1.1     skrll 
   7071      1.1     skrll   if (generating_literals)
   7072      1.1     skrll     {
   7073      1.1     skrll       static int reported = 0;
   7074      1.1     skrll       if (reported < 4)
   7075  1.1.1.4  christos 	as_bad_where (frag_now->fr_file, frag_now->fr_line,
   7076      1.1     skrll 		      _("cannot assemble into a literal fragment"));
   7077      1.1     skrll       if (reported == 3)
   7078      1.1     skrll 	as_bad (_("..."));
   7079      1.1     skrll       reported++;
   7080      1.1     skrll       return;
   7081      1.1     skrll     }
   7082      1.1     skrll 
   7083      1.1     skrll   if (frag_now_fix () != 0
   7084      1.1     skrll       && (! frag_now->tc_frag_data.is_insn
   7085      1.1     skrll  	  || (vinsn_has_specific_opcodes (vinsn) && use_transform ())
   7086      1.1     skrll  	  || (!use_transform ()) != frag_now->tc_frag_data.is_no_transform
   7087      1.1     skrll  	  || (directive_state[directive_longcalls]
   7088      1.1     skrll 	      != frag_now->tc_frag_data.use_longcalls)
   7089      1.1     skrll  	  || (directive_state[directive_absolute_literals]
   7090      1.1     skrll 	      != frag_now->tc_frag_data.use_absolute_literals)))
   7091      1.1     skrll     {
   7092      1.1     skrll       frag_wane (frag_now);
   7093      1.1     skrll       frag_new (0);
   7094      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7095      1.1     skrll     }
   7096      1.1     skrll 
   7097      1.1     skrll   if (workaround_a0_b_retw
   7098      1.1     skrll       && vinsn->num_slots == 1
   7099      1.1     skrll       && (get_last_insn_flags (now_seg, now_subseg) & FLAG_IS_A0_WRITER) != 0
   7100      1.1     skrll       && xtensa_opcode_is_branch (isa, vinsn->slots[0].opcode) == 1
   7101      1.1     skrll       && use_transform ())
   7102      1.1     skrll     {
   7103      1.1     skrll       has_a0_b_retw = TRUE;
   7104      1.1     skrll 
   7105      1.1     skrll       /* Mark this fragment with the special RELAX_ADD_NOP_IF_A0_B_RETW.
   7106      1.1     skrll 	 After the first assembly pass we will check all of them and
   7107      1.1     skrll 	 add a nop if needed.  */
   7108      1.1     skrll       frag_now->tc_frag_data.is_insn = TRUE;
   7109      1.1     skrll       frag_var (rs_machine_dependent, 4, 4,
   7110      1.1     skrll 		RELAX_ADD_NOP_IF_A0_B_RETW,
   7111      1.1     skrll 		frag_now->fr_symbol,
   7112      1.1     skrll 		frag_now->fr_offset,
   7113      1.1     skrll 		NULL);
   7114      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7115      1.1     skrll       frag_now->tc_frag_data.is_insn = TRUE;
   7116      1.1     skrll       frag_var (rs_machine_dependent, 4, 4,
   7117      1.1     skrll 		RELAX_ADD_NOP_IF_A0_B_RETW,
   7118      1.1     skrll 		frag_now->fr_symbol,
   7119      1.1     skrll 		frag_now->fr_offset,
   7120      1.1     skrll 		NULL);
   7121      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7122      1.1     skrll     }
   7123      1.1     skrll 
   7124      1.1     skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   7125      1.1     skrll     {
   7126      1.1     skrll       tinsn = &vinsn->slots[slot];
   7127      1.1     skrll 
   7128      1.1     skrll       /* See if the instruction implies an aligned section.  */
   7129      1.1     skrll       if (xtensa_opcode_is_loop (isa, tinsn->opcode) == 1)
   7130      1.1     skrll 	record_alignment (now_seg, 2);
   7131      1.1     skrll 
   7132      1.1     skrll       /* Determine the best line number for debug info.  */
   7133      1.1     skrll       if ((tinsn->loc_directive_seen || !loc_directive_seen)
   7134      1.1     skrll 	  && (tinsn->debug_line.filenum != debug_line.filenum
   7135      1.1     skrll 	      || tinsn->debug_line.line < debug_line.line
   7136      1.1     skrll 	      || tinsn->debug_line.column < debug_line.column))
   7137      1.1     skrll 	debug_line = tinsn->debug_line;
   7138      1.1     skrll       if (tinsn->loc_directive_seen)
   7139      1.1     skrll 	loc_directive_seen = TRUE;
   7140      1.1     skrll     }
   7141      1.1     skrll 
   7142      1.1     skrll   /* Special cases for instructions that force an alignment... */
   7143      1.1     skrll   /* None of these opcodes are bundle-able.  */
   7144      1.1     skrll   if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1)
   7145      1.1     skrll     {
   7146      1.1     skrll       int max_fill;
   7147      1.1     skrll 
   7148      1.1     skrll       /* Remember the symbol that marks the end of the loop in the frag
   7149      1.1     skrll 	 that marks the start of the loop.  This way we can easily find
   7150      1.1     skrll 	 the end of the loop at the beginning, without adding special code
   7151      1.1     skrll 	 to mark the loop instructions themselves.  */
   7152      1.1     skrll       symbolS *target_sym = NULL;
   7153      1.1     skrll       if (vinsn->slots[0].tok[1].X_op == O_symbol)
   7154      1.1     skrll 	target_sym = vinsn->slots[0].tok[1].X_add_symbol;
   7155      1.1     skrll 
   7156      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7157      1.1     skrll       frag_now->tc_frag_data.is_insn = TRUE;
   7158      1.1     skrll 
   7159      1.1     skrll       max_fill = get_text_align_max_fill_size
   7160      1.1     skrll 	(get_text_align_power (xtensa_fetch_width),
   7161      1.1     skrll 	 TRUE, frag_now->tc_frag_data.is_no_density);
   7162      1.1     skrll 
   7163      1.1     skrll       if (use_transform ())
   7164      1.1     skrll 	frag_var (rs_machine_dependent, max_fill, max_fill,
   7165      1.1     skrll 		  RELAX_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
   7166      1.1     skrll       else
   7167      1.1     skrll 	frag_var (rs_machine_dependent, 0, 0,
   7168      1.1     skrll 		  RELAX_CHECK_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
   7169      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7170      1.1     skrll     }
   7171      1.1     skrll 
   7172      1.1     skrll   if (vinsn->slots[0].opcode == xtensa_entry_opcode
   7173      1.1     skrll       && !vinsn->slots[0].is_specific_opcode)
   7174      1.1     skrll     {
   7175      1.1     skrll       xtensa_mark_literal_pool_location ();
   7176      1.1     skrll       xtensa_move_labels (frag_now, 0);
   7177      1.1     skrll       frag_var (rs_align_test, 1, 1, 0, NULL, 2, NULL);
   7178      1.1     skrll     }
   7179      1.1     skrll 
   7180      1.1     skrll   if (vinsn->num_slots == 1)
   7181      1.1     skrll     {
   7182      1.1     skrll       if (workaround_a0_b_retw && use_transform ())
   7183      1.1     skrll 	set_last_insn_flags (now_seg, now_subseg, FLAG_IS_A0_WRITER,
   7184      1.1     skrll 			     is_register_writer (&vinsn->slots[0], "a", 0));
   7185      1.1     skrll 
   7186      1.1     skrll       set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND,
   7187      1.1     skrll 			   is_bad_loopend_opcode (&vinsn->slots[0]));
   7188      1.1     skrll     }
   7189      1.1     skrll   else
   7190      1.1     skrll     set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND, FALSE);
   7191      1.1     skrll 
   7192      1.1     skrll   insn_size = xtensa_format_length (isa, vinsn->format);
   7193      1.1     skrll 
   7194      1.1     skrll   extra_space = relaxation_requirements (vinsn, &finish_frag);
   7195      1.1     skrll 
   7196      1.1     skrll   /* vinsn_to_insnbuf will produce the error.  */
   7197      1.1     skrll   if (vinsn->format != XTENSA_UNDEFINED)
   7198      1.1     skrll     {
   7199      1.1     skrll       f = frag_more (insn_size + extra_space);
   7200      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7201      1.1     skrll       frag_now->tc_frag_data.is_insn = TRUE;
   7202      1.1     skrll     }
   7203      1.1     skrll 
   7204      1.1     skrll   vinsn_to_insnbuf (vinsn, f, frag_now, FALSE);
   7205      1.1     skrll   if (vinsn->format == XTENSA_UNDEFINED)
   7206      1.1     skrll     return;
   7207      1.1     skrll 
   7208      1.1     skrll   xtensa_insnbuf_to_chars (isa, vinsn->insnbuf, (unsigned char *) f, 0);
   7209      1.1     skrll 
   7210  1.1.1.4  christos   if (debug_type == DEBUG_DWARF2 || loc_directive_seen)
   7211  1.1.1.8  christos     dwarf2_gen_line_info (frag_now_fix () - (insn_size + extra_space),
   7212  1.1.1.8  christos 			  &debug_line);
   7213      1.1     skrll 
   7214      1.1     skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   7215  1.1.1.2  christos     {
   7216      1.1     skrll       tinsn = &vinsn->slots[slot];
   7217      1.1     skrll       frag_now->tc_frag_data.slot_subtypes[slot] = tinsn->subtype;
   7218  1.1.1.2  christos       frag_now->tc_frag_data.slot_symbols[slot] = tinsn->symbol;
   7219      1.1     skrll       frag_now->tc_frag_data.slot_offsets[slot] = tinsn->offset;
   7220      1.1     skrll       frag_now->tc_frag_data.literal_frags[slot] = tinsn->literal_frag;
   7221      1.1     skrll       if (tinsn->opcode == xtensa_l32r_opcode)
   7222      1.1     skrll 	frag_now->tc_frag_data.literal_frags[slot]
   7223      1.1     skrll 	  = symbol_get_frag (tinsn->tok[1].X_add_symbol);
   7224      1.1     skrll       if (tinsn->literal_space != 0)
   7225      1.1     skrll 	xg_assemble_literal_space (tinsn->literal_space, slot);
   7226      1.1     skrll       frag_now->tc_frag_data.free_reg[slot] = tinsn->extra_arg;
   7227      1.1     skrll 
   7228      1.1     skrll       if (tinsn->subtype == RELAX_NARROW)
   7229      1.1     skrll 	gas_assert (vinsn->num_slots == 1);
   7230      1.1     skrll       if (xtensa_opcode_is_jump (isa, tinsn->opcode) == 1)
   7231      1.1     skrll 	is_jump = TRUE;
   7232      1.1     skrll       if (xtensa_opcode_is_branch (isa, tinsn->opcode) == 1)
   7233      1.1     skrll 	is_branch = TRUE;
   7234      1.1     skrll 
   7235      1.1     skrll       if (tinsn->subtype || tinsn->symbol || tinsn->offset
   7236      1.1     skrll 	  || tinsn->literal_frag || is_jump || is_branch)
   7237      1.1     skrll 	finish_frag = TRUE;
   7238      1.1     skrll     }
   7239      1.1     skrll 
   7240      1.1     skrll   if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
   7241      1.1     skrll     frag_now->tc_frag_data.is_specific_opcode = TRUE;
   7242      1.1     skrll 
   7243      1.1     skrll   if (finish_frag)
   7244      1.1     skrll     {
   7245      1.1     skrll       frag_variant (rs_machine_dependent,
   7246      1.1     skrll 		    extra_space, extra_space, RELAX_SLOTS,
   7247      1.1     skrll 		    frag_now->fr_symbol, frag_now->fr_offset, f);
   7248      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7249      1.1     skrll     }
   7250      1.1     skrll 
   7251      1.1     skrll   /* Special cases for loops:
   7252      1.1     skrll      close_loop_end should be inserted AFTER short_loop.
   7253      1.1     skrll      Make sure that CLOSE loops are processed BEFORE short_loops
   7254      1.1     skrll      when converting them.  */
   7255      1.1     skrll 
   7256      1.1     skrll   /* "short_loop": Add a NOP if the loop is < 4 bytes.  */
   7257      1.1     skrll   if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1
   7258      1.1     skrll       && !vinsn->slots[0].is_specific_opcode)
   7259      1.1     skrll     {
   7260      1.1     skrll       if (workaround_short_loop && use_transform ())
   7261      1.1     skrll 	{
   7262      1.1     skrll 	  maybe_has_short_loop = TRUE;
   7263      1.1     skrll 	  frag_now->tc_frag_data.is_insn = TRUE;
   7264      1.1     skrll 	  frag_var (rs_machine_dependent, 4, 4,
   7265      1.1     skrll 		    RELAX_ADD_NOP_IF_SHORT_LOOP,
   7266      1.1     skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7267      1.1     skrll 	  frag_now->tc_frag_data.is_insn = TRUE;
   7268      1.1     skrll 	  frag_var (rs_machine_dependent, 4, 4,
   7269      1.1     skrll 		    RELAX_ADD_NOP_IF_SHORT_LOOP,
   7270      1.1     skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7271      1.1     skrll 	}
   7272      1.1     skrll 
   7273      1.1     skrll       /* "close_loop_end": Add up to 12 bytes of NOPs to keep a
   7274      1.1     skrll 	 loop at least 12 bytes away from another loop's end.  */
   7275      1.1     skrll       if (workaround_close_loop_end && use_transform ())
   7276      1.1     skrll 	{
   7277      1.1     skrll 	  maybe_has_close_loop_end = TRUE;
   7278  1.1.1.2  christos 	  frag_now->tc_frag_data.is_insn = TRUE;
   7279      1.1     skrll 	  frag_var (rs_machine_dependent, 12, 12,
   7280  1.1.1.2  christos 		    RELAX_ADD_NOP_IF_CLOSE_LOOP_END,
   7281      1.1     skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7282      1.1     skrll 	}
   7283      1.1     skrll     }
   7284  1.1.1.4  christos 
   7285  1.1.1.4  christos   if (use_transform ())
   7286  1.1.1.4  christos     {
   7287      1.1     skrll       if (is_jump)
   7288      1.1     skrll 	{
   7289      1.1     skrll 	  gas_assert (finish_frag);
   7290  1.1.1.2  christos 	  frag_var (rs_machine_dependent,
   7291      1.1     skrll 		    xtensa_fetch_width, xtensa_fetch_width,
   7292  1.1.1.2  christos 		    RELAX_UNREACHABLE,
   7293      1.1     skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7294      1.1     skrll 	  xtensa_set_frag_assembly_state (frag_now);
   7295      1.1     skrll 	  xtensa_maybe_create_trampoline_frag ();
   7296      1.1     skrll 	  /* Always create one here.  */
   7297      1.1     skrll 	  xtensa_maybe_create_literal_pool_frag (TRUE, FALSE);
   7298      1.1     skrll 	}
   7299      1.1     skrll       else if (is_branch && do_align_targets ())
   7300      1.1     skrll 	{
   7301      1.1     skrll 	  gas_assert (finish_frag);
   7302      1.1     skrll 	  frag_var (rs_machine_dependent,
   7303      1.1     skrll 		    xtensa_fetch_width, xtensa_fetch_width,
   7304      1.1     skrll 		    RELAX_MAYBE_UNREACHABLE,
   7305      1.1     skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7306      1.1     skrll 	  xtensa_set_frag_assembly_state (frag_now);
   7307      1.1     skrll 	  frag_var (rs_machine_dependent,
   7308      1.1     skrll 		    0, 0,
   7309      1.1     skrll 		    RELAX_MAYBE_DESIRE_ALIGN,
   7310      1.1     skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7311      1.1     skrll 	  xtensa_set_frag_assembly_state (frag_now);
   7312      1.1     skrll 	}
   7313      1.1     skrll     }
   7314      1.1     skrll 
   7315      1.1     skrll   /* Now, if the original opcode was a call...  */
   7316      1.1     skrll   if (do_align_targets ()
   7317      1.1     skrll       && xtensa_opcode_is_call (isa, vinsn->slots[0].opcode) == 1)
   7318      1.1     skrll     {
   7319      1.1     skrll       float freq = get_subseg_total_freq (now_seg, now_subseg);
   7320      1.1     skrll       frag_now->tc_frag_data.is_insn = TRUE;
   7321      1.1     skrll       frag_var (rs_machine_dependent, 4, (int) freq, RELAX_DESIRE_ALIGN,
   7322      1.1     skrll 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7323      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7324      1.1     skrll     }
   7325      1.1     skrll 
   7326      1.1     skrll   if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
   7327      1.1     skrll     {
   7328      1.1     skrll       frag_wane (frag_now);
   7329      1.1     skrll       frag_new (0);
   7330      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   7331      1.1     skrll     }
   7332      1.1     skrll }
   7333      1.1     skrll 
   7334      1.1     skrll 
   7335      1.1     skrll /* xtensa_end and helper functions.  */
   7337      1.1     skrll 
   7338      1.1     skrll static void xtensa_cleanup_align_frags (void);
   7339      1.1     skrll static void xtensa_fix_target_frags (void);
   7340      1.1     skrll static void xtensa_mark_narrow_branches (void);
   7341      1.1     skrll static void xtensa_mark_zcl_first_insns (void);
   7342      1.1     skrll static void xtensa_mark_difference_of_two_symbols (void);
   7343      1.1     skrll static void xtensa_fix_a0_b_retw_frags (void);
   7344      1.1     skrll static void xtensa_fix_b_j_loop_end_frags (void);
   7345      1.1     skrll static void xtensa_fix_close_loop_end_frags (void);
   7346      1.1     skrll static void xtensa_fix_short_loop_frags (void);
   7347      1.1     skrll static void xtensa_sanity_check (void);
   7348      1.1     skrll static void xtensa_add_config_info (void);
   7349      1.1     skrll 
   7350      1.1     skrll void
   7351      1.1     skrll xtensa_end (void)
   7352      1.1     skrll {
   7353      1.1     skrll   directive_balance ();
   7354      1.1     skrll   xtensa_flush_pending_output ();
   7355      1.1     skrll 
   7356      1.1     skrll   past_xtensa_end = TRUE;
   7357      1.1     skrll 
   7358      1.1     skrll   xtensa_move_literals ();
   7359      1.1     skrll 
   7360      1.1     skrll   xtensa_reorder_segments ();
   7361      1.1     skrll   xtensa_cleanup_align_frags ();
   7362      1.1     skrll   xtensa_fix_target_frags ();
   7363      1.1     skrll   if (workaround_a0_b_retw && has_a0_b_retw)
   7364      1.1     skrll     xtensa_fix_a0_b_retw_frags ();
   7365      1.1     skrll   if (workaround_b_j_loop_end)
   7366      1.1     skrll     xtensa_fix_b_j_loop_end_frags ();
   7367      1.1     skrll 
   7368      1.1     skrll   /* "close_loop_end" should be processed BEFORE "short_loop".  */
   7369  1.1.1.4  christos   if (workaround_close_loop_end && maybe_has_close_loop_end)
   7370  1.1.1.4  christos     xtensa_fix_close_loop_end_frags ();
   7371      1.1     skrll 
   7372      1.1     skrll   if (workaround_short_loop && maybe_has_short_loop)
   7373  1.1.1.6  christos     xtensa_fix_short_loop_frags ();
   7374  1.1.1.6  christos   if (align_targets)
   7375  1.1.1.6  christos     xtensa_mark_narrow_branches ();
   7376  1.1.1.6  christos   xtensa_mark_zcl_first_insns ();
   7377  1.1.1.6  christos 
   7378      1.1     skrll   xtensa_sanity_check ();
   7379  1.1.1.6  christos 
   7380  1.1.1.6  christos   xtensa_add_config_info ();
   7381  1.1.1.6  christos 
   7382  1.1.1.6  christos   xtensa_check_frag_count ();
   7383  1.1.1.6  christos }
   7384  1.1.1.6  christos 
   7385  1.1.1.6  christos struct trampoline_chain_entry
   7386  1.1.1.6  christos {
   7387  1.1.1.6  christos   symbolS *sym;
   7388  1.1.1.6  christos   addressT offset;
   7389  1.1.1.6  christos };
   7390  1.1.1.6  christos 
   7391  1.1.1.6  christos /* Trampoline chain for a given (sym, offset) pair is a sorted array
   7392  1.1.1.6  christos    of locations of trampoline jumps leading there.  Jumps are represented
   7393  1.1.1.4  christos    as pairs (sym, offset): trampoline frag symbol and offset of the jump
   7394  1.1.1.6  christos    inside the frag.  */
   7395  1.1.1.6  christos struct trampoline_chain
   7396  1.1.1.6  christos {
   7397  1.1.1.6  christos   struct trampoline_chain_entry target;
   7398  1.1.1.6  christos   struct trampoline_chain_entry *entry;
   7399  1.1.1.6  christos   size_t n_entries;
   7400  1.1.1.6  christos   size_t n_max;
   7401  1.1.1.6  christos   bfd_boolean needs_sorting;
   7402  1.1.1.6  christos };
   7403  1.1.1.6  christos 
   7404  1.1.1.6  christos struct trampoline_chain_index
   7405  1.1.1.4  christos {
   7406  1.1.1.4  christos   struct trampoline_chain *entry;
   7407  1.1.1.4  christos   size_t n_entries;
   7408  1.1.1.4  christos   size_t n_max;
   7409  1.1.1.4  christos   bfd_boolean needs_sorting;
   7410  1.1.1.4  christos };
   7411  1.1.1.6  christos 
   7412  1.1.1.6  christos struct trampoline_index
   7413  1.1.1.6  christos {
   7414  1.1.1.6  christos   fragS **entry;
   7415  1.1.1.4  christos   size_t n_entries;
   7416  1.1.1.4  christos   size_t n_max;
   7417  1.1.1.4  christos };
   7418  1.1.1.4  christos 
   7419  1.1.1.6  christos struct trampoline_seg
   7420  1.1.1.4  christos {
   7421  1.1.1.4  christos   struct trampoline_seg *next;
   7422  1.1.1.4  christos   asection *seg;
   7423  1.1.1.4  christos   /* Trampolines ordered by their frag fr_address */
   7424  1.1.1.4  christos   struct trampoline_index index;
   7425  1.1.1.4  christos   /* Known trampoline chains ordered by (sym, offset) pair */
   7426  1.1.1.4  christos   struct trampoline_chain_index chain_index;
   7427  1.1.1.4  christos };
   7428  1.1.1.4  christos 
   7429  1.1.1.4  christos static struct trampoline_seg trampoline_seg_list;
   7430  1.1.1.4  christos #define J_RANGE (128 * 1024)
   7431  1.1.1.4  christos #define J_MARGIN 4096
   7432  1.1.1.4  christos 
   7433  1.1.1.4  christos static int unreachable_count = 0;
   7434  1.1.1.4  christos 
   7435  1.1.1.4  christos 
   7436  1.1.1.4  christos static void
   7437  1.1.1.4  christos xtensa_maybe_create_trampoline_frag (void)
   7438  1.1.1.4  christos {
   7439  1.1.1.4  christos   if (!use_trampolines)
   7440  1.1.1.4  christos     return;
   7441  1.1.1.4  christos 
   7442  1.1.1.4  christos   /* We create an area for possible trampolines every 10 unreachable frags.
   7443  1.1.1.4  christos      These are preferred over the ones not preceded by an unreachable frag,
   7444  1.1.1.4  christos      because we don't have to jump around them. This function is called after
   7445  1.1.1.4  christos      each RELAX_UNREACHABLE frag is created.  */
   7446  1.1.1.4  christos 
   7447  1.1.1.4  christos   if (++unreachable_count > 10)
   7448  1.1.1.4  christos     {
   7449  1.1.1.4  christos       xtensa_create_trampoline_frag (FALSE);
   7450  1.1.1.4  christos       clear_frag_count ();
   7451  1.1.1.4  christos       unreachable_count = 0;
   7452  1.1.1.4  christos     }
   7453  1.1.1.4  christos }
   7454  1.1.1.4  christos 
   7455  1.1.1.4  christos static void
   7456  1.1.1.4  christos xtensa_check_frag_count (void)
   7457  1.1.1.4  christos {
   7458  1.1.1.4  christos   if (!use_trampolines || frag_now->tc_frag_data.is_no_transform)
   7459  1.1.1.4  christos     return;
   7460  1.1.1.4  christos 
   7461  1.1.1.4  christos   /* We create an area for possible trampolines every 8000 frags or so. This
   7462  1.1.1.4  christos      is an estimate based on the max range of a "j" insn (+/-128K) divided
   7463  1.1.1.4  christos      by a typical frag byte count (16), minus a few for safety. This function
   7464  1.1.1.4  christos      is called after each source line is processed.  */
   7465  1.1.1.4  christos 
   7466  1.1.1.4  christos   if (get_frag_count () > 8000)
   7467  1.1.1.4  christos     {
   7468  1.1.1.4  christos       xtensa_create_trampoline_frag (TRUE);
   7469  1.1.1.4  christos       clear_frag_count ();
   7470  1.1.1.4  christos       unreachable_count = 0;
   7471  1.1.1.4  christos     }
   7472  1.1.1.4  christos 
   7473  1.1.1.4  christos   /* We create an area for a possible literal pool every N (default 5000)
   7474  1.1.1.6  christos      frags or so.  */
   7475  1.1.1.6  christos   xtensa_maybe_create_literal_pool_frag (TRUE, TRUE);
   7476  1.1.1.6  christos }
   7477  1.1.1.6  christos 
   7478  1.1.1.6  christos static xtensa_insnbuf trampoline_buf = NULL;
   7479  1.1.1.6  christos static xtensa_insnbuf trampoline_slotbuf = NULL;
   7480  1.1.1.6  christos 
   7481  1.1.1.6  christos static xtensa_insnbuf litpool_buf = NULL;
   7482  1.1.1.6  christos static xtensa_insnbuf litpool_slotbuf = NULL;
   7483  1.1.1.6  christos 
   7484  1.1.1.6  christos #define TRAMPOLINE_FRAG_SIZE 3000
   7485  1.1.1.6  christos 
   7486  1.1.1.6  christos static struct trampoline_seg *
   7487  1.1.1.6  christos find_trampoline_seg (asection *seg)
   7488  1.1.1.6  christos {
   7489  1.1.1.6  christos   struct trampoline_seg *ts = trampoline_seg_list.next;
   7490  1.1.1.6  christos   static struct trampoline_seg *mr;
   7491  1.1.1.6  christos 
   7492  1.1.1.6  christos   if (mr && mr->seg == seg)
   7493  1.1.1.6  christos     return mr;
   7494  1.1.1.6  christos 
   7495  1.1.1.6  christos   for ( ; ts; ts = ts->next)
   7496  1.1.1.6  christos     {
   7497  1.1.1.6  christos       if (ts->seg == seg)
   7498  1.1.1.6  christos 	{
   7499  1.1.1.6  christos 	  mr = ts;
   7500  1.1.1.6  christos 	  return ts;
   7501  1.1.1.6  christos 	}
   7502  1.1.1.6  christos     }
   7503  1.1.1.6  christos 
   7504  1.1.1.6  christos   return NULL;
   7505  1.1.1.6  christos }
   7506  1.1.1.6  christos 
   7507  1.1.1.6  christos static size_t xg_find_trampoline (const struct trampoline_index *idx,
   7508  1.1.1.6  christos 				  addressT addr)
   7509  1.1.1.6  christos {
   7510  1.1.1.6  christos   size_t a = 0;
   7511  1.1.1.6  christos   size_t b = idx->n_entries;
   7512  1.1.1.6  christos 
   7513  1.1.1.6  christos   while (b - a > 1)
   7514  1.1.1.6  christos     {
   7515  1.1.1.6  christos       size_t c = (a + b) / 2;
   7516  1.1.1.6  christos 
   7517  1.1.1.6  christos       if (idx->entry[c]->fr_address <= addr)
   7518  1.1.1.6  christos 	a = c;
   7519  1.1.1.6  christos       else
   7520  1.1.1.6  christos 	b = c;
   7521  1.1.1.6  christos     }
   7522  1.1.1.6  christos   return a;
   7523  1.1.1.6  christos }
   7524  1.1.1.6  christos 
   7525  1.1.1.6  christos static void xg_add_trampoline_to_index (struct trampoline_index *idx,
   7526  1.1.1.6  christos 					fragS *fragP)
   7527  1.1.1.6  christos {
   7528  1.1.1.6  christos   if (idx->n_entries == idx->n_max)
   7529  1.1.1.6  christos     {
   7530  1.1.1.6  christos       idx->n_max = (idx->n_entries + 1) * 2;
   7531  1.1.1.6  christos       idx->entry = xrealloc (idx->entry,
   7532  1.1.1.6  christos 			     sizeof (*idx->entry) * idx->n_max);
   7533  1.1.1.6  christos     }
   7534  1.1.1.6  christos   idx->entry[idx->n_entries] = fragP;
   7535  1.1.1.6  christos   ++idx->n_entries;
   7536  1.1.1.6  christos }
   7537  1.1.1.6  christos 
   7538  1.1.1.6  christos static void xg_remove_trampoline_from_index (struct trampoline_index *idx,
   7539  1.1.1.6  christos 					     size_t i)
   7540  1.1.1.6  christos {
   7541  1.1.1.4  christos   gas_assert (i < idx->n_entries);
   7542  1.1.1.4  christos   memmove (idx->entry + i, idx->entry + i + 1,
   7543  1.1.1.4  christos 	   (idx->n_entries - i - 1) * sizeof (*idx->entry));
   7544  1.1.1.4  christos   --idx->n_entries;
   7545  1.1.1.4  christos }
   7546  1.1.1.4  christos 
   7547  1.1.1.4  christos static void xg_add_trampoline_to_seg (struct trampoline_seg *ts,
   7548  1.1.1.4  christos 				      fragS *fragP)
   7549  1.1.1.4  christos {
   7550  1.1.1.6  christos   xg_add_trampoline_to_index (&ts->index, fragP);
   7551  1.1.1.4  christos }
   7552  1.1.1.4  christos 
   7553  1.1.1.4  christos static void
   7554  1.1.1.4  christos xtensa_create_trampoline_frag (bfd_boolean needs_jump_around)
   7555  1.1.1.4  christos {
   7556  1.1.1.4  christos   /* Emit a frag where we can place intermediate jump instructions,
   7557  1.1.1.5  christos      in case we need to jump farther than 128K bytes.
   7558  1.1.1.4  christos      Each jump instruction takes three bytes.
   7559  1.1.1.4  christos      We allocate enough for 1000 trampolines in each frag.
   7560  1.1.1.4  christos      If that's not enough, oh well.  */
   7561  1.1.1.4  christos 
   7562  1.1.1.4  christos   struct trampoline_seg *ts = find_trampoline_seg (now_seg);
   7563  1.1.1.4  christos   char *varP;
   7564  1.1.1.4  christos   fragS *fragP;
   7565  1.1.1.4  christos   int size = TRAMPOLINE_FRAG_SIZE;
   7566  1.1.1.4  christos 
   7567  1.1.1.4  christos   if (ts == NULL)
   7568  1.1.1.4  christos     {
   7569  1.1.1.4  christos       ts = XCNEW(struct trampoline_seg);
   7570  1.1.1.4  christos       ts->next = trampoline_seg_list.next;
   7571  1.1.1.4  christos       trampoline_seg_list.next = ts;
   7572  1.1.1.4  christos       ts->seg = now_seg;
   7573  1.1.1.6  christos     }
   7574  1.1.1.6  christos 
   7575  1.1.1.4  christos   frag_wane (frag_now);
   7576  1.1.1.4  christos   frag_new (0);
   7577  1.1.1.6  christos   xtensa_set_frag_assembly_state (frag_now);
   7578  1.1.1.6  christos   varP = frag_var (rs_machine_dependent, size, size, RELAX_TRAMPOLINE, NULL, 0, NULL);
   7579  1.1.1.6  christos   fragP = (fragS *)(varP - SIZEOF_STRUCT_FRAG);
   7580  1.1.1.6  christos   if (trampoline_buf == NULL)
   7581  1.1.1.4  christos     {
   7582  1.1.1.6  christos       trampoline_buf = xtensa_insnbuf_alloc (xtensa_default_isa);
   7583  1.1.1.4  christos       trampoline_slotbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
   7584  1.1.1.6  christos     }
   7585  1.1.1.6  christos   fragP->tc_frag_data.needs_jump_around = needs_jump_around;
   7586  1.1.1.4  christos   xg_add_trampoline_to_seg (ts, fragP);
   7587  1.1.1.8  christos }
   7588  1.1.1.8  christos 
   7589  1.1.1.8  christos static bfd_boolean xg_is_trampoline_frag_full (const fragS *fragP)
   7590  1.1.1.8  christos {
   7591  1.1.1.8  christos   return fragP->fr_var < 3;
   7592  1.1.1.8  christos }
   7593  1.1.1.8  christos 
   7594  1.1.1.8  christos static int xg_order_trampoline_chain_entry (const void *a, const void *b)
   7595  1.1.1.8  christos {
   7596  1.1.1.8  christos   const struct trampoline_chain_entry *pa = a;
   7597  1.1.1.8  christos   const struct trampoline_chain_entry *pb = b;
   7598  1.1.1.6  christos 
   7599  1.1.1.6  christos   if (pa->sym != pb->sym)
   7600  1.1.1.6  christos     {
   7601  1.1.1.6  christos       valueT aval = S_GET_VALUE (pa->sym);
   7602  1.1.1.6  christos       valueT bval = S_GET_VALUE (pb->sym);
   7603  1.1.1.6  christos 
   7604  1.1.1.6  christos       if (aval != bval)
   7605  1.1.1.6  christos 	return aval < bval ? -1 : 1;
   7606  1.1.1.6  christos     }
   7607  1.1.1.6  christos   if (pa->offset != pb->offset)
   7608  1.1.1.6  christos     return pa->offset < pb->offset ? -1 : 1;
   7609  1.1.1.6  christos   return 0;
   7610  1.1.1.6  christos }
   7611  1.1.1.6  christos 
   7612  1.1.1.6  christos static void xg_sort_trampoline_chain (struct trampoline_chain *tc)
   7613  1.1.1.6  christos {
   7614  1.1.1.6  christos   qsort (tc->entry, tc->n_entries, sizeof (*tc->entry),
   7615  1.1.1.6  christos 	 xg_order_trampoline_chain_entry);
   7616  1.1.1.6  christos   tc->needs_sorting = FALSE;
   7617  1.1.1.6  christos }
   7618  1.1.1.4  christos 
   7619  1.1.1.6  christos /* Find entry index in the given chain with maximal address <= source.  */
   7620  1.1.1.6  christos static size_t xg_find_chain_entry (struct trampoline_chain *tc,
   7621  1.1.1.6  christos 				   addressT source)
   7622  1.1.1.6  christos {
   7623  1.1.1.6  christos   size_t a = 0;
   7624  1.1.1.6  christos   size_t b = tc->n_entries;
   7625  1.1.1.6  christos 
   7626  1.1.1.4  christos   if (tc->needs_sorting)
   7627  1.1.1.6  christos     xg_sort_trampoline_chain (tc);
   7628  1.1.1.6  christos 
   7629  1.1.1.4  christos   while (b - a > 1)
   7630  1.1.1.6  christos     {
   7631  1.1.1.6  christos       size_t c = (a + b) / 2;
   7632  1.1.1.6  christos       struct trampoline_chain_entry *e = tc->entry + c;
   7633  1.1.1.6  christos 
   7634  1.1.1.6  christos       if (S_GET_VALUE(e->sym) + e->offset <= source)
   7635  1.1.1.6  christos 	a = c;
   7636  1.1.1.6  christos       else
   7637  1.1.1.6  christos 	b = c;
   7638  1.1.1.6  christos     }
   7639  1.1.1.6  christos   return a;
   7640  1.1.1.6  christos }
   7641  1.1.1.6  christos 
   7642  1.1.1.6  christos /* Find the best jump target for the source in the given trampoline chain.
   7643  1.1.1.6  christos    The best jump target is the one that results in the shortest path to the
   7644  1.1.1.6  christos    final target, it's the location of the jump closest to the final target,
   7645  1.1.1.6  christos    but within the J_RANGE - J_MARGIN from the source.  */
   7646  1.1.1.6  christos static struct trampoline_chain_entry *
   7647  1.1.1.6  christos xg_get_best_chain_entry (struct trampoline_chain *tc, addressT source)
   7648  1.1.1.6  christos {
   7649  1.1.1.6  christos   addressT target = S_GET_VALUE(tc->target.sym) + tc->target.offset;
   7650  1.1.1.6  christos   size_t i = xg_find_chain_entry (tc, source);
   7651  1.1.1.6  christos   struct trampoline_chain_entry *e = tc->entry + i;
   7652  1.1.1.6  christos   int step = target < source ? -1 : 1;
   7653  1.1.1.6  christos   addressT chained_target;
   7654  1.1.1.6  christos   offsetT off;
   7655  1.1.1.6  christos 
   7656  1.1.1.6  christos   if (target > source &&
   7657  1.1.1.6  christos       S_GET_VALUE(e->sym) + e->offset <= source &&
   7658  1.1.1.6  christos       i + 1 < tc->n_entries)
   7659  1.1.1.6  christos     ++i;
   7660  1.1.1.6  christos 
   7661  1.1.1.6  christos   while (i + step < tc->n_entries)
   7662  1.1.1.6  christos     {
   7663  1.1.1.6  christos       struct trampoline_chain_entry *next = tc->entry + i + step;
   7664  1.1.1.6  christos 
   7665  1.1.1.6  christos       chained_target = S_GET_VALUE(next->sym) + next->offset;
   7666  1.1.1.6  christos       off = source - chained_target;
   7667  1.1.1.6  christos 
   7668  1.1.1.6  christos       if (labs (off) >= J_RANGE - J_MARGIN)
   7669  1.1.1.6  christos 	break;
   7670  1.1.1.4  christos 
   7671  1.1.1.4  christos       i += step;
   7672  1.1.1.6  christos     }
   7673  1.1.1.6  christos 
   7674  1.1.1.6  christos   e = tc->entry + i;
   7675  1.1.1.6  christos   chained_target = S_GET_VALUE(e->sym) + e->offset;
   7676  1.1.1.6  christos   off = source - chained_target;
   7677  1.1.1.6  christos 
   7678  1.1.1.6  christos   if (labs (off) < J_MARGIN ||
   7679  1.1.1.6  christos       labs (off) >= J_RANGE - J_MARGIN)
   7680  1.1.1.6  christos     return &tc->target;
   7681  1.1.1.8  christos   return tc->entry + i;
   7682  1.1.1.8  christos }
   7683  1.1.1.8  christos 
   7684  1.1.1.8  christos static int xg_order_trampoline_chain (const void *a, const void *b)
   7685  1.1.1.8  christos {
   7686  1.1.1.8  christos   const struct trampoline_chain *_pa = a;
   7687  1.1.1.8  christos   const struct trampoline_chain *_pb = b;
   7688  1.1.1.8  christos   const struct trampoline_chain_entry *pa = &_pa->target;
   7689  1.1.1.8  christos   const struct trampoline_chain_entry *pb = &_pb->target;
   7690  1.1.1.6  christos   symbolS *s1 = pa->sym;
   7691  1.1.1.8  christos   symbolS *s2 = pb->sym;
   7692  1.1.1.8  christos 
   7693  1.1.1.8  christos   if (s1 != s2)
   7694  1.1.1.8  christos     {
   7695  1.1.1.8  christos       symbolS *tmp = symbol_symbolS (s1);
   7696  1.1.1.8  christos       if (tmp)
   7697  1.1.1.8  christos 	s1 = tmp;
   7698  1.1.1.6  christos 
   7699  1.1.1.6  christos       tmp = symbol_symbolS (s2);
   7700  1.1.1.6  christos       if (tmp)
   7701  1.1.1.6  christos 	s2 = tmp;
   7702  1.1.1.6  christos 
   7703  1.1.1.6  christos       if (s1 != s2)
   7704  1.1.1.6  christos 	return s1 < s2 ? -1 : 1;
   7705  1.1.1.6  christos     }
   7706  1.1.1.6  christos 
   7707  1.1.1.6  christos   if (pa->offset != pb->offset)
   7708  1.1.1.6  christos     return pa->offset < pb->offset ? -1 : 1;
   7709  1.1.1.6  christos   return 0;
   7710  1.1.1.6  christos }
   7711  1.1.1.6  christos 
   7712  1.1.1.6  christos static struct trampoline_chain *
   7713  1.1.1.6  christos xg_get_trampoline_chain (struct trampoline_seg *ts,
   7714  1.1.1.6  christos 			 symbolS *sym,
   7715  1.1.1.6  christos 			 addressT offset)
   7716  1.1.1.6  christos {
   7717  1.1.1.6  christos   struct trampoline_chain_index *idx = &ts->chain_index;
   7718  1.1.1.6  christos   struct trampoline_chain c;
   7719  1.1.1.6  christos 
   7720  1.1.1.6  christos   if (idx->needs_sorting)
   7721  1.1.1.6  christos     {
   7722  1.1.1.6  christos       qsort (idx->entry, idx->n_entries, sizeof (*idx->entry),
   7723  1.1.1.6  christos 	     xg_order_trampoline_chain);
   7724  1.1.1.6  christos       idx->needs_sorting = FALSE;
   7725  1.1.1.6  christos     }
   7726  1.1.1.6  christos   c.target.sym = sym;
   7727  1.1.1.6  christos   c.target.offset = offset;
   7728  1.1.1.6  christos   return bsearch (&c, idx->entry, idx->n_entries,
   7729  1.1.1.6  christos 		  sizeof (struct trampoline_chain),
   7730  1.1.1.6  christos 		  xg_order_trampoline_chain);
   7731  1.1.1.6  christos }
   7732  1.1.1.6  christos 
   7733  1.1.1.6  christos /* Find trampoline chain in the given trampoline segment that is going
   7734  1.1.1.6  christos    to the *sym + *offset.  If found, replace *sym and *offset with the
   7735  1.1.1.6  christos    best jump target in that chain.  */
   7736  1.1.1.6  christos static struct trampoline_chain *
   7737  1.1.1.6  christos xg_find_best_eq_target (struct trampoline_seg *ts,
   7738  1.1.1.6  christos 			addressT source, symbolS **sym,
   7739  1.1.1.6  christos 			addressT *offset)
   7740  1.1.1.6  christos {
   7741  1.1.1.6  christos   struct trampoline_chain *tc = xg_get_trampoline_chain (ts, *sym, *offset);
   7742  1.1.1.6  christos 
   7743  1.1.1.6  christos   if (tc)
   7744  1.1.1.6  christos     {
   7745  1.1.1.6  christos       struct trampoline_chain_entry *e = xg_get_best_chain_entry (tc, source);
   7746  1.1.1.6  christos 
   7747  1.1.1.6  christos       *sym = e->sym;
   7748  1.1.1.6  christos       *offset = e->offset;
   7749  1.1.1.6  christos     }
   7750  1.1.1.6  christos   return tc;
   7751  1.1.1.6  christos }
   7752  1.1.1.6  christos 
   7753  1.1.1.6  christos static void xg_add_location_to_chain (struct trampoline_chain *tc,
   7754  1.1.1.6  christos 				      symbolS *sym, addressT offset)
   7755  1.1.1.6  christos {
   7756  1.1.1.6  christos   struct trampoline_chain_entry *e;
   7757  1.1.1.6  christos 
   7758  1.1.1.6  christos   if (tc->n_entries == tc->n_max)
   7759  1.1.1.6  christos     {
   7760  1.1.1.6  christos       tc->n_max = (tc->n_max + 1) * 2;
   7761  1.1.1.6  christos       tc->entry = xrealloc (tc->entry, sizeof (*tc->entry) * tc->n_max);
   7762  1.1.1.6  christos     }
   7763  1.1.1.6  christos   e = tc->entry + tc->n_entries;
   7764  1.1.1.6  christos   e->sym = sym;
   7765  1.1.1.6  christos   e->offset = offset;
   7766  1.1.1.6  christos   ++tc->n_entries;
   7767  1.1.1.6  christos   tc->needs_sorting = TRUE;
   7768  1.1.1.6  christos }
   7769  1.1.1.6  christos 
   7770  1.1.1.6  christos static struct trampoline_chain *
   7771  1.1.1.6  christos xg_create_trampoline_chain (struct trampoline_seg *ts,
   7772  1.1.1.6  christos 			    symbolS *sym, addressT offset)
   7773  1.1.1.6  christos {
   7774  1.1.1.6  christos   struct trampoline_chain_index *idx = &ts->chain_index;
   7775  1.1.1.6  christos   struct trampoline_chain *tc;
   7776  1.1.1.6  christos 
   7777  1.1.1.6  christos   if (idx->n_entries == idx->n_max)
   7778  1.1.1.6  christos     {
   7779  1.1.1.6  christos       idx->n_max = (idx->n_max + 1) * 2;
   7780  1.1.1.6  christos       idx->entry = xrealloc (idx->entry,
   7781  1.1.1.6  christos 			     sizeof (*idx->entry) * idx->n_max);
   7782  1.1.1.6  christos     }
   7783  1.1.1.6  christos 
   7784  1.1.1.6  christos   tc = idx->entry + idx->n_entries;
   7785  1.1.1.4  christos   tc->target.sym = sym;
   7786  1.1.1.4  christos   tc->target.offset = offset;
   7787  1.1.1.4  christos   tc->entry = NULL;
   7788  1.1.1.4  christos   tc->n_entries = 0;
   7789  1.1.1.4  christos   tc->n_max = 0;
   7790  1.1.1.4  christos   xg_add_location_to_chain (tc, sym, offset);
   7791  1.1.1.4  christos 
   7792  1.1.1.4  christos   ++idx->n_entries;
   7793  1.1.1.4  christos   idx->needs_sorting = TRUE;
   7794  1.1.1.4  christos 
   7795  1.1.1.6  christos   return tc;
   7796  1.1.1.4  christos }
   7797  1.1.1.4  christos 
   7798  1.1.1.4  christos void dump_trampolines (void);
   7799  1.1.1.4  christos 
   7800  1.1.1.4  christos void
   7801  1.1.1.6  christos dump_trampolines (void)
   7802  1.1.1.6  christos {
   7803  1.1.1.4  christos   struct trampoline_seg *ts = trampoline_seg_list.next;
   7804  1.1.1.6  christos 
   7805  1.1.1.6  christos   for ( ; ts; ts = ts->next)
   7806  1.1.1.4  christos     {
   7807  1.1.1.6  christos       size_t i;
   7808  1.1.1.6  christos       asection *seg = ts->seg;
   7809  1.1.1.4  christos 
   7810  1.1.1.4  christos       if (seg == NULL)
   7811  1.1.1.4  christos 	continue;
   7812  1.1.1.4  christos       fprintf(stderr, "SECTION %s\n", seg->name);
   7813  1.1.1.4  christos 
   7814  1.1.1.4  christos       for (i = 0; i < ts->index.n_entries; ++i)
   7815  1.1.1.4  christos 	{
   7816  1.1.1.4  christos 	  fragS *tf = ts->index.entry[i];
   7817  1.1.1.4  christos 
   7818  1.1.1.4  christos 	  fprintf(stderr, "   0x%08x: fix=%d, jump_around=%s\n",
   7819  1.1.1.4  christos 		  (int)tf->fr_address, (int)tf->fr_fix,
   7820  1.1.1.4  christos 		  tf->tc_frag_data.needs_jump_around ? "T" : "F");
   7821  1.1.1.4  christos 	}
   7822  1.1.1.4  christos     }
   7823  1.1.1.4  christos }
   7824  1.1.1.4  christos 
   7825  1.1.1.4  christos static void dump_litpools (void) __attribute__ ((unused));
   7826  1.1.1.4  christos 
   7827  1.1.1.4  christos static void
   7828  1.1.1.4  christos dump_litpools (void)
   7829  1.1.1.4  christos {
   7830  1.1.1.4  christos   struct litpool_seg *lps = litpool_seg_list.next;
   7831  1.1.1.4  christos   struct litpool_frag *lpf;
   7832  1.1.1.4  christos 
   7833  1.1.1.4  christos   for ( ; lps ; lps = lps->next )
   7834  1.1.1.4  christos     {
   7835  1.1.1.4  christos       printf("litpool seg %s\n", lps->seg->name);
   7836  1.1.1.4  christos       for ( lpf = lps->frag_list.next; lpf->fragP; lpf = lpf->next )
   7837  1.1.1.4  christos 	{
   7838  1.1.1.4  christos 	  fragS *litfrag = lpf->fragP->fr_next;
   7839  1.1.1.4  christos 	  int count = 0;
   7840  1.1.1.4  christos 	  while (litfrag && litfrag->fr_subtype != RELAX_LITERAL_POOL_END)
   7841  1.1.1.4  christos 	    {
   7842  1.1.1.4  christos 	      if (litfrag->fr_fix == 4)
   7843  1.1.1.4  christos 		count++;
   7844  1.1.1.4  christos 	      litfrag = litfrag->fr_next;
   7845  1.1.1.4  christos 	    }
   7846  1.1.1.4  christos 	  printf("   %ld <%d:%d> (%d) [%d]: ",
   7847  1.1.1.4  christos 		 lpf->addr, lpf->priority, lpf->original_priority,
   7848  1.1.1.4  christos 		 lpf->fragP->fr_line, count);
   7849  1.1.1.4  christos 	  //dump_frag(lpf->fragP);
   7850  1.1.1.4  christos 	}
   7851  1.1.1.4  christos     }
   7852  1.1.1.4  christos }
   7853  1.1.1.4  christos 
   7854  1.1.1.4  christos static void
   7855  1.1.1.4  christos xtensa_maybe_create_literal_pool_frag (bfd_boolean create,
   7856  1.1.1.4  christos 				       bfd_boolean only_if_needed)
   7857  1.1.1.4  christos {
   7858  1.1.1.4  christos   struct litpool_seg *lps = litpool_seg_list.next;
   7859  1.1.1.4  christos   fragS *fragP;
   7860  1.1.1.4  christos   struct litpool_frag *lpf;
   7861  1.1.1.4  christos   bfd_boolean needed = FALSE;
   7862  1.1.1.5  christos 
   7863  1.1.1.4  christos   if (use_literal_section || !auto_litpools)
   7864  1.1.1.4  christos     return;
   7865  1.1.1.4  christos 
   7866  1.1.1.4  christos   for ( ; lps ; lps = lps->next )
   7867  1.1.1.4  christos     {
   7868  1.1.1.6  christos       if (lps->seg == now_seg)
   7869  1.1.1.6  christos 	break;
   7870  1.1.1.6  christos     }
   7871  1.1.1.6  christos 
   7872  1.1.1.4  christos   if (lps == NULL)
   7873  1.1.1.4  christos     {
   7874  1.1.1.4  christos       lps = XCNEW (struct litpool_seg);
   7875  1.1.1.4  christos       lps->next = litpool_seg_list.next;
   7876  1.1.1.4  christos       litpool_seg_list.next = lps;
   7877  1.1.1.4  christos       lps->seg = now_seg;
   7878  1.1.1.4  christos       lps->frag_list.next = &lps->frag_list;
   7879  1.1.1.4  christos       lps->frag_list.prev = &lps->frag_list;
   7880  1.1.1.4  christos       /* Put candidate literal pool at the beginning of every section,
   7881  1.1.1.4  christos          so that even when section starts with literal load there's a
   7882  1.1.1.4  christos 	 literal pool available.  */
   7883  1.1.1.4  christos       lps->frag_count = auto_litpool_limit;
   7884  1.1.1.4  christos     }
   7885  1.1.1.4  christos 
   7886  1.1.1.4  christos   lps->frag_count++;
   7887  1.1.1.4  christos 
   7888  1.1.1.4  christos   if (create)
   7889  1.1.1.4  christos     {
   7890  1.1.1.4  christos       if (only_if_needed)
   7891  1.1.1.4  christos 	{
   7892  1.1.1.4  christos 	  if (past_xtensa_end || !use_transform() ||
   7893  1.1.1.4  christos 	      frag_now->tc_frag_data.is_no_transform)
   7894  1.1.1.4  christos 	    {
   7895  1.1.1.4  christos 	      return;
   7896  1.1.1.4  christos 	    }
   7897  1.1.1.4  christos 	  if (auto_litpool_limit <= 0)
   7898  1.1.1.4  christos 	    {
   7899  1.1.1.4  christos 	      /* Don't create a litpool based only on frag count.  */
   7900  1.1.1.4  christos 	      return;
   7901  1.1.1.4  christos 	    }
   7902  1.1.1.4  christos 	  else if (lps->frag_count > auto_litpool_limit)
   7903  1.1.1.4  christos 	    {
   7904  1.1.1.4  christos 	      needed = TRUE;
   7905  1.1.1.4  christos 	    }
   7906  1.1.1.4  christos 	  else
   7907  1.1.1.4  christos 	    {
   7908  1.1.1.4  christos 	      return;
   7909  1.1.1.4  christos 	    }
   7910  1.1.1.4  christos 	}
   7911  1.1.1.4  christos       else
   7912  1.1.1.4  christos 	{
   7913  1.1.1.4  christos 	  needed = TRUE;
   7914  1.1.1.4  christos 	}
   7915  1.1.1.4  christos     }
   7916  1.1.1.4  christos 
   7917  1.1.1.4  christos   if (needed)
   7918  1.1.1.4  christos     {
   7919  1.1.1.4  christos       int size = (only_if_needed) ? 3 : 0; /* Space for a "j" insn.  */
   7920  1.1.1.4  christos       /* Create a potential site for a literal pool.  */
   7921  1.1.1.4  christos       frag_wane (frag_now);
   7922  1.1.1.4  christos       frag_new (0);
   7923  1.1.1.4  christos       xtensa_set_frag_assembly_state (frag_now);
   7924  1.1.1.4  christos       fragP = frag_now;
   7925  1.1.1.4  christos       fragP->tc_frag_data.lit_frchain = frchain_now;
   7926  1.1.1.4  christos       fragP->tc_frag_data.literal_frag = fragP;
   7927  1.1.1.4  christos       frag_var (rs_machine_dependent, size, size,
   7928  1.1.1.4  christos 		    (only_if_needed) ?
   7929  1.1.1.4  christos 		        RELAX_LITERAL_POOL_CANDIDATE_BEGIN :
   7930  1.1.1.4  christos 		        RELAX_LITERAL_POOL_BEGIN,
   7931  1.1.1.4  christos 		    NULL, 0, NULL);
   7932  1.1.1.5  christos       frag_now->tc_frag_data.lit_seg = now_seg;
   7933  1.1.1.4  christos       frag_variant (rs_machine_dependent, 0, 0,
   7934  1.1.1.4  christos 		    RELAX_LITERAL_POOL_END, NULL, 0, NULL);
   7935  1.1.1.4  christos       xtensa_set_frag_assembly_state (frag_now);
   7936  1.1.1.4  christos     }
   7937  1.1.1.4  christos   else
   7938  1.1.1.4  christos     {
   7939  1.1.1.4  christos       /* RELAX_LITERAL_POOL_BEGIN frag is being created;
   7940  1.1.1.4  christos 	 just record it here.  */
   7941  1.1.1.4  christos       fragP = frag_now;
   7942  1.1.1.7  christos     }
   7943  1.1.1.4  christos 
   7944  1.1.1.4  christos   lpf = XNEW (struct litpool_frag);
   7945  1.1.1.4  christos   /* Insert at tail of circular list.  */
   7946  1.1.1.4  christos   lpf->addr = 0;
   7947      1.1     skrll   lps->frag_list.prev->next = lpf;
   7948      1.1     skrll   lpf->next = &lps->frag_list;
   7949      1.1     skrll   lpf->prev = lps->frag_list.prev;
   7950      1.1     skrll   lps->frag_list.prev = lpf;
   7951      1.1     skrll   lpf->fragP = fragP;
   7952      1.1     skrll   lpf->priority = (needed) ? (only_if_needed) ? 3 : 2 : 1;
   7953      1.1     skrll   lpf->original_priority = lpf->priority;
   7954      1.1     skrll   lpf->literal_count = 0;
   7955      1.1     skrll 
   7956      1.1     skrll   lps->frag_count = 0;
   7957      1.1     skrll }
   7958      1.1     skrll 
   7959      1.1     skrll static void
   7960      1.1     skrll xtensa_cleanup_align_frags (void)
   7961      1.1     skrll {
   7962      1.1     skrll   frchainS *frchP;
   7963      1.1     skrll   asection *s;
   7964      1.1     skrll 
   7965      1.1     skrll   for (s = stdoutput->sections; s; s = s->next)
   7966      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7967      1.1     skrll       {
   7968      1.1     skrll 	fragS *fragP;
   7969      1.1     skrll 	/* Walk over all of the fragments in a subsection.  */
   7970      1.1     skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7971      1.1     skrll 	  {
   7972      1.1     skrll 	    if ((fragP->fr_type == rs_align
   7973      1.1     skrll 		 || fragP->fr_type == rs_align_code
   7974      1.1     skrll 		 || (fragP->fr_type == rs_machine_dependent
   7975      1.1     skrll 		     && (fragP->fr_subtype == RELAX_DESIRE_ALIGN
   7976      1.1     skrll 			 || fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)))
   7977      1.1     skrll 		&& fragP->fr_fix == 0)
   7978      1.1     skrll 	      {
   7979      1.1     skrll 		fragS *next = fragP->fr_next;
   7980      1.1     skrll 
   7981      1.1     skrll 		while (next
   7982      1.1     skrll 		       && next->fr_fix == 0
   7983      1.1     skrll 		       && next->fr_type == rs_machine_dependent
   7984      1.1     skrll 		       && next->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
   7985      1.1     skrll 		  {
   7986      1.1     skrll 		    frag_wane (next);
   7987      1.1     skrll 		    next = next->fr_next;
   7988      1.1     skrll 		  }
   7989      1.1     skrll 	      }
   7990      1.1     skrll 	    /* If we don't widen branch targets, then they
   7991      1.1     skrll 	       will be easier to align.  */
   7992      1.1     skrll 	    if (fragP->tc_frag_data.is_branch_target
   7993      1.1     skrll 		&& fragP->fr_opcode == fragP->fr_literal
   7994      1.1     skrll 		&& fragP->fr_type == rs_machine_dependent
   7995      1.1     skrll 		&& fragP->fr_subtype == RELAX_SLOTS
   7996      1.1     skrll 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
   7997      1.1     skrll 	      frag_wane (fragP);
   7998      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   7999      1.1     skrll 		&& fragP->fr_subtype == RELAX_UNREACHABLE)
   8000      1.1     skrll 	      fragP->tc_frag_data.is_unreachable = TRUE;
   8001      1.1     skrll 	  }
   8002      1.1     skrll       }
   8003      1.1     skrll }
   8004      1.1     skrll 
   8005      1.1     skrll 
   8006      1.1     skrll /* Re-process all of the fragments looking to convert all of the
   8007      1.1     skrll    RELAX_DESIRE_ALIGN_IF_TARGET fragments.  If there is a branch
   8008      1.1     skrll    target in the next fragment, convert this to RELAX_DESIRE_ALIGN.
   8009      1.1     skrll    Otherwise, convert to a .fill 0.  */
   8010      1.1     skrll 
   8011      1.1     skrll static void
   8012      1.1     skrll xtensa_fix_target_frags (void)
   8013      1.1     skrll {
   8014      1.1     skrll   frchainS *frchP;
   8015      1.1     skrll   asection *s;
   8016      1.1     skrll 
   8017      1.1     skrll   /* When this routine is called, all of the subsections are still intact
   8018      1.1     skrll      so we walk over subsections instead of sections.  */
   8019      1.1     skrll   for (s = stdoutput->sections; s; s = s->next)
   8020      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   8021      1.1     skrll       {
   8022      1.1     skrll 	fragS *fragP;
   8023      1.1     skrll 
   8024      1.1     skrll 	/* Walk over all of the fragments in a subsection.  */
   8025      1.1     skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   8026      1.1     skrll 	  {
   8027      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   8028      1.1     skrll 		&& fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
   8029      1.1     skrll 	      {
   8030      1.1     skrll 		if (next_frag_is_branch_target (fragP))
   8031      1.1     skrll 		  fragP->fr_subtype = RELAX_DESIRE_ALIGN;
   8032      1.1     skrll 		else
   8033      1.1     skrll 		  frag_wane (fragP);
   8034      1.1     skrll 	      }
   8035      1.1     skrll 	  }
   8036      1.1     skrll       }
   8037      1.1     skrll }
   8038      1.1     skrll 
   8039      1.1     skrll 
   8040      1.1     skrll static bfd_boolean is_narrow_branch_guaranteed_in_range (fragS *, TInsn *);
   8041      1.1     skrll 
   8042      1.1     skrll static void
   8043      1.1     skrll xtensa_mark_narrow_branches (void)
   8044      1.1     skrll {
   8045      1.1     skrll   frchainS *frchP;
   8046      1.1     skrll   asection *s;
   8047      1.1     skrll 
   8048      1.1     skrll   for (s = stdoutput->sections; s; s = s->next)
   8049      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   8050      1.1     skrll       {
   8051      1.1     skrll 	fragS *fragP;
   8052      1.1     skrll 	/* Walk over all of the fragments in a subsection.  */
   8053      1.1     skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   8054      1.1     skrll 	  {
   8055      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   8056      1.1     skrll 		&& fragP->fr_subtype == RELAX_SLOTS
   8057      1.1     skrll 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
   8058      1.1     skrll 	      {
   8059      1.1     skrll 		vliw_insn vinsn;
   8060      1.1     skrll 
   8061      1.1     skrll 		vinsn_from_chars (&vinsn, fragP->fr_opcode);
   8062      1.1     skrll 		tinsn_immed_from_frag (&vinsn.slots[0], fragP, 0);
   8063      1.1     skrll 
   8064      1.1     skrll 		if (vinsn.num_slots == 1
   8065      1.1     skrll 		    && xtensa_opcode_is_branch (xtensa_default_isa,
   8066      1.1     skrll 						vinsn.slots[0].opcode) == 1
   8067      1.1     skrll 		    && xg_get_single_size (vinsn.slots[0].opcode) == 2
   8068      1.1     skrll 		    && is_narrow_branch_guaranteed_in_range (fragP,
   8069      1.1     skrll 							     &vinsn.slots[0]))
   8070      1.1     skrll 		  {
   8071      1.1     skrll 		    fragP->fr_subtype = RELAX_SLOTS;
   8072      1.1     skrll 		    fragP->tc_frag_data.slot_subtypes[0] = RELAX_NARROW;
   8073      1.1     skrll 		    fragP->tc_frag_data.is_aligning_branch = 1;
   8074      1.1     skrll 		  }
   8075      1.1     skrll 	      }
   8076      1.1     skrll 	  }
   8077      1.1     skrll       }
   8078      1.1     skrll }
   8079      1.1     skrll 
   8080      1.1     skrll 
   8081      1.1     skrll /* A branch is typically widened only when its target is out of
   8082      1.1     skrll    range.  However, we would like to widen them to align a subsequent
   8083      1.1     skrll    branch target when possible.
   8084      1.1     skrll 
   8085      1.1     skrll    Because the branch relaxation code is so convoluted, the optimal solution
   8086      1.1     skrll    (combining the two cases) is difficult to get right in all circumstances.
   8087      1.1     skrll    We therefore go with an "almost as good" solution, where we only
   8088      1.1     skrll    use for alignment narrow branches that definitely will not expand to a
   8089      1.1     skrll    jump and a branch.  These functions find and mark these cases.  */
   8090  1.1.1.2  christos 
   8091  1.1.1.2  christos /* The range in bytes of BNEZ.N and BEQZ.N.  The target operand is encoded
   8092  1.1.1.2  christos    as PC + 4 + imm6, where imm6 is a 6-bit immediate ranging from 0 to 63.
   8093      1.1     skrll    We start counting beginning with the frag after the 2-byte branch, so the
   8094      1.1     skrll    maximum offset is (4 - 2) + 63 = 65.  */
   8095  1.1.1.2  christos #define MAX_IMMED6 65
   8096      1.1     skrll 
   8097      1.1     skrll static offsetT unrelaxed_frag_max_size (fragS *);
   8098      1.1     skrll 
   8099      1.1     skrll static bfd_boolean
   8100      1.1     skrll is_narrow_branch_guaranteed_in_range (fragS *fragP, TInsn *tinsn)
   8101      1.1     skrll {
   8102      1.1     skrll   const expressionS *exp = &tinsn->tok[1];
   8103      1.1     skrll   symbolS *symbolP = exp->X_add_symbol;
   8104      1.1     skrll   offsetT max_distance = exp->X_add_number;
   8105      1.1     skrll   fragS *target_frag;
   8106      1.1     skrll 
   8107      1.1     skrll   if (exp->X_op != O_symbol)
   8108      1.1     skrll     return FALSE;
   8109      1.1     skrll 
   8110      1.1     skrll   target_frag = symbol_get_frag (symbolP);
   8111      1.1     skrll 
   8112      1.1     skrll   max_distance += (S_GET_VALUE (symbolP) - target_frag->fr_address);
   8113      1.1     skrll   if (is_branch_jmp_to_next (tinsn, fragP))
   8114      1.1     skrll     return FALSE;
   8115      1.1     skrll 
   8116      1.1     skrll   /* The branch doesn't branch over it's own frag,
   8117      1.1     skrll      but over the subsequent ones.  */
   8118      1.1     skrll   fragP = fragP->fr_next;
   8119      1.1     skrll   while (fragP != NULL && fragP != target_frag && max_distance <= MAX_IMMED6)
   8120      1.1     skrll     {
   8121      1.1     skrll       max_distance += unrelaxed_frag_max_size (fragP);
   8122      1.1     skrll       fragP = fragP->fr_next;
   8123      1.1     skrll     }
   8124      1.1     skrll   if (max_distance <= MAX_IMMED6 && fragP == target_frag)
   8125      1.1     skrll     return TRUE;
   8126      1.1     skrll   return FALSE;
   8127      1.1     skrll }
   8128      1.1     skrll 
   8129      1.1     skrll 
   8130      1.1     skrll static void
   8131      1.1     skrll xtensa_mark_zcl_first_insns (void)
   8132      1.1     skrll {
   8133      1.1     skrll   frchainS *frchP;
   8134      1.1     skrll   asection *s;
   8135      1.1     skrll 
   8136  1.1.1.2  christos   for (s = stdoutput->sections; s; s = s->next)
   8137      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   8138  1.1.1.2  christos       {
   8139  1.1.1.2  christos 	fragS *fragP;
   8140  1.1.1.2  christos 	/* Walk over all of the fragments in a subsection.  */
   8141  1.1.1.2  christos 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   8142  1.1.1.4  christos 	  {
   8143  1.1.1.2  christos 	    if (fragP->fr_type == rs_machine_dependent
   8144  1.1.1.2  christos 		&& (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
   8145  1.1.1.2  christos 		    || fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE))
   8146  1.1.1.2  christos 	      {
   8147  1.1.1.2  christos 		/* Find the loop frag.  */
   8148  1.1.1.2  christos 		fragS *loop_frag = next_non_empty_frag (fragP);
   8149  1.1.1.2  christos 		/* Find the first insn frag.  */
   8150  1.1.1.2  christos 		fragS *targ_frag = next_non_empty_frag (loop_frag);
   8151  1.1.1.2  christos 
   8152  1.1.1.2  christos 	      /* Handle a corner case that comes up in hardware
   8153  1.1.1.2  christos 		 diagnostics.  The original assembly looks like this:
   8154  1.1.1.2  christos 
   8155  1.1.1.2  christos 		 loop aX, LabelA
   8156  1.1.1.2  christos 		 <empty_frag>--not found by next_non_empty_frag
   8157  1.1.1.2  christos 		 loop aY, LabelB
   8158  1.1.1.2  christos 
   8159  1.1.1.2  christos 		 Depending on the start address, the assembler may or
   8160  1.1.1.4  christos 		 may not change it to look something like this:
   8161  1.1.1.2  christos 
   8162  1.1.1.2  christos 		 loop aX, LabelA
   8163  1.1.1.2  christos 		 nop--frag isn't empty anymore
   8164  1.1.1.2  christos 		 loop aY, LabelB
   8165  1.1.1.2  christos 
   8166      1.1     skrll 		 So set up to check the alignment of the nop if it
   8167      1.1     skrll 		 exists  */
   8168      1.1     skrll 		while (loop_frag != targ_frag)
   8169      1.1     skrll 		  {
   8170      1.1     skrll 		    if (loop_frag->fr_type == rs_machine_dependent
   8171      1.1     skrll 			&& (loop_frag->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
   8172      1.1     skrll 			    || loop_frag->fr_subtype
   8173      1.1     skrll 			    == RELAX_CHECK_ALIGN_NEXT_OPCODE))
   8174      1.1     skrll 		      targ_frag = loop_frag;
   8175      1.1     skrll 		    else
   8176      1.1     skrll 		      loop_frag = loop_frag->fr_next;
   8177      1.1     skrll 		  }
   8178      1.1     skrll 
   8179      1.1     skrll 		/* Of course, sometimes (mostly for toy test cases) a
   8180      1.1     skrll 		   zero-cost loop instruction is the last in a section.  */
   8181      1.1     skrll 		if (targ_frag)
   8182      1.1     skrll 		  {
   8183      1.1     skrll 		    targ_frag->tc_frag_data.is_first_loop_insn = TRUE;
   8184      1.1     skrll 		    /* Do not widen a frag that is the first instruction of a
   8185      1.1     skrll 		       zero-cost loop.  It makes that loop harder to align.  */
   8186      1.1     skrll 		    if (targ_frag->fr_type == rs_machine_dependent
   8187      1.1     skrll 			&& targ_frag->fr_subtype == RELAX_SLOTS
   8188      1.1     skrll 			&& (targ_frag->tc_frag_data.slot_subtypes[0]
   8189      1.1     skrll 			    == RELAX_NARROW))
   8190      1.1     skrll 		      {
   8191      1.1     skrll 			if (targ_frag->tc_frag_data.is_aligning_branch)
   8192      1.1     skrll 			  targ_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
   8193      1.1     skrll 			else
   8194      1.1     skrll 			  {
   8195      1.1     skrll 			    frag_wane (targ_frag);
   8196      1.1     skrll 			    targ_frag->tc_frag_data.slot_subtypes[0] = 0;
   8197      1.1     skrll 			  }
   8198      1.1     skrll 		      }
   8199      1.1     skrll 		  }
   8200  1.1.1.4  christos 		if (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)
   8201      1.1     skrll 		  frag_wane (fragP);
   8202      1.1     skrll 	      }
   8203      1.1     skrll 	  }
   8204      1.1     skrll       }
   8205      1.1     skrll }
   8206  1.1.1.4  christos 
   8207      1.1     skrll 
   8208      1.1     skrll /* When a difference-of-symbols expression is encoded as a uleb128 or
   8209  1.1.1.2  christos    sleb128 value, the linker is unable to adjust that value to account for
   8210      1.1     skrll    link-time relaxation.  Mark all the code between such symbols so that
   8211  1.1.1.2  christos    its size cannot be changed by linker relaxation.  */
   8212      1.1     skrll 
   8213  1.1.1.2  christos static void
   8214  1.1.1.2  christos xtensa_mark_difference_of_two_symbols (void)
   8215  1.1.1.4  christos {
   8216      1.1     skrll   symbolS *expr_sym;
   8217      1.1     skrll 
   8218      1.1     skrll   for (expr_sym = expr_symbols; expr_sym;
   8219      1.1     skrll        expr_sym = symbol_get_tc (expr_sym)->next_expr_symbol)
   8220      1.1     skrll     {
   8221      1.1     skrll       expressionS *exp = symbol_get_value_expression (expr_sym);
   8222  1.1.1.2  christos 
   8223      1.1     skrll       if (exp->X_op == O_subtract)
   8224  1.1.1.4  christos 	{
   8225      1.1     skrll 	  symbolS *left = exp->X_add_symbol;
   8226      1.1     skrll 	  symbolS *right = exp->X_op_symbol;
   8227      1.1     skrll 
   8228      1.1     skrll 	  /* Difference of two symbols not in the same section
   8229      1.1     skrll 	     are handled with relocations in the linker.  */
   8230      1.1     skrll 	  if (S_GET_SEGMENT (left) == S_GET_SEGMENT (right))
   8231      1.1     skrll 	    {
   8232      1.1     skrll 	      fragS *start;
   8233      1.1     skrll 	      fragS *end;
   8234      1.1     skrll 	      fragS *walk;
   8235  1.1.1.2  christos 
   8236  1.1.1.2  christos 	      if (symbol_get_frag (left)->fr_address
   8237  1.1.1.2  christos 		  <= symbol_get_frag (right)->fr_address)
   8238  1.1.1.2  christos 		{
   8239  1.1.1.2  christos 		  start = symbol_get_frag (left);
   8240  1.1.1.4  christos 		  end = symbol_get_frag (right);
   8241      1.1     skrll 		}
   8242  1.1.1.2  christos 	      else
   8243  1.1.1.2  christos 		{
   8244      1.1     skrll 		  start = symbol_get_frag (right);
   8245  1.1.1.2  christos 		  end = symbol_get_frag (left);
   8246  1.1.1.2  christos 		}
   8247  1.1.1.2  christos 
   8248      1.1     skrll 	      if (start->tc_frag_data.no_transform_end != NULL)
   8249      1.1     skrll 		walk = start->tc_frag_data.no_transform_end;
   8250      1.1     skrll 	      else
   8251      1.1     skrll 		walk = start;
   8252      1.1     skrll 	      do
   8253      1.1     skrll 		{
   8254      1.1     skrll 		  walk->tc_frag_data.is_no_transform = 1;
   8255      1.1     skrll 		  walk = walk->fr_next;
   8256      1.1     skrll 		}
   8257      1.1     skrll 	      while (walk && walk->fr_address < end->fr_address);
   8258      1.1     skrll 
   8259      1.1     skrll 	      start->tc_frag_data.no_transform_end = walk;
   8260      1.1     skrll 	    }
   8261      1.1     skrll 	}
   8262      1.1     skrll     }
   8263      1.1     skrll }
   8264      1.1     skrll 
   8265      1.1     skrll 
   8266      1.1     skrll /* Re-process all of the fragments looking to convert all of the
   8267      1.1     skrll    RELAX_ADD_NOP_IF_A0_B_RETW.  If the next instruction is a
   8268      1.1     skrll    conditional branch or a retw/retw.n, convert this frag to one that
   8269      1.1     skrll    will generate a NOP.  In any case close it off with a .fill 0.  */
   8270      1.1     skrll 
   8271      1.1     skrll static bfd_boolean next_instrs_are_b_retw (fragS *);
   8272      1.1     skrll 
   8273      1.1     skrll static void
   8274      1.1     skrll xtensa_fix_a0_b_retw_frags (void)
   8275      1.1     skrll {
   8276      1.1     skrll   frchainS *frchP;
   8277      1.1     skrll   asection *s;
   8278      1.1     skrll 
   8279      1.1     skrll   /* When this routine is called, all of the subsections are still intact
   8280      1.1     skrll      so we walk over subsections instead of sections.  */
   8281      1.1     skrll   for (s = stdoutput->sections; s; s = s->next)
   8282      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   8283      1.1     skrll       {
   8284      1.1     skrll 	fragS *fragP;
   8285      1.1     skrll 
   8286      1.1     skrll 	/* Walk over all of the fragments in a subsection.  */
   8287      1.1     skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   8288      1.1     skrll 	  {
   8289      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   8290      1.1     skrll 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_A0_B_RETW)
   8291      1.1     skrll 	      {
   8292      1.1     skrll 		if (next_instrs_are_b_retw (fragP))
   8293      1.1     skrll 		  {
   8294      1.1     skrll 		    if (fragP->tc_frag_data.is_no_transform)
   8295      1.1     skrll 		      as_bad (_("instruction sequence (write a0, branch, retw) may trigger hardware errata"));
   8296      1.1     skrll 		    else
   8297      1.1     skrll 		      relax_frag_add_nop (fragP);
   8298      1.1     skrll 		  }
   8299      1.1     skrll 		frag_wane (fragP);
   8300      1.1     skrll 	      }
   8301      1.1     skrll 	  }
   8302      1.1     skrll       }
   8303  1.1.1.8  christos }
   8304      1.1     skrll 
   8305      1.1     skrll 
   8306      1.1     skrll static bfd_boolean
   8307      1.1     skrll next_instrs_are_b_retw (fragS *fragP)
   8308      1.1     skrll {
   8309      1.1     skrll   xtensa_opcode opcode;
   8310      1.1     skrll   xtensa_format fmt;
   8311      1.1     skrll   const fragS *next_fragP = next_non_empty_frag (fragP);
   8312      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   8313      1.1     skrll   static xtensa_insnbuf slotbuf = NULL;
   8314      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   8315      1.1     skrll   unsigned int offset = 0;
   8316      1.1     skrll   int slot;
   8317      1.1     skrll   bfd_boolean branch_seen = FALSE;
   8318      1.1     skrll 
   8319      1.1     skrll   if (!insnbuf)
   8320      1.1     skrll     {
   8321      1.1     skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   8322      1.1     skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   8323      1.1     skrll     }
   8324      1.1     skrll 
   8325      1.1     skrll   if (next_fragP == NULL)
   8326      1.1     skrll     return FALSE;
   8327      1.1     skrll 
   8328      1.1     skrll   /* Check for the conditional branch.  */
   8329      1.1     skrll   xtensa_insnbuf_from_chars
   8330      1.1     skrll     (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
   8331      1.1     skrll   fmt = xtensa_format_decode (isa, insnbuf);
   8332      1.1     skrll   if (fmt == XTENSA_UNDEFINED)
   8333      1.1     skrll     return FALSE;
   8334      1.1     skrll 
   8335      1.1     skrll   for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
   8336      1.1     skrll     {
   8337      1.1     skrll       xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
   8338      1.1     skrll       opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   8339      1.1     skrll 
   8340      1.1     skrll       branch_seen = (branch_seen
   8341      1.1     skrll 		     || xtensa_opcode_is_branch (isa, opcode) == 1);
   8342      1.1     skrll     }
   8343      1.1     skrll 
   8344      1.1     skrll   if (!branch_seen)
   8345      1.1     skrll     return FALSE;
   8346      1.1     skrll 
   8347      1.1     skrll   offset += xtensa_format_length (isa, fmt);
   8348      1.1     skrll   if (offset == next_fragP->fr_fix)
   8349      1.1     skrll     {
   8350      1.1     skrll       next_fragP = next_non_empty_frag (next_fragP);
   8351      1.1     skrll       offset = 0;
   8352      1.1     skrll     }
   8353      1.1     skrll 
   8354      1.1     skrll   if (next_fragP == NULL)
   8355      1.1     skrll     return FALSE;
   8356      1.1     skrll 
   8357      1.1     skrll   /* Check for the retw/retw.n.  */
   8358      1.1     skrll   xtensa_insnbuf_from_chars
   8359      1.1     skrll     (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
   8360      1.1     skrll   fmt = xtensa_format_decode (isa, insnbuf);
   8361      1.1     skrll 
   8362      1.1     skrll   /* Because RETW[.N] is not bundleable, a VLIW bundle here means that we
   8363      1.1     skrll      have no problems.  */
   8364      1.1     skrll   if (fmt == XTENSA_UNDEFINED
   8365      1.1     skrll       || xtensa_format_num_slots (isa, fmt) != 1)
   8366      1.1     skrll     return FALSE;
   8367      1.1     skrll 
   8368      1.1     skrll   xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
   8369      1.1     skrll   opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
   8370      1.1     skrll 
   8371      1.1     skrll   if (opcode == xtensa_retw_opcode || opcode == xtensa_retw_n_opcode)
   8372      1.1     skrll     return TRUE;
   8373      1.1     skrll 
   8374      1.1     skrll   return FALSE;
   8375      1.1     skrll }
   8376      1.1     skrll 
   8377      1.1     skrll 
   8378      1.1     skrll /* Re-process all of the fragments looking to convert all of the
   8379      1.1     skrll    RELAX_ADD_NOP_IF_PRE_LOOP_END.  If there is one instruction and a
   8380      1.1     skrll    loop end label, convert this frag to one that will generate a NOP.
   8381      1.1     skrll    In any case close it off with a .fill 0.  */
   8382      1.1     skrll 
   8383      1.1     skrll static bfd_boolean next_instr_is_loop_end (fragS *);
   8384      1.1     skrll 
   8385      1.1     skrll static void
   8386      1.1     skrll xtensa_fix_b_j_loop_end_frags (void)
   8387      1.1     skrll {
   8388      1.1     skrll   frchainS *frchP;
   8389      1.1     skrll   asection *s;
   8390      1.1     skrll 
   8391      1.1     skrll   /* When this routine is called, all of the subsections are still intact
   8392      1.1     skrll      so we walk over subsections instead of sections.  */
   8393      1.1     skrll   for (s = stdoutput->sections; s; s = s->next)
   8394      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   8395      1.1     skrll       {
   8396      1.1     skrll 	fragS *fragP;
   8397      1.1     skrll 
   8398      1.1     skrll 	/* Walk over all of the fragments in a subsection.  */
   8399      1.1     skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   8400      1.1     skrll 	  {
   8401      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   8402      1.1     skrll 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_PRE_LOOP_END)
   8403      1.1     skrll 	      {
   8404      1.1     skrll 		if (next_instr_is_loop_end (fragP))
   8405      1.1     skrll 		  {
   8406      1.1     skrll 		    if (fragP->tc_frag_data.is_no_transform)
   8407      1.1     skrll 		      as_bad (_("branching or jumping to a loop end may trigger hardware errata"));
   8408      1.1     skrll 		    else
   8409      1.1     skrll 		      relax_frag_add_nop (fragP);
   8410      1.1     skrll 		  }
   8411      1.1     skrll 		frag_wane (fragP);
   8412      1.1     skrll 	      }
   8413      1.1     skrll 	  }
   8414      1.1     skrll       }
   8415      1.1     skrll }
   8416      1.1     skrll 
   8417      1.1     skrll 
   8418      1.1     skrll static bfd_boolean
   8419      1.1     skrll next_instr_is_loop_end (fragS *fragP)
   8420      1.1     skrll {
   8421      1.1     skrll   const fragS *next_fragP;
   8422      1.1     skrll 
   8423      1.1     skrll   if (next_frag_is_loop_target (fragP))
   8424      1.1     skrll     return FALSE;
   8425      1.1     skrll 
   8426      1.1     skrll   next_fragP = next_non_empty_frag (fragP);
   8427      1.1     skrll   if (next_fragP == NULL)
   8428      1.1     skrll     return FALSE;
   8429      1.1     skrll 
   8430      1.1     skrll   if (!next_frag_is_loop_target (next_fragP))
   8431      1.1     skrll     return FALSE;
   8432      1.1     skrll 
   8433      1.1     skrll   /* If the size is >= 3 then there is more than one instruction here.
   8434      1.1     skrll      The hardware bug will not fire.  */
   8435      1.1     skrll   if (next_fragP->fr_fix > 3)
   8436      1.1     skrll     return FALSE;
   8437      1.1     skrll 
   8438      1.1     skrll   return TRUE;
   8439      1.1     skrll }
   8440      1.1     skrll 
   8441      1.1     skrll 
   8442      1.1     skrll /* Re-process all of the fragments looking to convert all of the
   8443      1.1     skrll    RELAX_ADD_NOP_IF_CLOSE_LOOP_END.  If there is an loop end that is
   8444      1.1     skrll    not MY loop's loop end within 12 bytes, add enough nops here to
   8445      1.1     skrll    make it at least 12 bytes away.  In any case close it off with a
   8446      1.1     skrll    .fill 0.  */
   8447      1.1     skrll 
   8448      1.1     skrll static offsetT min_bytes_to_other_loop_end
   8449      1.1     skrll   (fragS *, fragS *, offsetT);
   8450      1.1     skrll 
   8451      1.1     skrll static void
   8452      1.1     skrll xtensa_fix_close_loop_end_frags (void)
   8453      1.1     skrll {
   8454      1.1     skrll   frchainS *frchP;
   8455      1.1     skrll   asection *s;
   8456      1.1     skrll 
   8457      1.1     skrll   /* When this routine is called, all of the subsections are still intact
   8458      1.1     skrll      so we walk over subsections instead of sections.  */
   8459      1.1     skrll   for (s = stdoutput->sections; s; s = s->next)
   8460      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   8461      1.1     skrll       {
   8462      1.1     skrll 	fragS *fragP;
   8463      1.1     skrll 
   8464      1.1     skrll 	fragS *current_target = NULL;
   8465      1.1     skrll 
   8466      1.1     skrll 	/* Walk over all of the fragments in a subsection.  */
   8467      1.1     skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   8468      1.1     skrll 	  {
   8469      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   8470      1.1     skrll 		&& ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
   8471      1.1     skrll 		    || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
   8472      1.1     skrll 	      current_target = symbol_get_frag (fragP->fr_symbol);
   8473      1.1     skrll 
   8474      1.1     skrll 	    if (current_target
   8475      1.1     skrll 		&& fragP->fr_type == rs_machine_dependent
   8476      1.1     skrll 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_CLOSE_LOOP_END)
   8477      1.1     skrll 	      {
   8478      1.1     skrll 		offsetT min_bytes;
   8479      1.1     skrll 		int bytes_added = 0;
   8480      1.1     skrll 
   8481      1.1     skrll #define REQUIRED_LOOP_DIVIDING_BYTES 12
   8482      1.1     skrll 		/* Max out at 12.  */
   8483      1.1     skrll 		min_bytes = min_bytes_to_other_loop_end
   8484      1.1     skrll 		  (fragP->fr_next, current_target, REQUIRED_LOOP_DIVIDING_BYTES);
   8485      1.1     skrll 
   8486      1.1     skrll 		if (min_bytes < REQUIRED_LOOP_DIVIDING_BYTES)
   8487      1.1     skrll 		  {
   8488      1.1     skrll 		    if (fragP->tc_frag_data.is_no_transform)
   8489      1.1     skrll 		      as_bad (_("loop end too close to another loop end may trigger hardware errata"));
   8490      1.1     skrll 		    else
   8491      1.1     skrll 		      {
   8492      1.1     skrll 			while (min_bytes + bytes_added
   8493      1.1     skrll 			       < REQUIRED_LOOP_DIVIDING_BYTES)
   8494      1.1     skrll 			  {
   8495      1.1     skrll 			    int length = 3;
   8496      1.1     skrll 
   8497      1.1     skrll 			    if (fragP->fr_var < length)
   8498      1.1     skrll 			      as_fatal (_("fr_var %lu < length %d"),
   8499      1.1     skrll 					(long) fragP->fr_var, length);
   8500      1.1     skrll 			    else
   8501  1.1.1.2  christos 			      {
   8502      1.1     skrll 				assemble_nop (length,
   8503      1.1     skrll 					      fragP->fr_literal + fragP->fr_fix);
   8504      1.1     skrll 				fragP->fr_fix += length;
   8505      1.1     skrll 				fragP->fr_var -= length;
   8506      1.1     skrll 			      }
   8507      1.1     skrll 			    bytes_added += length;
   8508      1.1     skrll 			  }
   8509      1.1     skrll 		      }
   8510      1.1     skrll 		  }
   8511      1.1     skrll 		frag_wane (fragP);
   8512      1.1     skrll 	      }
   8513      1.1     skrll 	    gas_assert (fragP->fr_type != rs_machine_dependent
   8514      1.1     skrll 		    || fragP->fr_subtype != RELAX_ADD_NOP_IF_CLOSE_LOOP_END);
   8515      1.1     skrll 	  }
   8516      1.1     skrll       }
   8517      1.1     skrll }
   8518      1.1     skrll 
   8519      1.1     skrll 
   8520      1.1     skrll static offsetT unrelaxed_frag_min_size (fragS *);
   8521      1.1     skrll 
   8522      1.1     skrll static offsetT
   8523      1.1     skrll min_bytes_to_other_loop_end (fragS *fragP,
   8524      1.1     skrll 			     fragS *current_target,
   8525      1.1     skrll 			     offsetT max_size)
   8526      1.1     skrll {
   8527      1.1     skrll   offsetT offset = 0;
   8528      1.1     skrll   fragS *current_fragP;
   8529      1.1     skrll 
   8530      1.1     skrll   for (current_fragP = fragP;
   8531      1.1     skrll        current_fragP;
   8532      1.1     skrll        current_fragP = current_fragP->fr_next)
   8533      1.1     skrll     {
   8534      1.1     skrll       if (current_fragP->tc_frag_data.is_loop_target
   8535      1.1     skrll 	  && current_fragP != current_target)
   8536      1.1     skrll 	return offset;
   8537      1.1     skrll 
   8538      1.1     skrll       offset += unrelaxed_frag_min_size (current_fragP);
   8539      1.1     skrll 
   8540      1.1     skrll       if (offset >= max_size)
   8541      1.1     skrll 	return max_size;
   8542      1.1     skrll     }
   8543      1.1     skrll   return max_size;
   8544      1.1     skrll }
   8545      1.1     skrll 
   8546      1.1     skrll 
   8547      1.1     skrll static offsetT
   8548      1.1     skrll unrelaxed_frag_min_size (fragS *fragP)
   8549      1.1     skrll {
   8550      1.1     skrll   offsetT size = fragP->fr_fix;
   8551      1.1     skrll 
   8552      1.1     skrll   /* Add fill size.  */
   8553      1.1     skrll   if (fragP->fr_type == rs_fill)
   8554      1.1     skrll     size += fragP->fr_offset;
   8555      1.1     skrll 
   8556      1.1     skrll   return size;
   8557      1.1     skrll }
   8558      1.1     skrll 
   8559      1.1     skrll 
   8560      1.1     skrll static offsetT
   8561      1.1     skrll unrelaxed_frag_max_size (fragS *fragP)
   8562      1.1     skrll {
   8563      1.1     skrll   offsetT size = fragP->fr_fix;
   8564      1.1     skrll   switch (fragP->fr_type)
   8565      1.1     skrll     {
   8566      1.1     skrll     case 0:
   8567      1.1     skrll       /* Empty frags created by the obstack allocation scheme
   8568      1.1     skrll 	 end up with type 0.  */
   8569      1.1     skrll       break;
   8570      1.1     skrll     case rs_fill:
   8571      1.1     skrll     case rs_org:
   8572      1.1     skrll     case rs_space:
   8573      1.1     skrll       size += fragP->fr_offset;
   8574      1.1     skrll       break;
   8575      1.1     skrll     case rs_align:
   8576      1.1     skrll     case rs_align_code:
   8577  1.1.1.2  christos     case rs_align_test:
   8578      1.1     skrll     case rs_leb128:
   8579      1.1     skrll     case rs_cfa:
   8580      1.1     skrll     case rs_dwarf2dbg:
   8581      1.1     skrll       /* No further adjustments needed.  */
   8582      1.1     skrll       break;
   8583      1.1     skrll     case rs_machine_dependent:
   8584      1.1     skrll       if (fragP->fr_subtype != RELAX_DESIRE_ALIGN)
   8585      1.1     skrll 	size += fragP->fr_var;
   8586      1.1     skrll       break;
   8587      1.1     skrll     default:
   8588      1.1     skrll       /* We had darn well better know how big it is.  */
   8589      1.1     skrll       gas_assert (0);
   8590      1.1     skrll       break;
   8591      1.1     skrll     }
   8592      1.1     skrll 
   8593      1.1     skrll   return size;
   8594      1.1     skrll }
   8595      1.1     skrll 
   8596      1.1     skrll 
   8597      1.1     skrll /* Re-process all of the fragments looking to convert all
   8598      1.1     skrll    of the RELAX_ADD_NOP_IF_SHORT_LOOP.  If:
   8599      1.1     skrll 
   8600      1.1     skrll    A)
   8601      1.1     skrll      1) the instruction size count to the loop end label
   8602      1.1     skrll         is too short (<= 2 instructions),
   8603      1.1     skrll      2) loop has a jump or branch in it
   8604      1.1     skrll 
   8605      1.1     skrll    or B)
   8606      1.1     skrll      1) workaround_all_short_loops is TRUE
   8607      1.1     skrll      2) The generating loop was a  'loopgtz' or 'loopnez'
   8608      1.1     skrll      3) the instruction size count to the loop end label is too short
   8609      1.1     skrll         (<= 2 instructions)
   8610      1.1     skrll    then convert this frag (and maybe the next one) to generate a NOP.
   8611      1.1     skrll    In any case close it off with a .fill 0.  */
   8612      1.1     skrll 
   8613      1.1     skrll static int count_insns_to_loop_end (fragS *, bfd_boolean, int);
   8614      1.1     skrll static bfd_boolean branch_before_loop_end (fragS *);
   8615      1.1     skrll 
   8616      1.1     skrll static void
   8617      1.1     skrll xtensa_fix_short_loop_frags (void)
   8618      1.1     skrll {
   8619      1.1     skrll   frchainS *frchP;
   8620      1.1     skrll   asection *s;
   8621      1.1     skrll 
   8622      1.1     skrll   /* When this routine is called, all of the subsections are still intact
   8623      1.1     skrll      so we walk over subsections instead of sections.  */
   8624      1.1     skrll   for (s = stdoutput->sections; s; s = s->next)
   8625      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   8626      1.1     skrll       {
   8627      1.1     skrll 	fragS *fragP;
   8628      1.1     skrll 	xtensa_opcode current_opcode = XTENSA_UNDEFINED;
   8629  1.1.1.2  christos 
   8630      1.1     skrll 	/* Walk over all of the fragments in a subsection.  */
   8631      1.1     skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   8632      1.1     skrll 	  {
   8633      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   8634      1.1     skrll 		&& ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
   8635      1.1     skrll 		    || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
   8636      1.1     skrll 	      {
   8637      1.1     skrll 		TInsn t_insn;
   8638      1.1     skrll 		fragS *loop_frag = next_non_empty_frag (fragP);
   8639      1.1     skrll 		tinsn_from_chars (&t_insn, loop_frag->fr_opcode, 0);
   8640      1.1     skrll 		current_opcode = t_insn.opcode;
   8641      1.1     skrll 		gas_assert (xtensa_opcode_is_loop (xtensa_default_isa,
   8642      1.1     skrll 					       current_opcode) == 1);
   8643      1.1     skrll 	      }
   8644      1.1     skrll 
   8645      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   8646      1.1     skrll 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
   8647      1.1     skrll 	      {
   8648      1.1     skrll 		if (count_insns_to_loop_end (fragP->fr_next, TRUE, 3) < 3
   8649      1.1     skrll 		    && (branch_before_loop_end (fragP->fr_next)
   8650      1.1     skrll 			|| (workaround_all_short_loops
   8651      1.1     skrll 			    && current_opcode != XTENSA_UNDEFINED
   8652      1.1     skrll 			    && current_opcode != xtensa_loop_opcode)))
   8653      1.1     skrll 		  {
   8654      1.1     skrll 		    if (fragP->tc_frag_data.is_no_transform)
   8655      1.1     skrll 		      as_bad (_("loop containing less than three instructions may trigger hardware errata"));
   8656      1.1     skrll 		    else
   8657      1.1     skrll 		      relax_frag_add_nop (fragP);
   8658      1.1     skrll 		  }
   8659      1.1     skrll 		frag_wane (fragP);
   8660      1.1     skrll 	      }
   8661      1.1     skrll 	  }
   8662      1.1     skrll       }
   8663      1.1     skrll }
   8664      1.1     skrll 
   8665      1.1     skrll 
   8666      1.1     skrll static int unrelaxed_frag_min_insn_count (fragS *);
   8667      1.1     skrll 
   8668      1.1     skrll static int
   8669      1.1     skrll count_insns_to_loop_end (fragS *base_fragP,
   8670      1.1     skrll 			 bfd_boolean count_relax_add,
   8671      1.1     skrll 			 int max_count)
   8672      1.1     skrll {
   8673      1.1     skrll   fragS *fragP = NULL;
   8674      1.1     skrll   int insn_count = 0;
   8675      1.1     skrll 
   8676      1.1     skrll   fragP = base_fragP;
   8677      1.1     skrll 
   8678      1.1     skrll   for (; fragP && !fragP->tc_frag_data.is_loop_target; fragP = fragP->fr_next)
   8679      1.1     skrll     {
   8680      1.1     skrll       insn_count += unrelaxed_frag_min_insn_count (fragP);
   8681      1.1     skrll       if (insn_count >= max_count)
   8682      1.1     skrll 	return max_count;
   8683      1.1     skrll 
   8684      1.1     skrll       if (count_relax_add)
   8685      1.1     skrll 	{
   8686      1.1     skrll 	  if (fragP->fr_type == rs_machine_dependent
   8687      1.1     skrll 	      && fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
   8688      1.1     skrll 	    {
   8689      1.1     skrll 	      /* In order to add the appropriate number of
   8690      1.1     skrll 	         NOPs, we count an instruction for downstream
   8691      1.1     skrll 	         occurrences.  */
   8692      1.1     skrll 	      insn_count++;
   8693      1.1     skrll 	      if (insn_count >= max_count)
   8694      1.1     skrll 		return max_count;
   8695      1.1     skrll 	    }
   8696  1.1.1.8  christos 	}
   8697      1.1     skrll     }
   8698      1.1     skrll   return insn_count;
   8699      1.1     skrll }
   8700      1.1     skrll 
   8701      1.1     skrll 
   8702      1.1     skrll static int
   8703      1.1     skrll unrelaxed_frag_min_insn_count (fragS *fragP)
   8704      1.1     skrll {
   8705      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   8706      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   8707      1.1     skrll   int insn_count = 0;
   8708      1.1     skrll   unsigned int offset = 0;
   8709      1.1     skrll 
   8710      1.1     skrll   if (!fragP->tc_frag_data.is_insn)
   8711      1.1     skrll     return insn_count;
   8712      1.1     skrll 
   8713      1.1     skrll   if (!insnbuf)
   8714      1.1     skrll     insnbuf = xtensa_insnbuf_alloc (isa);
   8715      1.1     skrll 
   8716      1.1     skrll   /* Decode the fixed instructions.  */
   8717      1.1     skrll   while (offset < fragP->fr_fix)
   8718      1.1     skrll     {
   8719      1.1     skrll       xtensa_format fmt;
   8720      1.1     skrll 
   8721      1.1     skrll       xtensa_insnbuf_from_chars
   8722      1.1     skrll 	(isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
   8723      1.1     skrll       fmt = xtensa_format_decode (isa, insnbuf);
   8724      1.1     skrll 
   8725      1.1     skrll       if (fmt == XTENSA_UNDEFINED)
   8726      1.1     skrll 	{
   8727      1.1     skrll 	  as_fatal (_("undecodable instruction in instruction frag"));
   8728      1.1     skrll 	  return insn_count;
   8729      1.1     skrll 	}
   8730      1.1     skrll       offset += xtensa_format_length (isa, fmt);
   8731      1.1     skrll       insn_count++;
   8732      1.1     skrll     }
   8733      1.1     skrll 
   8734      1.1     skrll   return insn_count;
   8735      1.1     skrll }
   8736      1.1     skrll 
   8737      1.1     skrll 
   8738      1.1     skrll static bfd_boolean unrelaxed_frag_has_b_j (fragS *);
   8739      1.1     skrll 
   8740      1.1     skrll static bfd_boolean
   8741      1.1     skrll branch_before_loop_end (fragS *base_fragP)
   8742      1.1     skrll {
   8743      1.1     skrll   fragS *fragP;
   8744      1.1     skrll 
   8745      1.1     skrll   for (fragP = base_fragP;
   8746      1.1     skrll        fragP && !fragP->tc_frag_data.is_loop_target;
   8747      1.1     skrll        fragP = fragP->fr_next)
   8748      1.1     skrll     {
   8749  1.1.1.8  christos       if (unrelaxed_frag_has_b_j (fragP))
   8750      1.1     skrll 	return TRUE;
   8751      1.1     skrll     }
   8752      1.1     skrll   return FALSE;
   8753      1.1     skrll }
   8754      1.1     skrll 
   8755      1.1     skrll 
   8756      1.1     skrll static bfd_boolean
   8757      1.1     skrll unrelaxed_frag_has_b_j (fragS *fragP)
   8758      1.1     skrll {
   8759      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   8760      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   8761      1.1     skrll   unsigned int offset = 0;
   8762      1.1     skrll 
   8763      1.1     skrll   if (!fragP->tc_frag_data.is_insn)
   8764      1.1     skrll     return FALSE;
   8765      1.1     skrll 
   8766      1.1     skrll   if (!insnbuf)
   8767      1.1     skrll     insnbuf = xtensa_insnbuf_alloc (isa);
   8768      1.1     skrll 
   8769      1.1     skrll   /* Decode the fixed instructions.  */
   8770      1.1     skrll   while (offset < fragP->fr_fix)
   8771      1.1     skrll     {
   8772      1.1     skrll       xtensa_format fmt;
   8773      1.1     skrll       int slot;
   8774      1.1     skrll 
   8775      1.1     skrll       xtensa_insnbuf_from_chars
   8776      1.1     skrll 	(isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
   8777      1.1     skrll       fmt = xtensa_format_decode (isa, insnbuf);
   8778      1.1     skrll       if (fmt == XTENSA_UNDEFINED)
   8779      1.1     skrll 	return FALSE;
   8780      1.1     skrll 
   8781      1.1     skrll       for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
   8782      1.1     skrll 	{
   8783      1.1     skrll 	  xtensa_opcode opcode =
   8784      1.1     skrll 	    get_opcode_from_buf (fragP->fr_literal + offset, slot);
   8785      1.1     skrll 	  if (xtensa_opcode_is_branch (isa, opcode) == 1
   8786      1.1     skrll 	      || xtensa_opcode_is_jump (isa, opcode) == 1)
   8787      1.1     skrll 	    return TRUE;
   8788      1.1     skrll 	}
   8789      1.1     skrll       offset += xtensa_format_length (isa, fmt);
   8790      1.1     skrll     }
   8791  1.1.1.5  christos   return FALSE;
   8792      1.1     skrll }
   8793      1.1     skrll 
   8794      1.1     skrll 
   8795      1.1     skrll /* Checks to be made after initial assembly but before relaxation.  */
   8796  1.1.1.5  christos 
   8797      1.1     skrll static bfd_boolean is_empty_loop (const TInsn *, fragS *);
   8798      1.1     skrll static bfd_boolean is_local_forward_loop (const TInsn *, fragS *);
   8799      1.1     skrll 
   8800      1.1     skrll static void
   8801      1.1     skrll xtensa_sanity_check (void)
   8802      1.1     skrll {
   8803      1.1     skrll   const char *file_name;
   8804      1.1     skrll   unsigned line;
   8805      1.1     skrll   frchainS *frchP;
   8806  1.1.1.4  christos   asection *s;
   8807      1.1     skrll 
   8808      1.1     skrll   file_name = as_where (&line);
   8809      1.1     skrll   for (s = stdoutput->sections; s; s = s->next)
   8810      1.1     skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   8811      1.1     skrll       {
   8812      1.1     skrll 	fragS *fragP;
   8813      1.1     skrll 
   8814      1.1     skrll 	/* Walk over all of the fragments in a subsection.  */
   8815      1.1     skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   8816      1.1     skrll 	  {
   8817      1.1     skrll 	    if (fragP->fr_type == rs_machine_dependent
   8818      1.1     skrll 		&& fragP->fr_subtype == RELAX_SLOTS
   8819      1.1     skrll 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
   8820      1.1     skrll 	      {
   8821      1.1     skrll 		static xtensa_insnbuf insnbuf = NULL;
   8822      1.1     skrll 		TInsn t_insn;
   8823      1.1     skrll 
   8824      1.1     skrll 		if (fragP->fr_opcode != NULL)
   8825      1.1     skrll 		  {
   8826      1.1     skrll 		    if (!insnbuf)
   8827      1.1     skrll 		      insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
   8828      1.1     skrll 		    tinsn_from_chars (&t_insn, fragP->fr_opcode, 0);
   8829      1.1     skrll 		    tinsn_immed_from_frag (&t_insn, fragP, 0);
   8830      1.1     skrll 
   8831      1.1     skrll 		    if (xtensa_opcode_is_loop (xtensa_default_isa,
   8832      1.1     skrll 					       t_insn.opcode) == 1)
   8833      1.1     skrll 		      {
   8834      1.1     skrll 			if (is_empty_loop (&t_insn, fragP))
   8835      1.1     skrll 			  {
   8836      1.1     skrll 			    new_logical_line (fragP->fr_file, fragP->fr_line);
   8837      1.1     skrll 			    as_bad (_("invalid empty loop"));
   8838      1.1     skrll 			  }
   8839      1.1     skrll 			if (!is_local_forward_loop (&t_insn, fragP))
   8840      1.1     skrll 			  {
   8841      1.1     skrll 			    new_logical_line (fragP->fr_file, fragP->fr_line);
   8842      1.1     skrll 			    as_bad (_("loop target does not follow "
   8843      1.1     skrll 				      "loop instruction in section"));
   8844      1.1     skrll 			  }
   8845      1.1     skrll 		      }
   8846      1.1     skrll 		  }
   8847      1.1     skrll 	      }
   8848      1.1     skrll 	  }
   8849  1.1.1.2  christos       }
   8850      1.1     skrll   new_logical_line (file_name, line);
   8851      1.1     skrll }
   8852      1.1     skrll 
   8853      1.1     skrll 
   8854      1.1     skrll #define LOOP_IMMED_OPN 1
   8855      1.1     skrll 
   8856      1.1     skrll /* Return TRUE if the loop target is the next non-zero fragment.  */
   8857      1.1     skrll 
   8858      1.1     skrll static bfd_boolean
   8859      1.1     skrll is_empty_loop (const TInsn *insn, fragS *fragP)
   8860      1.1     skrll {
   8861      1.1     skrll   const expressionS *exp;
   8862  1.1.1.2  christos   symbolS *symbolP;
   8863      1.1     skrll   fragS *next_fragP;
   8864  1.1.1.2  christos 
   8865      1.1     skrll   if (insn->insn_type != ITYPE_INSN)
   8866      1.1     skrll     return FALSE;
   8867  1.1.1.2  christos 
   8868      1.1     skrll   if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
   8869      1.1     skrll     return FALSE;
   8870      1.1     skrll 
   8871      1.1     skrll   if (insn->ntok <= LOOP_IMMED_OPN)
   8872      1.1     skrll     return FALSE;
   8873      1.1     skrll 
   8874      1.1     skrll   exp = &insn->tok[LOOP_IMMED_OPN];
   8875      1.1     skrll 
   8876      1.1     skrll   if (exp->X_op != O_symbol)
   8877      1.1     skrll     return FALSE;
   8878      1.1     skrll 
   8879      1.1     skrll   symbolP = exp->X_add_symbol;
   8880      1.1     skrll   if (!symbolP)
   8881      1.1     skrll     return FALSE;
   8882      1.1     skrll 
   8883      1.1     skrll   if (symbol_get_frag (symbolP) == NULL)
   8884      1.1     skrll     return FALSE;
   8885      1.1     skrll 
   8886      1.1     skrll   if (S_GET_VALUE (symbolP) != 0)
   8887      1.1     skrll     return FALSE;
   8888      1.1     skrll 
   8889      1.1     skrll   /* Walk through the zero-size fragments from this one.  If we find
   8890      1.1     skrll      the target fragment, then this is a zero-size loop.  */
   8891      1.1     skrll 
   8892      1.1     skrll   for (next_fragP = fragP->fr_next;
   8893      1.1     skrll        next_fragP != NULL;
   8894      1.1     skrll        next_fragP = next_fragP->fr_next)
   8895      1.1     skrll     {
   8896  1.1.1.2  christos       if (next_fragP == symbol_get_frag (symbolP))
   8897      1.1     skrll 	return TRUE;
   8898      1.1     skrll       if (next_fragP->fr_fix != 0)
   8899      1.1     skrll 	return FALSE;
   8900      1.1     skrll     }
   8901      1.1     skrll   return FALSE;
   8902      1.1     skrll }
   8903      1.1     skrll 
   8904      1.1     skrll 
   8905      1.1     skrll static bfd_boolean
   8906      1.1     skrll is_local_forward_loop (const TInsn *insn, fragS *fragP)
   8907      1.1     skrll {
   8908      1.1     skrll   const expressionS *exp;
   8909  1.1.1.2  christos   symbolS *symbolP;
   8910      1.1     skrll   fragS *next_fragP;
   8911  1.1.1.2  christos 
   8912      1.1     skrll   if (insn->insn_type != ITYPE_INSN)
   8913      1.1     skrll     return FALSE;
   8914  1.1.1.2  christos 
   8915      1.1     skrll   if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
   8916      1.1     skrll     return FALSE;
   8917      1.1     skrll 
   8918      1.1     skrll   if (insn->ntok <= LOOP_IMMED_OPN)
   8919      1.1     skrll     return FALSE;
   8920      1.1     skrll 
   8921      1.1     skrll   exp = &insn->tok[LOOP_IMMED_OPN];
   8922      1.1     skrll 
   8923      1.1     skrll   if (exp->X_op != O_symbol)
   8924      1.1     skrll     return FALSE;
   8925      1.1     skrll 
   8926      1.1     skrll   symbolP = exp->X_add_symbol;
   8927      1.1     skrll   if (!symbolP)
   8928      1.1     skrll     return FALSE;
   8929      1.1     skrll 
   8930      1.1     skrll   if (symbol_get_frag (symbolP) == NULL)
   8931      1.1     skrll     return FALSE;
   8932      1.1     skrll 
   8933      1.1     skrll   /* Walk through fragments until we find the target.
   8934      1.1     skrll      If we do not find the target, then this is an invalid loop.  */
   8935      1.1     skrll 
   8936      1.1     skrll   for (next_fragP = fragP->fr_next;
   8937      1.1     skrll        next_fragP != NULL;
   8938      1.1     skrll        next_fragP = next_fragP->fr_next)
   8939      1.1     skrll     {
   8940      1.1     skrll       if (next_fragP == symbol_get_frag (symbolP))
   8941      1.1     skrll 	return TRUE;
   8942      1.1     skrll     }
   8943      1.1     skrll 
   8944      1.1     skrll   return FALSE;
   8945      1.1     skrll }
   8946      1.1     skrll 
   8947      1.1     skrll 
   8948  1.1.1.8  christos #define XTINFO_NAME "Xtensa_Info"
   8949      1.1     skrll #define XTINFO_NAMESZ 12
   8950  1.1.1.5  christos #define XTINFO_TYPE 1
   8951      1.1     skrll 
   8952      1.1     skrll static void
   8953      1.1     skrll xtensa_add_config_info (void)
   8954      1.1     skrll {
   8955      1.1     skrll   asection *info_sec;
   8956      1.1     skrll   char *data, *p;
   8957      1.1     skrll   int sz;
   8958      1.1     skrll 
   8959      1.1     skrll   info_sec = subseg_new (".xtensa.info", 0);
   8960      1.1     skrll   bfd_set_section_flags (info_sec, SEC_HAS_CONTENTS | SEC_READONLY);
   8961      1.1     skrll 
   8962      1.1     skrll   data = XNEWVEC (char, 100);
   8963      1.1     skrll   sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
   8964      1.1     skrll 	   XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI);
   8965      1.1     skrll   sz = strlen (data) + 1;
   8966      1.1     skrll 
   8967      1.1     skrll   /* Add enough null terminators to pad to a word boundary.  */
   8968      1.1     skrll   do
   8969      1.1     skrll     data[sz++] = 0;
   8970      1.1     skrll   while ((sz & 3) != 0);
   8971      1.1     skrll 
   8972      1.1     skrll   /* Follow the standard note section layout:
   8973      1.1     skrll      First write the length of the name string.  */
   8974      1.1     skrll   p = frag_more (4);
   8975      1.1     skrll   md_number_to_chars (p, (valueT) XTINFO_NAMESZ, 4);
   8976      1.1     skrll 
   8977      1.1     skrll   /* Next comes the length of the "descriptor", i.e., the actual data.  */
   8978      1.1     skrll   p = frag_more (4);
   8979      1.1     skrll   md_number_to_chars (p, (valueT) sz, 4);
   8980      1.1     skrll 
   8981      1.1     skrll   /* Write the note type.  */
   8982      1.1     skrll   p = frag_more (4);
   8983      1.1     skrll   md_number_to_chars (p, (valueT) XTINFO_TYPE, 4);
   8984      1.1     skrll 
   8985      1.1     skrll   /* Write the name field.  */
   8986      1.1     skrll   p = frag_more (XTINFO_NAMESZ);
   8987      1.1     skrll   memcpy (p, XTINFO_NAME, XTINFO_NAMESZ);
   8988      1.1     skrll 
   8989      1.1     skrll   /* Finally, write the descriptor.  */
   8990      1.1     skrll   p = frag_more (sz);
   8991      1.1     skrll   memcpy (p, data, sz);
   8992  1.1.1.2  christos 
   8993  1.1.1.2  christos   free (data);
   8994  1.1.1.2  christos }
   8995  1.1.1.2  christos 
   8996  1.1.1.2  christos 
   8997  1.1.1.2  christos /* Alignment Functions.  */
   8999  1.1.1.2  christos 
   9000  1.1.1.2  christos static int
   9001  1.1.1.2  christos get_text_align_power (unsigned target_size)
   9002  1.1.1.2  christos {
   9003  1.1.1.2  christos   if (target_size <= 4)
   9004  1.1.1.2  christos     return 2;
   9005  1.1.1.2  christos 
   9006  1.1.1.2  christos   if (target_size <= 8)
   9007  1.1.1.2  christos     return 3;
   9008  1.1.1.2  christos 
   9009  1.1.1.2  christos   if (target_size <= 16)
   9010  1.1.1.2  christos     return 4;
   9011  1.1.1.2  christos 
   9012  1.1.1.2  christos   if (target_size <= 32)
   9013  1.1.1.2  christos     return 5;
   9014  1.1.1.2  christos 
   9015  1.1.1.2  christos   if (target_size <= 64)
   9016  1.1.1.2  christos     return 6;
   9017  1.1.1.2  christos 
   9018  1.1.1.2  christos   if (target_size <= 128)
   9019      1.1     skrll     return 7;
   9020      1.1     skrll 
   9021      1.1     skrll   if (target_size <= 256)
   9022      1.1     skrll     return 8;
   9023      1.1     skrll 
   9024      1.1     skrll   if (target_size <= 512)
   9025      1.1     skrll     return 9;
   9026      1.1     skrll 
   9027      1.1     skrll   if (target_size <= 1024)
   9028      1.1     skrll     return 10;
   9029      1.1     skrll 
   9030      1.1     skrll   gas_assert (0);
   9031      1.1     skrll   return 0;
   9032      1.1     skrll }
   9033      1.1     skrll 
   9034      1.1     skrll 
   9035      1.1     skrll static int
   9036      1.1     skrll get_text_align_max_fill_size (int align_pow,
   9037      1.1     skrll 			      bfd_boolean use_nops,
   9038      1.1     skrll 			      bfd_boolean use_no_density)
   9039      1.1     skrll {
   9040      1.1     skrll   if (!use_nops)
   9041      1.1     skrll     return (1 << align_pow);
   9042      1.1     skrll   if (use_no_density)
   9043      1.1     skrll     return 3 * (1 << align_pow);
   9044      1.1     skrll 
   9045      1.1     skrll   return 1 + (1 << align_pow);
   9046      1.1     skrll }
   9047      1.1     skrll 
   9048      1.1     skrll 
   9049      1.1     skrll /* Calculate the minimum bytes of fill needed at "address" to align a
   9050      1.1     skrll    target instruction of size "target_size" so that it does not cross a
   9051      1.1     skrll    power-of-two boundary specified by "align_pow".  If "use_nops" is FALSE,
   9052      1.1     skrll    the fill can be an arbitrary number of bytes.  Otherwise, the space must
   9053  1.1.1.2  christos    be filled by NOP instructions.  */
   9054      1.1     skrll 
   9055      1.1     skrll static int
   9056      1.1     skrll get_text_align_fill_size (addressT address,
   9057      1.1     skrll 			  int align_pow,
   9058      1.1     skrll 			  int target_size,
   9059      1.1     skrll 			  bfd_boolean use_nops,
   9060      1.1     skrll 			  bfd_boolean use_no_density)
   9061      1.1     skrll {
   9062      1.1     skrll   addressT alignment, fill, fill_limit, fill_step;
   9063      1.1     skrll   bfd_boolean skip_one = FALSE;
   9064      1.1     skrll 
   9065      1.1     skrll   alignment = (1 << align_pow);
   9066      1.1     skrll   gas_assert (target_size > 0 && alignment >= (addressT) target_size);
   9067      1.1     skrll 
   9068      1.1     skrll   if (!use_nops)
   9069      1.1     skrll     {
   9070      1.1     skrll       fill_limit = alignment;
   9071      1.1     skrll       fill_step = 1;
   9072      1.1     skrll     }
   9073      1.1     skrll   else if (!use_no_density)
   9074      1.1     skrll     {
   9075      1.1     skrll       /* Combine 2- and 3-byte NOPs to fill anything larger than one.  */
   9076      1.1     skrll       fill_limit = alignment * 2;
   9077      1.1     skrll       fill_step = 1;
   9078      1.1     skrll       skip_one = TRUE;
   9079      1.1     skrll     }
   9080      1.1     skrll   else
   9081      1.1     skrll     {
   9082      1.1     skrll       /* Fill with 3-byte NOPs -- can only fill multiples of 3.  */
   9083  1.1.1.2  christos       fill_limit = alignment * 3;
   9084      1.1     skrll       fill_step = 3;
   9085      1.1     skrll     }
   9086      1.1     skrll 
   9087      1.1     skrll   /* Try all fill sizes until finding one that works.  */
   9088      1.1     skrll   for (fill = 0; fill < fill_limit; fill += fill_step)
   9089      1.1     skrll     {
   9090      1.1     skrll       if (skip_one && fill == 1)
   9091  1.1.1.2  christos 	continue;
   9092  1.1.1.2  christos       if ((address + fill) >> align_pow
   9093  1.1.1.2  christos 	  == (address + fill + target_size - 1) >> align_pow)
   9094  1.1.1.2  christos 	return fill;
   9095  1.1.1.2  christos     }
   9096  1.1.1.2  christos   gas_assert (0);
   9097  1.1.1.2  christos   return 0;
   9098  1.1.1.2  christos }
   9099  1.1.1.2  christos 
   9100  1.1.1.2  christos 
   9101  1.1.1.2  christos static int
   9102      1.1     skrll branch_align_power (segT sec)
   9103      1.1     skrll {
   9104      1.1     skrll   /* If the Xtensa processor has a fetch width of X, and
   9105      1.1     skrll      the section is aligned to at least that boundary, then a branch
   9106      1.1     skrll      target need only fit within that aligned block of memory to avoid
   9107      1.1     skrll      a stall.  Otherwise, try to fit branch targets within 4-byte
   9108      1.1     skrll      aligned blocks (which may be insufficient, e.g., if the section
   9109      1.1     skrll      has no alignment, but it's good enough).  */
   9110      1.1     skrll   int fetch_align = get_text_align_power(xtensa_fetch_width);
   9111      1.1     skrll   int sec_align = get_recorded_alignment (sec);
   9112      1.1     skrll 
   9113      1.1     skrll   if (sec_align >= fetch_align)
   9114      1.1     skrll     return fetch_align;
   9115      1.1     skrll 
   9116  1.1.1.2  christos   return 2;
   9117      1.1     skrll }
   9118      1.1     skrll 
   9119      1.1     skrll 
   9120  1.1.1.2  christos /* This will assert if it is not possible.  */
   9121      1.1     skrll 
   9122      1.1     skrll static int
   9123      1.1     skrll get_text_align_nop_count (offsetT fill_size, bfd_boolean use_no_density)
   9124      1.1     skrll {
   9125      1.1     skrll   int count = 0;
   9126      1.1     skrll 
   9127      1.1     skrll   if (use_no_density)
   9128      1.1     skrll     {
   9129      1.1     skrll       gas_assert (fill_size % 3 == 0);
   9130  1.1.1.2  christos       return (fill_size / 3);
   9131      1.1     skrll     }
   9132      1.1     skrll 
   9133      1.1     skrll   gas_assert (fill_size != 1);	/* Bad argument.  */
   9134      1.1     skrll 
   9135      1.1     skrll   while (fill_size > 1)
   9136      1.1     skrll     {
   9137      1.1     skrll       int insn_size = 3;
   9138      1.1     skrll       if (fill_size == 2 || fill_size == 4)
   9139      1.1     skrll 	insn_size = 2;
   9140      1.1     skrll       fill_size -= insn_size;
   9141      1.1     skrll       count++;
   9142      1.1     skrll     }
   9143      1.1     skrll   gas_assert (fill_size != 1);	/* Bad algorithm.  */
   9144      1.1     skrll   return count;
   9145  1.1.1.2  christos }
   9146      1.1     skrll 
   9147      1.1     skrll 
   9148      1.1     skrll static int
   9149      1.1     skrll get_text_align_nth_nop_size (offsetT fill_size,
   9150      1.1     skrll 			     int n,
   9151      1.1     skrll 			     bfd_boolean use_no_density)
   9152      1.1     skrll {
   9153      1.1     skrll   int count = 0;
   9154      1.1     skrll 
   9155      1.1     skrll   if (use_no_density)
   9156      1.1     skrll     return 3;
   9157  1.1.1.2  christos 
   9158      1.1     skrll   gas_assert (fill_size != 1);	/* Bad argument.  */
   9159      1.1     skrll 
   9160      1.1     skrll   while (fill_size > 1)
   9161      1.1     skrll     {
   9162      1.1     skrll       int insn_size = 3;
   9163      1.1     skrll       if (fill_size == 2 || fill_size == 4)
   9164      1.1     skrll 	insn_size = 2;
   9165      1.1     skrll       fill_size -= insn_size;
   9166      1.1     skrll       count++;
   9167      1.1     skrll       if (n + 1 == count)
   9168      1.1     skrll 	return insn_size;
   9169      1.1     skrll     }
   9170      1.1     skrll   gas_assert (0);
   9171      1.1     skrll   return 0;
   9172      1.1     skrll }
   9173      1.1     skrll 
   9174      1.1     skrll 
   9175      1.1     skrll /* For the given fragment, find the appropriate address
   9176      1.1     skrll    for it to begin at if we are using NOPs to align it.  */
   9177      1.1     skrll 
   9178      1.1     skrll static addressT
   9179      1.1     skrll get_noop_aligned_address (fragS *fragP, addressT address)
   9180      1.1     skrll {
   9181      1.1     skrll   /* The rule is: get next fragment's FIRST instruction.  Find
   9182      1.1     skrll      the smallest number of bytes that need to be added to
   9183      1.1     skrll      ensure that the next fragment's FIRST instruction will fit
   9184      1.1     skrll      in a single word.
   9185      1.1     skrll 
   9186      1.1     skrll      E.G.,   2 bytes : 0, 1, 2 mod 4
   9187      1.1     skrll 	     3 bytes: 0, 1 mod 4
   9188      1.1     skrll 
   9189      1.1     skrll      If the FIRST instruction MIGHT be relaxed,
   9190      1.1     skrll      assume that it will become a 3-byte instruction.
   9191  1.1.1.2  christos 
   9192  1.1.1.2  christos      Note again here that LOOP instructions are not bundleable,
   9193      1.1     skrll      and this relaxation only applies to LOOP opcodes.  */
   9194      1.1     skrll 
   9195      1.1     skrll   int fill_size = 0;
   9196      1.1     skrll   int first_insn_size;
   9197      1.1     skrll   int loop_insn_size;
   9198      1.1     skrll   addressT pre_opcode_bytes;
   9199      1.1     skrll   int align_power;
   9200  1.1.1.2  christos   fragS *first_insn;
   9201      1.1     skrll   xtensa_opcode opcode;
   9202      1.1     skrll   bfd_boolean is_loop;
   9203      1.1     skrll 
   9204      1.1     skrll   gas_assert (fragP->fr_type == rs_machine_dependent);
   9205      1.1     skrll   gas_assert (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE);
   9206      1.1     skrll 
   9207      1.1     skrll   /* Find the loop frag.  */
   9208      1.1     skrll   first_insn = next_non_empty_frag (fragP);
   9209      1.1     skrll   /* Now find the first insn frag.  */
   9210      1.1     skrll   first_insn = next_non_empty_frag (first_insn);
   9211      1.1     skrll 
   9212      1.1     skrll   is_loop = next_frag_opcode_is_loop (fragP, &opcode);
   9213      1.1     skrll   gas_assert (is_loop);
   9214      1.1     skrll   loop_insn_size = xg_get_single_size (opcode);
   9215      1.1     skrll 
   9216      1.1     skrll   pre_opcode_bytes = next_frag_pre_opcode_bytes (fragP);
   9217      1.1     skrll   pre_opcode_bytes += loop_insn_size;
   9218      1.1     skrll 
   9219      1.1     skrll   /* For loops, the alignment depends on the size of the
   9220      1.1     skrll      instruction following the loop, not the LOOP instruction.  */
   9221      1.1     skrll 
   9222      1.1     skrll   if (first_insn == NULL)
   9223      1.1     skrll     first_insn_size = xtensa_fetch_width;
   9224      1.1     skrll   else
   9225      1.1     skrll     first_insn_size = get_loop_align_size (frag_format_size (first_insn));
   9226      1.1     skrll 
   9227      1.1     skrll   /* If it was 8, then we'll need a larger alignment for the section.  */
   9228      1.1     skrll   align_power = get_text_align_power (first_insn_size);
   9229      1.1     skrll   record_alignment (now_seg, align_power);
   9230      1.1     skrll 
   9231      1.1     skrll   fill_size = get_text_align_fill_size
   9232      1.1     skrll     (address + pre_opcode_bytes, align_power, first_insn_size, TRUE,
   9233      1.1     skrll      fragP->tc_frag_data.is_no_density);
   9234      1.1     skrll 
   9235      1.1     skrll   return address + fill_size;
   9236      1.1     skrll }
   9237      1.1     skrll 
   9238      1.1     skrll 
   9239      1.1     skrll /* 3 mechanisms for relaxing an alignment:
   9240      1.1     skrll 
   9241      1.1     skrll    Align to a power of 2.
   9242      1.1     skrll    Align so the next fragment's instruction does not cross a word boundary.
   9243      1.1     skrll    Align the current instruction so that if the next instruction
   9244      1.1     skrll        were 3 bytes, it would not cross a word boundary.
   9245      1.1     skrll 
   9246      1.1     skrll    We can align with:
   9247      1.1     skrll 
   9248      1.1     skrll    zeros    - This is easy; always insert zeros.
   9249      1.1     skrll    nops     - 3-byte and 2-byte instructions
   9250      1.1     skrll               2 - 2-byte nop
   9251      1.1     skrll               3 - 3-byte nop
   9252      1.1     skrll               4 - 2 2-byte nops
   9253      1.1     skrll               >=5 : 3-byte instruction + fn (n-3)
   9254      1.1     skrll    widening - widen previous instructions.  */
   9255  1.1.1.2  christos 
   9256      1.1     skrll static offsetT
   9257      1.1     skrll get_aligned_diff (fragS *fragP, addressT address, offsetT *max_diff)
   9258      1.1     skrll {
   9259      1.1     skrll   addressT target_address, loop_insn_offset;
   9260      1.1     skrll   int target_size;
   9261      1.1     skrll   xtensa_opcode loop_opcode;
   9262      1.1     skrll   bfd_boolean is_loop;
   9263      1.1     skrll   int align_power;
   9264      1.1     skrll   offsetT opt_diff;
   9265      1.1     skrll   offsetT branch_align;
   9266      1.1     skrll   fragS *loop_frag;
   9267      1.1     skrll 
   9268      1.1     skrll   gas_assert (fragP->fr_type == rs_machine_dependent);
   9269      1.1     skrll   switch (fragP->fr_subtype)
   9270      1.1     skrll     {
   9271      1.1     skrll     case RELAX_DESIRE_ALIGN:
   9272  1.1.1.2  christos       target_size = next_frag_format_size (fragP);
   9273      1.1     skrll       if (target_size == XTENSA_UNDEFINED)
   9274      1.1     skrll 	target_size = 3;
   9275      1.1     skrll       align_power = branch_align_power (now_seg);
   9276      1.1     skrll       branch_align = 1 << align_power;
   9277      1.1     skrll       /* Don't count on the section alignment being as large as the target.  */
   9278      1.1     skrll       if (target_size > branch_align)
   9279      1.1     skrll 	target_size = branch_align;
   9280      1.1     skrll       opt_diff = get_text_align_fill_size (address, align_power,
   9281      1.1     skrll 					   target_size, FALSE, FALSE);
   9282      1.1     skrll 
   9283      1.1     skrll       *max_diff = (opt_diff + branch_align
   9284  1.1.1.2  christos 		   - (target_size + ((address + opt_diff) % branch_align)));
   9285      1.1     skrll       gas_assert (*max_diff >= opt_diff);
   9286      1.1     skrll       return opt_diff;
   9287      1.1     skrll 
   9288      1.1     skrll     case RELAX_ALIGN_NEXT_OPCODE:
   9289      1.1     skrll       /* The next non-empty frag after this one holds the LOOP instruction
   9290      1.1     skrll 	 that needs to be aligned.  The required alignment depends on the
   9291      1.1     skrll 	 size of the next non-empty frag after the loop frag, i.e., the
   9292      1.1     skrll 	 first instruction in the loop.  */
   9293      1.1     skrll       loop_frag = next_non_empty_frag (fragP);
   9294      1.1     skrll       target_size = get_loop_align_size (next_frag_format_size (loop_frag));
   9295      1.1     skrll       loop_insn_offset = 0;
   9296      1.1     skrll       is_loop = next_frag_opcode_is_loop (fragP, &loop_opcode);
   9297      1.1     skrll       gas_assert (is_loop);
   9298      1.1     skrll 
   9299      1.1     skrll       /* If the loop has been expanded then the LOOP instruction
   9300      1.1     skrll 	 could be at an offset from this fragment.  */
   9301      1.1     skrll       if (loop_frag->tc_frag_data.slot_subtypes[0] != RELAX_IMMED)
   9302      1.1     skrll 	loop_insn_offset = get_expanded_loop_offset (loop_opcode);
   9303      1.1     skrll 
   9304  1.1.1.2  christos       /* In an ideal world, which is what we are shooting for here,
   9305      1.1     skrll 	 we wouldn't need to use any NOPs immediately prior to the
   9306      1.1     skrll 	 LOOP instruction.  If this approach fails, relax_frag_loop_align
   9307      1.1     skrll 	 will call get_noop_aligned_address.  */
   9308      1.1     skrll       target_address =
   9309      1.1     skrll 	address + loop_insn_offset + xg_get_single_size (loop_opcode);
   9310  1.1.1.2  christos       align_power = get_text_align_power (target_size);
   9311      1.1     skrll       opt_diff = get_text_align_fill_size (target_address, align_power,
   9312      1.1     skrll 					   target_size, FALSE, FALSE);
   9313      1.1     skrll 
   9314      1.1     skrll       *max_diff = xtensa_fetch_width
   9315      1.1     skrll 	- ((target_address + opt_diff) % xtensa_fetch_width)
   9316      1.1     skrll 	- target_size + opt_diff;
   9317      1.1     skrll       gas_assert (*max_diff >= opt_diff);
   9318      1.1     skrll       return opt_diff;
   9319      1.1     skrll 
   9320      1.1     skrll     default:
   9321      1.1     skrll       break;
   9322  1.1.1.6  christos     }
   9323  1.1.1.6  christos   gas_assert (0);
   9324  1.1.1.6  christos   return 0;
   9325  1.1.1.6  christos }
   9326  1.1.1.6  christos 
   9327  1.1.1.6  christos 
   9328  1.1.1.6  christos /* md_relax_frag Hook and Helper Functions.  */
   9330  1.1.1.6  christos 
   9331  1.1.1.6  christos static long relax_frag_loop_align (fragS *, long);
   9332  1.1.1.6  christos static long relax_frag_for_align (fragS *, long);
   9333  1.1.1.6  christos static long relax_frag_immed
   9334  1.1.1.6  christos   (segT, fragS *, long, int, xtensa_format, int, int *, bfd_boolean);
   9335  1.1.1.6  christos 
   9336  1.1.1.6  christos /* Get projected address for the first fulcrum on a path from source to
   9337  1.1.1.6  christos    target.  */
   9338  1.1.1.6  christos static addressT xg_get_fulcrum (addressT source, addressT target)
   9339  1.1.1.6  christos {
   9340  1.1.1.6  christos   offsetT delta = target - source;
   9341  1.1.1.6  christos   int n;
   9342  1.1.1.6  christos 
   9343  1.1.1.6  christos   n = (labs (delta) + J_RANGE - J_MARGIN - 1) / (J_RANGE - J_MARGIN);
   9344  1.1.1.6  christos   return source + delta / n;
   9345  1.1.1.6  christos }
   9346  1.1.1.4  christos 
   9347  1.1.1.6  christos /* Given trampoline index, source and target of a jump find the best
   9348  1.1.1.6  christos    candidate trampoline for the first fulcrum.  The best trampoline is
   9349  1.1.1.6  christos    the one in the reach of "j' instruction from the source, closest to
   9350  1.1.1.6  christos    the projected fulcrum address, and preferrably w/o a jump around or
   9351  1.1.1.6  christos    with already initialized jump around.  */
   9352  1.1.1.4  christos static size_t xg_find_best_trampoline (struct trampoline_index *idx,
   9353  1.1.1.6  christos 				       addressT source, addressT target)
   9354  1.1.1.4  christos {
   9355  1.1.1.6  christos   addressT fulcrum = xg_get_fulcrum (source, target);
   9356  1.1.1.6  christos   size_t dist = 0;
   9357  1.1.1.6  christos   size_t best = -1;
   9358  1.1.1.6  christos   size_t base_tr = xg_find_trampoline (idx, fulcrum);
   9359  1.1.1.6  christos   int checked = 1;
   9360  1.1.1.6  christos 
   9361  1.1.1.6  christos   /* Check trampoline frags around the base_tr to find the best.  */
   9362  1.1.1.4  christos   for (dist = 0; checked; ++dist)
   9363  1.1.1.6  christos     {
   9364  1.1.1.6  christos       int i;
   9365  1.1.1.6  christos       size_t tr = base_tr - dist;
   9366  1.1.1.6  christos 
   9367  1.1.1.6  christos       checked = 0;
   9368  1.1.1.6  christos 
   9369  1.1.1.6  christos       /* Trampolines are checked in the following order:
   9370  1.1.1.7  christos          base_tr, base_tr + 1, base_tr - 1, base_tr + 2, base_tr - 2  */
   9371  1.1.1.7  christos       for (i = 0; i < 2; ++i, tr = base_tr + dist + 1)
   9372  1.1.1.7  christos 	if (tr < idx->n_entries)
   9373  1.1.1.7  christos 	  {
   9374  1.1.1.7  christos 	    fragS *trampoline_frag = idx->entry[tr];
   9375  1.1.1.7  christos 	    offsetT off;
   9376  1.1.1.6  christos 
   9377  1.1.1.6  christos 	    /* Don't check trampolines outside source - target interval.  */
   9378  1.1.1.6  christos 	    if ((trampoline_frag->fr_address < source &&
   9379  1.1.1.6  christos 		 trampoline_frag->fr_address < target) ||
   9380  1.1.1.6  christos 		(trampoline_frag->fr_address > source &&
   9381  1.1.1.6  christos 		 trampoline_frag->fr_address > target))
   9382  1.1.1.6  christos 	      continue;
   9383  1.1.1.6  christos 
   9384  1.1.1.6  christos 	    /* Don't choose trampoline that contains the source.  */
   9385  1.1.1.6  christos 	    if (source >= trampoline_frag->fr_address
   9386  1.1.1.6  christos 		&& source <= trampoline_frag->fr_address +
   9387  1.1.1.6  christos 		trampoline_frag->fr_fix)
   9388  1.1.1.6  christos 	      continue;
   9389  1.1.1.6  christos 
   9390  1.1.1.6  christos 	    off = trampoline_frag->fr_address - fulcrum;
   9391  1.1.1.6  christos 	    /* Stop if some trampoline is found and the search is more than
   9392  1.1.1.6  christos 	       J_RANGE / 4 from the projected fulcrum.  A trampoline w/o jump
   9393  1.1.1.6  christos 	       around is nice, but it shouldn't have much overhead.  */
   9394  1.1.1.6  christos 	    if (best < idx->n_entries && labs (off) > J_RANGE / 4)
   9395  1.1.1.6  christos 	      return best;
   9396  1.1.1.4  christos 
   9397  1.1.1.6  christos 	    off = trampoline_frag->fr_address - source;
   9398  1.1.1.6  christos 	    if (labs (off) < J_RANGE - J_MARGIN)
   9399  1.1.1.6  christos 	      {
   9400  1.1.1.6  christos 		++checked;
   9401  1.1.1.6  christos 		/* Stop if a trampoline w/o jump around is found or initialized
   9402  1.1.1.6  christos 		   trampoline with jump around is found.  */
   9403  1.1.1.6  christos 		if (!trampoline_frag->tc_frag_data.needs_jump_around ||
   9404  1.1.1.6  christos 		    trampoline_frag->fr_fix)
   9405  1.1.1.6  christos 		  return tr;
   9406  1.1.1.6  christos 		else if (best >= idx->n_entries)
   9407  1.1.1.6  christos 		  best = tr;
   9408  1.1.1.6  christos 	      }
   9409  1.1.1.6  christos 	  }
   9410  1.1.1.6  christos     }
   9411  1.1.1.6  christos 
   9412  1.1.1.6  christos   if (best < idx->n_entries)
   9413  1.1.1.6  christos     return best;
   9414  1.1.1.6  christos   else
   9415  1.1.1.6  christos     as_fatal (_("cannot find suitable trampoline"));
   9416  1.1.1.6  christos }
   9417  1.1.1.6  christos 
   9418  1.1.1.6  christos static fixS *xg_relax_fixup (struct trampoline_index *idx, fixS *fixP)
   9419  1.1.1.6  christos {
   9420  1.1.1.6  christos   symbolS *s = fixP->fx_addsy;
   9421  1.1.1.6  christos   addressT source = fixP->fx_frag->fr_address;
   9422  1.1.1.6  christos   addressT target = S_GET_VALUE (s) + fixP->fx_offset;
   9423  1.1.1.6  christos   size_t tr = xg_find_best_trampoline (idx, source, target);
   9424  1.1.1.6  christos   fragS *trampoline_frag = idx->entry[tr];
   9425  1.1.1.6  christos   fixS *newfixP;
   9426  1.1.1.6  christos 
   9427  1.1.1.6  christos   init_trampoline_frag (trampoline_frag);
   9428  1.1.1.6  christos   newfixP = xg_append_jump (trampoline_frag,
   9429  1.1.1.6  christos 			    fixP->fx_addsy, fixP->fx_offset);
   9430  1.1.1.4  christos 
   9431  1.1.1.4  christos   /* Adjust the fixup for the original "j" instruction to
   9432  1.1.1.6  christos      point to the newly added jump.  */
   9433  1.1.1.4  christos   fixP->fx_addsy = trampoline_frag->fr_symbol;
   9434  1.1.1.4  christos   fixP->fx_offset = trampoline_frag->fr_fix - 3;
   9435  1.1.1.6  christos   fixP->tc_fix_data.X_add_symbol = trampoline_frag->fr_symbol;
   9436  1.1.1.6  christos   fixP->tc_fix_data.X_add_number = trampoline_frag->fr_fix - 3;
   9437  1.1.1.6  christos 
   9438  1.1.1.4  christos   trampoline_frag->tc_frag_data.relax_seen = FALSE;
   9439  1.1.1.4  christos 
   9440  1.1.1.4  christos   if (xg_is_trampoline_frag_full (trampoline_frag))
   9441  1.1.1.4  christos     xg_remove_trampoline_from_index (idx, tr);
   9442  1.1.1.4  christos 
   9443  1.1.1.4  christos   return newfixP;
   9444  1.1.1.4  christos }
   9445  1.1.1.4  christos 
   9446  1.1.1.6  christos static bfd_boolean xg_is_relaxable_fixup (fixS *fixP)
   9447  1.1.1.6  christos {
   9448  1.1.1.4  christos   xtensa_isa isa = xtensa_default_isa;
   9449  1.1.1.4  christos   addressT addr = fixP->fx_frag->fr_address;
   9450  1.1.1.6  christos   addressT target;
   9451  1.1.1.4  christos   offsetT delta;
   9452  1.1.1.4  christos   symbolS *s = fixP->fx_addsy;
   9453  1.1.1.4  christos   int slot;
   9454  1.1.1.4  christos   xtensa_format fmt;
   9455  1.1.1.4  christos   xtensa_opcode opcode;
   9456  1.1.1.4  christos 
   9457  1.1.1.4  christos   if (fixP->fx_r_type < BFD_RELOC_XTENSA_SLOT0_OP ||
   9458  1.1.1.4  christos       fixP->fx_r_type > BFD_RELOC_XTENSA_SLOT14_OP)
   9459  1.1.1.4  christos     return FALSE;
   9460  1.1.1.4  christos 
   9461  1.1.1.6  christos   target = S_GET_VALUE (s) + fixP->fx_offset;
   9462  1.1.1.4  christos   delta = target - addr;
   9463  1.1.1.4  christos 
   9464  1.1.1.6  christos   if (labs (delta) < J_RANGE - J_MARGIN)
   9465  1.1.1.4  christos     return FALSE;
   9466  1.1.1.6  christos 
   9467  1.1.1.6  christos   xtensa_insnbuf_from_chars (isa, trampoline_buf,
   9468  1.1.1.6  christos 			     (unsigned char *) fixP->fx_frag->fr_literal +
   9469  1.1.1.4  christos 			     fixP->fx_where, 0);
   9470  1.1.1.6  christos   fmt = xtensa_format_decode (isa, trampoline_buf);
   9471  1.1.1.4  christos   gas_assert (fmt != XTENSA_UNDEFINED);
   9472  1.1.1.6  christos   slot = fixP->tc_fix_data.slot;
   9473  1.1.1.6  christos   xtensa_format_get_slot (isa, fmt, slot, trampoline_buf, trampoline_slotbuf);
   9474  1.1.1.4  christos   opcode = xtensa_opcode_decode (isa, fmt, slot, trampoline_slotbuf);
   9475  1.1.1.6  christos   return opcode == xtensa_j_opcode;
   9476  1.1.1.6  christos }
   9477  1.1.1.6  christos 
   9478  1.1.1.6  christos static void xg_relax_fixups (struct trampoline_seg *ts)
   9479  1.1.1.6  christos {
   9480  1.1.1.6  christos   struct trampoline_index *idx = &ts->index;
   9481  1.1.1.6  christos   segment_info_type *seginfo = seg_info (now_seg);
   9482  1.1.1.6  christos   fixS *fx;
   9483  1.1.1.6  christos 
   9484  1.1.1.4  christos   for (fx = seginfo->fix_root; fx; fx = fx->fx_next)
   9485  1.1.1.6  christos     {
   9486  1.1.1.6  christos       fixS *fixP = fx;
   9487  1.1.1.6  christos       struct trampoline_chain *tc = NULL;
   9488  1.1.1.6  christos 
   9489  1.1.1.6  christos       if (xg_is_relaxable_fixup (fixP))
   9490  1.1.1.6  christos 	{
   9491  1.1.1.4  christos 	  tc = xg_find_best_eq_target (ts, fixP->fx_frag->fr_address,
   9492  1.1.1.4  christos 				       &fixP->fx_addsy, &fixP->fx_offset);
   9493  1.1.1.4  christos 	  if (!tc)
   9494  1.1.1.6  christos 	    tc = xg_create_trampoline_chain (ts, fixP->fx_addsy,
   9495  1.1.1.6  christos 					     fixP->fx_offset);
   9496  1.1.1.6  christos 	  gas_assert (tc);
   9497  1.1.1.6  christos 	}
   9498  1.1.1.6  christos 
   9499  1.1.1.6  christos       while (xg_is_relaxable_fixup (fixP))
   9500  1.1.1.6  christos 	{
   9501  1.1.1.6  christos 	  fixP = xg_relax_fixup (idx, fixP);
   9502  1.1.1.4  christos 	  xg_add_location_to_chain (tc, fixP->fx_frag->fr_symbol,
   9503  1.1.1.6  christos 				    fixP->fx_where);
   9504  1.1.1.4  christos 	}
   9505  1.1.1.6  christos     }
   9506  1.1.1.6  christos }
   9507  1.1.1.4  christos 
   9508      1.1     skrll /* Given a trampoline frag relax all jumps that might want to use this
   9509      1.1     skrll    trampoline.  Only do real work once per relaxation cycle, when
   9510      1.1     skrll    xg_relax_trampoline is called for the first trampoline in the now_seg.
   9511      1.1     skrll    Don't use stretch, don't update new_stretch: place fulcrums with a
   9512      1.1     skrll    slack to tolerate code movement.  In the worst case if a jump between
   9513      1.1     skrll    two trampolines wouldn't reach the next relaxation pass will fix it.  */
   9514      1.1     skrll static void xg_relax_trampoline (fragS *fragP, long stretch ATTRIBUTE_UNUSED,
   9515      1.1     skrll 				 long *new_stretch ATTRIBUTE_UNUSED)
   9516      1.1     skrll {
   9517      1.1     skrll   struct trampoline_seg *ts = find_trampoline_seg (now_seg);
   9518  1.1.1.5  christos 
   9519      1.1     skrll   if (ts->index.n_entries && ts->index.entry[0] == fragP)
   9520      1.1     skrll     xg_relax_fixups (ts);
   9521      1.1     skrll }
   9522      1.1     skrll 
   9523      1.1     skrll /* Return the number of bytes added to this fragment, given that the
   9524      1.1     skrll    input has been stretched already by "stretch".  */
   9525  1.1.1.5  christos 
   9526      1.1     skrll long
   9527      1.1     skrll xtensa_relax_frag (fragS *fragP, long stretch, int *stretched_p)
   9528      1.1     skrll {
   9529      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   9530      1.1     skrll   int unreported = fragP->tc_frag_data.unreported_expansion;
   9531      1.1     skrll   long new_stretch = 0;
   9532      1.1     skrll   const char *file_name;
   9533      1.1     skrll   unsigned line;
   9534      1.1     skrll   int lit_size;
   9535      1.1     skrll   static xtensa_insnbuf vbuf = NULL;
   9536      1.1     skrll   int slot, num_slots;
   9537      1.1     skrll   xtensa_format fmt;
   9538      1.1     skrll 
   9539      1.1     skrll   file_name = as_where (&line);
   9540      1.1     skrll   new_logical_line (fragP->fr_file, fragP->fr_line);
   9541      1.1     skrll 
   9542      1.1     skrll   fragP->tc_frag_data.unreported_expansion = 0;
   9543      1.1     skrll 
   9544      1.1     skrll   switch (fragP->fr_subtype)
   9545      1.1     skrll     {
   9546      1.1     skrll     case RELAX_ALIGN_NEXT_OPCODE:
   9547      1.1     skrll       /* Always convert.  */
   9548      1.1     skrll       if (fragP->tc_frag_data.relax_seen)
   9549      1.1     skrll 	new_stretch = relax_frag_loop_align (fragP, stretch);
   9550      1.1     skrll       break;
   9551      1.1     skrll 
   9552      1.1     skrll     case RELAX_LOOP_END:
   9553      1.1     skrll       /* Do nothing.  */
   9554      1.1     skrll       break;
   9555      1.1     skrll 
   9556      1.1     skrll     case RELAX_LOOP_END_ADD_NOP:
   9557      1.1     skrll       /* Add a NOP and switch to .fill 0.  */
   9558      1.1     skrll       new_stretch = relax_frag_add_nop (fragP);
   9559      1.1     skrll       frag_wane (fragP);
   9560  1.1.1.2  christos       break;
   9561      1.1     skrll 
   9562      1.1     skrll     case RELAX_DESIRE_ALIGN:
   9563      1.1     skrll       /* Do nothing. The narrowing before this frag will either align
   9564      1.1     skrll          it or not.  */
   9565      1.1     skrll       break;
   9566      1.1     skrll 
   9567      1.1     skrll     case RELAX_LITERAL:
   9568      1.1     skrll     case RELAX_LITERAL_FINAL:
   9569      1.1     skrll       return 0;
   9570      1.1     skrll 
   9571      1.1     skrll     case RELAX_LITERAL_NR:
   9572      1.1     skrll       lit_size = 4;
   9573      1.1     skrll       fragP->fr_subtype = RELAX_LITERAL_FINAL;
   9574      1.1     skrll       gas_assert (unreported == lit_size);
   9575      1.1     skrll       memset (&fragP->fr_literal[fragP->fr_fix], 0, 4);
   9576      1.1     skrll       fragP->fr_var -= lit_size;
   9577      1.1     skrll       fragP->fr_fix += lit_size;
   9578      1.1     skrll       new_stretch = 4;
   9579      1.1     skrll       break;
   9580      1.1     skrll 
   9581      1.1     skrll     case RELAX_SLOTS:
   9582      1.1     skrll       if (vbuf == NULL)
   9583      1.1     skrll 	vbuf = xtensa_insnbuf_alloc (isa);
   9584      1.1     skrll 
   9585      1.1     skrll       xtensa_insnbuf_from_chars
   9586      1.1     skrll 	(isa, vbuf, (unsigned char *) fragP->fr_opcode, 0);
   9587      1.1     skrll       fmt = xtensa_format_decode (isa, vbuf);
   9588      1.1     skrll       num_slots = xtensa_format_num_slots (isa, fmt);
   9589      1.1     skrll 
   9590      1.1     skrll       for (slot = 0; slot < num_slots; slot++)
   9591      1.1     skrll 	{
   9592      1.1     skrll 	  switch (fragP->tc_frag_data.slot_subtypes[slot])
   9593      1.1     skrll 	    {
   9594      1.1     skrll 	    case RELAX_NARROW:
   9595      1.1     skrll 	      if (fragP->tc_frag_data.relax_seen)
   9596      1.1     skrll 		new_stretch += relax_frag_for_align (fragP, stretch);
   9597      1.1     skrll 	      break;
   9598      1.1     skrll 
   9599      1.1     skrll 	    case RELAX_IMMED:
   9600      1.1     skrll 	    case RELAX_IMMED_STEP1:
   9601      1.1     skrll 	    case RELAX_IMMED_STEP2:
   9602      1.1     skrll 	    case RELAX_IMMED_STEP3:
   9603      1.1     skrll 	      /* Place the immediate.  */
   9604  1.1.1.4  christos 	      new_stretch += relax_frag_immed
   9605  1.1.1.4  christos 		(now_seg, fragP, stretch,
   9606  1.1.1.4  christos 		 fragP->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
   9607  1.1.1.4  christos 		 fmt, slot, stretched_p, FALSE);
   9608  1.1.1.4  christos 	      break;
   9609  1.1.1.4  christos 
   9610  1.1.1.4  christos 	    default:
   9611  1.1.1.4  christos 	      /* This is OK; see the note in xg_assemble_vliw_tokens.  */
   9612  1.1.1.4  christos 	      break;
   9613  1.1.1.4  christos 	    }
   9614  1.1.1.4  christos 	}
   9615  1.1.1.4  christos       break;
   9616  1.1.1.4  christos 
   9617  1.1.1.4  christos     case RELAX_LITERAL_POOL_BEGIN:
   9618  1.1.1.4  christos       if (fragP->fr_var != 0)
   9619  1.1.1.4  christos 	{
   9620  1.1.1.4  christos 	  /* We have a converted "candidate" literal pool;
   9621  1.1.1.4  christos 	     assemble a jump around it.  */
   9622  1.1.1.4  christos 	  TInsn insn;
   9623  1.1.1.4  christos 	  if (!litpool_slotbuf)
   9624  1.1.1.4  christos 	    {
   9625  1.1.1.4  christos 	      litpool_buf = xtensa_insnbuf_alloc (isa);
   9626  1.1.1.4  christos 	      litpool_slotbuf = xtensa_insnbuf_alloc (isa);
   9627  1.1.1.4  christos 	    }
   9628  1.1.1.4  christos 	  new_stretch += 3;
   9629  1.1.1.4  christos 	  fragP->tc_frag_data.relax_seen = FALSE; /* Need another pass.  */
   9630  1.1.1.4  christos 	  fragP->tc_frag_data.is_insn = TRUE;
   9631  1.1.1.4  christos 	  tinsn_init (&insn);
   9632  1.1.1.4  christos 	  insn.insn_type = ITYPE_INSN;
   9633  1.1.1.4  christos 	  insn.opcode = xtensa_j_opcode;
   9634  1.1.1.4  christos 	  insn.ntok = 1;
   9635  1.1.1.4  christos 	  set_expr_symbol_offset (&insn.tok[0], fragP->fr_symbol,
   9636  1.1.1.4  christos 				  fragP->fr_fix);
   9637      1.1     skrll 	  fmt = xg_get_single_format (xtensa_j_opcode);
   9638  1.1.1.4  christos 	  tinsn_to_slotbuf (fmt, 0, &insn, litpool_slotbuf);
   9639      1.1     skrll 	  xtensa_format_set_slot (isa, fmt, 0, litpool_buf, litpool_slotbuf);
   9640      1.1     skrll 	  xtensa_insnbuf_to_chars (isa, litpool_buf,
   9641      1.1     skrll 				   (unsigned char *)fragP->fr_literal +
   9642      1.1     skrll 				   fragP->fr_fix, 3);
   9643      1.1     skrll 	  fragP->fr_fix += 3;
   9644      1.1     skrll 	  fragP->fr_var -= 3;
   9645      1.1     skrll 	  /* Add a fix-up.  */
   9646      1.1     skrll 	  fix_new (fragP, 0, 3, fragP->fr_symbol, 0, TRUE,
   9647      1.1     skrll 		   BFD_RELOC_XTENSA_SLOT0_OP);
   9648      1.1     skrll 	}
   9649      1.1     skrll       break;
   9650  1.1.1.4  christos 
   9651  1.1.1.4  christos     case RELAX_LITERAL_POOL_END:
   9652  1.1.1.6  christos     case RELAX_LITERAL_POOL_CANDIDATE_BEGIN:
   9653  1.1.1.4  christos     case RELAX_MAYBE_UNREACHABLE:
   9654  1.1.1.4  christos     case RELAX_MAYBE_DESIRE_ALIGN:
   9655      1.1     skrll       /* No relaxation required.  */
   9656      1.1     skrll       break;
   9657      1.1     skrll 
   9658      1.1     skrll     case RELAX_FILL_NOP:
   9659      1.1     skrll     case RELAX_UNREACHABLE:
   9660      1.1     skrll       if (fragP->tc_frag_data.relax_seen)
   9661      1.1     skrll 	new_stretch += relax_frag_for_align (fragP, stretch);
   9662      1.1     skrll       break;
   9663      1.1     skrll 
   9664      1.1     skrll     case RELAX_TRAMPOLINE:
   9665      1.1     skrll       if (fragP->tc_frag_data.relax_seen)
   9666      1.1     skrll 	xg_relax_trampoline (fragP, stretch, &new_stretch);
   9667      1.1     skrll       break;
   9668      1.1     skrll 
   9669      1.1     skrll     default:
   9670      1.1     skrll       as_bad (_("bad relaxation state"));
   9671      1.1     skrll     }
   9672      1.1     skrll 
   9673      1.1     skrll   /* Tell gas we need another relaxation pass.  */
   9674      1.1     skrll   if (! fragP->tc_frag_data.relax_seen)
   9675      1.1     skrll     {
   9676      1.1     skrll       fragP->tc_frag_data.relax_seen = TRUE;
   9677      1.1     skrll       *stretched_p = 1;
   9678      1.1     skrll     }
   9679      1.1     skrll 
   9680      1.1     skrll   new_logical_line (file_name, line);
   9681      1.1     skrll   return new_stretch;
   9682      1.1     skrll }
   9683      1.1     skrll 
   9684      1.1     skrll 
   9685      1.1     skrll static long
   9686      1.1     skrll relax_frag_loop_align (fragS *fragP, long stretch)
   9687      1.1     skrll {
   9688      1.1     skrll   addressT old_address, old_next_address, old_size;
   9689      1.1     skrll   addressT new_address, new_next_address, new_size;
   9690      1.1     skrll   addressT growth;
   9691      1.1     skrll 
   9692      1.1     skrll   /* All the frags with relax_frag_for_alignment prior to this one in the
   9693      1.1     skrll      section have been done, hopefully eliminating the need for a NOP here.
   9694      1.1     skrll      But, this will put it in if necessary.  */
   9695      1.1     skrll 
   9696      1.1     skrll   /* Calculate the old address of this fragment and the next fragment.  */
   9697      1.1     skrll   old_address = fragP->fr_address - stretch;
   9698      1.1     skrll   old_next_address = (fragP->fr_address - stretch + fragP->fr_fix +
   9699      1.1     skrll 		      fragP->tc_frag_data.text_expansion[0]);
   9700      1.1     skrll   old_size = old_next_address - old_address;
   9701      1.1     skrll 
   9702      1.1     skrll   /* Calculate the new address of this fragment and the next fragment.  */
   9703      1.1     skrll   new_address = fragP->fr_address;
   9704      1.1     skrll   new_next_address =
   9705      1.1     skrll     get_noop_aligned_address (fragP, fragP->fr_address + fragP->fr_fix);
   9706      1.1     skrll   new_size = new_next_address - new_address;
   9707      1.1     skrll 
   9708      1.1     skrll   growth = new_size - old_size;
   9709      1.1     skrll 
   9710      1.1     skrll   /* Fix up the text_expansion field and return the new growth.  */
   9711      1.1     skrll   fragP->tc_frag_data.text_expansion[0] += growth;
   9712      1.1     skrll   return growth;
   9713      1.1     skrll }
   9714      1.1     skrll 
   9715      1.1     skrll 
   9716      1.1     skrll /* Add a NOP instruction.  */
   9717      1.1     skrll 
   9718      1.1     skrll static long
   9719      1.1     skrll relax_frag_add_nop (fragS *fragP)
   9720      1.1     skrll {
   9721      1.1     skrll   char *nop_buf = fragP->fr_literal + fragP->fr_fix;
   9722      1.1     skrll   int length = fragP->tc_frag_data.is_no_density ? 3 : 2;
   9723      1.1     skrll   assemble_nop (length, nop_buf);
   9724      1.1     skrll   fragP->tc_frag_data.is_insn = TRUE;
   9725      1.1     skrll 
   9726      1.1     skrll   if (fragP->fr_var < length)
   9727      1.1     skrll     {
   9728      1.1     skrll       as_fatal (_("fr_var (%ld) < length (%d)"), (long) fragP->fr_var, length);
   9729      1.1     skrll       return 0;
   9730      1.1     skrll     }
   9731      1.1     skrll 
   9732      1.1     skrll   fragP->fr_fix += length;
   9733      1.1     skrll   fragP->fr_var -= length;
   9734      1.1     skrll   return length;
   9735      1.1     skrll }
   9736      1.1     skrll 
   9737  1.1.1.2  christos 
   9738      1.1     skrll static long future_alignment_required (fragS *, long);
   9739      1.1     skrll 
   9740      1.1     skrll static long
   9741      1.1     skrll relax_frag_for_align (fragS *fragP, long stretch)
   9742      1.1     skrll {
   9743      1.1     skrll   /* Overview of the relaxation procedure for alignment:
   9744      1.1     skrll      We can widen with NOPs or by widening instructions or by filling
   9745      1.1     skrll      bytes after jump instructions.  Find the opportune places and widen
   9746      1.1     skrll      them if necessary.  */
   9747      1.1     skrll 
   9748      1.1     skrll   long stretch_me;
   9749      1.1     skrll   long diff;
   9750      1.1     skrll 
   9751      1.1     skrll   gas_assert (fragP->fr_subtype == RELAX_FILL_NOP
   9752      1.1     skrll 	  || fragP->fr_subtype == RELAX_UNREACHABLE
   9753      1.1     skrll 	  || (fragP->fr_subtype == RELAX_SLOTS
   9754      1.1     skrll 	      && fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW));
   9755      1.1     skrll 
   9756      1.1     skrll   stretch_me = future_alignment_required (fragP, stretch);
   9757      1.1     skrll   diff = stretch_me - fragP->tc_frag_data.text_expansion[0];
   9758      1.1     skrll   if (diff == 0)
   9759      1.1     skrll     return 0;
   9760      1.1     skrll 
   9761      1.1     skrll   if (diff < 0)
   9762      1.1     skrll     {
   9763      1.1     skrll       /* We expanded on a previous pass.  Can we shrink now?  */
   9764      1.1     skrll       long shrink = fragP->tc_frag_data.text_expansion[0] - stretch_me;
   9765      1.1     skrll       if (shrink <= stretch && stretch > 0)
   9766      1.1     skrll 	{
   9767      1.1     skrll 	  fragP->tc_frag_data.text_expansion[0] = stretch_me;
   9768      1.1     skrll 	  return -shrink;
   9769      1.1     skrll 	}
   9770      1.1     skrll       return 0;
   9771      1.1     skrll     }
   9772      1.1     skrll 
   9773      1.1     skrll   /* Below here, diff > 0.  */
   9774      1.1     skrll   fragP->tc_frag_data.text_expansion[0] = stretch_me;
   9775      1.1     skrll 
   9776      1.1     skrll   return diff;
   9777      1.1     skrll }
   9778      1.1     skrll 
   9779      1.1     skrll 
   9780      1.1     skrll /* Return the address of the next frag that should be aligned.
   9781      1.1     skrll 
   9782      1.1     skrll    By "address" we mean the address it _would_ be at if there
   9783      1.1     skrll    is no action taken to align it between here and the target frag.
   9784      1.1     skrll    In other words, if no narrows and no fill nops are used between
   9785      1.1     skrll    here and the frag to align, _even_if_ some of the frags we use
   9786      1.1     skrll    to align targets have already expanded on a previous relaxation
   9787      1.1     skrll    pass.
   9788      1.1     skrll 
   9789      1.1     skrll    Also, count each frag that may be used to help align the target.
   9790      1.1     skrll 
   9791      1.1     skrll    Return 0 if there are no frags left in the chain that need to be
   9792      1.1     skrll    aligned.  */
   9793      1.1     skrll 
   9794      1.1     skrll static addressT
   9795      1.1     skrll find_address_of_next_align_frag (fragS **fragPP,
   9796      1.1     skrll 				 int *wide_nops,
   9797      1.1     skrll 				 int *narrow_nops,
   9798      1.1     skrll 				 int *widens,
   9799      1.1     skrll 				 bfd_boolean *paddable)
   9800      1.1     skrll {
   9801      1.1     skrll   fragS *fragP = *fragPP;
   9802      1.1     skrll   addressT address = fragP->fr_address;
   9803      1.1     skrll 
   9804      1.1     skrll   /* Do not reset the counts to 0.  */
   9805      1.1     skrll 
   9806      1.1     skrll   while (fragP)
   9807      1.1     skrll     {
   9808      1.1     skrll       /* Limit this to a small search.  */
   9809      1.1     skrll       if (*widens >= (int) xtensa_fetch_width)
   9810      1.1     skrll 	{
   9811      1.1     skrll 	  *fragPP = fragP;
   9812      1.1     skrll 	  return 0;
   9813      1.1     skrll 	}
   9814      1.1     skrll       address += fragP->fr_fix;
   9815      1.1     skrll 
   9816      1.1     skrll       if (fragP->fr_type == rs_fill)
   9817      1.1     skrll 	address += fragP->fr_offset * fragP->fr_var;
   9818      1.1     skrll       else if (fragP->fr_type == rs_machine_dependent)
   9819      1.1     skrll 	{
   9820      1.1     skrll 	  switch (fragP->fr_subtype)
   9821      1.1     skrll 	    {
   9822      1.1     skrll 	    case RELAX_UNREACHABLE:
   9823      1.1     skrll 	      *paddable = TRUE;
   9824  1.1.1.4  christos 	      break;
   9825      1.1     skrll 
   9826      1.1     skrll 	    case RELAX_FILL_NOP:
   9827      1.1     skrll 	      (*wide_nops)++;
   9828      1.1     skrll 	      if (!fragP->tc_frag_data.is_no_density)
   9829      1.1     skrll 		(*narrow_nops)++;
   9830      1.1     skrll 	      break;
   9831      1.1     skrll 
   9832      1.1     skrll 	    case RELAX_SLOTS:
   9833      1.1     skrll 	      if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
   9834      1.1     skrll 		{
   9835      1.1     skrll 		  (*widens)++;
   9836      1.1     skrll 		  break;
   9837      1.1     skrll 		}
   9838      1.1     skrll 	      address += total_frag_text_expansion (fragP);
   9839      1.1     skrll 	      break;
   9840      1.1     skrll 
   9841      1.1     skrll 	    case RELAX_IMMED:
   9842      1.1     skrll 	      address += fragP->tc_frag_data.text_expansion[0];
   9843      1.1     skrll 	      break;
   9844      1.1     skrll 
   9845      1.1     skrll 	    case RELAX_ALIGN_NEXT_OPCODE:
   9846      1.1     skrll 	    case RELAX_DESIRE_ALIGN:
   9847      1.1     skrll 	      *fragPP = fragP;
   9848      1.1     skrll 	      return address;
   9849      1.1     skrll 
   9850      1.1     skrll 	    case RELAX_MAYBE_UNREACHABLE:
   9851      1.1     skrll 	    case RELAX_MAYBE_DESIRE_ALIGN:
   9852      1.1     skrll 	      /* Do nothing.  */
   9853      1.1     skrll 	      break;
   9854      1.1     skrll 
   9855      1.1     skrll 	    default:
   9856      1.1     skrll 	      /* Just punt if we don't know the type.  */
   9857      1.1     skrll 	      *fragPP = fragP;
   9858      1.1     skrll 	      return 0;
   9859      1.1     skrll 	    }
   9860      1.1     skrll 	}
   9861      1.1     skrll       else
   9862      1.1     skrll 	{
   9863      1.1     skrll 	  /* Just punt if we don't know the type.  */
   9864      1.1     skrll 	  *fragPP = fragP;
   9865      1.1     skrll 	  return 0;
   9866      1.1     skrll 	}
   9867      1.1     skrll       fragP = fragP->fr_next;
   9868      1.1     skrll     }
   9869      1.1     skrll 
   9870      1.1     skrll   *fragPP = fragP;
   9871      1.1     skrll   return 0;
   9872      1.1     skrll }
   9873      1.1     skrll 
   9874      1.1     skrll 
   9875      1.1     skrll static long bytes_to_stretch (fragS *, int, int, int, int);
   9876      1.1     skrll 
   9877      1.1     skrll static long
   9878      1.1     skrll future_alignment_required (fragS *fragP, long stretch ATTRIBUTE_UNUSED)
   9879      1.1     skrll {
   9880      1.1     skrll   fragS *this_frag = fragP;
   9881      1.1     skrll   long address;
   9882      1.1     skrll   int num_widens = 0;
   9883      1.1     skrll   int wide_nops = 0;
   9884      1.1     skrll   int narrow_nops = 0;
   9885      1.1     skrll   bfd_boolean paddable = FALSE;
   9886      1.1     skrll   offsetT local_opt_diff;
   9887      1.1     skrll   offsetT opt_diff;
   9888      1.1     skrll   offsetT max_diff;
   9889      1.1     skrll   int stretch_amount = 0;
   9890      1.1     skrll   int local_stretch_amount;
   9891      1.1     skrll   int global_stretch_amount;
   9892      1.1     skrll 
   9893  1.1.1.2  christos   address = find_address_of_next_align_frag
   9894  1.1.1.2  christos     (&fragP, &wide_nops, &narrow_nops, &num_widens, &paddable);
   9895      1.1     skrll 
   9896      1.1     skrll   if (!address)
   9897      1.1     skrll     {
   9898      1.1     skrll       if (this_frag->tc_frag_data.is_aligning_branch)
   9899      1.1     skrll 	this_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
   9900      1.1     skrll       else
   9901      1.1     skrll 	frag_wane (this_frag);
   9902      1.1     skrll     }
   9903      1.1     skrll   else
   9904      1.1     skrll     {
   9905      1.1     skrll       local_opt_diff = get_aligned_diff (fragP, address, &max_diff);
   9906      1.1     skrll       opt_diff = local_opt_diff;
   9907      1.1     skrll       gas_assert (opt_diff >= 0);
   9908      1.1     skrll       gas_assert (max_diff >= opt_diff);
   9909      1.1     skrll       if (max_diff == 0)
   9910      1.1     skrll 	return 0;
   9911      1.1     skrll 
   9912      1.1     skrll       if (fragP)
   9913      1.1     skrll 	fragP = fragP->fr_next;
   9914      1.1     skrll 
   9915      1.1     skrll       while (fragP && opt_diff < max_diff && address)
   9916      1.1     skrll 	{
   9917      1.1     skrll 	  /* We only use these to determine if we can exit early
   9918      1.1     skrll 	     because there will be plenty of ways to align future
   9919      1.1     skrll 	     align frags.  */
   9920      1.1     skrll 	  int glob_widens = 0;
   9921      1.1     skrll 	  int dnn = 0;
   9922      1.1     skrll 	  int dw = 0;
   9923      1.1     skrll 	  bfd_boolean glob_pad = 0;
   9924      1.1     skrll 	  address = find_address_of_next_align_frag
   9925      1.1     skrll 	    (&fragP, &glob_widens, &dnn, &dw, &glob_pad);
   9926      1.1     skrll 	  /* If there is a padable portion, then skip.  */
   9927      1.1     skrll 	  if (glob_pad || glob_widens >= (1 << branch_align_power (now_seg)))
   9928      1.1     skrll 	    address = 0;
   9929      1.1     skrll 
   9930      1.1     skrll 	  if (address)
   9931      1.1     skrll 	    {
   9932      1.1     skrll 	      offsetT next_m_diff;
   9933      1.1     skrll 	      offsetT next_o_diff;
   9934      1.1     skrll 
   9935      1.1     skrll 	      /* Downrange frags haven't had stretch added to them yet.  */
   9936      1.1     skrll 	      address += stretch;
   9937      1.1     skrll 
   9938      1.1     skrll 	      /* The address also includes any text expansion from this
   9939      1.1     skrll 		 frag in a previous pass, but we don't want that.  */
   9940      1.1     skrll 	      address -= this_frag->tc_frag_data.text_expansion[0];
   9941      1.1     skrll 
   9942      1.1     skrll 	      /* Assume we are going to move at least opt_diff.  In
   9943      1.1     skrll 		 reality, we might not be able to, but assuming that
   9944      1.1     skrll 		 we will helps catch cases where moving opt_diff pushes
   9945      1.1     skrll 		 the next target from aligned to unaligned.  */
   9946      1.1     skrll 	      address += opt_diff;
   9947      1.1     skrll 
   9948      1.1     skrll 	      next_o_diff = get_aligned_diff (fragP, address, &next_m_diff);
   9949      1.1     skrll 
   9950      1.1     skrll 	      /* Now cleanup for the adjustments to address.  */
   9951      1.1     skrll 	      next_o_diff += opt_diff;
   9952  1.1.1.2  christos 	      next_m_diff += opt_diff;
   9953      1.1     skrll 	      if (next_o_diff <= max_diff && next_o_diff > opt_diff)
   9954      1.1     skrll 		opt_diff = next_o_diff;
   9955      1.1     skrll 	      if (next_m_diff < max_diff)
   9956      1.1     skrll 		max_diff = next_m_diff;
   9957      1.1     skrll 	      fragP = fragP->fr_next;
   9958      1.1     skrll 	    }
   9959      1.1     skrll 	}
   9960      1.1     skrll 
   9961      1.1     skrll       /* If there are enough wideners in between, do it.  */
   9962      1.1     skrll       if (paddable)
   9963      1.1     skrll 	{
   9964      1.1     skrll 	  if (this_frag->fr_subtype == RELAX_UNREACHABLE)
   9965      1.1     skrll 	    {
   9966      1.1     skrll 	      gas_assert (opt_diff <= (signed) xtensa_fetch_width);
   9967      1.1     skrll 	      return opt_diff;
   9968      1.1     skrll 	    }
   9969      1.1     skrll 	  return 0;
   9970      1.1     skrll 	}
   9971      1.1     skrll       local_stretch_amount
   9972      1.1     skrll 	= bytes_to_stretch (this_frag, wide_nops, narrow_nops,
   9973      1.1     skrll 			    num_widens, local_opt_diff);
   9974  1.1.1.2  christos       global_stretch_amount
   9975      1.1     skrll 	= bytes_to_stretch (this_frag, wide_nops, narrow_nops,
   9976      1.1     skrll 			    num_widens, opt_diff);
   9977      1.1     skrll       /* If the condition below is true, then the frag couldn't
   9978  1.1.1.2  christos 	 stretch the correct amount for the global case, so we just
   9979      1.1     skrll 	 optimize locally.  We'll rely on the subsequent frags to get
   9980  1.1.1.2  christos 	 the correct alignment in the global case.  */
   9981      1.1     skrll       if (global_stretch_amount < local_stretch_amount)
   9982      1.1     skrll 	stretch_amount = local_stretch_amount;
   9983      1.1     skrll       else
   9984      1.1     skrll 	stretch_amount = global_stretch_amount;
   9985      1.1     skrll 
   9986      1.1     skrll       if (this_frag->fr_subtype == RELAX_SLOTS
   9987      1.1     skrll 	  && this_frag->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
   9988      1.1     skrll 	gas_assert (stretch_amount <= 1);
   9989      1.1     skrll       else if (this_frag->fr_subtype == RELAX_FILL_NOP)
   9990      1.1     skrll 	{
   9991      1.1     skrll 	  if (this_frag->tc_frag_data.is_no_density)
   9992      1.1     skrll 	    gas_assert (stretch_amount == 3 || stretch_amount == 0);
   9993      1.1     skrll 	  else
   9994      1.1     skrll 	    gas_assert (stretch_amount <= 3);
   9995      1.1     skrll 	}
   9996      1.1     skrll     }
   9997      1.1     skrll   return stretch_amount;
   9998      1.1     skrll }
   9999      1.1     skrll 
   10000      1.1     skrll 
   10001      1.1     skrll /* The idea: widen everything you can to get a target or loop aligned,
   10002      1.1     skrll    then start using NOPs.
   10003      1.1     skrll 
   10004  1.1.1.2  christos    wide_nops   = the number of wide NOPs available for aligning
   10005  1.1.1.2  christos    narrow_nops = the number of narrow NOPs available for aligning
   10006  1.1.1.2  christos 		 (a subset of wide_nops)
   10007      1.1     skrll    widens      = the number of narrow instructions that should be widened
   10008      1.1     skrll 
   10009  1.1.1.4  christos */
   10010  1.1.1.2  christos 
   10011      1.1     skrll static long
   10012      1.1     skrll bytes_to_stretch (fragS *this_frag,
   10013      1.1     skrll 		  int wide_nops,
   10014  1.1.1.2  christos 		  int narrow_nops,
   10015      1.1     skrll 		  int num_widens,
   10016      1.1     skrll 		  int desired_diff)
   10017      1.1     skrll {
   10018      1.1     skrll   int nops_needed;
   10019      1.1     skrll   int nop_bytes;
   10020      1.1     skrll   int extra_bytes;
   10021      1.1     skrll   int bytes_short = desired_diff - num_widens;
   10022      1.1     skrll 
   10023      1.1     skrll   gas_assert (desired_diff >= 0
   10024      1.1     skrll 	      && desired_diff < (signed) xtensa_fetch_width);
   10025      1.1     skrll   if (desired_diff == 0)
   10026      1.1     skrll     return 0;
   10027      1.1     skrll 
   10028      1.1     skrll   gas_assert (wide_nops > 0 || num_widens > 0);
   10029      1.1     skrll 
   10030      1.1     skrll   /* Always prefer widening to NOP-filling.  */
   10031      1.1     skrll   if (bytes_short < 0)
   10032      1.1     skrll     {
   10033      1.1     skrll       /* There are enough RELAX_NARROW frags after this one
   10034      1.1     skrll 	 to align the target without widening this frag in any way.  */
   10035      1.1     skrll       return 0;
   10036      1.1     skrll     }
   10037  1.1.1.2  christos 
   10038  1.1.1.2  christos   if (bytes_short == 0)
   10039  1.1.1.2  christos     {
   10040  1.1.1.2  christos       /* Widen every narrow between here and the align target
   10041  1.1.1.2  christos 	 and the align target will be properly aligned.  */
   10042  1.1.1.2  christos       if (this_frag->fr_subtype == RELAX_FILL_NOP)
   10043  1.1.1.2  christos 	return 0;
   10044  1.1.1.2  christos       else
   10045  1.1.1.2  christos 	return 1;
   10046  1.1.1.2  christos     }
   10047  1.1.1.2  christos 
   10048      1.1     skrll   /* From here we will need at least one NOP to get an alignment.
   10049  1.1.1.2  christos      However, we may not be able to align at all, in which case,
   10050  1.1.1.2  christos      don't widen.  */
   10051  1.1.1.2  christos   nops_needed = desired_diff / 3;
   10052  1.1.1.2  christos 
   10053  1.1.1.2  christos   /* If there aren't enough nops, don't widen.  */
   10054      1.1     skrll   if (nops_needed > wide_nops)
   10055  1.1.1.2  christos     return 0;
   10056  1.1.1.2  christos 
   10057  1.1.1.2  christos   /* First try it with all wide nops.  */
   10058  1.1.1.2  christos   nop_bytes = nops_needed * 3;
   10059  1.1.1.2  christos   extra_bytes = desired_diff - nop_bytes;
   10060  1.1.1.2  christos 
   10061  1.1.1.2  christos   if (nop_bytes + num_widens >= desired_diff)
   10062  1.1.1.2  christos     {
   10063  1.1.1.2  christos       if (this_frag->fr_subtype == RELAX_FILL_NOP)
   10064      1.1     skrll 	return 3;
   10065  1.1.1.2  christos       else if (num_widens == extra_bytes)
   10066  1.1.1.2  christos 	return 1;
   10067  1.1.1.2  christos       return 0;
   10068  1.1.1.2  christos     }
   10069  1.1.1.2  christos 
   10070  1.1.1.2  christos   /* Add a narrow nop.  */
   10071      1.1     skrll   nops_needed++;
   10072  1.1.1.2  christos   nop_bytes += 2;
   10073  1.1.1.2  christos   extra_bytes -= 2;
   10074  1.1.1.2  christos   if (narrow_nops == 0 || nops_needed > wide_nops)
   10075  1.1.1.2  christos     return 0;
   10076  1.1.1.2  christos 
   10077  1.1.1.2  christos   if (nop_bytes + num_widens >= desired_diff && extra_bytes >= 0)
   10078  1.1.1.2  christos     {
   10079  1.1.1.2  christos       if (this_frag->fr_subtype == RELAX_FILL_NOP)
   10080  1.1.1.2  christos 	return !this_frag->tc_frag_data.is_no_density ? 2 : 3;
   10081  1.1.1.2  christos       else if (num_widens == extra_bytes)
   10082  1.1.1.2  christos 	return 1;
   10083  1.1.1.2  christos       return 0;
   10084  1.1.1.2  christos     }
   10085      1.1     skrll 
   10086  1.1.1.2  christos   /* Replace a wide nop with a narrow nop--we can get here if
   10087  1.1.1.2  christos      extra_bytes was negative in the previous conditional.  */
   10088  1.1.1.2  christos   if (narrow_nops == 1)
   10089      1.1     skrll     return 0;
   10090      1.1     skrll   nop_bytes--;
   10091      1.1     skrll   extra_bytes++;
   10092      1.1     skrll   if (nop_bytes + num_widens >= desired_diff)
   10093  1.1.1.6  christos     {
   10094  1.1.1.6  christos       if (this_frag->fr_subtype == RELAX_FILL_NOP)
   10095  1.1.1.4  christos 	return !this_frag->tc_frag_data.is_no_density ? 2 : 3;
   10096  1.1.1.4  christos       else if (num_widens == extra_bytes)
   10097  1.1.1.6  christos 	return 1;
   10098  1.1.1.6  christos       return 0;
   10099  1.1.1.6  christos     }
   10100  1.1.1.6  christos 
   10101  1.1.1.4  christos   /* If we can't satisfy any of the above cases, then we can't align
   10102  1.1.1.6  christos      using padding or fill nops.  */
   10103  1.1.1.6  christos   return 0;
   10104  1.1.1.4  christos }
   10105  1.1.1.6  christos 
   10106  1.1.1.4  christos 
   10107  1.1.1.6  christos static fragS *
   10108  1.1.1.4  christos xg_find_best_trampoline_for_tinsn (TInsn *tinsn, fragS *fragP)
   10109  1.1.1.4  christos {
   10110  1.1.1.4  christos   symbolS *sym = tinsn->tok[0].X_add_symbol;
   10111  1.1.1.6  christos   addressT source = fragP->fr_address;
   10112  1.1.1.6  christos   addressT target = S_GET_VALUE (sym) + tinsn->tok[0].X_add_number;
   10113  1.1.1.6  christos   struct trampoline_seg *ts = find_trampoline_seg (now_seg);
   10114  1.1.1.6  christos   size_t i;
   10115  1.1.1.6  christos 
   10116  1.1.1.4  christos   if (!ts || !ts->index.n_entries)
   10117  1.1.1.6  christos     return NULL;
   10118  1.1.1.6  christos 
   10119  1.1.1.6  christos   i = xg_find_best_trampoline (&ts->index, source, target);
   10120  1.1.1.6  christos 
   10121  1.1.1.4  christos   return ts->index.entry[i];
   10122  1.1.1.6  christos }
   10123  1.1.1.6  christos 
   10124  1.1.1.6  christos 
   10125  1.1.1.6  christos /* Append jump to sym + offset to the end of the trampoline frag fragP.
   10126  1.1.1.6  christos    Adjust fragP's jump around if it's present.  Adjust fragP's fr_fix/fr_var
   10127  1.1.1.6  christos    and finish the frag if it's full (but don't remove it from the trampoline
   10128  1.1.1.6  christos    frag index).  Return fixup for the newly created jump.  */
   10129  1.1.1.6  christos static fixS *xg_append_jump (fragS *fragP, symbolS *sym, offsetT offset)
   10130  1.1.1.6  christos {
   10131  1.1.1.6  christos   fixS *fixP;
   10132  1.1.1.6  christos   TInsn insn;
   10133  1.1.1.6  christos   xtensa_format fmt;
   10134  1.1.1.6  christos   xtensa_isa isa = xtensa_default_isa;
   10135  1.1.1.6  christos 
   10136  1.1.1.6  christos   gas_assert (fragP->fr_var >= 3);
   10137  1.1.1.6  christos   tinsn_init (&insn);
   10138  1.1.1.6  christos   insn.insn_type = ITYPE_INSN;
   10139  1.1.1.6  christos   insn.opcode = xtensa_j_opcode;
   10140  1.1.1.6  christos   insn.ntok = 1;
   10141  1.1.1.6  christos   set_expr_symbol_offset (&insn.tok[0], sym, offset);
   10142  1.1.1.6  christos   fmt = xg_get_single_format (xtensa_j_opcode);
   10143  1.1.1.4  christos   tinsn_to_slotbuf (fmt, 0, &insn, trampoline_slotbuf);
   10144  1.1.1.6  christos   xtensa_format_set_slot (isa, fmt, 0, trampoline_buf, trampoline_slotbuf);
   10145  1.1.1.6  christos   xtensa_insnbuf_to_chars (isa, trampoline_buf,
   10146  1.1.1.4  christos 			   (unsigned char *)fragP->fr_literal + fragP->fr_fix, 3);
   10147  1.1.1.6  christos   fixP = fix_new (fragP, fragP->fr_fix, 3, sym, offset, TRUE,
   10148  1.1.1.6  christos 		  BFD_RELOC_XTENSA_SLOT0_OP);
   10149  1.1.1.4  christos   fixP->tc_fix_data.slot = 0;
   10150  1.1.1.6  christos 
   10151  1.1.1.6  christos   fragP->fr_fix += 3;
   10152  1.1.1.4  christos   fragP->fr_var -= 3;
   10153  1.1.1.4  christos 
   10154  1.1.1.4  christos   /* Adjust the jump around this trampoline (if present).  */
   10155  1.1.1.4  christos   if (fragP->tc_frag_data.jump_around_fix)
   10156  1.1.1.6  christos     fragP->tc_frag_data.jump_around_fix->fx_offset += 3;
   10157  1.1.1.4  christos 
   10158  1.1.1.4  christos   /* Do we have room for more? */
   10159  1.1.1.4  christos   if (xg_is_trampoline_frag_full (fragP))
   10160  1.1.1.4  christos     {
   10161  1.1.1.4  christos       frag_wane (fragP);
   10162  1.1.1.4  christos       fragP->fr_subtype = 0;
   10163  1.1.1.4  christos     }
   10164  1.1.1.4  christos 
   10165  1.1.1.6  christos   return fixP;
   10166  1.1.1.4  christos }
   10167  1.1.1.4  christos 
   10168  1.1.1.6  christos 
   10169  1.1.1.4  christos static int
   10170  1.1.1.6  christos init_trampoline_frag (fragS *fp)
   10171  1.1.1.4  christos {
   10172  1.1.1.4  christos   int growth = 0;
   10173  1.1.1.4  christos 
   10174  1.1.1.4  christos   if (fp->fr_fix == 0)
   10175  1.1.1.4  christos     {
   10176  1.1.1.4  christos       symbolS *lsym;
   10177  1.1.1.4  christos       char label[10 + 2 * sizeof(fp)];
   10178  1.1.1.6  christos 
   10179  1.1.1.6  christos       sprintf (label, ".L0_TR_%p", fp);
   10180  1.1.1.6  christos       lsym = (symbolS *)local_symbol_make (label, now_seg, 0, fp);
   10181  1.1.1.6  christos       fp->fr_symbol = lsym;
   10182  1.1.1.6  christos       if (fp->tc_frag_data.needs_jump_around)
   10183  1.1.1.6  christos         {
   10184  1.1.1.6  christos 	  fp->tc_frag_data.jump_around_fix = xg_append_jump (fp, lsym, 3);
   10185  1.1.1.6  christos 	  growth = 3;
   10186  1.1.1.6  christos         }
   10187  1.1.1.6  christos     }
   10188  1.1.1.6  christos   return growth;
   10189  1.1.1.6  christos }
   10190  1.1.1.6  christos 
   10191  1.1.1.6  christos static int
   10192  1.1.1.6  christos xg_get_single_symbol_slot (fragS *fragP)
   10193  1.1.1.6  christos {
   10194  1.1.1.6  christos   int i;
   10195  1.1.1.6  christos   int slot = -1;
   10196  1.1.1.6  christos 
   10197  1.1.1.4  christos   for (i = 0; i < MAX_SLOTS; ++i)
   10198  1.1.1.6  christos     if (fragP->tc_frag_data.slot_symbols[i])
   10199  1.1.1.4  christos       {
   10200  1.1.1.4  christos 	gas_assert (slot == -1);
   10201  1.1.1.4  christos 	slot = i;
   10202  1.1.1.6  christos       }
   10203  1.1.1.6  christos 
   10204  1.1.1.6  christos   gas_assert (slot >= 0 && slot < MAX_SLOTS);
   10205  1.1.1.6  christos 
   10206  1.1.1.4  christos   return slot;
   10207  1.1.1.6  christos }
   10208  1.1.1.6  christos 
   10209  1.1.1.6  christos static fixS *
   10210  1.1.1.4  christos add_jump_to_trampoline (fragS *tramp, fragS *origfrag)
   10211  1.1.1.6  christos {
   10212  1.1.1.6  christos   int slot = xg_get_single_symbol_slot (origfrag);
   10213  1.1.1.6  christos   fixS *fixP;
   10214  1.1.1.6  christos 
   10215  1.1.1.4  christos   /* Assemble a jump to the target label in the trampoline frag.  */
   10216  1.1.1.6  christos   fixP = xg_append_jump (tramp,
   10217  1.1.1.6  christos 			 origfrag->tc_frag_data.slot_symbols[slot],
   10218  1.1.1.6  christos 			 origfrag->tc_frag_data.slot_offsets[slot]);
   10219  1.1.1.6  christos 
   10220  1.1.1.6  christos   /* Modify the original j to point here.  */
   10221  1.1.1.4  christos   origfrag->tc_frag_data.slot_symbols[slot] = tramp->fr_symbol;
   10222  1.1.1.4  christos   origfrag->tc_frag_data.slot_offsets[slot] = tramp->fr_fix - 3;
   10223  1.1.1.4  christos 
   10224      1.1     skrll   /* If trampoline is full, remove it from the list.  */
   10225      1.1     skrll   if (xg_is_trampoline_frag_full (tramp))
   10226      1.1     skrll     {
   10227      1.1     skrll       struct trampoline_seg *ts = find_trampoline_seg (now_seg);
   10228      1.1     skrll       size_t tr = xg_find_trampoline (&ts->index, tramp->fr_address);
   10229      1.1     skrll 
   10230      1.1     skrll       gas_assert (ts->index.entry[tr] == tramp);
   10231      1.1     skrll       xg_remove_trampoline_from_index (&ts->index, tr);
   10232      1.1     skrll     }
   10233      1.1     skrll 
   10234      1.1     skrll   return fixP;
   10235      1.1     skrll }
   10236      1.1     skrll 
   10237      1.1     skrll 
   10238      1.1     skrll static long
   10239      1.1     skrll relax_frag_immed (segT segP,
   10240      1.1     skrll 		  fragS *fragP,
   10241      1.1     skrll 		  long stretch,
   10242      1.1     skrll 		  int min_steps,
   10243      1.1     skrll 		  xtensa_format fmt,
   10244      1.1     skrll 		  int slot,
   10245      1.1     skrll 		  int *stretched_p,
   10246  1.1.1.2  christos 		  bfd_boolean estimate_only)
   10247      1.1     skrll {
   10248      1.1     skrll   TInsn tinsn;
   10249      1.1     skrll   int old_size;
   10250      1.1     skrll   bfd_boolean negatable_branch = FALSE;
   10251      1.1     skrll   bfd_boolean branch_jmp_to_next = FALSE;
   10252      1.1     skrll   bfd_boolean from_wide_insn = FALSE;
   10253      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   10254      1.1     skrll   IStack istack;
   10255      1.1     skrll   offsetT frag_offset;
   10256      1.1     skrll   int num_steps;
   10257      1.1     skrll   int num_text_bytes, num_literal_bytes;
   10258      1.1     skrll   int literal_diff, total_text_diff, this_text_diff;
   10259      1.1     skrll 
   10260      1.1     skrll   gas_assert (fragP->fr_opcode != NULL);
   10261      1.1     skrll 
   10262      1.1     skrll   xg_clear_vinsn (&cur_vinsn);
   10263      1.1     skrll   vinsn_from_chars (&cur_vinsn, fragP->fr_opcode);
   10264      1.1     skrll   if (cur_vinsn.num_slots > 1)
   10265      1.1     skrll     from_wide_insn = TRUE;
   10266      1.1     skrll 
   10267      1.1     skrll   tinsn = cur_vinsn.slots[slot];
   10268      1.1     skrll   tinsn_immed_from_frag (&tinsn, fragP, slot);
   10269      1.1     skrll 
   10270      1.1     skrll   if (estimate_only && xtensa_opcode_is_loop (isa, tinsn.opcode) == 1)
   10271      1.1     skrll     return 0;
   10272      1.1     skrll 
   10273      1.1     skrll   if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
   10274      1.1     skrll     branch_jmp_to_next = is_branch_jmp_to_next (&tinsn, fragP);
   10275      1.1     skrll 
   10276      1.1     skrll   negatable_branch = (xtensa_opcode_is_branch (isa, tinsn.opcode) == 1);
   10277      1.1     skrll 
   10278      1.1     skrll   old_size = xtensa_format_length (isa, fmt);
   10279      1.1     skrll 
   10280      1.1     skrll   /* Special case: replace a branch to the next instruction with a NOP.
   10281      1.1     skrll      This is required to work around a hardware bug in T1040.0 and also
   10282      1.1     skrll      serves as an optimization.  */
   10283  1.1.1.2  christos 
   10284      1.1     skrll   if (branch_jmp_to_next
   10285      1.1     skrll       && ((old_size == 2) || (old_size == 3))
   10286      1.1     skrll       && !next_frag_is_loop_target (fragP))
   10287      1.1     skrll     return 0;
   10288      1.1     skrll 
   10289      1.1     skrll   /* Here is the fun stuff: Get the immediate field from this
   10290      1.1     skrll      instruction.  If it fits, we are done.  If not, find the next
   10291      1.1     skrll      instruction sequence that fits.  */
   10292      1.1     skrll 
   10293      1.1     skrll   frag_offset = fragP->fr_opcode - fragP->fr_literal;
   10294      1.1     skrll   istack_init (&istack);
   10295      1.1     skrll   num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP, frag_offset,
   10296      1.1     skrll 				 min_steps, stretch);
   10297      1.1     skrll   gas_assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
   10298      1.1     skrll 
   10299      1.1     skrll   fragP->tc_frag_data.slot_subtypes[slot] = (int) RELAX_IMMED + num_steps;
   10300      1.1     skrll 
   10301      1.1     skrll   /* Figure out the number of bytes needed.  */
   10302      1.1     skrll   num_literal_bytes = get_num_stack_literal_bytes (&istack);
   10303      1.1     skrll   literal_diff
   10304      1.1     skrll     = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
   10305      1.1     skrll   num_text_bytes = get_num_stack_text_bytes (&istack);
   10306      1.1     skrll 
   10307  1.1.1.4  christos   if (from_wide_insn)
   10308      1.1     skrll     {
   10309  1.1.1.4  christos       int first = 0;
   10310      1.1     skrll       while (istack.insn[first].opcode == XTENSA_UNDEFINED)
   10311      1.1     skrll 	first++;
   10312  1.1.1.2  christos 
   10313      1.1     skrll       num_text_bytes += old_size;
   10314  1.1.1.4  christos       if (opcode_fits_format_slot (istack.insn[first].opcode, fmt, slot))
   10315      1.1     skrll 	num_text_bytes -= xg_get_single_size (istack.insn[first].opcode);
   10316      1.1     skrll       else
   10317      1.1     skrll 	{
   10318  1.1.1.4  christos 	  /* The first instruction in the relaxed sequence will go after
   10319      1.1     skrll 	     the current wide instruction, and thus its symbolic immediates
   10320  1.1.1.4  christos 	     might not fit.  */
   10321      1.1     skrll 
   10322      1.1     skrll 	  istack_init (&istack);
   10323      1.1     skrll 	  num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP,
   10324      1.1     skrll 					 frag_offset + old_size,
   10325      1.1     skrll 					 min_steps, stretch + old_size);
   10326      1.1     skrll 	  gas_assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
   10327      1.1     skrll 
   10328      1.1     skrll 	  fragP->tc_frag_data.slot_subtypes[slot]
   10329  1.1.1.2  christos 	    = (int) RELAX_IMMED + num_steps;
   10330  1.1.1.2  christos 
   10331  1.1.1.2  christos 	  num_literal_bytes = get_num_stack_literal_bytes (&istack);
   10332      1.1     skrll 	  literal_diff
   10333      1.1     skrll 	    = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
   10334      1.1     skrll 
   10335  1.1.1.2  christos 	  num_text_bytes = get_num_stack_text_bytes (&istack) + old_size;
   10336  1.1.1.2  christos 	}
   10337      1.1     skrll     }
   10338      1.1     skrll 
   10339      1.1     skrll   total_text_diff = num_text_bytes - old_size;
   10340      1.1     skrll   this_text_diff = total_text_diff - fragP->tc_frag_data.text_expansion[slot];
   10341      1.1     skrll 
   10342      1.1     skrll   /* It MUST get larger.  If not, we could get an infinite loop.  */
   10343      1.1     skrll   gas_assert (num_text_bytes >= 0);
   10344  1.1.1.2  christos   gas_assert (literal_diff >= 0);
   10345      1.1     skrll   gas_assert (total_text_diff >= 0);
   10346      1.1     skrll 
   10347      1.1     skrll   fragP->tc_frag_data.text_expansion[slot] = total_text_diff;
   10348      1.1     skrll   fragP->tc_frag_data.literal_expansion[slot] = num_literal_bytes;
   10349  1.1.1.2  christos   gas_assert (fragP->tc_frag_data.text_expansion[slot] >= 0);
   10350      1.1     skrll   gas_assert (fragP->tc_frag_data.literal_expansion[slot] >= 0);
   10351      1.1     skrll 
   10352      1.1     skrll   /* Find the associated expandable literal for this.  */
   10353      1.1     skrll   if (literal_diff != 0)
   10354      1.1     skrll     {
   10355      1.1     skrll       fragS *lit_fragP = fragP->tc_frag_data.literal_frags[slot];
   10356      1.1     skrll       if (lit_fragP)
   10357      1.1     skrll 	{
   10358      1.1     skrll 	  gas_assert (literal_diff == 4);
   10359      1.1     skrll 	  lit_fragP->tc_frag_data.unreported_expansion += literal_diff;
   10360      1.1     skrll 
   10361      1.1     skrll 	  /* We expect that the literal section state has NOT been
   10362  1.1.1.4  christos 	     modified yet.  */
   10363  1.1.1.4  christos 	  gas_assert (lit_fragP->fr_type == rs_machine_dependent
   10364  1.1.1.4  christos 		  && lit_fragP->fr_subtype == RELAX_LITERAL);
   10365  1.1.1.4  christos 	  lit_fragP->fr_subtype = RELAX_LITERAL_NR;
   10366  1.1.1.4  christos 
   10367  1.1.1.4  christos 	  /* We need to mark this section for another iteration
   10368  1.1.1.4  christos 	     of relaxation.  */
   10369  1.1.1.6  christos 	  (*stretched_p)++;
   10370  1.1.1.6  christos 	}
   10371  1.1.1.4  christos     }
   10372  1.1.1.6  christos 
   10373  1.1.1.6  christos   if (negatable_branch && istack.ninsn > 1)
   10374  1.1.1.6  christos     update_next_frag_state (fragP);
   10375  1.1.1.4  christos 
   10376  1.1.1.6  christos   /* If last insn is a jump, and it cannot reach its target, try to find a trampoline.  */
   10377  1.1.1.6  christos   if (istack.ninsn > 2 &&
   10378  1.1.1.6  christos       istack.insn[istack.ninsn - 1].insn_type == ITYPE_LABEL &&
   10379  1.1.1.6  christos       istack.insn[istack.ninsn - 2].insn_type == ITYPE_INSN &&
   10380  1.1.1.6  christos       istack.insn[istack.ninsn - 2].opcode == xtensa_j_opcode)
   10381  1.1.1.6  christos     {
   10382  1.1.1.6  christos       TInsn *jinsn = &istack.insn[istack.ninsn - 2];
   10383  1.1.1.6  christos       struct trampoline_seg *ts = find_trampoline_seg (segP);
   10384  1.1.1.6  christos       struct trampoline_chain *tc = NULL;
   10385  1.1.1.6  christos 
   10386  1.1.1.6  christos       if (ts &&
   10387  1.1.1.6  christos 	  !xg_symbolic_immeds_fit (jinsn, segP, fragP, fragP->fr_offset,
   10388  1.1.1.6  christos 				   total_text_diff))
   10389  1.1.1.6  christos 	{
   10390  1.1.1.6  christos 	  int s = xg_get_single_symbol_slot (fragP);
   10391  1.1.1.6  christos 	  addressT offset = fragP->tc_frag_data.slot_offsets[s];
   10392  1.1.1.6  christos 
   10393  1.1.1.6  christos 	  tc = xg_find_best_eq_target (ts, fragP->fr_address,
   10394  1.1.1.6  christos 				       &fragP->tc_frag_data.slot_symbols[s],
   10395  1.1.1.4  christos 				       &offset);
   10396  1.1.1.4  christos 
   10397  1.1.1.4  christos 	  if (!tc)
   10398  1.1.1.6  christos 	    tc = xg_create_trampoline_chain (ts,
   10399  1.1.1.6  christos 					     fragP->tc_frag_data.slot_symbols[s],
   10400  1.1.1.6  christos 					     offset);
   10401  1.1.1.6  christos 	  fragP->tc_frag_data.slot_offsets[s] = offset;
   10402  1.1.1.6  christos 	  tinsn_immed_from_frag (jinsn, fragP, s);
   10403  1.1.1.6  christos 	}
   10404  1.1.1.6  christos 
   10405  1.1.1.4  christos       if (!xg_symbolic_immeds_fit (jinsn, segP, fragP, fragP->fr_offset,
   10406  1.1.1.4  christos 				   total_text_diff))
   10407  1.1.1.4  christos 	{
   10408  1.1.1.4  christos 	  fragS *tf = xg_find_best_trampoline_for_tinsn (jinsn, fragP);
   10409  1.1.1.4  christos 
   10410  1.1.1.4  christos 	  if (tf)
   10411  1.1.1.4  christos 	    {
   10412  1.1.1.4  christos 	      fixS *fixP;
   10413  1.1.1.4  christos 
   10414  1.1.1.4  christos 	      this_text_diff += init_trampoline_frag (tf) + 3;
   10415  1.1.1.4  christos 	      fixP = add_jump_to_trampoline (tf, fragP);
   10416  1.1.1.4  christos 	      xg_add_location_to_chain (tc, fixP->fx_frag->fr_symbol,
   10417  1.1.1.4  christos 					fixP->fx_where);
   10418  1.1.1.4  christos 	      fragP->tc_frag_data.relax_seen = FALSE;
   10419  1.1.1.4  christos 	    }
   10420      1.1     skrll 	  else
   10421      1.1     skrll 	    {
   10422      1.1     skrll 	      /* If target symbol is undefined, assume it will reach once linked.  */
   10423      1.1     skrll 	      expressionS *exp = &istack.insn[istack.ninsn - 2].tok[0];
   10424      1.1     skrll 
   10425      1.1     skrll 	      if (exp->X_op == O_symbol && S_IS_DEFINED (exp->X_add_symbol))
   10426      1.1     skrll 		{
   10427      1.1     skrll 		  as_bad_where (fragP->fr_file, fragP->fr_line,
   10428      1.1     skrll 		    _("jump target out of range; no usable trampoline found"));
   10429      1.1     skrll 		}
   10430      1.1     skrll 	    }
   10431      1.1     skrll 	}
   10432      1.1     skrll     }
   10433      1.1     skrll 
   10434      1.1     skrll   return this_text_diff;
   10435      1.1     skrll }
   10436      1.1     skrll 
   10437      1.1     skrll 
   10438      1.1     skrll /* md_convert_frag Hook and Helper Functions.  */
   10440      1.1     skrll 
   10441      1.1     skrll static void convert_frag_align_next_opcode (fragS *);
   10442  1.1.1.5  christos static void convert_frag_narrow (segT, fragS *, xtensa_format, int);
   10443      1.1     skrll static void convert_frag_fill_nop (fragS *);
   10444      1.1     skrll static void convert_frag_immed (segT, fragS *, int, xtensa_format, int);
   10445      1.1     skrll 
   10446      1.1     skrll void
   10447      1.1     skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec, fragS *fragp)
   10448      1.1     skrll {
   10449      1.1     skrll   static xtensa_insnbuf vbuf = NULL;
   10450      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   10451      1.1     skrll   int slot;
   10452      1.1     skrll   int num_slots;
   10453      1.1     skrll   xtensa_format fmt;
   10454      1.1     skrll   const char *file_name;
   10455      1.1     skrll   unsigned line;
   10456      1.1     skrll 
   10457      1.1     skrll   file_name = as_where (&line);
   10458      1.1     skrll   new_logical_line (fragp->fr_file, fragp->fr_line);
   10459      1.1     skrll 
   10460      1.1     skrll   switch (fragp->fr_subtype)
   10461      1.1     skrll     {
   10462      1.1     skrll     case RELAX_ALIGN_NEXT_OPCODE:
   10463      1.1     skrll       /* Always convert.  */
   10464      1.1     skrll       convert_frag_align_next_opcode (fragp);
   10465      1.1     skrll       break;
   10466      1.1     skrll 
   10467      1.1     skrll     case RELAX_DESIRE_ALIGN:
   10468      1.1     skrll       /* Do nothing.  If not aligned already, too bad.  */
   10469      1.1     skrll       break;
   10470      1.1     skrll 
   10471      1.1     skrll     case RELAX_LITERAL:
   10472      1.1     skrll     case RELAX_LITERAL_FINAL:
   10473      1.1     skrll       break;
   10474      1.1     skrll 
   10475      1.1     skrll     case RELAX_SLOTS:
   10476      1.1     skrll       if (vbuf == NULL)
   10477      1.1     skrll 	vbuf = xtensa_insnbuf_alloc (isa);
   10478      1.1     skrll 
   10479      1.1     skrll       xtensa_insnbuf_from_chars
   10480      1.1     skrll 	(isa, vbuf, (unsigned char *) fragp->fr_opcode, 0);
   10481      1.1     skrll       fmt = xtensa_format_decode (isa, vbuf);
   10482      1.1     skrll       num_slots = xtensa_format_num_slots (isa, fmt);
   10483      1.1     skrll 
   10484      1.1     skrll       for (slot = 0; slot < num_slots; slot++)
   10485      1.1     skrll 	{
   10486      1.1     skrll 	  switch (fragp->tc_frag_data.slot_subtypes[slot])
   10487      1.1     skrll 	    {
   10488      1.1     skrll 	    case RELAX_NARROW:
   10489      1.1     skrll 	      convert_frag_narrow (sec, fragp, fmt, slot);
   10490      1.1     skrll 	      break;
   10491      1.1     skrll 
   10492      1.1     skrll 	    case RELAX_IMMED:
   10493      1.1     skrll 	    case RELAX_IMMED_STEP1:
   10494      1.1     skrll 	    case RELAX_IMMED_STEP2:
   10495      1.1     skrll 	    case RELAX_IMMED_STEP3:
   10496      1.1     skrll 	      /* Place the immediate.  */
   10497      1.1     skrll 	      convert_frag_immed
   10498      1.1     skrll 		(sec, fragp,
   10499      1.1     skrll 		 fragp->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
   10500      1.1     skrll 		 fmt, slot);
   10501      1.1     skrll 	      break;
   10502      1.1     skrll 
   10503      1.1     skrll 	    default:
   10504      1.1     skrll 	      /* This is OK because some slots could have
   10505      1.1     skrll 		 relaxations and others have none.  */
   10506      1.1     skrll 	      break;
   10507      1.1     skrll 	    }
   10508      1.1     skrll 	}
   10509      1.1     skrll       break;
   10510      1.1     skrll 
   10511      1.1     skrll     case RELAX_UNREACHABLE:
   10512      1.1     skrll       memset (&fragp->fr_literal[fragp->fr_fix], 0, fragp->fr_var);
   10513      1.1     skrll       fragp->fr_fix += fragp->tc_frag_data.text_expansion[0];
   10514      1.1     skrll       fragp->fr_var -= fragp->tc_frag_data.text_expansion[0];
   10515      1.1     skrll       frag_wane (fragp);
   10516      1.1     skrll       break;
   10517      1.1     skrll 
   10518      1.1     skrll     case RELAX_MAYBE_UNREACHABLE:
   10519      1.1     skrll     case RELAX_MAYBE_DESIRE_ALIGN:
   10520      1.1     skrll       frag_wane (fragp);
   10521      1.1     skrll       break;
   10522      1.1     skrll 
   10523      1.1     skrll     case RELAX_FILL_NOP:
   10524      1.1     skrll       convert_frag_fill_nop (fragp);
   10525      1.1     skrll       break;
   10526      1.1     skrll 
   10527      1.1     skrll     case RELAX_LITERAL_NR:
   10528      1.1     skrll       if (use_literal_section)
   10529      1.1     skrll 	{
   10530  1.1.1.2  christos 	  /* This should have been handled during relaxation.  When
   10531      1.1     skrll 	     relaxing a code segment, literals sometimes need to be
   10532      1.1     skrll 	     added to the corresponding literal segment.  If that
   10533      1.1     skrll 	     literal segment has already been relaxed, then we end up
   10534      1.1     skrll 	     in this situation.  Marking the literal segments as data
   10535      1.1     skrll 	     would make this happen less often (since GAS always relaxes
   10536      1.1     skrll 	     code before data), but we could still get into trouble if
   10537      1.1     skrll 	     there are instructions in a segment that is not marked as
   10538      1.1     skrll 	     containing code.  Until we can implement a better solution,
   10539      1.1     skrll 	     cheat and adjust the addresses of all the following frags.
   10540  1.1.1.4  christos 	     This could break subsequent alignments, but the linker's
   10541  1.1.1.4  christos 	     literal coalescing will do that anyway.  */
   10542  1.1.1.4  christos 
   10543      1.1     skrll 	  fragS *f;
   10544      1.1     skrll 	  fragp->fr_subtype = RELAX_LITERAL_FINAL;
   10545      1.1     skrll 	  gas_assert (fragp->tc_frag_data.unreported_expansion == 4);
   10546      1.1     skrll 	  memset (&fragp->fr_literal[fragp->fr_fix], 0, 4);
   10547      1.1     skrll 	  fragp->fr_var -= 4;
   10548      1.1     skrll 	  fragp->fr_fix += 4;
   10549      1.1     skrll 	  for (f = fragp->fr_next; f; f = f->fr_next)
   10550      1.1     skrll 	    f->fr_address += 4;
   10551      1.1     skrll 	}
   10552      1.1     skrll       else
   10553      1.1     skrll 	as_bad (_("invalid relaxation fragment result"));
   10554      1.1     skrll       break;
   10555      1.1     skrll 
   10556      1.1     skrll     case RELAX_TRAMPOLINE:
   10557      1.1     skrll       break;
   10558      1.1     skrll     }
   10559      1.1     skrll 
   10560      1.1     skrll   fragp->fr_var = 0;
   10561      1.1     skrll   new_logical_line (file_name, line);
   10562      1.1     skrll }
   10563      1.1     skrll 
   10564      1.1     skrll 
   10565      1.1     skrll static void
   10566      1.1     skrll convert_frag_align_next_opcode (fragS *fragp)
   10567      1.1     skrll {
   10568      1.1     skrll   char *nop_buf;		/* Location for Writing.  */
   10569      1.1     skrll   bfd_boolean use_no_density = fragp->tc_frag_data.is_no_density;
   10570      1.1     skrll   addressT aligned_address;
   10571      1.1     skrll   offsetT fill_size;
   10572      1.1     skrll   int nop, nop_count;
   10573      1.1     skrll 
   10574      1.1     skrll   aligned_address = get_noop_aligned_address (fragp, fragp->fr_address +
   10575      1.1     skrll 					      fragp->fr_fix);
   10576      1.1     skrll   fill_size = aligned_address - (fragp->fr_address + fragp->fr_fix);
   10577      1.1     skrll   nop_count = get_text_align_nop_count (fill_size, use_no_density);
   10578      1.1     skrll   nop_buf = fragp->fr_literal + fragp->fr_fix;
   10579      1.1     skrll 
   10580      1.1     skrll   for (nop = 0; nop < nop_count; nop++)
   10581      1.1     skrll     {
   10582      1.1     skrll       int nop_size;
   10583      1.1     skrll       nop_size = get_text_align_nth_nop_size (fill_size, nop, use_no_density);
   10584      1.1     skrll 
   10585      1.1     skrll       assemble_nop (nop_size, nop_buf);
   10586  1.1.1.2  christos       nop_buf += nop_size;
   10587      1.1     skrll     }
   10588      1.1     skrll 
   10589      1.1     skrll   fragp->fr_fix += fill_size;
   10590      1.1     skrll   fragp->fr_var -= fill_size;
   10591  1.1.1.2  christos }
   10592      1.1     skrll 
   10593      1.1     skrll 
   10594      1.1     skrll static void
   10595      1.1     skrll convert_frag_narrow (segT segP, fragS *fragP, xtensa_format fmt, int slot)
   10596      1.1     skrll {
   10597      1.1     skrll   TInsn tinsn, single_target;
   10598      1.1     skrll   int size, old_size, diff;
   10599      1.1     skrll   offsetT frag_offset;
   10600      1.1     skrll 
   10601      1.1     skrll   gas_assert (slot == 0);
   10602      1.1     skrll   tinsn_from_chars (&tinsn, fragP->fr_opcode, 0);
   10603      1.1     skrll 
   10604      1.1     skrll   if (fragP->tc_frag_data.is_aligning_branch == 1)
   10605  1.1.1.2  christos     {
   10606      1.1     skrll       gas_assert (fragP->tc_frag_data.text_expansion[0] == 1
   10607      1.1     skrll 	      || fragP->tc_frag_data.text_expansion[0] == 0);
   10608      1.1     skrll       convert_frag_immed (segP, fragP, fragP->tc_frag_data.text_expansion[0],
   10609      1.1     skrll 			  fmt, slot);
   10610      1.1     skrll       return;
   10611      1.1     skrll     }
   10612      1.1     skrll 
   10613      1.1     skrll   if (fragP->tc_frag_data.text_expansion[0] == 0)
   10614      1.1     skrll     {
   10615      1.1     skrll       /* No conversion.  */
   10616      1.1     skrll       fragP->fr_var = 0;
   10617      1.1     skrll       return;
   10618      1.1     skrll     }
   10619      1.1     skrll 
   10620      1.1     skrll   gas_assert (fragP->fr_opcode != NULL);
   10621      1.1     skrll 
   10622      1.1     skrll   /* Frags in this relaxation state should only contain
   10623      1.1     skrll      single instruction bundles.  */
   10624      1.1     skrll   tinsn_immed_from_frag (&tinsn, fragP, 0);
   10625      1.1     skrll 
   10626      1.1     skrll   /* Just convert it to a wide form....  */
   10627      1.1     skrll   size = 0;
   10628      1.1     skrll   old_size = xg_get_single_size (tinsn.opcode);
   10629  1.1.1.2  christos 
   10630  1.1.1.2  christos   tinsn_init (&single_target);
   10631      1.1     skrll   frag_offset = fragP->fr_opcode - fragP->fr_literal;
   10632      1.1     skrll 
   10633      1.1     skrll   if (! xg_is_single_relaxable_insn (&tinsn, &single_target, FALSE))
   10634      1.1     skrll     {
   10635      1.1     skrll       as_bad (_("unable to widen instruction"));
   10636      1.1     skrll       return;
   10637      1.1     skrll     }
   10638      1.1     skrll 
   10639      1.1     skrll   size = xg_get_single_size (single_target.opcode);
   10640      1.1     skrll   xg_emit_insn_to_buf (&single_target, fragP->fr_opcode, fragP,
   10641      1.1     skrll 		       frag_offset, TRUE);
   10642      1.1     skrll 
   10643      1.1     skrll   diff = size - old_size;
   10644  1.1.1.2  christos   gas_assert (diff >= 0);
   10645      1.1     skrll   gas_assert (diff <= fragP->fr_var);
   10646      1.1     skrll   fragP->fr_var -= diff;
   10647      1.1     skrll   fragP->fr_fix += diff;
   10648      1.1     skrll 
   10649      1.1     skrll   /* clean it up */
   10650      1.1     skrll   fragP->fr_var = 0;
   10651      1.1     skrll }
   10652      1.1     skrll 
   10653      1.1     skrll 
   10654      1.1     skrll static void
   10655      1.1     skrll convert_frag_fill_nop (fragS *fragP)
   10656      1.1     skrll {
   10657      1.1     skrll   char *loc = &fragP->fr_literal[fragP->fr_fix];
   10658      1.1     skrll   int size = fragP->tc_frag_data.text_expansion[0];
   10659      1.1     skrll   gas_assert ((unsigned) size == (fragP->fr_next->fr_address
   10660      1.1     skrll 			      - fragP->fr_address - fragP->fr_fix));
   10661      1.1     skrll   if (size == 0)
   10662      1.1     skrll     {
   10663      1.1     skrll       /* No conversion.  */
   10664      1.1     skrll       fragP->fr_var = 0;
   10665      1.1     skrll       return;
   10666      1.1     skrll     }
   10667      1.1     skrll   assemble_nop (size, loc);
   10668      1.1     skrll   fragP->tc_frag_data.is_insn = TRUE;
   10669      1.1     skrll   fragP->fr_var -= size;
   10670      1.1     skrll   fragP->fr_fix += size;
   10671      1.1     skrll   frag_wane (fragP);
   10672      1.1     skrll }
   10673      1.1     skrll 
   10674      1.1     skrll 
   10675      1.1     skrll static fixS *fix_new_exp_in_seg
   10676      1.1     skrll   (segT, subsegT, fragS *, int, int, expressionS *, int,
   10677      1.1     skrll    bfd_reloc_code_real_type);
   10678      1.1     skrll 
   10679      1.1     skrll static void
   10680      1.1     skrll convert_frag_immed (segT segP,
   10681  1.1.1.2  christos 		    fragS *fragP,
   10682      1.1     skrll 		    int min_steps,
   10683      1.1     skrll 		    xtensa_format fmt,
   10684      1.1     skrll 		    int slot)
   10685      1.1     skrll {
   10686      1.1     skrll   char *immed_instr = fragP->fr_opcode;
   10687      1.1     skrll   TInsn orig_tinsn;
   10688      1.1     skrll   bfd_boolean expanded = FALSE;
   10689      1.1     skrll   bfd_boolean branch_jmp_to_next = FALSE;
   10690      1.1     skrll   char *fr_opcode = fragP->fr_opcode;
   10691      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   10692      1.1     skrll   bfd_boolean from_wide_insn = FALSE;
   10693      1.1     skrll   int bytes;
   10694      1.1     skrll   bfd_boolean is_loop;
   10695      1.1     skrll 
   10696      1.1     skrll   gas_assert (fr_opcode != NULL);
   10697      1.1     skrll 
   10698      1.1     skrll   xg_clear_vinsn (&cur_vinsn);
   10699      1.1     skrll 
   10700      1.1     skrll   vinsn_from_chars (&cur_vinsn, fr_opcode);
   10701      1.1     skrll   if (cur_vinsn.num_slots > 1)
   10702      1.1     skrll     from_wide_insn = TRUE;
   10703      1.1     skrll 
   10704      1.1     skrll   orig_tinsn = cur_vinsn.slots[slot];
   10705      1.1     skrll   tinsn_immed_from_frag (&orig_tinsn, fragP, slot);
   10706      1.1     skrll 
   10707      1.1     skrll   is_loop = xtensa_opcode_is_loop (xtensa_default_isa, orig_tinsn.opcode) == 1;
   10708      1.1     skrll 
   10709      1.1     skrll   if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
   10710  1.1.1.2  christos     branch_jmp_to_next = is_branch_jmp_to_next (&orig_tinsn, fragP);
   10711      1.1     skrll 
   10712      1.1     skrll   if (branch_jmp_to_next && !next_frag_is_loop_target (fragP))
   10713      1.1     skrll     {
   10714      1.1     skrll       /* Conversion just inserts a NOP and marks the fix as completed.  */
   10715      1.1     skrll       bytes = xtensa_format_length (isa, fmt);
   10716      1.1     skrll       if (bytes >= 4)
   10717      1.1     skrll 	{
   10718      1.1     skrll 	  cur_vinsn.slots[slot].opcode =
   10719      1.1     skrll 	    xtensa_format_slot_nop_opcode (isa, cur_vinsn.format, slot);
   10720      1.1     skrll 	  cur_vinsn.slots[slot].ntok = 0;
   10721      1.1     skrll 	}
   10722      1.1     skrll       else
   10723      1.1     skrll 	{
   10724      1.1     skrll 	  bytes += fragP->tc_frag_data.text_expansion[0];
   10725      1.1     skrll 	  gas_assert (bytes == 2 || bytes == 3);
   10726      1.1     skrll 	  build_nop (&cur_vinsn.slots[0], bytes);
   10727      1.1     skrll 	  fragP->fr_fix += fragP->tc_frag_data.text_expansion[0];
   10728      1.1     skrll 	}
   10729      1.1     skrll       vinsn_to_insnbuf (&cur_vinsn, fr_opcode, frag_now, TRUE);
   10730      1.1     skrll       xtensa_insnbuf_to_chars
   10731      1.1     skrll 	(isa, cur_vinsn.insnbuf, (unsigned char *) fr_opcode, 0);
   10732      1.1     skrll       fragP->fr_var = 0;
   10733      1.1     skrll     }
   10734      1.1     skrll   else
   10735      1.1     skrll     {
   10736      1.1     skrll       /* Here is the fun stuff:  Get the immediate field from this
   10737      1.1     skrll 	 instruction.  If it fits, we're done.  If not, find the next
   10738      1.1     skrll 	 instruction sequence that fits.  */
   10739      1.1     skrll 
   10740      1.1     skrll       IStack istack;
   10741      1.1     skrll       int i;
   10742      1.1     skrll       symbolS *lit_sym = NULL;
   10743      1.1     skrll       int total_size = 0;
   10744      1.1     skrll       int target_offset = 0;
   10745      1.1     skrll       int old_size;
   10746      1.1     skrll       int diff;
   10747      1.1     skrll       symbolS *gen_label = NULL;
   10748      1.1     skrll       offsetT frag_offset;
   10749      1.1     skrll       bfd_boolean first = TRUE;
   10750      1.1     skrll 
   10751      1.1     skrll       /* It does not fit.  Find something that does and
   10752      1.1     skrll          convert immediately.  */
   10753      1.1     skrll       frag_offset = fr_opcode - fragP->fr_literal;
   10754      1.1     skrll       istack_init (&istack);
   10755      1.1     skrll       xg_assembly_relax (&istack, &orig_tinsn,
   10756      1.1     skrll 			 segP, fragP, frag_offset, min_steps, 0);
   10757      1.1     skrll 
   10758      1.1     skrll       old_size = xtensa_format_length (isa, fmt);
   10759      1.1     skrll 
   10760      1.1     skrll       /* Assemble this right inline.  */
   10761      1.1     skrll 
   10762      1.1     skrll       /* First, create the mapping from a label name to the REAL label.  */
   10763      1.1     skrll       target_offset = 0;
   10764      1.1     skrll       for (i = 0; i < istack.ninsn; i++)
   10765      1.1     skrll 	{
   10766      1.1     skrll 	  TInsn *tinsn = &istack.insn[i];
   10767      1.1     skrll 	  fragS *lit_frag;
   10768      1.1     skrll 
   10769      1.1     skrll 	  switch (tinsn->insn_type)
   10770      1.1     skrll 	    {
   10771      1.1     skrll 	    case ITYPE_LITERAL:
   10772      1.1     skrll 	      if (lit_sym != NULL)
   10773      1.1     skrll 		as_bad (_("multiple literals in expansion"));
   10774      1.1     skrll 	      /* First find the appropriate space in the literal pool.  */
   10775      1.1     skrll 	      lit_frag = fragP->tc_frag_data.literal_frags[slot];
   10776      1.1     skrll 	      if (lit_frag == NULL)
   10777      1.1     skrll 		as_bad (_("no registered fragment for literal"));
   10778      1.1     skrll 	      if (tinsn->ntok != 1)
   10779      1.1     skrll 		as_bad (_("number of literal tokens != 1"));
   10780      1.1     skrll 
   10781  1.1.1.2  christos 	      /* Set the literal symbol and add a fixup.  */
   10782      1.1     skrll 	      lit_sym = lit_frag->fr_symbol;
   10783      1.1     skrll 	      break;
   10784      1.1     skrll 
   10785      1.1     skrll 	    case ITYPE_LABEL:
   10786      1.1     skrll 	      if (align_targets && !is_loop)
   10787  1.1.1.2  christos 		{
   10788      1.1     skrll 		  fragS *unreach = fragP->fr_next;
   10789      1.1     skrll 		  while (!(unreach->fr_type == rs_machine_dependent
   10790      1.1     skrll 			   && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
   10791      1.1     skrll 			       || unreach->fr_subtype == RELAX_UNREACHABLE)))
   10792      1.1     skrll 		    {
   10793      1.1     skrll 		      unreach = unreach->fr_next;
   10794      1.1     skrll 		    }
   10795      1.1     skrll 
   10796      1.1     skrll 		  gas_assert (unreach->fr_type == rs_machine_dependent
   10797      1.1     skrll 			  && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
   10798      1.1     skrll 			      || unreach->fr_subtype == RELAX_UNREACHABLE));
   10799      1.1     skrll 
   10800      1.1     skrll 		  target_offset += unreach->tc_frag_data.text_expansion[0];
   10801      1.1     skrll 		}
   10802      1.1     skrll 	      gas_assert (gen_label == NULL);
   10803      1.1     skrll 	      gen_label = symbol_new (FAKE_LABEL_NAME, now_seg,
   10804      1.1     skrll 				      fr_opcode - fragP->fr_literal
   10805      1.1     skrll 				      + target_offset, fragP);
   10806      1.1     skrll 	      break;
   10807      1.1     skrll 
   10808      1.1     skrll 	    case ITYPE_INSN:
   10809      1.1     skrll 	      if (first && from_wide_insn)
   10810      1.1     skrll 		{
   10811      1.1     skrll 		  target_offset += xtensa_format_length (isa, fmt);
   10812      1.1     skrll 		  first = FALSE;
   10813      1.1     skrll 		  if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
   10814      1.1     skrll 		    target_offset += xg_get_single_size (tinsn->opcode);
   10815      1.1     skrll 		}
   10816      1.1     skrll 	      else
   10817      1.1     skrll 		target_offset += xg_get_single_size (tinsn->opcode);
   10818      1.1     skrll 	      break;
   10819      1.1     skrll 	    }
   10820      1.1     skrll 	}
   10821      1.1     skrll 
   10822  1.1.1.2  christos       total_size = 0;
   10823  1.1.1.2  christos       first = TRUE;
   10824  1.1.1.2  christos       for (i = 0; i < istack.ninsn; i++)
   10825      1.1     skrll 	{
   10826      1.1     skrll 	  TInsn *tinsn = &istack.insn[i];
   10827  1.1.1.2  christos 	  fragS *lit_frag;
   10828      1.1     skrll 	  int size;
   10829      1.1     skrll 	  segT target_seg;
   10830      1.1     skrll 	  bfd_reloc_code_real_type reloc_type;
   10831      1.1     skrll 
   10832      1.1     skrll 	  switch (tinsn->insn_type)
   10833      1.1     skrll 	    {
   10834      1.1     skrll 	    case ITYPE_LITERAL:
   10835      1.1     skrll 	      lit_frag = fragP->tc_frag_data.literal_frags[slot];
   10836      1.1     skrll 	      /* Already checked.  */
   10837      1.1     skrll 	      gas_assert (lit_frag != NULL);
   10838      1.1     skrll 	      gas_assert (lit_sym != NULL);
   10839      1.1     skrll 	      gas_assert (tinsn->ntok == 1);
   10840      1.1     skrll 	      /* Add a fixup.  */
   10841      1.1     skrll 	      target_seg = S_GET_SEGMENT (lit_sym);
   10842      1.1     skrll 	      gas_assert (target_seg);
   10843      1.1     skrll 	      reloc_type = map_operator_to_reloc (tinsn->tok[0].X_op, TRUE);
   10844      1.1     skrll 	      fix_new_exp_in_seg (target_seg, 0, lit_frag, 0, 4,
   10845      1.1     skrll 				  &tinsn->tok[0], FALSE, reloc_type);
   10846      1.1     skrll 	      break;
   10847      1.1     skrll 
   10848      1.1     skrll 	    case ITYPE_LABEL:
   10849      1.1     skrll 	      break;
   10850      1.1     skrll 
   10851      1.1     skrll 	    case ITYPE_INSN:
   10852      1.1     skrll 	      xg_resolve_labels (tinsn, gen_label);
   10853      1.1     skrll 	      xg_resolve_literals (tinsn, lit_sym);
   10854      1.1     skrll 	      if (from_wide_insn && first)
   10855      1.1     skrll 		{
   10856      1.1     skrll 		  first = FALSE;
   10857      1.1     skrll 		  if (opcode_fits_format_slot (tinsn->opcode, fmt, slot))
   10858      1.1     skrll 		    {
   10859      1.1     skrll 		      cur_vinsn.slots[slot] = *tinsn;
   10860      1.1     skrll 		    }
   10861      1.1     skrll 		  else
   10862      1.1     skrll 		    {
   10863      1.1     skrll 		      cur_vinsn.slots[slot].opcode =
   10864      1.1     skrll 			xtensa_format_slot_nop_opcode (isa, fmt, slot);
   10865      1.1     skrll 		      cur_vinsn.slots[slot].ntok = 0;
   10866      1.1     skrll 		    }
   10867      1.1     skrll 		  vinsn_to_insnbuf (&cur_vinsn, immed_instr, fragP, TRUE);
   10868      1.1     skrll 		  xtensa_insnbuf_to_chars (isa, cur_vinsn.insnbuf,
   10869      1.1     skrll 					   (unsigned char *) immed_instr, 0);
   10870      1.1     skrll 		  fragP->tc_frag_data.is_insn = TRUE;
   10871      1.1     skrll 		  size = xtensa_format_length (isa, fmt);
   10872      1.1     skrll 		  if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
   10873      1.1     skrll 		    {
   10874      1.1     skrll 		      xg_emit_insn_to_buf
   10875      1.1     skrll 			(tinsn, immed_instr + size, fragP,
   10876      1.1     skrll 			 immed_instr - fragP->fr_literal + size, TRUE);
   10877      1.1     skrll 		      size += xg_get_single_size (tinsn->opcode);
   10878  1.1.1.2  christos 		    }
   10879      1.1     skrll 		}
   10880      1.1     skrll 	      else
   10881  1.1.1.2  christos 		{
   10882      1.1     skrll 		  size = xg_get_single_size (tinsn->opcode);
   10883      1.1     skrll 		  xg_emit_insn_to_buf (tinsn, immed_instr, fragP,
   10884      1.1     skrll 				       immed_instr - fragP->fr_literal, TRUE);
   10885      1.1     skrll 		}
   10886      1.1     skrll 	      immed_instr += size;
   10887      1.1     skrll 	      total_size += size;
   10888      1.1     skrll 	      break;
   10889      1.1     skrll 	    }
   10890      1.1     skrll 	}
   10891      1.1     skrll 
   10892      1.1     skrll       diff = total_size - old_size;
   10893      1.1     skrll       gas_assert (diff >= 0);
   10894      1.1     skrll       if (diff != 0)
   10895      1.1     skrll 	expanded = TRUE;
   10896      1.1     skrll       gas_assert (diff <= fragP->fr_var);
   10897      1.1     skrll       fragP->fr_var -= diff;
   10898      1.1     skrll       fragP->fr_fix += diff;
   10899      1.1     skrll     }
   10900      1.1     skrll 
   10901      1.1     skrll   /* Check for undefined immediates in LOOP instructions.  */
   10902      1.1     skrll   if (is_loop)
   10903      1.1     skrll     {
   10904      1.1     skrll       symbolS *sym;
   10905      1.1     skrll       sym = orig_tinsn.tok[1].X_add_symbol;
   10906      1.1     skrll       if (sym != NULL && !S_IS_DEFINED (sym))
   10907      1.1     skrll 	{
   10908      1.1     skrll 	  as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
   10909      1.1     skrll 	  return;
   10910      1.1     skrll 	}
   10911      1.1     skrll       sym = orig_tinsn.tok[1].X_op_symbol;
   10912      1.1     skrll       if (sym != NULL && !S_IS_DEFINED (sym))
   10913      1.1     skrll 	{
   10914      1.1     skrll 	  as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
   10915      1.1     skrll 	  return;
   10916      1.1     skrll 	}
   10917      1.1     skrll     }
   10918      1.1     skrll 
   10919      1.1     skrll   if (expanded && is_direct_call_opcode (orig_tinsn.opcode))
   10920      1.1     skrll     {
   10921      1.1     skrll       /* Add an expansion note on the expanded instruction.  */
   10922      1.1     skrll       fix_new_exp_in_seg (now_seg, 0, fragP, fr_opcode - fragP->fr_literal, 4,
   10923      1.1     skrll 			  &orig_tinsn.tok[0], TRUE,
   10924      1.1     skrll 			  BFD_RELOC_XTENSA_ASM_EXPAND);
   10925      1.1     skrll     }
   10926      1.1     skrll }
   10927      1.1     skrll 
   10928      1.1     skrll 
   10929      1.1     skrll /* Add a new fix expression into the desired segment.  We have to
   10930      1.1     skrll    switch to that segment to do this.  */
   10931  1.1.1.2  christos 
   10932      1.1     skrll static fixS *
   10933      1.1     skrll fix_new_exp_in_seg (segT new_seg,
   10934      1.1     skrll 		    subsegT new_subseg,
   10935      1.1     skrll 		    fragS *frag,
   10936      1.1     skrll 		    int where,
   10937      1.1     skrll 		    int size,
   10938      1.1     skrll 		    expressionS *exp,
   10939      1.1     skrll 		    int pcrel,
   10940      1.1     skrll 		    bfd_reloc_code_real_type r_type)
   10941      1.1     skrll {
   10942      1.1     skrll   fixS *new_fix;
   10943      1.1     skrll   segT seg = now_seg;
   10944      1.1     skrll   subsegT subseg = now_subseg;
   10945      1.1     skrll 
   10946      1.1     skrll   gas_assert (new_seg != 0);
   10947      1.1     skrll   subseg_set (new_seg, new_subseg);
   10948      1.1     skrll 
   10949      1.1     skrll   new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
   10950      1.1     skrll   subseg_set (seg, subseg);
   10951      1.1     skrll   return new_fix;
   10952      1.1     skrll }
   10953      1.1     skrll 
   10954      1.1     skrll 
   10955      1.1     skrll 
   10956      1.1     skrll /* A map that keeps information on a per-subsegment basis.  This is
   10958      1.1     skrll    maintained during initial assembly, but is invalid once the
   10959      1.1     skrll    subsegments are smashed together.  I.E., it cannot be used during
   10960      1.1     skrll    the relaxation.  */
   10961      1.1     skrll 
   10962      1.1     skrll typedef struct subseg_map_struct
   10963      1.1     skrll {
   10964      1.1     skrll   /* the key */
   10965      1.1     skrll   segT seg;
   10966      1.1     skrll   subsegT subseg;
   10967      1.1     skrll 
   10968      1.1     skrll   /* the data */
   10969      1.1     skrll   unsigned flags;
   10970      1.1     skrll   float total_freq;	/* fall-through + branch target frequency */
   10971      1.1     skrll   float target_freq;	/* branch target frequency alone */
   10972      1.1     skrll 
   10973      1.1     skrll   struct subseg_map_struct *next;
   10974      1.1     skrll } subseg_map;
   10975      1.1     skrll 
   10976      1.1     skrll 
   10977      1.1     skrll static subseg_map *sseg_map = NULL;
   10978      1.1     skrll 
   10979      1.1     skrll static subseg_map *
   10980  1.1.1.5  christos get_subseg_info (segT seg, subsegT subseg)
   10981      1.1     skrll {
   10982      1.1     skrll   subseg_map *subseg_e;
   10983      1.1     skrll 
   10984      1.1     skrll   for (subseg_e = sseg_map; subseg_e; subseg_e = subseg_e->next)
   10985      1.1     skrll     {
   10986      1.1     skrll       if (seg == subseg_e->seg && subseg == subseg_e->subseg)
   10987      1.1     skrll 	break;
   10988      1.1     skrll     }
   10989      1.1     skrll   return subseg_e;
   10990      1.1     skrll }
   10991      1.1     skrll 
   10992      1.1     skrll 
   10993      1.1     skrll static subseg_map *
   10994      1.1     skrll add_subseg_info (segT seg, subsegT subseg)
   10995      1.1     skrll {
   10996      1.1     skrll   subseg_map *subseg_e = XNEW (subseg_map);
   10997      1.1     skrll   memset (subseg_e, 0, sizeof (subseg_map));
   10998      1.1     skrll   subseg_e->seg = seg;
   10999      1.1     skrll   subseg_e->subseg = subseg;
   11000      1.1     skrll   subseg_e->flags = 0;
   11001      1.1     skrll   /* Start off considering every branch target very important.  */
   11002      1.1     skrll   subseg_e->target_freq = 1.0;
   11003      1.1     skrll   subseg_e->total_freq = 1.0;
   11004      1.1     skrll   subseg_e->next = sseg_map;
   11005      1.1     skrll   sseg_map = subseg_e;
   11006      1.1     skrll   return subseg_e;
   11007      1.1     skrll }
   11008      1.1     skrll 
   11009      1.1     skrll 
   11010      1.1     skrll static unsigned
   11011      1.1     skrll get_last_insn_flags (segT seg, subsegT subseg)
   11012      1.1     skrll {
   11013      1.1     skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   11014      1.1     skrll   if (subseg_e)
   11015      1.1     skrll     return subseg_e->flags;
   11016      1.1     skrll   return 0;
   11017      1.1     skrll }
   11018      1.1     skrll 
   11019      1.1     skrll 
   11020      1.1     skrll static void
   11021      1.1     skrll set_last_insn_flags (segT seg,
   11022      1.1     skrll 		     subsegT subseg,
   11023      1.1     skrll 		     unsigned fl,
   11024      1.1     skrll 		     bfd_boolean val)
   11025      1.1     skrll {
   11026      1.1     skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   11027      1.1     skrll   if (! subseg_e)
   11028      1.1     skrll     subseg_e = add_subseg_info (seg, subseg);
   11029      1.1     skrll   if (val)
   11030      1.1     skrll     subseg_e->flags |= fl;
   11031      1.1     skrll   else
   11032      1.1     skrll     subseg_e->flags &= ~fl;
   11033      1.1     skrll }
   11034      1.1     skrll 
   11035      1.1     skrll 
   11036      1.1     skrll static float
   11037      1.1     skrll get_subseg_total_freq (segT seg, subsegT subseg)
   11038      1.1     skrll {
   11039      1.1     skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   11040      1.1     skrll   if (subseg_e)
   11041      1.1     skrll     return subseg_e->total_freq;
   11042      1.1     skrll   return 1.0;
   11043      1.1     skrll }
   11044      1.1     skrll 
   11045      1.1     skrll 
   11046      1.1     skrll static float
   11047      1.1     skrll get_subseg_target_freq (segT seg, subsegT subseg)
   11048      1.1     skrll {
   11049      1.1     skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   11050      1.1     skrll   if (subseg_e)
   11051      1.1     skrll     return subseg_e->target_freq;
   11052      1.1     skrll   return 1.0;
   11053      1.1     skrll }
   11054      1.1     skrll 
   11055      1.1     skrll 
   11056      1.1     skrll static void
   11057      1.1     skrll set_subseg_freq (segT seg, subsegT subseg, float total_f, float target_f)
   11058      1.1     skrll {
   11059      1.1     skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   11060      1.1     skrll   if (! subseg_e)
   11061      1.1     skrll     subseg_e = add_subseg_info (seg, subseg);
   11062  1.1.1.2  christos   subseg_e->total_freq = total_f;
   11063      1.1     skrll   subseg_e->target_freq = target_f;
   11064      1.1     skrll }
   11065      1.1     skrll 
   11066      1.1     skrll 
   11067      1.1     skrll /* Segment Lists and emit_state Stuff.  */
   11069      1.1     skrll 
   11070      1.1     skrll static void
   11071      1.1     skrll xtensa_move_seg_list_to_beginning (seg_list *head)
   11072      1.1     skrll {
   11073      1.1     skrll   head = head->next;
   11074      1.1     skrll   while (head)
   11075      1.1     skrll     {
   11076  1.1.1.6  christos       segT literal_section = head->seg;
   11077  1.1.1.6  christos 
   11078  1.1.1.6  christos       /* Move the literal section to the front of the section list.  */
   11079  1.1.1.6  christos       gas_assert (literal_section);
   11080  1.1.1.6  christos       if (literal_section != stdoutput->sections)
   11081  1.1.1.6  christos 	{
   11082  1.1.1.6  christos 	  bfd_section_list_remove (stdoutput, literal_section);
   11083  1.1.1.6  christos 	  bfd_section_list_prepend (stdoutput, literal_section);
   11084  1.1.1.6  christos 	}
   11085  1.1.1.6  christos       head = head->next;
   11086  1.1.1.6  christos     }
   11087  1.1.1.6  christos }
   11088  1.1.1.6  christos 
   11089  1.1.1.6  christos 
   11090  1.1.1.6  christos static void mark_literal_frags (seg_list *);
   11091  1.1.1.6  christos 
   11092  1.1.1.6  christos static void
   11093  1.1.1.6  christos xg_promote_candidate_litpool (struct litpool_seg *lps,
   11094  1.1.1.6  christos 			      struct litpool_frag *lp)
   11095  1.1.1.6  christos {
   11096  1.1.1.6  christos   fragS *poolbeg;
   11097  1.1.1.6  christos   fragS *poolend;
   11098  1.1.1.6  christos   symbolS *lsym;
   11099  1.1.1.7  christos   char label[10 + 2 * sizeof (fragS *)];
   11100  1.1.1.7  christos 
   11101  1.1.1.7  christos   poolbeg = lp->fragP;
   11102  1.1.1.7  christos   lp->priority = 1;
   11103  1.1.1.7  christos   poolbeg->fr_subtype = RELAX_LITERAL_POOL_BEGIN;
   11104  1.1.1.7  christos   poolend = poolbeg->fr_next;
   11105  1.1.1.7  christos   gas_assert (poolend->fr_type == rs_machine_dependent &&
   11106  1.1.1.7  christos 	      poolend->fr_subtype == RELAX_LITERAL_POOL_END);
   11107  1.1.1.7  christos   /* Create a local symbol pointing to the
   11108  1.1.1.7  christos      end of the pool.  */
   11109  1.1.1.7  christos   sprintf (label, ".L0_LT_%p", poolbeg);
   11110  1.1.1.7  christos   lsym = (symbolS *)local_symbol_make (label, lps->seg,
   11111  1.1.1.7  christos 				       0, poolend);
   11112  1.1.1.7  christos   poolbeg->fr_symbol = lsym;
   11113  1.1.1.7  christos   /* Rest is done in xtensa_relax_frag.  */
   11114  1.1.1.7  christos }
   11115  1.1.1.7  christos 
   11116  1.1.1.7  christos static struct litpool_frag *xg_find_litpool (struct litpool_seg *lps,
   11117  1.1.1.7  christos 					     struct litpool_frag *lpf,
   11118  1.1.1.7  christos 					     addressT addr)
   11119  1.1.1.7  christos {
   11120  1.1.1.7  christos   struct litpool_frag *lp = lpf->prev;
   11121  1.1.1.7  christos 
   11122  1.1.1.7  christos   gas_assert (lp->fragP);
   11123  1.1.1.7  christos 
   11124  1.1.1.7  christos   while (lp->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN)
   11125  1.1.1.7  christos     {
   11126  1.1.1.7  christos       lp = lp->prev;
   11127  1.1.1.7  christos       if (lp->fragP == NULL)
   11128  1.1.1.7  christos 	{
   11129  1.1.1.7  christos 	  /* End of list; have to bite the bullet.
   11130  1.1.1.7  christos 	     Take the nearest.  */
   11131  1.1.1.7  christos 	  lp = lpf->prev;
   11132  1.1.1.7  christos 	  break;
   11133  1.1.1.7  christos 	}
   11134  1.1.1.7  christos       /* Does it (conservatively) reach?  */
   11135  1.1.1.7  christos       if (addr - lp->addr <= 128 * 1024)
   11136  1.1.1.7  christos 	{
   11137  1.1.1.7  christos 	  if (lp->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN &&
   11138  1.1.1.7  christos 	      lp->literal_count < MAX_POOL_LITERALS)
   11139  1.1.1.7  christos 	    {
   11140  1.1.1.7  christos 	      /* Found a good one.  */
   11141  1.1.1.7  christos 	      break;
   11142  1.1.1.7  christos 	    }
   11143  1.1.1.7  christos 	  else if (lp->prev->fragP &&
   11144  1.1.1.7  christos 		   addr - lp->prev->addr > 128 * 1024 &&
   11145  1.1.1.7  christos 		   lp->prev->literal_count < MAX_POOL_LITERALS)
   11146  1.1.1.7  christos 	    {
   11147  1.1.1.7  christos 	      /* This is still a "candidate" but the next one
   11148  1.1.1.7  christos 		 will be too far away, so revert to the nearest
   11149  1.1.1.7  christos 		 one, convert it and add the jump around.  */
   11150  1.1.1.7  christos 	      lp = lpf->prev;
   11151  1.1.1.7  christos 	      break;
   11152  1.1.1.7  christos 	    }
   11153  1.1.1.7  christos 	}
   11154  1.1.1.7  christos     }
   11155  1.1.1.7  christos 
   11156  1.1.1.7  christos   if (lp->literal_count >= MAX_POOL_LITERALS)
   11157  1.1.1.7  christos     {
   11158  1.1.1.7  christos       lp = lpf->prev;
   11159  1.1.1.7  christos       while (lp && lp->fragP && lp->literal_count >= MAX_POOL_LITERALS)
   11160  1.1.1.7  christos 	{
   11161  1.1.1.7  christos 	  lp = lp->prev;
   11162  1.1.1.7  christos 	}
   11163  1.1.1.7  christos       gas_assert (lp);
   11164  1.1.1.7  christos     }
   11165  1.1.1.7  christos 
   11166  1.1.1.7  christos   gas_assert (lp && lp->fragP && lp->literal_count < MAX_POOL_LITERALS);
   11167  1.1.1.6  christos   ++lp->literal_count;
   11168  1.1.1.8  christos 
   11169      1.1     skrll   /* Convert candidate and add the jump around.  */
   11170  1.1.1.4  christos   if (lp->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN)
   11171  1.1.1.4  christos     xg_promote_candidate_litpool (lps, lp);
   11172  1.1.1.4  christos 
   11173  1.1.1.4  christos   return lp;
   11174  1.1.1.4  christos }
   11175  1.1.1.4  christos 
   11176  1.1.1.4  christos static bfd_boolean xtensa_is_init_fini (segT seg)
   11177  1.1.1.4  christos {
   11178  1.1.1.7  christos   if (!seg)
   11179  1.1.1.7  christos     return 0;
   11180  1.1.1.7  christos   return strcmp (segment_name (seg), INIT_SECTION_NAME) == 0
   11181  1.1.1.4  christos     || strcmp (segment_name (seg), FINI_SECTION_NAME) == 0;
   11182  1.1.1.4  christos }
   11183  1.1.1.4  christos 
   11184  1.1.1.4  christos static void
   11185  1.1.1.4  christos xtensa_assign_litpool_addresses (void)
   11186  1.1.1.4  christos {
   11187  1.1.1.4  christos   struct litpool_seg *lps;
   11188  1.1.1.4  christos 
   11189  1.1.1.4  christos   for (lps = litpool_seg_list.next; lps; lps = lps->next)
   11190  1.1.1.4  christos     {
   11191  1.1.1.4  christos       frchainS *frchP = seg_info (lps->seg)->frchainP;
   11192  1.1.1.4  christos       struct litpool_frag *lpf = lps->frag_list.next;
   11193  1.1.1.4  christos       addressT addr = 0;
   11194  1.1.1.4  christos 
   11195  1.1.1.4  christos       if (xtensa_is_init_fini (lps->seg))
   11196  1.1.1.4  christos 	continue;
   11197  1.1.1.4  christos 
   11198  1.1.1.4  christos       for ( ; frchP; frchP = frchP->frch_next)
   11199  1.1.1.4  christos 	{
   11200  1.1.1.4  christos 	  fragS *fragP;
   11201  1.1.1.7  christos 	  for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   11202  1.1.1.7  christos 	    {
   11203  1.1.1.7  christos 	      if (lpf && fragP == lpf->fragP)
   11204  1.1.1.7  christos 		{
   11205  1.1.1.7  christos 		  gas_assert(fragP->fr_type == rs_machine_dependent &&
   11206  1.1.1.4  christos 			     (fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN ||
   11207  1.1.1.7  christos 			      fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN));
   11208  1.1.1.7  christos 		  /* Found a litpool location.  */
   11209  1.1.1.7  christos 		  lpf->addr = addr;
   11210  1.1.1.7  christos 		  lpf = lpf->next;
   11211  1.1.1.7  christos 		}
   11212  1.1.1.7  christos 	      if (fragP->fr_type == rs_machine_dependent &&
   11213  1.1.1.7  christos 		  fragP->fr_subtype == RELAX_SLOTS)
   11214  1.1.1.7  christos 		{
   11215  1.1.1.7  christos 		  int slot;
   11216  1.1.1.7  christos 		  for (slot = 0; slot < MAX_SLOTS; slot++)
   11217  1.1.1.7  christos 		    {
   11218  1.1.1.4  christos 		      fragS *litfrag = fragP->tc_frag_data.literal_frags[slot];
   11219  1.1.1.4  christos 
   11220  1.1.1.4  christos 		      if (litfrag
   11221  1.1.1.4  christos 			  && litfrag->tc_frag_data.is_literal
   11222  1.1.1.4  christos 			  && !litfrag->tc_frag_data.literal_frag)
   11223  1.1.1.4  christos 			{
   11224  1.1.1.4  christos 			  /* L32R referring .literal or generated as a result
   11225  1.1.1.4  christos 			     of relaxation.  Point its literal to the nearest
   11226  1.1.1.4  christos 			     litpool preferring non-"candidate" positions to
   11227  1.1.1.8  christos 			     avoid the jump-around.  */
   11228  1.1.1.8  christos 
   11229  1.1.1.8  christos 			  struct litpool_frag *lp;
   11230  1.1.1.8  christos 
   11231  1.1.1.8  christos 			  lp = xg_find_litpool (lps, lpf, addr);
   11232  1.1.1.8  christos 			  /* Take earliest use of this literal to avoid
   11233  1.1.1.8  christos 			     forward refs.  */
   11234  1.1.1.8  christos 			  litfrag->tc_frag_data.literal_frag = lp->fragP;
   11235  1.1.1.8  christos 			}
   11236  1.1.1.8  christos 		    }
   11237  1.1.1.8  christos 		}
   11238  1.1.1.8  christos 	      addr += fragP->fr_fix;
   11239  1.1.1.8  christos 	      if (fragP->fr_type == rs_fill)
   11240  1.1.1.8  christos 		addr += fragP->fr_offset;
   11241  1.1.1.8  christos 	    }
   11242  1.1.1.8  christos 	}
   11243  1.1.1.8  christos     }
   11244  1.1.1.8  christos }
   11245  1.1.1.8  christos 
   11246  1.1.1.8  christos static void
   11247  1.1.1.8  christos xtensa_move_literals (void)
   11248  1.1.1.8  christos {
   11249  1.1.1.4  christos   seg_list *segment;
   11250  1.1.1.8  christos   frchainS *frchain_from, *frchain_to;
   11251  1.1.1.8  christos   fragS *search_frag, *next_frag, *literal_pool, *insert_after;
   11252  1.1.1.8  christos   fragS **frag_splice;
   11253  1.1.1.8  christos   emit_state state;
   11254  1.1.1.8  christos   segT dest_seg;
   11255  1.1.1.8  christos   fixS *fix, *next_fix, **fix_splice;
   11256      1.1     skrll   sym_list *lit;
   11257      1.1     skrll   const char *init_name = INIT_SECTION_NAME;
   11258  1.1.1.5  christos   const char *fini_name = FINI_SECTION_NAME;
   11259  1.1.1.5  christos   int init_name_len = strlen(init_name);
   11260      1.1     skrll   int fini_name_len = strlen(fini_name);
   11261  1.1.1.5  christos 
   11262  1.1.1.5  christos   mark_literal_frags (literal_head->next);
   11263  1.1.1.5  christos 
   11264  1.1.1.5  christos   if (use_literal_section)
   11265      1.1     skrll     return;
   11266      1.1     skrll 
   11267      1.1     skrll   /* Assign addresses (rough estimates) to the potential literal pool locations
   11268      1.1     skrll      and create new ones if the gaps are too large.  */
   11269      1.1     skrll 
   11270      1.1     skrll   xtensa_assign_litpool_addresses ();
   11271      1.1     skrll 
   11272      1.1     skrll   /* Walk through the literal segments.  */
   11273  1.1.1.4  christos   for (segment = literal_head->next; segment; segment = segment->next)
   11274      1.1     skrll     {
   11275  1.1.1.2  christos       const char *seg_name = segment_name (segment->seg);
   11276      1.1     skrll 
   11277      1.1     skrll       /* Keep the literals for .init and .fini in separate sections.  */
   11278      1.1     skrll       if ((!memcmp (seg_name, init_name, init_name_len) &&
   11279      1.1     skrll 	   !strcmp (seg_name + init_name_len, ".literal")) ||
   11280  1.1.1.4  christos 	  (!memcmp (seg_name, fini_name, fini_name_len) &&
   11281  1.1.1.8  christos 	   !strcmp (seg_name + fini_name_len, ".literal")))
   11282  1.1.1.4  christos 	continue;
   11283  1.1.1.2  christos 
   11284      1.1     skrll       frchain_from = seg_info (segment->seg)->frchainP;
   11285      1.1     skrll       search_frag = frchain_from->frch_root;
   11286      1.1     skrll       literal_pool = NULL;
   11287      1.1     skrll       frchain_to = NULL;
   11288      1.1     skrll       frag_splice = &(frchain_from->frch_root);
   11289      1.1     skrll 
   11290      1.1     skrll       while (search_frag && !search_frag->tc_frag_data.literal_frag)
   11291      1.1     skrll 	{
   11292      1.1     skrll 	  gas_assert (search_frag->fr_fix == 0
   11293      1.1     skrll 		  || search_frag->fr_type == rs_align);
   11294      1.1     skrll 	  search_frag = search_frag->fr_next;
   11295      1.1     skrll 	}
   11296      1.1     skrll 
   11297      1.1     skrll       if (!search_frag)
   11298      1.1     skrll 	continue;
   11299      1.1     skrll 
   11300      1.1     skrll       gas_assert (search_frag->tc_frag_data.literal_frag->fr_subtype
   11301      1.1     skrll 	      == RELAX_LITERAL_POOL_BEGIN);
   11302  1.1.1.2  christos       xtensa_switch_section_emit_state (&state, segment->seg, 0);
   11303      1.1     skrll 
   11304  1.1.1.2  christos       /* Make sure that all the frags in this series are closed, and
   11305      1.1     skrll 	 that there is at least one left over of zero-size.  This
   11306  1.1.1.4  christos 	 prevents us from making a segment with an frchain without any
   11307  1.1.1.4  christos 	 frags in it.  */
   11308  1.1.1.4  christos       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   11309  1.1.1.4  christos       xtensa_set_frag_assembly_state (frag_now);
   11310  1.1.1.4  christos       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   11311  1.1.1.4  christos       xtensa_set_frag_assembly_state (frag_now);
   11312  1.1.1.4  christos 
   11313  1.1.1.4  christos       while (search_frag != frag_now)
   11314  1.1.1.4  christos 	{
   11315  1.1.1.4  christos 	  next_frag = search_frag->fr_next;
   11316  1.1.1.4  christos 	  if (search_frag->tc_frag_data.literal_frag)
   11317  1.1.1.4  christos 	    {
   11318  1.1.1.4  christos 	      literal_pool = search_frag->tc_frag_data.literal_frag;
   11319  1.1.1.4  christos 	      gas_assert (literal_pool->fr_subtype == RELAX_LITERAL_POOL_BEGIN);
   11320  1.1.1.4  christos 	      frchain_to = literal_pool->tc_frag_data.lit_frchain;
   11321  1.1.1.4  christos 	      gas_assert (frchain_to);
   11322  1.1.1.4  christos 	    }
   11323  1.1.1.4  christos 
   11324  1.1.1.4  christos 	  if (search_frag->fr_type == rs_fill && search_frag->fr_fix == 0)
   11325  1.1.1.4  christos 	    {
   11326  1.1.1.4  christos 	      /* Skip empty fill frags.  */
   11327  1.1.1.4  christos 	      *frag_splice = next_frag;
   11328  1.1.1.6  christos 	      search_frag = next_frag;
   11329  1.1.1.4  christos 	      continue;
   11330  1.1.1.4  christos 	    }
   11331  1.1.1.4  christos 
   11332  1.1.1.4  christos 	  if (search_frag->fr_type == rs_align)
   11333  1.1.1.4  christos 	    {
   11334  1.1.1.4  christos 	      /* Skip alignment frags, because the pool as a whole will be
   11335  1.1.1.4  christos 	         aligned if used, and we don't want to force alignment if the
   11336  1.1.1.4  christos 		 pool is unused.  */
   11337  1.1.1.4  christos 	      *frag_splice = next_frag;
   11338  1.1.1.4  christos 	      search_frag = next_frag;
   11339  1.1.1.4  christos 	      continue;
   11340  1.1.1.4  christos 	    }
   11341  1.1.1.4  christos 
   11342  1.1.1.4  christos 	  /* First, move the frag out of the literal section and
   11343  1.1.1.4  christos 	     to the appropriate place.  */
   11344  1.1.1.4  christos 
   11345  1.1.1.4  christos 	  /* Insert an alignment frag at start of pool.  */
   11346  1.1.1.4  christos 	  if (literal_pool->fr_next->fr_type == rs_machine_dependent &&
   11347  1.1.1.4  christos 	      literal_pool->fr_next->fr_subtype == RELAX_LITERAL_POOL_END)
   11348  1.1.1.4  christos 	    {
   11349      1.1     skrll 	      segT pool_seg = literal_pool->fr_next->tc_frag_data.lit_seg;
   11350      1.1     skrll 	      emit_state prev_state;
   11351  1.1.1.4  christos 	      fragS *prev_frag;
   11352  1.1.1.4  christos 	      fragS *align_frag;
   11353  1.1.1.4  christos 	      xtensa_switch_section_emit_state (&prev_state, pool_seg, 0);
   11354  1.1.1.4  christos 	      prev_frag = frag_now;
   11355  1.1.1.4  christos 	      frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   11356      1.1     skrll 	      align_frag = frag_now;
   11357      1.1     skrll 	      frag_align (2, 0, 0);
   11358      1.1     skrll 	      /* Splice it into the right place.  */
   11359      1.1     skrll 	      prev_frag->fr_next = align_frag->fr_next;
   11360      1.1     skrll 	      align_frag->fr_next = literal_pool->fr_next;
   11361      1.1     skrll 	      literal_pool->fr_next = align_frag;
   11362      1.1     skrll 	      /* Insert after this one.  */
   11363      1.1     skrll 	      literal_pool->tc_frag_data.literal_frag = align_frag;
   11364      1.1     skrll 	      xtensa_restore_emit_state (&prev_state);
   11365      1.1     skrll 	    }
   11366      1.1     skrll 	  insert_after = literal_pool->tc_frag_data.literal_frag;
   11367      1.1     skrll 	  dest_seg = insert_after->fr_next->tc_frag_data.lit_seg;
   11368      1.1     skrll 	  /* Skip align frag.  */
   11369      1.1     skrll 	  if (insert_after->fr_next->fr_type == rs_align)
   11370      1.1     skrll 	    {
   11371      1.1     skrll 	      insert_after = insert_after->fr_next;
   11372      1.1     skrll 	    }
   11373      1.1     skrll 
   11374      1.1     skrll 	  *frag_splice = next_frag;
   11375      1.1     skrll 	  search_frag->fr_next = insert_after->fr_next;
   11376      1.1     skrll 	  insert_after->fr_next = search_frag;
   11377      1.1     skrll 	  search_frag->tc_frag_data.lit_seg = dest_seg;
   11378      1.1     skrll 	  literal_pool->tc_frag_data.literal_frag = search_frag;
   11379      1.1     skrll 
   11380      1.1     skrll 	  /* Now move any fixups associated with this frag to the
   11381      1.1     skrll 	     right section.  */
   11382      1.1     skrll 	  fix = frchain_from->fix_root;
   11383      1.1     skrll 	  fix_splice = &(frchain_from->fix_root);
   11384      1.1     skrll 	  while (fix)
   11385      1.1     skrll 	    {
   11386      1.1     skrll 	      next_fix = fix->fx_next;
   11387      1.1     skrll 	      if (fix->fx_frag == search_frag)
   11388      1.1     skrll 		{
   11389      1.1     skrll 		  *fix_splice = next_fix;
   11390  1.1.1.2  christos 		  fix->fx_next = frchain_to->fix_root;
   11391      1.1     skrll 		  frchain_to->fix_root = fix;
   11392      1.1     skrll 		  if (frchain_to->fix_tail == NULL)
   11393      1.1     skrll 		    frchain_to->fix_tail = fix;
   11394      1.1     skrll 		}
   11395      1.1     skrll 	      else
   11396      1.1     skrll 		fix_splice = &(fix->fx_next);
   11397      1.1     skrll 	      fix = next_fix;
   11398      1.1     skrll 	    }
   11399      1.1     skrll 	  search_frag = next_frag;
   11400  1.1.1.2  christos 	}
   11401  1.1.1.2  christos 
   11402  1.1.1.2  christos       if (frchain_from->fix_root != NULL)
   11403      1.1     skrll 	{
   11404      1.1     skrll 	  frchain_from = seg_info (segment->seg)->frchainP;
   11405      1.1     skrll 	  as_warn (_("fixes not all moved from %s"), segment->seg->name);
   11406      1.1     skrll 
   11407      1.1     skrll 	  gas_assert (frchain_from->fix_root == NULL);
   11408      1.1     skrll 	}
   11409      1.1     skrll       frchain_from->fix_tail = NULL;
   11410      1.1     skrll       xtensa_restore_emit_state (&state);
   11411      1.1     skrll     }
   11412      1.1     skrll 
   11413      1.1     skrll   /* Now fix up the SEGMENT value for all the literal symbols.  */
   11414      1.1     skrll   for (lit = literal_syms; lit; lit = lit->next)
   11415      1.1     skrll     {
   11416      1.1     skrll       symbolS *lit_sym = lit->sym;
   11417      1.1     skrll       segT dseg = symbol_get_frag (lit_sym)->tc_frag_data.lit_seg;
   11418      1.1     skrll       if (dseg)
   11419      1.1     skrll 	S_SET_SEGMENT (lit_sym, dseg);
   11420      1.1     skrll     }
   11421      1.1     skrll }
   11422      1.1     skrll 
   11423      1.1     skrll 
   11424      1.1     skrll /* Walk over all the frags for segments in a list and mark them as
   11425      1.1     skrll    containing literals.  As clunky as this is, we can't rely on frag_var
   11426      1.1     skrll    and frag_variant to get called in all situations.  */
   11427      1.1     skrll 
   11428      1.1     skrll static void
   11429      1.1     skrll mark_literal_frags (seg_list *segment)
   11430      1.1     skrll {
   11431      1.1     skrll   frchainS *frchain_from;
   11432      1.1     skrll   fragS *search_frag;
   11433      1.1     skrll 
   11434      1.1     skrll   while (segment)
   11435      1.1     skrll     {
   11436      1.1     skrll       frchain_from = seg_info (segment->seg)->frchainP;
   11437      1.1     skrll       search_frag = frchain_from->frch_root;
   11438      1.1     skrll       while (search_frag)
   11439      1.1     skrll 	{
   11440      1.1     skrll 	  search_frag->tc_frag_data.is_literal = TRUE;
   11441      1.1     skrll 	  search_frag = search_frag->fr_next;
   11442      1.1     skrll 	}
   11443  1.1.1.2  christos       segment = segment->next;
   11444      1.1     skrll     }
   11445      1.1     skrll }
   11446      1.1     skrll 
   11447      1.1     skrll 
   11448      1.1     skrll static void
   11449      1.1     skrll xtensa_reorder_seg_list (seg_list *head, segT after)
   11450      1.1     skrll {
   11451      1.1     skrll   /* Move all of the sections in the section list to come
   11452      1.1     skrll      after "after" in the gnu segment list.  */
   11453      1.1     skrll 
   11454      1.1     skrll   head = head->next;
   11455      1.1     skrll   while (head)
   11456      1.1     skrll     {
   11457      1.1     skrll       segT literal_section = head->seg;
   11458      1.1     skrll 
   11459      1.1     skrll       /* Move the literal section after "after".  */
   11460      1.1     skrll       gas_assert (literal_section);
   11461      1.1     skrll       if (literal_section != after)
   11462      1.1     skrll 	{
   11463      1.1     skrll 	  bfd_section_list_remove (stdoutput, literal_section);
   11464      1.1     skrll 	  bfd_section_list_insert_after (stdoutput, after, literal_section);
   11465      1.1     skrll 	}
   11466      1.1     skrll 
   11467      1.1     skrll       head = head->next;
   11468      1.1     skrll     }
   11469      1.1     skrll }
   11470      1.1     skrll 
   11471      1.1     skrll 
   11472      1.1     skrll /* Push all the literal segments to the end of the gnu list.  */
   11473      1.1     skrll 
   11474      1.1     skrll static void
   11475      1.1     skrll xtensa_reorder_segments (void)
   11476      1.1     skrll {
   11477      1.1     skrll   segT sec;
   11478  1.1.1.2  christos   segT last_sec = 0;
   11479      1.1     skrll   int old_count = 0;
   11480      1.1     skrll   int new_count = 0;
   11481      1.1     skrll 
   11482      1.1     skrll   for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
   11483      1.1     skrll     {
   11484      1.1     skrll       last_sec = sec;
   11485      1.1     skrll       old_count++;
   11486      1.1     skrll     }
   11487      1.1     skrll 
   11488      1.1     skrll   /* Now that we have the last section, push all the literal
   11489      1.1     skrll      sections to the end.  */
   11490      1.1     skrll   xtensa_reorder_seg_list (literal_head, last_sec);
   11491      1.1     skrll 
   11492      1.1     skrll   /* Now perform the final error check.  */
   11493      1.1     skrll   for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
   11494      1.1     skrll     new_count++;
   11495      1.1     skrll   gas_assert (new_count == old_count);
   11496      1.1     skrll }
   11497      1.1     skrll 
   11498      1.1     skrll 
   11499      1.1     skrll /* Change the emit state (seg, subseg, and frag related stuff) to the
   11500      1.1     skrll    correct location.  Return a emit_state which can be passed to
   11501      1.1     skrll    xtensa_restore_emit_state to return to current fragment.  */
   11502      1.1     skrll 
   11503      1.1     skrll static void
   11504      1.1     skrll xtensa_switch_to_literal_fragment (emit_state *result)
   11505      1.1     skrll {
   11506      1.1     skrll   if (directive_state[directive_absolute_literals])
   11507      1.1     skrll     {
   11508  1.1.1.7  christos       segT lit4_seg = cache_literal_section (TRUE);
   11509      1.1     skrll       xtensa_switch_section_emit_state (result, lit4_seg, 0);
   11510      1.1     skrll     }
   11511      1.1     skrll   else
   11512  1.1.1.7  christos     xtensa_switch_to_non_abs_literal_fragment (result);
   11513      1.1     skrll 
   11514  1.1.1.4  christos   /* Do a 4-byte align here.  */
   11515  1.1.1.4  christos   frag_align (2, 0, 0);
   11516  1.1.1.4  christos   record_alignment (now_seg, 2);
   11517  1.1.1.4  christos }
   11518  1.1.1.6  christos 
   11519  1.1.1.6  christos 
   11520      1.1     skrll static void
   11521      1.1     skrll xtensa_switch_to_non_abs_literal_fragment (emit_state *result)
   11522      1.1     skrll {
   11523      1.1     skrll   fragS *pool_location = get_literal_pool_location (now_seg);
   11524      1.1     skrll   segT lit_seg;
   11525      1.1     skrll   bfd_boolean is_init_fini = xtensa_is_init_fini (now_seg);
   11526  1.1.1.7  christos 
   11527      1.1     skrll   if (pool_location == NULL
   11528      1.1     skrll       && !use_literal_section
   11529      1.1     skrll       && !is_init_fini)
   11530      1.1     skrll     {
   11531      1.1     skrll       if (!auto_litpools)
   11532      1.1     skrll 	{
   11533      1.1     skrll 	  as_bad (_("literal pool location required for text-section-literals; specify with .literal_position"));
   11534      1.1     skrll 	}
   11535      1.1     skrll       xtensa_maybe_create_literal_pool_frag (TRUE, TRUE);
   11536      1.1     skrll       pool_location = get_literal_pool_location (now_seg);
   11537      1.1     skrll     }
   11538      1.1     skrll 
   11539      1.1     skrll   lit_seg = cache_literal_section (FALSE);
   11540      1.1     skrll   xtensa_switch_section_emit_state (result, lit_seg, 0);
   11541      1.1     skrll 
   11542      1.1     skrll   if (!use_literal_section
   11543      1.1     skrll       && !is_init_fini
   11544      1.1     skrll       && get_literal_pool_location (now_seg) != pool_location)
   11545      1.1     skrll     {
   11546      1.1     skrll       /* Close whatever frag is there.  */
   11547      1.1     skrll       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   11548      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   11549      1.1     skrll       frag_now->tc_frag_data.literal_frag = pool_location;
   11550      1.1     skrll       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   11551      1.1     skrll       xtensa_set_frag_assembly_state (frag_now);
   11552      1.1     skrll     }
   11553      1.1     skrll }
   11554      1.1     skrll 
   11555      1.1     skrll 
   11556      1.1     skrll /* Call this function before emitting data into the literal section.
   11557      1.1     skrll    This is a helper function for xtensa_switch_to_literal_fragment.
   11558      1.1     skrll    This is similar to a .section new_now_seg subseg. */
   11559      1.1     skrll 
   11560      1.1     skrll static void
   11561      1.1     skrll xtensa_switch_section_emit_state (emit_state *state,
   11562      1.1     skrll 				  segT new_now_seg,
   11563      1.1     skrll 				  subsegT new_now_subseg)
   11564      1.1     skrll {
   11565      1.1     skrll   state->name = now_seg->name;
   11566      1.1     skrll   state->now_seg = now_seg;
   11567      1.1     skrll   state->now_subseg = now_subseg;
   11568      1.1     skrll   state->generating_literals = generating_literals;
   11569      1.1     skrll   generating_literals++;
   11570      1.1     skrll   subseg_set (new_now_seg, new_now_subseg);
   11571      1.1     skrll }
   11572      1.1     skrll 
   11573      1.1     skrll 
   11574  1.1.1.4  christos /* Use to restore the emitting into the normal place.  */
   11575      1.1     skrll 
   11576      1.1     skrll static void
   11577      1.1     skrll xtensa_restore_emit_state (emit_state *state)
   11578      1.1     skrll {
   11579      1.1     skrll   generating_literals = state->generating_literals;
   11580      1.1     skrll   subseg_set (state->now_seg, state->now_subseg);
   11581      1.1     skrll }
   11582      1.1     skrll 
   11583      1.1     skrll 
   11584      1.1     skrll /* Predicate function used to look up a section in a particular group.  */
   11585      1.1     skrll 
   11586      1.1     skrll static bfd_boolean
   11587      1.1     skrll match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
   11588      1.1     skrll {
   11589  1.1.1.5  christos   const char *gname = inf;
   11590  1.1.1.5  christos   const char *group_name = elf_group_name (sec);
   11591      1.1     skrll 
   11592      1.1     skrll   return (group_name == gname
   11593      1.1     skrll 	  || (group_name != NULL
   11594      1.1     skrll 	      && gname != NULL
   11595      1.1     skrll 	      && strcmp (group_name, gname) == 0));
   11596      1.1     skrll }
   11597      1.1     skrll 
   11598      1.1     skrll 
   11599      1.1     skrll /* Get the literal section to be used for the current text section.
   11600      1.1     skrll    The result may be cached in the default_lit_sections structure.  */
   11601      1.1     skrll 
   11602      1.1     skrll static segT
   11603      1.1     skrll cache_literal_section (bfd_boolean use_abs_literals)
   11604      1.1     skrll {
   11605      1.1     skrll   const char *text_name, *group_name = 0;
   11606      1.1     skrll   const char *base_name, *suffix;
   11607      1.1     skrll   char *name;
   11608      1.1     skrll   segT *pcached;
   11609      1.1     skrll   segT seg, current_section;
   11610      1.1     skrll   int current_subsec;
   11611      1.1     skrll   bfd_boolean linkonce = FALSE;
   11612      1.1     skrll 
   11613      1.1     skrll   /* Save the current section/subsection.  */
   11614      1.1     skrll   current_section = now_seg;
   11615      1.1     skrll   current_subsec = now_subseg;
   11616  1.1.1.4  christos 
   11617      1.1     skrll   /* Clear the cached values if they are no longer valid.  */
   11618      1.1     skrll   if (now_seg != default_lit_sections.current_text_seg)
   11619      1.1     skrll     {
   11620      1.1     skrll       default_lit_sections.current_text_seg = now_seg;
   11621      1.1     skrll       default_lit_sections.lit_seg = NULL;
   11622      1.1     skrll       default_lit_sections.lit4_seg = NULL;
   11623      1.1     skrll     }
   11624      1.1     skrll 
   11625      1.1     skrll   /* Check if the literal section is already cached.  */
   11626      1.1     skrll   if (use_abs_literals)
   11627      1.1     skrll     pcached = &default_lit_sections.lit4_seg;
   11628  1.1.1.5  christos   else
   11629      1.1     skrll     pcached = &default_lit_sections.lit_seg;
   11630      1.1     skrll 
   11631      1.1     skrll   if (*pcached)
   11632      1.1     skrll     return *pcached;
   11633      1.1     skrll 
   11634  1.1.1.5  christos   text_name = default_lit_sections.lit_prefix;
   11635  1.1.1.5  christos   if (! text_name || ! *text_name)
   11636      1.1     skrll     {
   11637      1.1     skrll       text_name = segment_name (current_section);
   11638      1.1     skrll       group_name = elf_group_name (current_section);
   11639      1.1     skrll       linkonce = (current_section->flags & SEC_LINK_ONCE) != 0;
   11640  1.1.1.2  christos     }
   11641  1.1.1.2  christos 
   11642      1.1     skrll   base_name = use_abs_literals ? ".lit4" : ".literal";
   11643  1.1.1.2  christos   if (group_name)
   11644  1.1.1.2  christos     {
   11645  1.1.1.2  christos       name = concat (base_name, ".", group_name, (char *) NULL);
   11646      1.1     skrll     }
   11647      1.1     skrll   else if (strncmp (text_name, ".gnu.linkonce.", linkonce_len) == 0)
   11648  1.1.1.5  christos     {
   11649  1.1.1.2  christos       suffix = strchr (text_name + linkonce_len, '.');
   11650  1.1.1.2  christos 
   11651  1.1.1.2  christos       name = concat (".gnu.linkonce", base_name, suffix ? suffix : "",
   11652  1.1.1.2  christos 		     (char *) NULL);
   11653  1.1.1.2  christos       linkonce = TRUE;
   11654  1.1.1.2  christos     }
   11655  1.1.1.2  christos   else
   11656  1.1.1.2  christos     {
   11657  1.1.1.2  christos       /* If the section name begins or ends with ".text", then replace
   11658  1.1.1.2  christos 	 that portion instead of appending an additional suffix.  */
   11659      1.1     skrll       size_t len = strlen (text_name);
   11660      1.1     skrll       if (len >= 5
   11661      1.1     skrll 	  && (strcmp (text_name + len - 5, ".text") == 0
   11662      1.1     skrll 	      || strncmp (text_name, ".text", 5) == 0))
   11663      1.1     skrll 	len -= 5;
   11664      1.1     skrll 
   11665      1.1     skrll       name = XNEWVEC (char, len + strlen (base_name) + 1);
   11666      1.1     skrll       if (strncmp (text_name, ".text", 5) == 0)
   11667      1.1     skrll 	{
   11668      1.1     skrll 	  strcpy (name, base_name);
   11669      1.1     skrll 	  strcat (name, text_name + 5);
   11670      1.1     skrll 	}
   11671      1.1     skrll       else
   11672      1.1     skrll 	{
   11673      1.1     skrll 	  strcpy (name, text_name);
   11674      1.1     skrll 	  strcpy (name + len, base_name);
   11675      1.1     skrll 	}
   11676      1.1     skrll     }
   11677  1.1.1.5  christos 
   11678      1.1     skrll   /* Canonicalize section names to allow renaming literal sections.
   11679      1.1     skrll      The group name, if any, came from the current text section and
   11680      1.1     skrll      has already been canonicalized.  */
   11681      1.1     skrll   name = tc_canonicalize_symbol_name (name);
   11682      1.1     skrll 
   11683      1.1     skrll   seg = bfd_get_section_by_name_if (stdoutput, name, match_section_group,
   11684      1.1     skrll 				    (void *) group_name);
   11685      1.1     skrll   if (! seg)
   11686      1.1     skrll     {
   11687      1.1     skrll       flagword flags;
   11688      1.1     skrll 
   11689  1.1.1.8  christos       seg = subseg_force_new (name, 0);
   11690  1.1.1.8  christos 
   11691      1.1     skrll       if (! use_abs_literals)
   11692      1.1     skrll 	{
   11693      1.1     skrll 	  /* Add the newly created literal segment to the list.  */
   11694      1.1     skrll 	  seg_list *n = XNEW (seg_list);
   11695      1.1     skrll 	  n->seg = seg;
   11696      1.1     skrll 	  n->next = literal_head->next;
   11697      1.1     skrll 	  literal_head->next = n;
   11698      1.1     skrll 	}
   11699      1.1     skrll 
   11700      1.1     skrll       flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_ALLOC | SEC_LOAD
   11701      1.1     skrll 	       | (linkonce ? (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD) : 0)
   11702      1.1     skrll 	       | (use_abs_literals ? SEC_DATA : SEC_CODE));
   11703      1.1     skrll 
   11704      1.1     skrll       elf_group_name (seg) = group_name;
   11705      1.1     skrll 
   11706      1.1     skrll       bfd_set_section_flags (seg, flags);
   11707      1.1     skrll       bfd_set_section_alignment (seg, 2);
   11708      1.1     skrll     }
   11709      1.1     skrll 
   11710      1.1     skrll   *pcached = seg;
   11711      1.1     skrll   subseg_set (current_section, current_subsec);
   11712      1.1     skrll   return seg;
   11713      1.1     skrll }
   11714      1.1     skrll 
   11715      1.1     skrll 
   11716      1.1     skrll /* Property Tables Stuff.  */
   11718      1.1     skrll 
   11719      1.1     skrll #define XTENSA_INSN_SEC_NAME ".xt.insn"
   11720      1.1     skrll #define XTENSA_LIT_SEC_NAME ".xt.lit"
   11721  1.1.1.2  christos #define XTENSA_PROP_SEC_NAME ".xt.prop"
   11722      1.1     skrll 
   11723      1.1     skrll typedef bfd_boolean (*frag_predicate) (const fragS *);
   11724      1.1     skrll typedef void (*frag_flags_fn) (const fragS *, frag_flags *);
   11725      1.1     skrll 
   11726      1.1     skrll static bfd_boolean get_frag_is_literal (const fragS *);
   11727      1.1     skrll static void xtensa_create_property_segments
   11728      1.1     skrll   (frag_predicate, frag_predicate, const char *, xt_section_type);
   11729      1.1     skrll static void xtensa_create_xproperty_segments
   11730      1.1     skrll   (frag_flags_fn, const char *, xt_section_type);
   11731      1.1     skrll static bfd_boolean exclude_section_from_property_tables (segT);
   11732      1.1     skrll static bfd_boolean section_has_property (segT, frag_predicate);
   11733      1.1     skrll static bfd_boolean section_has_xproperty (segT, frag_flags_fn);
   11734      1.1     skrll static void add_xt_block_frags
   11735      1.1     skrll   (segT, xtensa_block_info **, frag_predicate, frag_predicate);
   11736      1.1     skrll static bfd_boolean xtensa_frag_flags_is_empty (const frag_flags *);
   11737      1.1     skrll static void xtensa_frag_flags_init (frag_flags *);
   11738      1.1     skrll static void get_frag_property_flags (const fragS *, frag_flags *);
   11739      1.1     skrll static flagword frag_flags_to_number (const frag_flags *);
   11740      1.1     skrll static void add_xt_prop_frags (segT, xtensa_block_info **, frag_flags_fn);
   11741      1.1     skrll 
   11742      1.1     skrll /* Set up property tables after relaxation.  */
   11743      1.1     skrll 
   11744      1.1     skrll void
   11745      1.1     skrll xtensa_post_relax_hook (void)
   11746      1.1     skrll {
   11747      1.1     skrll   xtensa_move_seg_list_to_beginning (literal_head);
   11748      1.1     skrll 
   11749      1.1     skrll   xtensa_find_unmarked_state_frags ();
   11750      1.1     skrll   xtensa_mark_frags_for_org ();
   11751      1.1     skrll   xtensa_mark_difference_of_two_symbols ();
   11752      1.1     skrll 
   11753      1.1     skrll   xtensa_create_property_segments (get_frag_is_literal,
   11754  1.1.1.2  christos 				   NULL,
   11755      1.1     skrll 				   XTENSA_LIT_SEC_NAME,
   11756      1.1     skrll 				   xt_literal_sec);
   11757      1.1     skrll   xtensa_create_xproperty_segments (get_frag_property_flags,
   11758      1.1     skrll 				    XTENSA_PROP_SEC_NAME,
   11759      1.1     skrll 				    xt_prop_sec);
   11760      1.1     skrll 
   11761      1.1     skrll   if (warn_unaligned_branch_targets)
   11762      1.1     skrll     bfd_map_over_sections (stdoutput, xtensa_find_unaligned_branch_targets, 0);
   11763      1.1     skrll   bfd_map_over_sections (stdoutput, xtensa_find_unaligned_loops, 0);
   11764      1.1     skrll }
   11765      1.1     skrll 
   11766      1.1     skrll 
   11767      1.1     skrll /* This function is only meaningful after xtensa_move_literals.  */
   11768      1.1     skrll 
   11769      1.1     skrll static bfd_boolean
   11770      1.1     skrll get_frag_is_literal (const fragS *fragP)
   11771      1.1     skrll {
   11772      1.1     skrll   gas_assert (fragP != NULL);
   11773      1.1     skrll   return fragP->tc_frag_data.is_literal;
   11774      1.1     skrll }
   11775      1.1     skrll 
   11776      1.1     skrll 
   11777      1.1     skrll static void
   11778      1.1     skrll xtensa_create_property_segments (frag_predicate property_function,
   11779      1.1     skrll 				 frag_predicate end_property_function,
   11780      1.1     skrll 				 const char *section_name_base,
   11781      1.1     skrll 				 xt_section_type sec_type)
   11782      1.1     skrll {
   11783      1.1     skrll   segT *seclist;
   11784      1.1     skrll 
   11785      1.1     skrll   /* Walk over all of the current segments.
   11786      1.1     skrll      Walk over each fragment
   11787      1.1     skrll      For each non-empty fragment,
   11788      1.1     skrll      Build a property record (append where possible).  */
   11789      1.1     skrll 
   11790      1.1     skrll   for (seclist = &stdoutput->sections;
   11791      1.1     skrll        seclist && *seclist;
   11792      1.1     skrll        seclist = &(*seclist)->next)
   11793      1.1     skrll     {
   11794      1.1     skrll       segT sec = *seclist;
   11795      1.1     skrll 
   11796      1.1     skrll       if (exclude_section_from_property_tables (sec))
   11797      1.1     skrll 	continue;
   11798      1.1     skrll 
   11799      1.1     skrll       if (section_has_property (sec, property_function))
   11800      1.1     skrll 	{
   11801      1.1     skrll 	  segment_info_type *xt_seg_info;
   11802      1.1     skrll 	  xtensa_block_info **xt_blocks;
   11803      1.1     skrll 	  segT prop_sec = xtensa_make_property_section (sec, section_name_base);
   11804      1.1     skrll 
   11805      1.1     skrll 	  prop_sec->output_section = prop_sec;
   11806      1.1     skrll 	  subseg_set (prop_sec, 0);
   11807      1.1     skrll 	  xt_seg_info = seg_info (prop_sec);
   11808      1.1     skrll 	  xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
   11809      1.1     skrll 
   11810      1.1     skrll 	  /* Walk over all of the frchains here and add new sections.  */
   11811      1.1     skrll 	  add_xt_block_frags (sec, xt_blocks, property_function,
   11812      1.1     skrll 			      end_property_function);
   11813      1.1     skrll 	}
   11814      1.1     skrll     }
   11815      1.1     skrll 
   11816      1.1     skrll   /* Now we fill them out....  */
   11817      1.1     skrll 
   11818      1.1     skrll   for (seclist = &stdoutput->sections;
   11819      1.1     skrll        seclist && *seclist;
   11820      1.1     skrll        seclist = &(*seclist)->next)
   11821  1.1.1.8  christos     {
   11822      1.1     skrll       segment_info_type *seginfo;
   11823      1.1     skrll       xtensa_block_info *block;
   11824      1.1     skrll       segT sec = *seclist;
   11825      1.1     skrll 
   11826      1.1     skrll       seginfo = seg_info (sec);
   11827      1.1     skrll       block = seginfo->tc_segment_info_data.blocks[sec_type];
   11828      1.1     skrll 
   11829      1.1     skrll       if (block)
   11830      1.1     skrll 	{
   11831      1.1     skrll 	  xtensa_block_info *cur_block;
   11832      1.1     skrll 	  int num_recs = 0;
   11833      1.1     skrll 	  bfd_size_type rec_size;
   11834      1.1     skrll 
   11835      1.1     skrll 	  for (cur_block = block; cur_block; cur_block = cur_block->next)
   11836  1.1.1.2  christos 	    num_recs++;
   11837      1.1     skrll 
   11838      1.1     skrll 	  rec_size = num_recs * 8;
   11839      1.1     skrll 	  bfd_set_section_size (sec, rec_size);
   11840      1.1     skrll 
   11841      1.1     skrll 	  if (num_recs)
   11842      1.1     skrll 	    {
   11843      1.1     skrll 	      char *frag_data;
   11844      1.1     skrll 	      int i;
   11845      1.1     skrll 
   11846      1.1     skrll 	      subseg_set (sec, 0);
   11847      1.1     skrll 	      frag_data = frag_more (rec_size);
   11848      1.1     skrll 	      cur_block = block;
   11849      1.1     skrll 	      for (i = 0; i < num_recs; i++)
   11850      1.1     skrll 		{
   11851      1.1     skrll 		  fixS *fix;
   11852      1.1     skrll 
   11853      1.1     skrll 		  /* Write the fixup.  */
   11854      1.1     skrll 		  gas_assert (cur_block);
   11855      1.1     skrll 		  fix = fix_new (frag_now, i * 8, 4,
   11856      1.1     skrll 				 section_symbol (cur_block->sec),
   11857      1.1     skrll 				 cur_block->offset,
   11858      1.1     skrll 				 FALSE, BFD_RELOC_32);
   11859      1.1     skrll 		  fix->fx_file = "<internal>";
   11860      1.1     skrll 		  fix->fx_line = 0;
   11861      1.1     skrll 
   11862      1.1     skrll 		  /* Write the length.  */
   11863      1.1     skrll 		  md_number_to_chars (&frag_data[4 + i * 8],
   11864      1.1     skrll 				      cur_block->size, 4);
   11865      1.1     skrll 		  cur_block = cur_block->next;
   11866      1.1     skrll 		}
   11867      1.1     skrll 	      frag_wane (frag_now);
   11868      1.1     skrll 	      frag_new (0);
   11869      1.1     skrll 	      frag_wane (frag_now);
   11870      1.1     skrll 	    }
   11871      1.1     skrll 	}
   11872      1.1     skrll     }
   11873      1.1     skrll }
   11874      1.1     skrll 
   11875      1.1     skrll 
   11876      1.1     skrll static void
   11877      1.1     skrll xtensa_create_xproperty_segments (frag_flags_fn flag_fn,
   11878      1.1     skrll 				  const char *section_name_base,
   11879      1.1     skrll 				  xt_section_type sec_type)
   11880      1.1     skrll {
   11881      1.1     skrll   segT *seclist;
   11882      1.1     skrll 
   11883      1.1     skrll   /* Walk over all of the current segments.
   11884      1.1     skrll      Walk over each fragment.
   11885      1.1     skrll      For each fragment that has instructions,
   11886      1.1     skrll      build an instruction record (append where possible).  */
   11887      1.1     skrll 
   11888      1.1     skrll   for (seclist = &stdoutput->sections;
   11889      1.1     skrll        seclist && *seclist;
   11890      1.1     skrll        seclist = &(*seclist)->next)
   11891      1.1     skrll     {
   11892      1.1     skrll       segT sec = *seclist;
   11893      1.1     skrll 
   11894      1.1     skrll       if (exclude_section_from_property_tables (sec))
   11895      1.1     skrll 	continue;
   11896      1.1     skrll 
   11897      1.1     skrll       if (section_has_xproperty (sec, flag_fn))
   11898      1.1     skrll 	{
   11899      1.1     skrll 	  segment_info_type *xt_seg_info;
   11900      1.1     skrll 	  xtensa_block_info **xt_blocks;
   11901      1.1     skrll 	  segT prop_sec = xtensa_make_property_section (sec, section_name_base);
   11902      1.1     skrll 
   11903      1.1     skrll 	  prop_sec->output_section = prop_sec;
   11904      1.1     skrll 	  subseg_set (prop_sec, 0);
   11905      1.1     skrll 	  xt_seg_info = seg_info (prop_sec);
   11906      1.1     skrll 	  xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
   11907      1.1     skrll 
   11908      1.1     skrll 	  /* Walk over all of the frchains here and add new sections.  */
   11909      1.1     skrll 	  add_xt_prop_frags (sec, xt_blocks, flag_fn);
   11910      1.1     skrll 	}
   11911      1.1     skrll     }
   11912      1.1     skrll 
   11913      1.1     skrll   /* Now we fill them out....  */
   11914      1.1     skrll 
   11915      1.1     skrll   for (seclist = &stdoutput->sections;
   11916      1.1     skrll        seclist && *seclist;
   11917      1.1     skrll        seclist = &(*seclist)->next)
   11918  1.1.1.8  christos     {
   11919      1.1     skrll       segment_info_type *seginfo;
   11920      1.1     skrll       xtensa_block_info *block;
   11921      1.1     skrll       segT sec = *seclist;
   11922      1.1     skrll 
   11923      1.1     skrll       seginfo = seg_info (sec);
   11924      1.1     skrll       block = seginfo->tc_segment_info_data.blocks[sec_type];
   11925      1.1     skrll 
   11926      1.1     skrll       if (block)
   11927      1.1     skrll 	{
   11928      1.1     skrll 	  xtensa_block_info *cur_block;
   11929      1.1     skrll 	  int num_recs = 0;
   11930      1.1     skrll 	  bfd_size_type rec_size;
   11931      1.1     skrll 
   11932      1.1     skrll 	  for (cur_block = block; cur_block; cur_block = cur_block->next)
   11933      1.1     skrll 	    num_recs++;
   11934  1.1.1.2  christos 
   11935      1.1     skrll 	  rec_size = num_recs * (8 + 4);
   11936      1.1     skrll 	  bfd_set_section_size (sec, rec_size);
   11937      1.1     skrll 	  /* elf_section_data (sec)->this_hdr.sh_entsize = 12; */
   11938      1.1     skrll 
   11939      1.1     skrll 	  if (num_recs)
   11940      1.1     skrll 	    {
   11941      1.1     skrll 	      char *frag_data;
   11942      1.1     skrll 	      int i;
   11943      1.1     skrll 
   11944      1.1     skrll 	      subseg_set (sec, 0);
   11945      1.1     skrll 	      frag_data = frag_more (rec_size);
   11946      1.1     skrll 	      cur_block = block;
   11947  1.1.1.2  christos 	      for (i = 0; i < num_recs; i++)
   11948      1.1     skrll 		{
   11949      1.1     skrll 		  fixS *fix;
   11950      1.1     skrll 
   11951      1.1     skrll 		  /* Write the fixup.  */
   11952      1.1     skrll 		  gas_assert (cur_block);
   11953      1.1     skrll 		  fix = fix_new (frag_now, i * 12, 4,
   11954      1.1     skrll 				 section_symbol (cur_block->sec),
   11955      1.1     skrll 				 cur_block->offset,
   11956      1.1     skrll 				 FALSE, BFD_RELOC_32);
   11957      1.1     skrll 		  fix->fx_file = "<internal>";
   11958      1.1     skrll 		  fix->fx_line = 0;
   11959      1.1     skrll 
   11960      1.1     skrll 		  /* Write the length.  */
   11961      1.1     skrll 		  md_number_to_chars (&frag_data[4 + i * 12],
   11962  1.1.1.8  christos 				      cur_block->size, 4);
   11963      1.1     skrll 		  md_number_to_chars (&frag_data[8 + i * 12],
   11964      1.1     skrll 				      frag_flags_to_number (&cur_block->flags),
   11965      1.1     skrll 				      sizeof (flagword));
   11966      1.1     skrll 		  cur_block = cur_block->next;
   11967      1.1     skrll 		}
   11968      1.1     skrll 	      frag_wane (frag_now);
   11969      1.1     skrll 	      frag_new (0);
   11970      1.1     skrll 	      frag_wane (frag_now);
   11971      1.1     skrll 	    }
   11972      1.1     skrll 	}
   11973      1.1     skrll     }
   11974      1.1     skrll }
   11975      1.1     skrll 
   11976      1.1     skrll 
   11977      1.1     skrll static bfd_boolean
   11978      1.1     skrll exclude_section_from_property_tables (segT sec)
   11979      1.1     skrll {
   11980      1.1     skrll   flagword flags = bfd_section_flags (sec);
   11981      1.1     skrll 
   11982      1.1     skrll   /* Sections that don't contribute to the memory footprint are excluded.  */
   11983      1.1     skrll   if ((flags & SEC_DEBUGGING)
   11984      1.1     skrll       || !(flags & SEC_ALLOC)
   11985      1.1     skrll       || (flags & SEC_MERGE))
   11986      1.1     skrll     return TRUE;
   11987      1.1     skrll 
   11988      1.1     skrll   /* Linker cie and fde optimizations mess up property entries for
   11989      1.1     skrll      eh_frame sections, but there is nothing inside them relevant to
   11990      1.1     skrll      property tables anyway.  */
   11991      1.1     skrll   if (strcmp (sec->name, ".eh_frame") == 0)
   11992      1.1     skrll     return TRUE;
   11993      1.1     skrll 
   11994      1.1     skrll   return FALSE;
   11995      1.1     skrll }
   11996      1.1     skrll 
   11997      1.1     skrll 
   11998      1.1     skrll static bfd_boolean
   11999      1.1     skrll section_has_property (segT sec, frag_predicate property_function)
   12000      1.1     skrll {
   12001      1.1     skrll   segment_info_type *seginfo = seg_info (sec);
   12002      1.1     skrll   fragS *fragP;
   12003      1.1     skrll 
   12004      1.1     skrll   if (seginfo && seginfo->frchainP)
   12005      1.1     skrll     {
   12006      1.1     skrll       for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
   12007      1.1     skrll 	{
   12008      1.1     skrll 	  if (property_function (fragP)
   12009      1.1     skrll 	      && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
   12010      1.1     skrll 	    return TRUE;
   12011      1.1     skrll 	}
   12012      1.1     skrll     }
   12013      1.1     skrll   return FALSE;
   12014      1.1     skrll }
   12015      1.1     skrll 
   12016      1.1     skrll 
   12017      1.1     skrll static bfd_boolean
   12018      1.1     skrll section_has_xproperty (segT sec, frag_flags_fn property_function)
   12019      1.1     skrll {
   12020      1.1     skrll   segment_info_type *seginfo = seg_info (sec);
   12021      1.1     skrll   fragS *fragP;
   12022      1.1     skrll 
   12023      1.1     skrll   if (seginfo && seginfo->frchainP)
   12024      1.1     skrll     {
   12025      1.1     skrll       for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
   12026      1.1     skrll 	{
   12027      1.1     skrll 	  frag_flags prop_flags;
   12028      1.1     skrll 	  property_function (fragP, &prop_flags);
   12029      1.1     skrll 	  if (!xtensa_frag_flags_is_empty (&prop_flags))
   12030      1.1     skrll 	    return TRUE;
   12031      1.1     skrll 	}
   12032      1.1     skrll     }
   12033      1.1     skrll   return FALSE;
   12034      1.1     skrll }
   12035      1.1     skrll 
   12036      1.1     skrll 
   12037      1.1     skrll /* Two types of block sections exist right now: literal and insns.  */
   12038      1.1     skrll 
   12039      1.1     skrll static void
   12040      1.1     skrll add_xt_block_frags (segT sec,
   12041      1.1     skrll 		    xtensa_block_info **xt_block,
   12042      1.1     skrll 		    frag_predicate property_function,
   12043      1.1     skrll 		    frag_predicate end_property_function)
   12044      1.1     skrll {
   12045      1.1     skrll   fragS *fragP;
   12046      1.1     skrll 
   12047      1.1     skrll   /* Build it if needed.  */
   12048      1.1     skrll   while (*xt_block != NULL)
   12049      1.1     skrll     xt_block = &(*xt_block)->next;
   12050      1.1     skrll   /* We are either at NULL at the beginning or at the end.  */
   12051      1.1     skrll 
   12052      1.1     skrll   /* Walk through the frags.  */
   12053      1.1     skrll   if (seg_info (sec)->frchainP)
   12054  1.1.1.5  christos     {
   12055      1.1     skrll       for (fragP = seg_info (sec)->frchainP->frch_root;
   12056      1.1     skrll 	   fragP;
   12057      1.1     skrll 	   fragP = fragP->fr_next)
   12058      1.1     skrll 	{
   12059      1.1     skrll 	  if (property_function (fragP)
   12060      1.1     skrll 	      && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
   12061      1.1     skrll 	    {
   12062      1.1     skrll 	      if (*xt_block != NULL)
   12063      1.1     skrll 		{
   12064      1.1     skrll 		  if ((*xt_block)->offset + (*xt_block)->size
   12065      1.1     skrll 		      == fragP->fr_address)
   12066      1.1     skrll 		    (*xt_block)->size += fragP->fr_fix;
   12067      1.1     skrll 		  else
   12068      1.1     skrll 		    xt_block = &((*xt_block)->next);
   12069      1.1     skrll 		}
   12070      1.1     skrll 	      if (*xt_block == NULL)
   12071      1.1     skrll 		{
   12072      1.1     skrll 		  xtensa_block_info *new_block = XNEW (xtensa_block_info);
   12073      1.1     skrll 		  new_block->sec = sec;
   12074      1.1     skrll 		  new_block->offset = fragP->fr_address;
   12075      1.1     skrll 		  new_block->size = fragP->fr_fix;
   12076      1.1     skrll 		  new_block->next = NULL;
   12077      1.1     skrll 		  xtensa_frag_flags_init (&new_block->flags);
   12078      1.1     skrll 		  *xt_block = new_block;
   12079      1.1     skrll 		}
   12080      1.1     skrll 	      if (end_property_function
   12081      1.1     skrll 		  && end_property_function (fragP))
   12082      1.1     skrll 		{
   12083      1.1     skrll 		  xt_block = &((*xt_block)->next);
   12084      1.1     skrll 		}
   12085      1.1     skrll 	    }
   12086      1.1     skrll 	}
   12087      1.1     skrll     }
   12088      1.1     skrll }
   12089      1.1     skrll 
   12090      1.1     skrll 
   12091      1.1     skrll /* Break the encapsulation of add_xt_prop_frags here.  */
   12092      1.1     skrll 
   12093      1.1     skrll static bfd_boolean
   12094      1.1     skrll xtensa_frag_flags_is_empty (const frag_flags *prop_flags)
   12095      1.1     skrll {
   12096      1.1     skrll   if (prop_flags->is_literal
   12097      1.1     skrll       || prop_flags->is_insn
   12098      1.1     skrll       || prop_flags->is_data
   12099      1.1     skrll       || prop_flags->is_unreachable)
   12100      1.1     skrll     return FALSE;
   12101      1.1     skrll   return TRUE;
   12102      1.1     skrll }
   12103      1.1     skrll 
   12104      1.1     skrll 
   12105      1.1     skrll static void
   12106      1.1     skrll xtensa_frag_flags_init (frag_flags *prop_flags)
   12107      1.1     skrll {
   12108      1.1     skrll   memset (prop_flags, 0, sizeof (frag_flags));
   12109      1.1     skrll }
   12110      1.1     skrll 
   12111      1.1     skrll 
   12112      1.1     skrll static void
   12113      1.1     skrll get_frag_property_flags (const fragS *fragP, frag_flags *prop_flags)
   12114      1.1     skrll {
   12115      1.1     skrll   xtensa_frag_flags_init (prop_flags);
   12116      1.1     skrll   if (fragP->tc_frag_data.is_literal)
   12117      1.1     skrll     prop_flags->is_literal = TRUE;
   12118      1.1     skrll   if (fragP->tc_frag_data.is_specific_opcode
   12119      1.1     skrll       || fragP->tc_frag_data.is_no_transform)
   12120      1.1     skrll     {
   12121      1.1     skrll       prop_flags->is_no_transform = TRUE;
   12122      1.1     skrll       if (xtensa_frag_flags_is_empty (prop_flags))
   12123      1.1     skrll 	prop_flags->is_data = TRUE;
   12124      1.1     skrll     }
   12125      1.1     skrll   if (fragP->tc_frag_data.is_unreachable)
   12126      1.1     skrll     prop_flags->is_unreachable = TRUE;
   12127      1.1     skrll   else if (fragP->tc_frag_data.is_insn)
   12128      1.1     skrll     {
   12129      1.1     skrll       prop_flags->is_insn = TRUE;
   12130      1.1     skrll       if (fragP->tc_frag_data.is_loop_target)
   12131  1.1.1.2  christos 	prop_flags->insn.is_loop_target = TRUE;
   12132      1.1     skrll       if (fragP->tc_frag_data.is_branch_target)
   12133      1.1     skrll 	prop_flags->insn.is_branch_target = TRUE;
   12134  1.1.1.2  christos       if (fragP->tc_frag_data.is_no_density)
   12135      1.1     skrll 	prop_flags->insn.is_no_density = TRUE;
   12136      1.1     skrll       if (fragP->tc_frag_data.use_absolute_literals)
   12137      1.1     skrll 	prop_flags->insn.is_abslit = TRUE;
   12138      1.1     skrll     }
   12139      1.1     skrll   if (fragP->tc_frag_data.is_align)
   12140      1.1     skrll     {
   12141      1.1     skrll       prop_flags->is_align = TRUE;
   12142      1.1     skrll       prop_flags->alignment = fragP->tc_frag_data.alignment;
   12143      1.1     skrll       if (xtensa_frag_flags_is_empty (prop_flags))
   12144      1.1     skrll 	prop_flags->is_data = TRUE;
   12145      1.1     skrll     }
   12146      1.1     skrll }
   12147      1.1     skrll 
   12148      1.1     skrll 
   12149      1.1     skrll static flagword
   12150      1.1     skrll frag_flags_to_number (const frag_flags *prop_flags)
   12151      1.1     skrll {
   12152      1.1     skrll   flagword num = 0;
   12153      1.1     skrll   if (prop_flags->is_literal)
   12154      1.1     skrll     num |= XTENSA_PROP_LITERAL;
   12155      1.1     skrll   if (prop_flags->is_insn)
   12156      1.1     skrll     num |= XTENSA_PROP_INSN;
   12157      1.1     skrll   if (prop_flags->is_data)
   12158      1.1     skrll     num |= XTENSA_PROP_DATA;
   12159      1.1     skrll   if (prop_flags->is_unreachable)
   12160      1.1     skrll     num |= XTENSA_PROP_UNREACHABLE;
   12161      1.1     skrll   if (prop_flags->insn.is_loop_target)
   12162      1.1     skrll     num |= XTENSA_PROP_INSN_LOOP_TARGET;
   12163      1.1     skrll   if (prop_flags->insn.is_branch_target)
   12164      1.1     skrll     {
   12165      1.1     skrll       num |= XTENSA_PROP_INSN_BRANCH_TARGET;
   12166      1.1     skrll       num = SET_XTENSA_PROP_BT_ALIGN (num, prop_flags->insn.bt_align_priority);
   12167      1.1     skrll     }
   12168      1.1     skrll 
   12169      1.1     skrll   if (prop_flags->insn.is_no_density)
   12170      1.1     skrll     num |= XTENSA_PROP_INSN_NO_DENSITY;
   12171      1.1     skrll   if (prop_flags->is_no_transform)
   12172      1.1     skrll     num |= XTENSA_PROP_NO_TRANSFORM;
   12173      1.1     skrll   if (prop_flags->insn.is_no_reorder)
   12174      1.1     skrll     num |= XTENSA_PROP_INSN_NO_REORDER;
   12175      1.1     skrll   if (prop_flags->insn.is_abslit)
   12176      1.1     skrll     num |= XTENSA_PROP_INSN_ABSLIT;
   12177      1.1     skrll 
   12178      1.1     skrll   if (prop_flags->is_align)
   12179      1.1     skrll     {
   12180      1.1     skrll       num |= XTENSA_PROP_ALIGN;
   12181      1.1     skrll       num = SET_XTENSA_PROP_ALIGNMENT (num, prop_flags->alignment);
   12182      1.1     skrll     }
   12183      1.1     skrll 
   12184      1.1     skrll   return num;
   12185      1.1     skrll }
   12186      1.1     skrll 
   12187      1.1     skrll 
   12188      1.1     skrll static bfd_boolean
   12189      1.1     skrll xtensa_frag_flags_combinable (const frag_flags *prop_flags_1,
   12190      1.1     skrll 			      const frag_flags *prop_flags_2)
   12191      1.1     skrll {
   12192      1.1     skrll   /* Cannot combine with an end marker.  */
   12193      1.1     skrll 
   12194      1.1     skrll   if (prop_flags_1->is_literal != prop_flags_2->is_literal)
   12195      1.1     skrll     return FALSE;
   12196      1.1     skrll   if (prop_flags_1->is_insn != prop_flags_2->is_insn)
   12197      1.1     skrll     return FALSE;
   12198      1.1     skrll   if (prop_flags_1->is_data != prop_flags_2->is_data)
   12199      1.1     skrll     return FALSE;
   12200      1.1     skrll 
   12201      1.1     skrll   if (prop_flags_1->is_insn)
   12202      1.1     skrll     {
   12203      1.1     skrll       /* Properties of the beginning of the frag.  */
   12204      1.1     skrll       if (prop_flags_2->insn.is_loop_target)
   12205      1.1     skrll 	return FALSE;
   12206      1.1     skrll       if (prop_flags_2->insn.is_branch_target)
   12207      1.1     skrll 	return FALSE;
   12208      1.1     skrll       if (prop_flags_1->insn.is_no_density !=
   12209      1.1     skrll 	  prop_flags_2->insn.is_no_density)
   12210      1.1     skrll 	return FALSE;
   12211      1.1     skrll       if (prop_flags_1->is_no_transform !=
   12212      1.1     skrll 	  prop_flags_2->is_no_transform)
   12213      1.1     skrll 	return FALSE;
   12214      1.1     skrll       if (prop_flags_1->insn.is_no_reorder !=
   12215      1.1     skrll 	  prop_flags_2->insn.is_no_reorder)
   12216      1.1     skrll 	return FALSE;
   12217      1.1     skrll       if (prop_flags_1->insn.is_abslit !=
   12218      1.1     skrll 	  prop_flags_2->insn.is_abslit)
   12219      1.1     skrll 	return FALSE;
   12220      1.1     skrll     }
   12221      1.1     skrll 
   12222      1.1     skrll   if (prop_flags_1->is_align)
   12223      1.1     skrll     return FALSE;
   12224      1.1     skrll 
   12225      1.1     skrll   return TRUE;
   12226      1.1     skrll }
   12227      1.1     skrll 
   12228      1.1     skrll 
   12229      1.1     skrll static bfd_vma
   12230      1.1     skrll xt_block_aligned_size (const xtensa_block_info *xt_block)
   12231      1.1     skrll {
   12232      1.1     skrll   bfd_vma end_addr;
   12233      1.1     skrll   unsigned align_bits;
   12234      1.1     skrll 
   12235      1.1     skrll   if (!xt_block->flags.is_align)
   12236      1.1     skrll     return xt_block->size;
   12237      1.1     skrll 
   12238      1.1     skrll   end_addr = xt_block->offset + xt_block->size;
   12239      1.1     skrll   align_bits = xt_block->flags.alignment;
   12240      1.1     skrll   end_addr = ((end_addr + ((1 << align_bits) -1)) >> align_bits) << align_bits;
   12241      1.1     skrll   return end_addr - xt_block->offset;
   12242      1.1     skrll }
   12243      1.1     skrll 
   12244      1.1     skrll 
   12245      1.1     skrll static bfd_boolean
   12246      1.1     skrll xtensa_xt_block_combine (xtensa_block_info *xt_block,
   12247      1.1     skrll 			 const xtensa_block_info *xt_block_2)
   12248      1.1     skrll {
   12249      1.1     skrll   if (xt_block->sec != xt_block_2->sec)
   12250      1.1     skrll     return FALSE;
   12251      1.1     skrll   if (xt_block->offset + xt_block_aligned_size (xt_block)
   12252      1.1     skrll       != xt_block_2->offset)
   12253      1.1     skrll     return FALSE;
   12254      1.1     skrll 
   12255      1.1     skrll   if (xt_block_2->size == 0
   12256      1.1     skrll       && (!xt_block_2->flags.is_unreachable
   12257      1.1     skrll 	  || xt_block->flags.is_unreachable))
   12258      1.1     skrll     {
   12259      1.1     skrll       if (xt_block_2->flags.is_align
   12260      1.1     skrll 	  && xt_block->flags.is_align)
   12261      1.1     skrll 	{
   12262      1.1     skrll 	  /* Nothing needed.  */
   12263      1.1     skrll 	  if (xt_block->flags.alignment >= xt_block_2->flags.alignment)
   12264      1.1     skrll 	    return TRUE;
   12265      1.1     skrll 	}
   12266      1.1     skrll       else
   12267      1.1     skrll 	{
   12268      1.1     skrll 	  if (xt_block_2->flags.is_align)
   12269      1.1     skrll 	    {
   12270      1.1     skrll 	      /* Push alignment to previous entry.  */
   12271      1.1     skrll 	      xt_block->flags.is_align = xt_block_2->flags.is_align;
   12272      1.1     skrll 	      xt_block->flags.alignment = xt_block_2->flags.alignment;
   12273      1.1     skrll 	    }
   12274      1.1     skrll 	  return TRUE;
   12275      1.1     skrll 	}
   12276      1.1     skrll     }
   12277      1.1     skrll   if (!xtensa_frag_flags_combinable (&xt_block->flags,
   12278      1.1     skrll 				     &xt_block_2->flags))
   12279      1.1     skrll     return FALSE;
   12280      1.1     skrll 
   12281      1.1     skrll   xt_block->size += xt_block_2->size;
   12282      1.1     skrll 
   12283      1.1     skrll   if (xt_block_2->flags.is_align)
   12284      1.1     skrll     {
   12285      1.1     skrll       xt_block->flags.is_align = TRUE;
   12286      1.1     skrll       xt_block->flags.alignment = xt_block_2->flags.alignment;
   12287      1.1     skrll     }
   12288      1.1     skrll 
   12289      1.1     skrll   return TRUE;
   12290      1.1     skrll }
   12291      1.1     skrll 
   12292      1.1     skrll 
   12293      1.1     skrll static void
   12294      1.1     skrll add_xt_prop_frags (segT sec,
   12295      1.1     skrll 		   xtensa_block_info **xt_block,
   12296      1.1     skrll 		   frag_flags_fn property_function)
   12297      1.1     skrll {
   12298      1.1     skrll   fragS *fragP;
   12299      1.1     skrll 
   12300      1.1     skrll   /* Build it if needed.  */
   12301      1.1     skrll   while (*xt_block != NULL)
   12302      1.1     skrll     {
   12303      1.1     skrll       xt_block = &(*xt_block)->next;
   12304      1.1     skrll     }
   12305      1.1     skrll   /* We are either at NULL at the beginning or at the end.  */
   12306      1.1     skrll 
   12307      1.1     skrll   /* Walk through the frags.  */
   12308      1.1     skrll   if (seg_info (sec)->frchainP)
   12309      1.1     skrll     {
   12310      1.1     skrll       for (fragP = seg_info (sec)->frchainP->frch_root; fragP;
   12311  1.1.1.5  christos 	   fragP = fragP->fr_next)
   12312      1.1     skrll 	{
   12313      1.1     skrll 	  xtensa_block_info tmp_block;
   12314      1.1     skrll 	  tmp_block.sec = sec;
   12315      1.1     skrll 	  tmp_block.offset = fragP->fr_address;
   12316      1.1     skrll 	  tmp_block.size = fragP->fr_fix;
   12317      1.1     skrll 	  tmp_block.next = NULL;
   12318      1.1     skrll 	  property_function (fragP, &tmp_block.flags);
   12319      1.1     skrll 
   12320      1.1     skrll 	  if (!xtensa_frag_flags_is_empty (&tmp_block.flags))
   12321      1.1     skrll 	    /* && fragP->fr_fix != 0) */
   12322      1.1     skrll 	    {
   12323      1.1     skrll 	      if ((*xt_block) == NULL
   12324      1.1     skrll 		  || !xtensa_xt_block_combine (*xt_block, &tmp_block))
   12325      1.1     skrll 		{
   12326      1.1     skrll 		  xtensa_block_info *new_block;
   12327      1.1     skrll 		  if ((*xt_block) != NULL)
   12328      1.1     skrll 		    xt_block = &(*xt_block)->next;
   12329      1.1     skrll 		  new_block = XNEW (xtensa_block_info);
   12330      1.1     skrll 		  *new_block = tmp_block;
   12331      1.1     skrll 		  *xt_block = new_block;
   12332      1.1     skrll 		}
   12333      1.1     skrll 	    }
   12334      1.1     skrll 	}
   12335      1.1     skrll     }
   12336  1.1.1.5  christos }
   12337  1.1.1.2  christos 
   12338      1.1     skrll 
   12339      1.1     skrll /* op_placement_info_table */
   12341      1.1     skrll 
   12342      1.1     skrll /* op_placement_info makes it easier to determine which
   12343  1.1.1.2  christos    ops can go in which slots.  */
   12344      1.1     skrll 
   12345      1.1     skrll static void
   12346      1.1     skrll init_op_placement_info_table (void)
   12347      1.1     skrll {
   12348      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   12349      1.1     skrll   xtensa_insnbuf ibuf = xtensa_insnbuf_alloc (isa);
   12350      1.1     skrll   xtensa_opcode opcode;
   12351      1.1     skrll   xtensa_format fmt;
   12352      1.1     skrll   int slot;
   12353      1.1     skrll   int num_opcodes = xtensa_isa_num_opcodes (isa);
   12354      1.1     skrll 
   12355      1.1     skrll   op_placement_table = XNEWVEC (op_placement_info, num_opcodes);
   12356      1.1     skrll   gas_assert (xtensa_isa_num_formats (isa) < MAX_FORMATS);
   12357      1.1     skrll 
   12358      1.1     skrll   for (opcode = 0; opcode < num_opcodes; opcode++)
   12359      1.1     skrll     {
   12360      1.1     skrll       op_placement_info *opi = &op_placement_table[opcode];
   12361      1.1     skrll       /* FIXME: Make tinsn allocation dynamic.  */
   12362      1.1     skrll       if (xtensa_opcode_num_operands (isa, opcode) > MAX_INSN_ARGS)
   12363      1.1     skrll 	as_fatal (_("too many operands in instruction"));
   12364      1.1     skrll       opi->narrowest = XTENSA_UNDEFINED;
   12365      1.1     skrll       opi->narrowest_size = 0x7F;
   12366      1.1     skrll       opi->narrowest_slot = 0;
   12367      1.1     skrll       opi->formats = 0;
   12368      1.1     skrll       opi->num_formats = 0;
   12369      1.1     skrll       opi->issuef = 0;
   12370      1.1     skrll       for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
   12371      1.1     skrll 	{
   12372      1.1     skrll 	  opi->slots[fmt] = 0;
   12373      1.1     skrll 	  for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
   12374      1.1     skrll 	    {
   12375      1.1     skrll 	      if (xtensa_opcode_encode (isa, fmt, slot, ibuf, opcode) == 0)
   12376      1.1     skrll 		{
   12377      1.1     skrll 		  int fmt_length = xtensa_format_length (isa, fmt);
   12378      1.1     skrll 		  opi->issuef++;
   12379      1.1     skrll 		  set_bit (fmt, opi->formats);
   12380      1.1     skrll 		  set_bit (slot, opi->slots[fmt]);
   12381      1.1     skrll 		  if (fmt_length < opi->narrowest_size
   12382      1.1     skrll 		      || (fmt_length == opi->narrowest_size
   12383      1.1     skrll 			  && (xtensa_format_num_slots (isa, fmt)
   12384      1.1     skrll 			      < xtensa_format_num_slots (isa,
   12385      1.1     skrll 							 opi->narrowest))))
   12386      1.1     skrll 		    {
   12387      1.1     skrll 		      opi->narrowest = fmt;
   12388      1.1     skrll 		      opi->narrowest_size = fmt_length;
   12389      1.1     skrll 		      opi->narrowest_slot = slot;
   12390      1.1     skrll 		    }
   12391      1.1     skrll 		}
   12392      1.1     skrll 	    }
   12393      1.1     skrll 	  if (opi->formats)
   12394      1.1     skrll 	    opi->num_formats++;
   12395      1.1     skrll 	}
   12396      1.1     skrll     }
   12397      1.1     skrll   xtensa_insnbuf_free (isa, ibuf);
   12398      1.1     skrll }
   12399      1.1     skrll 
   12400      1.1     skrll 
   12401      1.1     skrll bfd_boolean
   12402      1.1     skrll opcode_fits_format_slot (xtensa_opcode opcode, xtensa_format fmt, int slot)
   12403      1.1     skrll {
   12404      1.1     skrll   return bit_is_set (slot, op_placement_table[opcode].slots[fmt]);
   12405      1.1     skrll }
   12406      1.1     skrll 
   12407      1.1     skrll 
   12408      1.1     skrll /* If the opcode is available in a single slot format, return its size.  */
   12409      1.1     skrll 
   12410      1.1     skrll static int
   12411      1.1     skrll xg_get_single_size (xtensa_opcode opcode)
   12412      1.1     skrll {
   12413      1.1     skrll   return op_placement_table[opcode].narrowest_size;
   12414      1.1     skrll }
   12415      1.1     skrll 
   12416      1.1     skrll 
   12417      1.1     skrll static xtensa_format
   12418      1.1     skrll xg_get_single_format (xtensa_opcode opcode)
   12419      1.1     skrll {
   12420      1.1     skrll   return op_placement_table[opcode].narrowest;
   12421      1.1     skrll }
   12422      1.1     skrll 
   12423      1.1     skrll 
   12424      1.1     skrll static int
   12425      1.1     skrll xg_get_single_slot (xtensa_opcode opcode)
   12426      1.1     skrll {
   12427      1.1     skrll   return op_placement_table[opcode].narrowest_slot;
   12428      1.1     skrll }
   12429      1.1     skrll 
   12430      1.1     skrll 
   12431      1.1     skrll /* Instruction Stack Functions (from "xtensa-istack.h").  */
   12433      1.1     skrll 
   12434      1.1     skrll void
   12435      1.1     skrll istack_init (IStack *stack)
   12436      1.1     skrll {
   12437      1.1     skrll   stack->ninsn = 0;
   12438      1.1     skrll }
   12439      1.1     skrll 
   12440      1.1     skrll 
   12441      1.1     skrll bfd_boolean
   12442  1.1.1.2  christos istack_empty (IStack *stack)
   12443      1.1     skrll {
   12444      1.1     skrll   return (stack->ninsn == 0);
   12445      1.1     skrll }
   12446      1.1     skrll 
   12447      1.1     skrll 
   12448      1.1     skrll bfd_boolean
   12449      1.1     skrll istack_full (IStack *stack)
   12450      1.1     skrll {
   12451      1.1     skrll   return (stack->ninsn == MAX_ISTACK);
   12452      1.1     skrll }
   12453      1.1     skrll 
   12454  1.1.1.2  christos 
   12455      1.1     skrll /* Return a pointer to the top IStack entry.
   12456      1.1     skrll    It is an error to call this if istack_empty () is TRUE. */
   12457      1.1     skrll 
   12458      1.1     skrll TInsn *
   12459      1.1     skrll istack_top (IStack *stack)
   12460      1.1     skrll {
   12461      1.1     skrll   int rec = stack->ninsn - 1;
   12462      1.1     skrll   gas_assert (!istack_empty (stack));
   12463      1.1     skrll   return &stack->insn[rec];
   12464      1.1     skrll }
   12465      1.1     skrll 
   12466      1.1     skrll 
   12467      1.1     skrll /* Add a new TInsn to an IStack.
   12468  1.1.1.2  christos    It is an error to call this if istack_full () is TRUE.  */
   12469      1.1     skrll 
   12470      1.1     skrll void
   12471      1.1     skrll istack_push (IStack *stack, TInsn *insn)
   12472      1.1     skrll {
   12473      1.1     skrll   int rec = stack->ninsn;
   12474      1.1     skrll   gas_assert (!istack_full (stack));
   12475      1.1     skrll   stack->insn[rec] = *insn;
   12476      1.1     skrll   stack->ninsn++;
   12477      1.1     skrll }
   12478      1.1     skrll 
   12479      1.1     skrll 
   12480      1.1     skrll /* Clear space for the next TInsn on the IStack and return a pointer
   12481      1.1     skrll    to it.  It is an error to call this if istack_full () is TRUE.  */
   12482      1.1     skrll 
   12483  1.1.1.2  christos TInsn *
   12484      1.1     skrll istack_push_space (IStack *stack)
   12485      1.1     skrll {
   12486      1.1     skrll   int rec = stack->ninsn;
   12487      1.1     skrll   TInsn *insn;
   12488      1.1     skrll   gas_assert (!istack_full (stack));
   12489      1.1     skrll   insn = &stack->insn[rec];
   12490      1.1     skrll   tinsn_init (insn);
   12491      1.1     skrll   stack->ninsn++;
   12492      1.1     skrll   return insn;
   12493      1.1     skrll }
   12494      1.1     skrll 
   12495      1.1     skrll 
   12496      1.1     skrll /* Remove the last pushed instruction.  It is an error to call this if
   12497      1.1     skrll    istack_empty () returns TRUE.  */
   12498      1.1     skrll 
   12499      1.1     skrll void
   12500      1.1     skrll istack_pop (IStack *stack)
   12501      1.1     skrll {
   12502      1.1     skrll   int rec = stack->ninsn - 1;
   12503      1.1     skrll   gas_assert (!istack_empty (stack));
   12504      1.1     skrll   stack->ninsn--;
   12505      1.1     skrll   tinsn_init (&stack->insn[rec]);
   12506  1.1.1.2  christos }
   12507      1.1     skrll 
   12508      1.1     skrll 
   12509      1.1     skrll /* TInsn functions.  */
   12511      1.1     skrll 
   12512      1.1     skrll void
   12513      1.1     skrll tinsn_init (TInsn *dst)
   12514      1.1     skrll {
   12515      1.1     skrll   memset (dst, 0, sizeof (TInsn));
   12516      1.1     skrll }
   12517      1.1     skrll 
   12518      1.1     skrll 
   12519      1.1     skrll /* Return TRUE if ANY of the operands in the insn are symbolic.  */
   12520      1.1     skrll 
   12521      1.1     skrll static bfd_boolean
   12522      1.1     skrll tinsn_has_symbolic_operands (const TInsn *insn)
   12523      1.1     skrll {
   12524      1.1     skrll   int i;
   12525      1.1     skrll   int n = insn->ntok;
   12526      1.1     skrll 
   12527      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   12528      1.1     skrll 
   12529      1.1     skrll   for (i = 0; i < n; ++i)
   12530  1.1.1.2  christos     {
   12531      1.1     skrll       switch (insn->tok[i].X_op)
   12532      1.1     skrll 	{
   12533      1.1     skrll 	case O_register:
   12534      1.1     skrll 	case O_constant:
   12535      1.1     skrll 	  break;
   12536      1.1     skrll 	default:
   12537      1.1     skrll 	  return TRUE;
   12538      1.1     skrll 	}
   12539      1.1     skrll     }
   12540      1.1     skrll   return FALSE;
   12541      1.1     skrll }
   12542      1.1     skrll 
   12543      1.1     skrll 
   12544      1.1     skrll bfd_boolean
   12545      1.1     skrll tinsn_has_invalid_symbolic_operands (const TInsn *insn)
   12546      1.1     skrll {
   12547      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   12548      1.1     skrll   int i;
   12549      1.1     skrll   int n = insn->ntok;
   12550      1.1     skrll 
   12551      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   12552      1.1     skrll 
   12553      1.1     skrll   for (i = 0; i < n; ++i)
   12554      1.1     skrll     {
   12555      1.1     skrll       switch (insn->tok[i].X_op)
   12556      1.1     skrll 	{
   12557      1.1     skrll 	case O_register:
   12558      1.1     skrll 	case O_constant:
   12559      1.1     skrll 	  break;
   12560      1.1     skrll 	case O_big:
   12561      1.1     skrll 	case O_illegal:
   12562      1.1     skrll 	case O_absent:
   12563      1.1     skrll 	  /* Errors for these types are caught later.  */
   12564      1.1     skrll 	  break;
   12565      1.1     skrll 	case O_hi16:
   12566      1.1     skrll 	case O_lo16:
   12567      1.1     skrll 	default:
   12568      1.1     skrll 	  /* Symbolic immediates are only allowed on the last immediate
   12569      1.1     skrll 	     operand.  At this time, CONST16 is the only opcode where we
   12570      1.1     skrll 	     support non-PC-relative relocations.  */
   12571      1.1     skrll 	  if (i != get_relaxable_immed (insn->opcode)
   12572      1.1     skrll 	      || (xtensa_operand_is_PCrelative (isa, insn->opcode, i) != 1
   12573      1.1     skrll 		  && insn->opcode != xtensa_const16_opcode))
   12574  1.1.1.2  christos 	    {
   12575      1.1     skrll 	      as_bad (_("invalid symbolic operand"));
   12576      1.1     skrll 	      return TRUE;
   12577      1.1     skrll 	    }
   12578      1.1     skrll 	}
   12579      1.1     skrll     }
   12580      1.1     skrll   return FALSE;
   12581      1.1     skrll }
   12582      1.1     skrll 
   12583      1.1     skrll 
   12584      1.1     skrll /* For assembly code with complex expressions (e.g. subtraction),
   12585      1.1     skrll    we have to build them in the literal pool so that
   12586      1.1     skrll    their results are calculated correctly after relaxation.
   12587      1.1     skrll    The relaxation only handles expressions that
   12588      1.1     skrll    boil down to SYMBOL + OFFSET.  */
   12589      1.1     skrll 
   12590      1.1     skrll static bfd_boolean
   12591      1.1     skrll tinsn_has_complex_operands (const TInsn *insn)
   12592      1.1     skrll {
   12593      1.1     skrll   int i;
   12594      1.1     skrll   int n = insn->ntok;
   12595      1.1     skrll   gas_assert (insn->insn_type == ITYPE_INSN);
   12596      1.1     skrll   for (i = 0; i < n; ++i)
   12597      1.1     skrll     {
   12598      1.1     skrll       switch (insn->tok[i].X_op)
   12599      1.1     skrll 	{
   12600      1.1     skrll 	case O_register:
   12601      1.1     skrll 	case O_constant:
   12602      1.1     skrll 	case O_symbol:
   12603      1.1     skrll 	case O_lo16:
   12604      1.1     skrll 	case O_hi16:
   12605      1.1     skrll 	  break;
   12606      1.1     skrll 	default:
   12607      1.1     skrll 	  return TRUE;
   12608      1.1     skrll 	}
   12609      1.1     skrll     }
   12610      1.1     skrll   return FALSE;
   12611      1.1     skrll }
   12612      1.1     skrll 
   12613  1.1.1.2  christos 
   12614      1.1     skrll /* Encode a TInsn opcode and its constant operands into slotbuf.
   12615      1.1     skrll    Return TRUE if there is a symbol in the immediate field.  This
   12616      1.1     skrll    function assumes that:
   12617      1.1     skrll    1) The number of operands are correct.
   12618      1.1     skrll    2) The insn_type is ITYPE_INSN.
   12619      1.1     skrll    3) The opcode can be encoded in the specified format and slot.
   12620      1.1     skrll    4) Operands are either O_constant or O_symbol, and all constants fit.  */
   12621      1.1     skrll 
   12622      1.1     skrll static bfd_boolean
   12623      1.1     skrll tinsn_to_slotbuf (xtensa_format fmt,
   12624      1.1     skrll 		  int slot,
   12625      1.1     skrll 		  TInsn *tinsn,
   12626  1.1.1.2  christos 		  xtensa_insnbuf slotbuf)
   12627      1.1     skrll {
   12628      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   12629  1.1.1.5  christos   xtensa_opcode opcode = tinsn->opcode;
   12630      1.1     skrll   bfd_boolean has_fixup = FALSE;
   12631      1.1     skrll   int noperands = xtensa_opcode_num_operands (isa, opcode);
   12632  1.1.1.2  christos   int i;
   12633      1.1     skrll 
   12634      1.1     skrll   gas_assert (tinsn->insn_type == ITYPE_INSN);
   12635      1.1     skrll   if (noperands != tinsn->ntok)
   12636      1.1     skrll     as_fatal (_("operand number mismatch"));
   12637      1.1     skrll 
   12638      1.1     skrll   if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opcode))
   12639  1.1.1.2  christos     {
   12640      1.1     skrll       as_bad (_("cannot encode opcode \"%s\" in the given format \"%s\""),
   12641      1.1     skrll 	      xtensa_opcode_name (isa, opcode), xtensa_format_name (isa, fmt));
   12642      1.1     skrll       return FALSE;
   12643      1.1     skrll     }
   12644      1.1     skrll 
   12645      1.1     skrll   for (i = 0; i < noperands; i++)
   12646      1.1     skrll     {
   12647      1.1     skrll       expressionS *exp = &tinsn->tok[i];
   12648      1.1     skrll       int rc;
   12649      1.1     skrll       unsigned line;
   12650  1.1.1.5  christos       const char *file_name;
   12651      1.1     skrll       uint32 opnd_value;
   12652      1.1     skrll 
   12653      1.1     skrll       switch (exp->X_op)
   12654  1.1.1.2  christos 	{
   12655      1.1     skrll 	case O_register:
   12656      1.1     skrll 	  if (xtensa_operand_is_visible (isa, opcode, i) == 0)
   12657      1.1     skrll 	    break;
   12658      1.1     skrll 	  /* The register number has already been checked in
   12659      1.1     skrll 	     expression_maybe_register, so we don't need to check here.  */
   12660      1.1     skrll 	  opnd_value = exp->X_add_number;
   12661      1.1     skrll 	  (void) xtensa_operand_encode (isa, opcode, i, &opnd_value);
   12662      1.1     skrll 	  rc = xtensa_operand_set_field (isa, opcode, i, fmt, slot, slotbuf,
   12663      1.1     skrll 					 opnd_value);
   12664      1.1     skrll 	  if (rc != 0)
   12665      1.1     skrll 	    as_warn (_("xtensa-isa failure: %s"), xtensa_isa_error_msg (isa));
   12666      1.1     skrll 	  break;
   12667      1.1     skrll 
   12668      1.1     skrll 	case O_constant:
   12669      1.1     skrll 	  if (xtensa_operand_is_visible (isa, opcode, i) == 0)
   12670      1.1     skrll 	    break;
   12671      1.1     skrll 	  file_name = as_where (&line);
   12672      1.1     skrll 	  /* It is a constant and we called this function
   12673      1.1     skrll 	     then we have to try to fit it.  */
   12674      1.1     skrll 	  xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode, i,
   12675      1.1     skrll 				      exp->X_add_number, file_name, line);
   12676      1.1     skrll 	  break;
   12677      1.1     skrll 
   12678      1.1     skrll 	default:
   12679      1.1     skrll 	  has_fixup = TRUE;
   12680      1.1     skrll 	  break;
   12681      1.1     skrll 	}
   12682      1.1     skrll     }
   12683      1.1     skrll 
   12684      1.1     skrll   return has_fixup;
   12685      1.1     skrll }
   12686      1.1     skrll 
   12687      1.1     skrll 
   12688      1.1     skrll /* Encode a single TInsn into an insnbuf.  If the opcode can only be encoded
   12689      1.1     skrll    into a multi-slot instruction, fill the other slots with NOPs.
   12690      1.1     skrll    Return TRUE if there is a symbol in the immediate field.  See also the
   12691      1.1     skrll    assumptions listed for tinsn_to_slotbuf.  */
   12692      1.1     skrll 
   12693      1.1     skrll static bfd_boolean
   12694      1.1     skrll tinsn_to_insnbuf (TInsn *tinsn, xtensa_insnbuf insnbuf)
   12695      1.1     skrll {
   12696      1.1     skrll   static xtensa_insnbuf slotbuf = 0;
   12697      1.1     skrll   static vliw_insn vinsn;
   12698      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   12699      1.1     skrll   bfd_boolean has_fixup = FALSE;
   12700      1.1     skrll   int i;
   12701      1.1     skrll 
   12702      1.1     skrll   if (!slotbuf)
   12703      1.1     skrll     {
   12704      1.1     skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   12705      1.1     skrll       xg_init_vinsn (&vinsn);
   12706      1.1     skrll     }
   12707      1.1     skrll 
   12708      1.1     skrll   xg_clear_vinsn (&vinsn);
   12709      1.1     skrll 
   12710      1.1     skrll   bundle_tinsn (tinsn, &vinsn);
   12711      1.1     skrll 
   12712  1.1.1.2  christos   xtensa_format_encode (isa, vinsn.format, insnbuf);
   12713  1.1.1.2  christos 
   12714  1.1.1.2  christos   for (i = 0; i < vinsn.num_slots; i++)
   12715  1.1.1.2  christos     {
   12716  1.1.1.2  christos       /* Only one slot may have a fix-up because the rest contains NOPs.  */
   12717  1.1.1.2  christos       has_fixup |=
   12718      1.1     skrll 	tinsn_to_slotbuf (vinsn.format, i, &vinsn.slots[i], vinsn.slotbuf[i]);
   12719      1.1     skrll       xtensa_format_set_slot (isa, vinsn.format, i, insnbuf, vinsn.slotbuf[i]);
   12720      1.1     skrll     }
   12721      1.1     skrll 
   12722      1.1     skrll   return has_fixup;
   12723      1.1     skrll }
   12724      1.1     skrll 
   12725      1.1     skrll 
   12726      1.1     skrll /* Check the instruction arguments.  Return TRUE on failure.  */
   12727      1.1     skrll 
   12728      1.1     skrll static bfd_boolean
   12729      1.1     skrll tinsn_check_arguments (const TInsn *insn)
   12730      1.1     skrll {
   12731      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   12732      1.1     skrll   xtensa_opcode opcode = insn->opcode;
   12733      1.1     skrll   xtensa_regfile t1_regfile, t2_regfile;
   12734      1.1     skrll   int t1_reg, t2_reg;
   12735      1.1     skrll   int t1_base_reg, t1_last_reg;
   12736  1.1.1.2  christos   int t2_base_reg, t2_last_reg;
   12737  1.1.1.2  christos   char t1_inout, t2_inout;
   12738  1.1.1.2  christos   int i, j;
   12739  1.1.1.2  christos 
   12740  1.1.1.2  christos   if (opcode == XTENSA_UNDEFINED)
   12741  1.1.1.2  christos     {
   12742  1.1.1.2  christos       as_bad (_("invalid opcode"));
   12743  1.1.1.2  christos       return TRUE;
   12744  1.1.1.2  christos     }
   12745  1.1.1.2  christos 
   12746  1.1.1.2  christos   if (xtensa_opcode_num_operands (isa, opcode) > insn->ntok)
   12747  1.1.1.2  christos     {
   12748  1.1.1.2  christos       as_bad (_("too few operands"));
   12749  1.1.1.2  christos       return TRUE;
   12750  1.1.1.2  christos     }
   12751  1.1.1.2  christos 
   12752  1.1.1.2  christos   if (xtensa_opcode_num_operands (isa, opcode) < insn->ntok)
   12753  1.1.1.2  christos     {
   12754  1.1.1.2  christos       as_bad (_("too many operands"));
   12755  1.1.1.2  christos       return TRUE;
   12756  1.1.1.2  christos     }
   12757  1.1.1.2  christos 
   12758  1.1.1.2  christos   /* Check registers.  */
   12759  1.1.1.2  christos   for (j = 0; j < insn->ntok; j++)
   12760  1.1.1.2  christos     {
   12761  1.1.1.2  christos       if (xtensa_operand_is_register (isa, insn->opcode, j) != 1)
   12762  1.1.1.2  christos 	continue;
   12763  1.1.1.2  christos 
   12764  1.1.1.2  christos       t2_regfile = xtensa_operand_regfile (isa, insn->opcode, j);
   12765  1.1.1.2  christos       t2_base_reg = insn->tok[j].X_add_number;
   12766  1.1.1.2  christos       t2_last_reg
   12767  1.1.1.2  christos 	= t2_base_reg + xtensa_operand_num_regs (isa, insn->opcode, j);
   12768  1.1.1.2  christos 
   12769  1.1.1.2  christos       for (i = 0; i < insn->ntok; i++)
   12770  1.1.1.2  christos 	{
   12771  1.1.1.2  christos 	  if (i == j)
   12772  1.1.1.2  christos 	    continue;
   12773  1.1.1.2  christos 
   12774  1.1.1.2  christos 	  if (xtensa_operand_is_register (isa, insn->opcode, i) != 1)
   12775  1.1.1.2  christos 	    continue;
   12776  1.1.1.2  christos 
   12777  1.1.1.2  christos 	  t1_regfile = xtensa_operand_regfile (isa, insn->opcode, i);
   12778  1.1.1.2  christos 
   12779  1.1.1.2  christos 	  if (t1_regfile != t2_regfile)
   12780  1.1.1.2  christos 	    continue;
   12781  1.1.1.2  christos 
   12782  1.1.1.2  christos 	  t1_inout = xtensa_operand_inout (isa, insn->opcode, i);
   12783  1.1.1.2  christos 	  t2_inout = xtensa_operand_inout (isa, insn->opcode, j);
   12784      1.1     skrll 
   12785      1.1     skrll 	  t1_base_reg = insn->tok[i].X_add_number;
   12786      1.1     skrll 	  t1_last_reg = (t1_base_reg
   12787      1.1     skrll 			 + xtensa_operand_num_regs (isa, insn->opcode, i));
   12788      1.1     skrll 
   12789      1.1     skrll 	  for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
   12790      1.1     skrll 	    {
   12791      1.1     skrll 	      for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
   12792      1.1     skrll 		{
   12793      1.1     skrll 		  if (t1_reg != t2_reg)
   12794      1.1     skrll 		    continue;
   12795      1.1     skrll 
   12796      1.1     skrll 		  if (t1_inout != 'i' && t2_inout != 'i')
   12797      1.1     skrll 		    {
   12798      1.1     skrll 		      as_bad (_("multiple writes to the same register"));
   12799      1.1     skrll 		      return TRUE;
   12800      1.1     skrll 		    }
   12801      1.1     skrll 		}
   12802      1.1     skrll 	    }
   12803      1.1     skrll 	}
   12804      1.1     skrll     }
   12805      1.1     skrll   return FALSE;
   12806      1.1     skrll }
   12807      1.1     skrll 
   12808      1.1     skrll 
   12809      1.1     skrll /* Load an instruction from its encoded form.  */
   12810      1.1     skrll 
   12811      1.1     skrll static void
   12812      1.1     skrll tinsn_from_chars (TInsn *tinsn, char *f, int slot)
   12813      1.1     skrll {
   12814      1.1     skrll   vliw_insn vinsn;
   12815      1.1     skrll 
   12816      1.1     skrll   xg_init_vinsn (&vinsn);
   12817      1.1     skrll   vinsn_from_chars (&vinsn, f);
   12818      1.1     skrll 
   12819      1.1     skrll   *tinsn = vinsn.slots[slot];
   12820      1.1     skrll   xg_free_vinsn (&vinsn);
   12821      1.1     skrll }
   12822      1.1     skrll 
   12823      1.1     skrll 
   12824      1.1     skrll static void
   12825      1.1     skrll tinsn_from_insnbuf (TInsn *tinsn,
   12826      1.1     skrll 		    xtensa_insnbuf slotbuf,
   12827      1.1     skrll 		    xtensa_format fmt,
   12828      1.1     skrll 		    int slot)
   12829      1.1     skrll {
   12830      1.1     skrll   int i;
   12831      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   12832      1.1     skrll 
   12833      1.1     skrll   /* Find the immed.  */
   12834      1.1     skrll   tinsn_init (tinsn);
   12835      1.1     skrll   tinsn->insn_type = ITYPE_INSN;
   12836      1.1     skrll   tinsn->is_specific_opcode = FALSE;	/* must not be specific */
   12837      1.1     skrll   tinsn->opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   12838  1.1.1.2  christos   tinsn->ntok = xtensa_opcode_num_operands (isa, tinsn->opcode);
   12839      1.1     skrll   for (i = 0; i < tinsn->ntok; i++)
   12840      1.1     skrll     {
   12841      1.1     skrll       set_expr_const (&tinsn->tok[i],
   12842      1.1     skrll 		      xtensa_insnbuf_get_operand (slotbuf, fmt, slot,
   12843  1.1.1.2  christos 						  tinsn->opcode, i));
   12844      1.1     skrll     }
   12845      1.1     skrll }
   12846      1.1     skrll 
   12847      1.1     skrll 
   12848      1.1     skrll /* Read the value of the relaxable immed from the fr_symbol and fr_offset.  */
   12849      1.1     skrll 
   12850      1.1     skrll static void
   12851      1.1     skrll tinsn_immed_from_frag (TInsn *tinsn, fragS *fragP, int slot)
   12852      1.1     skrll {
   12853      1.1     skrll   xtensa_opcode opcode = tinsn->opcode;
   12854      1.1     skrll   int opnum;
   12855      1.1     skrll 
   12856      1.1     skrll   if (fragP->tc_frag_data.slot_symbols[slot])
   12857      1.1     skrll     {
   12858      1.1     skrll       opnum = get_relaxable_immed (opcode);
   12859      1.1     skrll       gas_assert (opnum >= 0);
   12860      1.1     skrll       set_expr_symbol_offset (&tinsn->tok[opnum],
   12861      1.1     skrll 			      fragP->tc_frag_data.slot_symbols[slot],
   12862      1.1     skrll 			      fragP->tc_frag_data.slot_offsets[slot]);
   12863      1.1     skrll     }
   12864      1.1     skrll   tinsn->extra_arg = fragP->tc_frag_data.free_reg[slot];
   12865      1.1     skrll }
   12866      1.1     skrll 
   12867      1.1     skrll 
   12868      1.1     skrll static int
   12869      1.1     skrll get_num_stack_text_bytes (IStack *istack)
   12870      1.1     skrll {
   12871      1.1     skrll   int i;
   12872      1.1     skrll   int text_bytes = 0;
   12873      1.1     skrll 
   12874      1.1     skrll   for (i = 0; i < istack->ninsn; i++)
   12875      1.1     skrll     {
   12876      1.1     skrll       TInsn *tinsn = &istack->insn[i];
   12877      1.1     skrll       if (tinsn->insn_type == ITYPE_INSN)
   12878      1.1     skrll 	text_bytes += xg_get_single_size (tinsn->opcode);
   12879      1.1     skrll     }
   12880      1.1     skrll   return text_bytes;
   12881      1.1     skrll }
   12882      1.1     skrll 
   12883      1.1     skrll 
   12884      1.1     skrll static int
   12885      1.1     skrll get_num_stack_literal_bytes (IStack *istack)
   12886      1.1     skrll {
   12887      1.1     skrll   int i;
   12888      1.1     skrll   int lit_bytes = 0;
   12889      1.1     skrll 
   12890      1.1     skrll   for (i = 0; i < istack->ninsn; i++)
   12891      1.1     skrll     {
   12892      1.1     skrll       TInsn *tinsn = &istack->insn[i];
   12893  1.1.1.2  christos       if (tinsn->insn_type == ITYPE_LITERAL && tinsn->ntok == 1)
   12894      1.1     skrll 	lit_bytes += 4;
   12895      1.1     skrll     }
   12896      1.1     skrll   return lit_bytes;
   12897      1.1     skrll }
   12898      1.1     skrll 
   12899      1.1     skrll 
   12900      1.1     skrll /* vliw_insn functions.  */
   12902      1.1     skrll 
   12903      1.1     skrll static void
   12904      1.1     skrll xg_init_vinsn (vliw_insn *v)
   12905      1.1     skrll {
   12906      1.1     skrll   int i;
   12907  1.1.1.4  christos   xtensa_isa isa = xtensa_default_isa;
   12908  1.1.1.2  christos 
   12909      1.1     skrll   xg_clear_vinsn (v);
   12910      1.1     skrll 
   12911      1.1     skrll   v->insnbuf = xtensa_insnbuf_alloc (isa);
   12912      1.1     skrll   if (v->insnbuf == NULL)
   12913      1.1     skrll     as_fatal (_("out of memory"));
   12914      1.1     skrll 
   12915      1.1     skrll   for (i = 0; i < config_max_slots; i++)
   12916      1.1     skrll     {
   12917  1.1.1.2  christos       v->slotbuf[i] = xtensa_insnbuf_alloc (isa);
   12918      1.1     skrll       if (v->slotbuf[i] == NULL)
   12919      1.1     skrll 	as_fatal (_("out of memory"));
   12920      1.1     skrll     }
   12921      1.1     skrll }
   12922  1.1.1.2  christos 
   12923  1.1.1.2  christos 
   12924  1.1.1.2  christos static void
   12925  1.1.1.4  christos xg_clear_vinsn (vliw_insn *v)
   12926  1.1.1.2  christos {
   12927  1.1.1.2  christos   int i;
   12928  1.1.1.2  christos 
   12929  1.1.1.2  christos   memset (v, 0, offsetof (vliw_insn, slots)
   12930  1.1.1.2  christos                 + sizeof(TInsn) * config_max_slots);
   12931  1.1.1.2  christos 
   12932      1.1     skrll   v->format = XTENSA_UNDEFINED;
   12933      1.1     skrll   v->num_slots = 0;
   12934      1.1     skrll   v->inside_bundle = FALSE;
   12935      1.1     skrll 
   12936      1.1     skrll   if (xt_saved_debug_type != DEBUG_NONE)
   12937      1.1     skrll     debug_type = xt_saved_debug_type;
   12938      1.1     skrll 
   12939      1.1     skrll   for (i = 0; i < config_max_slots; i++)
   12940      1.1     skrll     v->slots[i].opcode = XTENSA_UNDEFINED;
   12941      1.1     skrll }
   12942      1.1     skrll 
   12943      1.1     skrll 
   12944      1.1     skrll static void
   12945      1.1     skrll xg_copy_vinsn (vliw_insn *dst, vliw_insn *src)
   12946      1.1     skrll {
   12947      1.1     skrll   memcpy (dst, src,
   12948      1.1     skrll 	  offsetof(vliw_insn, slots) + src->num_slots * sizeof(TInsn));
   12949      1.1     skrll   dst->insnbuf = src->insnbuf;
   12950      1.1     skrll   memcpy (dst->slotbuf, src->slotbuf, src->num_slots * sizeof(xtensa_insnbuf));
   12951  1.1.1.2  christos }
   12952      1.1     skrll 
   12953      1.1     skrll 
   12954      1.1     skrll static bfd_boolean
   12955      1.1     skrll vinsn_has_specific_opcodes (vliw_insn *v)
   12956      1.1     skrll {
   12957      1.1     skrll   int i;
   12958      1.1     skrll 
   12959      1.1     skrll   for (i = 0; i < v->num_slots; i++)
   12960      1.1     skrll     {
   12961      1.1     skrll       if (v->slots[i].is_specific_opcode)
   12962      1.1     skrll 	return TRUE;
   12963      1.1     skrll     }
   12964      1.1     skrll   return FALSE;
   12965      1.1     skrll }
   12966      1.1     skrll 
   12967      1.1     skrll 
   12968      1.1     skrll static void
   12969      1.1     skrll xg_free_vinsn (vliw_insn *v)
   12970      1.1     skrll {
   12971      1.1     skrll   int i;
   12972      1.1     skrll   xtensa_insnbuf_free (xtensa_default_isa, v->insnbuf);
   12973      1.1     skrll   for (i = 0; i < config_max_slots; i++)
   12974      1.1     skrll     xtensa_insnbuf_free (xtensa_default_isa, v->slotbuf[i]);
   12975      1.1     skrll }
   12976  1.1.1.2  christos 
   12977      1.1     skrll 
   12978      1.1     skrll /* Encode a vliw_insn into an insnbuf.  Return TRUE if there are any symbolic
   12979      1.1     skrll    operands.  See also the assumptions listed for tinsn_to_slotbuf.  */
   12980      1.1     skrll 
   12981      1.1     skrll static bfd_boolean
   12982      1.1     skrll vinsn_to_insnbuf (vliw_insn *vinsn,
   12983  1.1.1.2  christos 		  char *frag_offset,
   12984      1.1     skrll 		  fragS *fragP,
   12985      1.1     skrll 		  bfd_boolean record_fixup)
   12986      1.1     skrll {
   12987      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   12988      1.1     skrll   xtensa_format fmt = vinsn->format;
   12989      1.1     skrll   xtensa_insnbuf insnbuf = vinsn->insnbuf;
   12990      1.1     skrll   int slot;
   12991      1.1     skrll   bfd_boolean has_fixup = FALSE;
   12992      1.1     skrll 
   12993      1.1     skrll   xtensa_format_encode (isa, fmt, insnbuf);
   12994      1.1     skrll 
   12995      1.1     skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   12996  1.1.1.2  christos     {
   12997  1.1.1.2  christos       TInsn *tinsn = &vinsn->slots[slot];
   12998      1.1     skrll       expressionS *extra_arg = &tinsn->extra_arg;
   12999      1.1     skrll       bfd_boolean tinsn_has_fixup =
   13000      1.1     skrll 	tinsn_to_slotbuf (vinsn->format, slot, tinsn,
   13001      1.1     skrll 			  vinsn->slotbuf[slot]);
   13002      1.1     skrll 
   13003      1.1     skrll       xtensa_format_set_slot (isa, fmt, slot,
   13004      1.1     skrll 			      insnbuf, vinsn->slotbuf[slot]);
   13005      1.1     skrll       if (extra_arg->X_op != O_illegal && extra_arg->X_op != O_register)
   13006      1.1     skrll 	{
   13007      1.1     skrll 	  if (vinsn->num_slots != 1)
   13008  1.1.1.2  christos 	    as_bad (_("TLS relocation not allowed in FLIX bundle"));
   13009  1.1.1.2  christos 	  else if (record_fixup)
   13010      1.1     skrll 	    /* Instructions that generate TLS relocations should always be
   13011      1.1     skrll 	       relaxed in the front-end.  If "record_fixup" is set, then this
   13012      1.1     skrll 	       function is being called during back-end relaxation, so flag
   13013      1.1     skrll 	       the unexpected behavior as an error.  */
   13014      1.1     skrll 	    as_bad (_("unexpected TLS relocation"));
   13015      1.1     skrll 	  else
   13016      1.1     skrll 	    fix_new (fragP, frag_offset - fragP->fr_literal,
   13017      1.1     skrll 		     xtensa_format_length (isa, fmt),
   13018      1.1     skrll 		     extra_arg->X_add_symbol, extra_arg->X_add_number,
   13019      1.1     skrll 		     FALSE, map_operator_to_reloc (extra_arg->X_op, FALSE));
   13020      1.1     skrll 	}
   13021      1.1     skrll       if (tinsn_has_fixup)
   13022      1.1     skrll 	{
   13023      1.1     skrll 	  int i;
   13024  1.1.1.2  christos 	  xtensa_opcode opcode = tinsn->opcode;
   13025      1.1     skrll 	  int noperands = xtensa_opcode_num_operands (isa, opcode);
   13026      1.1     skrll 	  has_fixup = TRUE;
   13027      1.1     skrll 
   13028      1.1     skrll 	  for (i = 0; i < noperands; i++)
   13029  1.1.1.2  christos 	    {
   13030      1.1     skrll 	      expressionS* exp = &tinsn->tok[i];
   13031  1.1.1.2  christos 	      switch (exp->X_op)
   13032  1.1.1.2  christos 		{
   13033      1.1     skrll 		case O_symbol:
   13034      1.1     skrll 		case O_lo16:
   13035      1.1     skrll 		case O_hi16:
   13036      1.1     skrll 		  if (get_relaxable_immed (opcode) == i)
   13037      1.1     skrll 		    {
   13038      1.1     skrll 		      /* Add a fix record for the instruction, except if this
   13039      1.1     skrll 			 function is being called prior to relaxation, i.e.,
   13040      1.1     skrll 			 if record_fixup is false, and the instruction might
   13041      1.1     skrll 			 be relaxed later.  */
   13042      1.1     skrll 		      if (record_fixup
   13043      1.1     skrll 			  || tinsn->is_specific_opcode
   13044      1.1     skrll 			  || !xg_is_relaxable_insn (tinsn, 0))
   13045      1.1     skrll 			{
   13046      1.1     skrll 			  xg_add_opcode_fix (tinsn, i, fmt, slot, exp, fragP,
   13047      1.1     skrll 					     frag_offset - fragP->fr_literal);
   13048      1.1     skrll 			}
   13049      1.1     skrll 		      else
   13050      1.1     skrll 			{
   13051      1.1     skrll 			  if (exp->X_op != O_symbol)
   13052      1.1     skrll 			    as_bad (_("invalid operand"));
   13053      1.1     skrll 			  tinsn->symbol = exp->X_add_symbol;
   13054      1.1     skrll 			  tinsn->offset = exp->X_add_number;
   13055      1.1     skrll 			}
   13056      1.1     skrll 		    }
   13057      1.1     skrll 		  else
   13058      1.1     skrll 		    as_bad (_("symbolic operand not allowed"));
   13059      1.1     skrll 		  break;
   13060      1.1     skrll 
   13061      1.1     skrll 		case O_constant:
   13062      1.1     skrll 		case O_register:
   13063      1.1     skrll 		  break;
   13064      1.1     skrll 
   13065      1.1     skrll 		default:
   13066      1.1     skrll 		  as_bad (_("expression too complex"));
   13067      1.1     skrll 		  break;
   13068      1.1     skrll 		}
   13069      1.1     skrll 	    }
   13070      1.1     skrll 	}
   13071      1.1     skrll     }
   13072      1.1     skrll 
   13073      1.1     skrll   return has_fixup;
   13074      1.1     skrll }
   13075      1.1     skrll 
   13076      1.1     skrll 
   13077      1.1     skrll static void
   13078      1.1     skrll vinsn_from_chars (vliw_insn *vinsn, char *f)
   13079      1.1     skrll {
   13080      1.1     skrll   static xtensa_insnbuf insnbuf = NULL;
   13081      1.1     skrll   static xtensa_insnbuf slotbuf = NULL;
   13082      1.1     skrll   int i;
   13083      1.1     skrll   xtensa_format fmt;
   13084      1.1     skrll   xtensa_isa isa = xtensa_default_isa;
   13085      1.1     skrll 
   13086      1.1     skrll   if (!insnbuf)
   13087      1.1     skrll     {
   13088      1.1     skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   13089      1.1     skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   13090      1.1     skrll     }
   13091      1.1     skrll 
   13092      1.1     skrll   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) f, 0);
   13093      1.1     skrll   fmt = xtensa_format_decode (isa, insnbuf);
   13094      1.1     skrll   if (fmt == XTENSA_UNDEFINED)
   13095      1.1     skrll     as_fatal (_("cannot decode instruction format"));
   13096      1.1     skrll   vinsn->format = fmt;
   13097      1.1     skrll   vinsn->num_slots = xtensa_format_num_slots (isa, fmt);
   13098      1.1     skrll 
   13099      1.1     skrll   for (i = 0; i < vinsn->num_slots; i++)
   13100      1.1     skrll     {
   13101      1.1     skrll       TInsn *tinsn = &vinsn->slots[i];
   13102      1.1     skrll       xtensa_format_get_slot (isa, fmt, i, insnbuf, slotbuf);
   13103  1.1.1.2  christos       tinsn_from_insnbuf (tinsn, slotbuf, fmt, i);
   13104      1.1     skrll     }
   13105      1.1     skrll }
   13106      1.1     skrll 
   13107      1.1     skrll 
   13108      1.1     skrll /* Expression utilities.  */
   13110      1.1     skrll 
   13111      1.1     skrll /* Return TRUE if the expression is an integer constant.  */
   13112      1.1     skrll 
   13113      1.1     skrll bfd_boolean
   13114      1.1     skrll expr_is_const (const expressionS *s)
   13115      1.1     skrll {
   13116      1.1     skrll   return (s->X_op == O_constant);
   13117      1.1     skrll }
   13118      1.1     skrll 
   13119      1.1     skrll 
   13120      1.1     skrll /* Get the expression constant.
   13121      1.1     skrll    Calling this is illegal if expr_is_const () returns TRUE.  */
   13122      1.1     skrll 
   13123      1.1     skrll offsetT
   13124      1.1     skrll get_expr_const (const expressionS *s)
   13125      1.1     skrll {
   13126      1.1     skrll   gas_assert (expr_is_const (s));
   13127      1.1     skrll   return s->X_add_number;
   13128      1.1     skrll }
   13129      1.1     skrll 
   13130      1.1     skrll 
   13131      1.1     skrll /* Set the expression to a constant value.  */
   13132      1.1     skrll 
   13133  1.1.1.2  christos void
   13134      1.1     skrll set_expr_const (expressionS *s, offsetT val)
   13135      1.1     skrll {
   13136      1.1     skrll   s->X_op = O_constant;
   13137      1.1     skrll   s->X_add_number = val;
   13138      1.1     skrll   s->X_add_symbol = NULL;
   13139      1.1     skrll   s->X_op_symbol = NULL;
   13140      1.1     skrll }
   13141      1.1     skrll 
   13142      1.1     skrll 
   13143      1.1     skrll bfd_boolean
   13144      1.1     skrll expr_is_register (const expressionS *s)
   13145      1.1     skrll {
   13146      1.1     skrll   return (s->X_op == O_register);
   13147      1.1     skrll }
   13148      1.1     skrll 
   13149      1.1     skrll 
   13150      1.1     skrll /* Get the expression constant.
   13151      1.1     skrll    Calling this is illegal if expr_is_const () returns TRUE.  */
   13152      1.1     skrll 
   13153      1.1     skrll offsetT
   13154      1.1     skrll get_expr_register (const expressionS *s)
   13155      1.1     skrll {
   13156      1.1     skrll   gas_assert (expr_is_register (s));
   13157      1.1     skrll   return s->X_add_number;
   13158      1.1     skrll }
   13159      1.1     skrll 
   13160      1.1     skrll 
   13161      1.1     skrll /* Set the expression to a symbol + constant offset.  */
   13162      1.1     skrll 
   13163      1.1     skrll void
   13164      1.1     skrll set_expr_symbol_offset (expressionS *s, symbolS *sym, offsetT offset)
   13165      1.1     skrll {
   13166      1.1     skrll   s->X_op = O_symbol;
   13167      1.1     skrll   s->X_add_symbol = sym;
   13168      1.1     skrll   s->X_op_symbol = NULL;	/* unused */
   13169      1.1     skrll   s->X_add_number = offset;
   13170      1.1     skrll }
   13171      1.1     skrll 
   13172      1.1     skrll 
   13173      1.1     skrll /* Return TRUE if the two expressions are equal.  */
   13174      1.1     skrll 
   13175      1.1     skrll bfd_boolean
   13176      1.1     skrll expr_is_equal (expressionS *s1, expressionS *s2)
   13177      1.1     skrll {
   13178  1.1.1.5  christos   if (s1->X_op != s2->X_op)
   13179      1.1     skrll     return FALSE;
   13180      1.1     skrll   if (s1->X_add_symbol != s2->X_add_symbol)
   13181      1.1     skrll     return FALSE;
   13182      1.1     skrll   if (s1->X_op_symbol != s2->X_op_symbol)
   13183      1.1     skrll     return FALSE;
   13184      1.1     skrll   if (s1->X_add_number != s2->X_add_number)
   13185      1.1     skrll     return FALSE;
   13186      1.1     skrll   return TRUE;
   13187      1.1     skrll }
   13188      1.1     skrll 
   13189      1.1     skrll 
   13190      1.1     skrll static void
   13191      1.1     skrll copy_expr (expressionS *dst, const expressionS *src)
   13192      1.1     skrll {
   13193      1.1     skrll   memcpy (dst, src, sizeof (expressionS));
   13194      1.1     skrll }
   13195      1.1     skrll 
   13196      1.1     skrll 
   13197      1.1     skrll /* Support for the "--rename-section" option.  */
   13199      1.1     skrll 
   13200      1.1     skrll struct rename_section_struct
   13201      1.1     skrll {
   13202      1.1     skrll   const char *old_name;
   13203      1.1     skrll   char *new_name;
   13204      1.1     skrll   struct rename_section_struct *next;
   13205      1.1     skrll };
   13206      1.1     skrll 
   13207      1.1     skrll static struct rename_section_struct *section_rename;
   13208      1.1     skrll 
   13209      1.1     skrll 
   13210      1.1     skrll /* Parse the string "oldname=new_name(:oldname2=new_name2)*" and add
   13211      1.1     skrll    entries to the section_rename list.  Note: Specifying multiple
   13212      1.1     skrll    renamings separated by colons is not documented and is retained only
   13213      1.1     skrll    for backward compatibility.  */
   13214      1.1     skrll 
   13215      1.1     skrll static void
   13216      1.1     skrll build_section_rename (const char *arg)
   13217      1.1     skrll {
   13218      1.1     skrll   struct rename_section_struct *r;
   13219      1.1     skrll   char *this_arg = NULL;
   13220      1.1     skrll   char *next_arg = NULL;
   13221      1.1     skrll 
   13222      1.1     skrll   for (this_arg = xstrdup (arg); this_arg != NULL; this_arg = next_arg)
   13223      1.1     skrll     {
   13224      1.1     skrll       char *old_name, *new_name;
   13225      1.1     skrll 
   13226      1.1     skrll       if (this_arg)
   13227      1.1     skrll 	{
   13228      1.1     skrll 	  next_arg = strchr (this_arg, ':');
   13229      1.1     skrll 	  if (next_arg)
   13230      1.1     skrll 	    {
   13231      1.1     skrll 	      *next_arg = '\0';
   13232      1.1     skrll 	      next_arg++;
   13233      1.1     skrll 	    }
   13234      1.1     skrll 	}
   13235      1.1     skrll 
   13236      1.1     skrll       old_name = this_arg;
   13237      1.1     skrll       new_name = strchr (this_arg, '=');
   13238      1.1     skrll 
   13239      1.1     skrll       if (*old_name == '\0')
   13240  1.1.1.5  christos 	{
   13241      1.1     skrll 	  as_warn (_("ignoring extra '-rename-section' delimiter ':'"));
   13242      1.1     skrll 	  continue;
   13243      1.1     skrll 	}
   13244      1.1     skrll       if (!new_name || new_name[1] == '\0')
   13245      1.1     skrll 	{
   13246      1.1     skrll 	  as_warn (_("ignoring invalid '-rename-section' specification: '%s'"),
   13247      1.1     skrll 		   old_name);
   13248      1.1     skrll 	  continue;
   13249      1.1     skrll 	}
   13250  1.1.1.5  christos       *new_name = '\0';
   13251      1.1     skrll       new_name++;
   13252      1.1     skrll 
   13253      1.1     skrll       /* Check for invalid section renaming.  */
   13254      1.1     skrll       for (r = section_rename; r != NULL; r = r->next)
   13255      1.1     skrll 	{
   13256      1.1     skrll 	  if (strcmp (r->old_name, old_name) == 0)
   13257      1.1     skrll 	    as_bad (_("section %s renamed multiple times"), old_name);
   13258      1.1     skrll 	  if (strcmp (r->new_name, new_name) == 0)
   13259      1.1     skrll 	    as_bad (_("multiple sections remapped to output section %s"),
   13260  1.1.1.5  christos 		    new_name);
   13261      1.1     skrll 	}
   13262                    
   13263                          /* Now add it.  */
   13264                          r = XNEW (struct rename_section_struct);
   13265                          r->old_name = xstrdup (old_name);
   13266                          r->new_name = xstrdup (new_name);
   13267                          r->next = section_rename;
   13268                          section_rename = r;
   13269                        }
   13270                    }
   13271                    
   13272                    
   13273                    char *
   13274                    xtensa_section_rename (const char *name)
   13275                    {
   13276                      struct rename_section_struct *r = section_rename;
   13277                    
   13278                      for (r = section_rename; r != NULL; r = r->next)
   13279                        {
   13280                          if (strcmp (r->old_name, name) == 0)
   13281                    	return r->new_name;
   13282                        }
   13283                    
   13284                      return (char *) name;
   13285                    }
   13286