diff options
author | Dimitar Dimitrov <dimitar@dinux.eu> | 2016-12-27 22:43:38 +0200 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2016-12-31 12:03:35 +1030 |
commit | 93f11b16ec1f5775c7f6c32b4a39d6dd0fb0c92a (patch) | |
tree | 239a723ef7f1ce40a785067b4fda0a66d770aef4 /gas/config/tc-pru.h | |
parent | 2b100bb5cf206f9254453a00e4b48e32d3584625 (diff) | |
download | fsf-binutils-gdb-93f11b16ec1f5775c7f6c32b4a39d6dd0fb0c92a.zip fsf-binutils-gdb-93f11b16ec1f5775c7f6c32b4a39d6dd0fb0c92a.tar.gz fsf-binutils-gdb-93f11b16ec1f5775c7f6c32b4a39d6dd0fb0c92a.tar.bz2 |
PRU GAS Port
* NEWS: Mention new PRU target.
* Makefile.am: Add PRU target.
* config/obj-elf.c: Ditto.
* configure.tgt: Ditto.
* config/tc-pru.c: New file.
* config/tc-pru.h: New file.
* doc/Makefile.am: Add documentation for PRU GAS port.
* doc/all.texi, Ditto.
* doc/as.texinfo: Ditto.
* doc/c-pru.texi: Document PRU GAS options.
* Makefile.in: Regenerate.
* doc/Makefile.in: Regenerate.
* po/POTFILES.in: Regenerate.
* testsuite/gas/pru/alu.d: New file for PRU GAS testsuite.
* testsuite/gas/pru/alu.s: Ditto.
* testsuite/gas/pru/branch.d: Ditto.
* testsuite/gas/pru/branch.s: Ditto.
* testsuite/gas/pru/illegal.l: Ditto.
* testsuite/gas/pru/illegal.s: Ditto.
* testsuite/gas/pru/ldi.d: Ditto.
* testsuite/gas/pru/ldi.s: Ditto.
* testsuite/gas/pru/ldst.d: Ditto.
* testsuite/gas/pru/ldst.s: Ditto.
* testsuite/gas/pru/loop.d: Ditto.
* testsuite/gas/pru/loop.s: Ditto.
* testsuite/gas/pru/misc.d: Ditto.
* testsuite/gas/pru/misc.s: Ditto.
* testsuite/gas/pru/pru.exp: Ditto.
* testsuite/gas/pru/pseudo.d: Ditto.
* testsuite/gas/pru/pseudo.s: Ditto.
* testsuite/gas/pru/warn_reglabel.l: Ditto.
* testsuite/gas/pru/warn_reglabel.s: Ditto.
* testsuite/gas/pru/xfr.d: Ditto.
* testsuite/gas/pru/xfr.s: Ditto.
* testsuite/gas/lns/lns.exp: Mark lns-common-1-alt variant for PRU.
Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
Diffstat (limited to 'gas/config/tc-pru.h')
-rw-r--r-- | gas/config/tc-pru.h | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/gas/config/tc-pru.h b/gas/config/tc-pru.h new file mode 100644 index 0000000..d3d0d78 --- /dev/null +++ b/gas/config/tc-pru.h @@ -0,0 +1,154 @@ +/* Definitions for TI PRU assembler. + Copyright (C) 2014-2016 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) \ + (! SEG_NORMAL (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 +#define DWARF2_DEFAULT_RETURN_COLUMN 31 +#define DWARF2_CIE_DATA_ALIGNMENT (-4) +#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 bfd_boolean pru_allow_local_subtract (expressionS *, expressionS *, + segT); + +#endif /* __TC_PRU__ */ |