| /* Definitions for TI PRU assembler. |
| Copyright (C) 2014-2021 Free Software Foundation, Inc. |
| Contributed by Dimitar Dimitrov <dimitar@dinux.eu> |
| |
| This file is part of GAS, the GNU Assembler. |
| |
| GAS is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3, or (at your option) |
| any later version. |
| |
| GAS is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GAS; see the file COPYING. If not, write to the Free |
| Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
| 02110-1301, USA. */ |
| |
| #ifndef __TC_PRU__ |
| #define __TC_PRU__ |
| |
| #define TARGET_BYTES_BIG_ENDIAN 0 |
| |
| /* Words are big enough to hold addresses. */ |
| #define WORKING_DOT_WORD 1 |
| |
| extern const char *pru_target_format (void); |
| #define TARGET_FORMAT pru_target_format () |
| #define TARGET_ARCH bfd_arch_pru |
| |
| /* A PRU instruction consists of tokens and separator characters |
| the tokens are things like the instruction name (add, or jmp etc), |
| the register indices ($5, $7 etc), and constant expressions. The |
| separator characters are commas, brackets and space. |
| The instruction name is always separated from other tokens by a space |
| The maximum number of tokens in an instruction is 6 (the instruction name, |
| 4 arguments, and a 4th string representing the expected instruction opcode |
| after assembly. The latter is only used when the assemble is running in |
| self test mode, otherwise its presence will generate an error. */ |
| #define PRU_MAX_INSN_TOKENS 7 |
| |
| /* There are no machine-specific operands so we #define this to nothing. */ |
| #define md_operand(x) |
| |
| /* Function prototypes exported to rest of GAS. */ |
| extern void md_assemble (char *op_str); |
| extern void md_end (void); |
| extern void md_begin (void); |
| |
| #define tc_fix_adjustable(fixp) pru_fix_adjustable (fixp) |
| extern int pru_fix_adjustable (struct fix *); |
| |
| #define tc_frob_label(lab) pru_frob_label (lab) |
| extern void pru_frob_label (symbolS *); |
| |
| extern void md_convert_frag (bfd * headers, segT sec, fragS * fragP); |
| |
| #define DIFF_EXPR_OK |
| |
| /* FIXME This seems appropriate, given that we intentionally prevent |
| PRU's .text from being used in a DIFF expression with symbols from |
| other sections. Revisit once GDB is ported. */ |
| #define CFI_DIFF_EXPR_OK 0 |
| |
| #define TC_PARSE_CONS_RETURN_TYPE int |
| #define TC_PARSE_CONS_RETURN_NONE 0 |
| |
| #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \ |
| pru_parse_cons_expression (EXP, NBYTES) |
| extern int pru_parse_cons_expression (expressionS *exp, int size); |
| |
| #define TC_CONS_FIX_NEW pru_cons_fix_new |
| extern void pru_cons_fix_new (struct frag *frag, int where, |
| unsigned int nbytes, struct expressionS *exp, |
| const int is_pmem); |
| |
| /* If you define this macro, it means that `tc_gen_reloc' may return |
| multiple relocation entries for a single fixup. In this case, the |
| return value of `tc_gen_reloc' is a pointer to a null terminated |
| array. */ |
| #undef RELOC_EXPANSION_POSSIBLE |
| |
| /* No shared lib support, so we don't need to ensure externally |
| visible symbols can be overridden. */ |
| #define EXTERN_FORCE_RELOC 0 |
| |
| /* If defined, this macro allows control over whether fixups for a |
| given section will be processed when the linkrelax variable is |
| set. Define it to zero and handle things in md_apply_fix instead. */ |
| #define TC_LINKRELAX_FIXUP(SEG) 0 |
| |
| /* If this macro returns non-zero, it guarantees that a relocation will be |
| emitted even when the value can be resolved locally. Do that if |
| linkrelax is turned on. */ |
| #define TC_FORCE_RELOCATION(fix) pru_force_relocation (fix) |
| #define TC_FORCE_RELOCATION_SUB_SAME(fix, seg) \ |
| (GENERIC_FORCE_RELOCATION_SUB_SAME (fix, seg) || pru_force_relocation (fix)) |
| extern int pru_force_relocation (struct fix *); |
| |
| /* Do not use PC relative fixups and relocations for |
| anything but real PCREL relocations. */ |
| #define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) \ |
| (((FIX)->fx_r_type != BFD_RELOC_PRU_S10_PCREL) \ |
| && ((FIX)->fx_r_type != BFD_RELOC_PRU_U8_PCREL)) |
| |
| /* Values passed to md_apply_fix don't include the symbol value. */ |
| #define MD_APPLY_SYM_VALUE(FIX) 0 |
| |
| /* We don't want gas to fixup the following memory related relocations. |
| We will need them in case that we want to do linker relaxation. |
| We could in principle keep these fixups in gas when not relaxing. |
| However, there is no serious performance penalty when making the linker |
| make the fixup work. Check also that fx_addsy is not NULL, in order to |
| make sure that the fixup refers to some sort of label. */ |
| #define TC_VALIDATE_FIX(FIXP,SEG,SKIP) \ |
| if ((FIXP->fx_r_type == BFD_RELOC_PRU_LDI32 \ |
| || FIXP->fx_r_type == BFD_RELOC_PRU_U16 \ |
| || FIXP->fx_r_type == BFD_RELOC_PRU_U16_PMEMIMM \ |
| || FIXP->fx_r_type == BFD_RELOC_PRU_S10_PCREL \ |
| || FIXP->fx_r_type == BFD_RELOC_PRU_U8_PCREL \ |
| || FIXP->fx_r_type == BFD_RELOC_PRU_32_PMEM \ |
| || FIXP->fx_r_type == BFD_RELOC_PRU_16_PMEM) \ |
| && FIXP->fx_addsy != NULL \ |
| && FIXP->fx_subsy == NULL) \ |
| { \ |
| symbol_mark_used_in_reloc (FIXP->fx_addsy); \ |
| goto SKIP; \ |
| } |
| |
| /* This macro is evaluated for any fixup with a fx_subsy that |
| fixup_segment cannot reduce to a number. If the macro returns |
| false an error will be reported. */ |
| #define TC_VALIDATE_FIX_SUB(fix, seg) pru_validate_fix_sub (fix) |
| extern int pru_validate_fix_sub (struct fix *); |
| |
| /* We want .cfi_* pseudo-ops for generating unwind info. */ |
| #define TARGET_USE_CFIPOP 1 |
| |
| /* Program Counter register number is not defined by TI documents. |
| Pick the virtual number used by GCC. */ |
| #define DWARF2_DEFAULT_RETURN_COLUMN 132 |
| |
| /* The stack grows down, and is only byte aligned. */ |
| #define DWARF2_CIE_DATA_ALIGNMENT -1 |
| |
| #define tc_regname_to_dw2regnum pru_regname_to_dw2regnum |
| extern int pru_regname_to_dw2regnum (char *regname); |
| #define tc_cfi_frame_initial_instructions pru_frame_initial_instructions |
| extern void pru_frame_initial_instructions (void); |
| |
| /* The difference between same-section symbols may be affected by linker |
| relaxation, so do not resolve such expressions in the assembler. */ |
| #define md_allow_local_subtract(l,r,s) pru_allow_local_subtract (l, r, s) |
| extern bool pru_allow_local_subtract (expressionS *, expressionS *, segT); |
| |
| #endif /* __TC_PRU__ */ |