aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-xtensa.h
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2003-04-01 15:50:31 +0000
committerNick Clifton <nickc@redhat.com>2003-04-01 15:50:31 +0000
commite0001a05d2e4967ee86f4468cdc4fafea66b92d1 (patch)
tree4676b72e452f4dfc81e8d6646fb43f63a108da1b /gas/config/tc-xtensa.h
parentce0c72625ad0f6497718b4293572b2b6be711714 (diff)
downloadgdb-e0001a05d2e4967ee86f4468cdc4fafea66b92d1.zip
gdb-e0001a05d2e4967ee86f4468cdc4fafea66b92d1.tar.gz
gdb-e0001a05d2e4967ee86f4468cdc4fafea66b92d1.tar.bz2
Add Xtensa port
Diffstat (limited to 'gas/config/tc-xtensa.h')
-rw-r--r--gas/config/tc-xtensa.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/gas/config/tc-xtensa.h b/gas/config/tc-xtensa.h
new file mode 100644
index 0000000..c6bc09d
--- /dev/null
+++ b/gas/config/tc-xtensa.h
@@ -0,0 +1,200 @@
+/* tc-xtensa.h -- Header file for tc-xtensa.c.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+
+ 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 2, 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, 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
+
+#ifndef TC_XTENSA
+#define TC_XTENSA 1
+
+#ifdef ANSI_PROTOTYPES
+struct fix;
+#endif
+
+#ifndef BFD_ASSEMBLER
+#error Xtensa support requires BFD_ASSEMBLER
+#endif
+
+#ifndef OBJ_ELF
+#error Xtensa support requires ELF object format
+#endif
+
+#include "xtensa-config.h"
+
+#define TARGET_BYTES_BIG_ENDIAN XCHAL_HAVE_BE
+
+
+struct xtensa_frag_type
+{
+ unsigned is_literal:1;
+ unsigned is_text:1;
+ unsigned is_loop_target:1;
+ unsigned is_branch_target:1;
+ unsigned is_insn:1;
+
+ /* Info about the current state of assembly, i.e., density, relax,
+ generics, freeregs, longcalls. These need to be passed to the
+ backend and then to the linking file. */
+
+ unsigned is_no_density:1;
+ unsigned is_relax:1;
+ unsigned is_generics:1;
+ unsigned is_longcalls:1;
+
+ /* For text fragments that can generate literals at relax time, this
+ variable points to the frag where the literal will be stored. For
+ literal frags, this variable points to the nearest literal pool
+ location frag. This literal frag will be moved to after this
+ location. */
+
+ fragS *literal_frag;
+
+ /* The destination segment for literal frags. (Note that this is only
+ valid after xtensa_move_literals. */
+
+ segT lit_seg;
+
+ /* For the relaxation scheme, some literal fragments can have their
+ expansions modified by an instruction that relaxes. */
+
+ unsigned text_expansion;
+ unsigned literal_expansion;
+ unsigned unreported_expansion;
+};
+
+typedef struct xtensa_block_info_struct
+{
+ segT sec;
+ bfd_vma offset;
+ size_t size;
+ struct xtensa_block_info_struct *next;
+} xtensa_block_info;
+
+typedef enum
+{
+ xt_insn_sec,
+ xt_literal_sec,
+ max_xt_sec
+} xt_section_type;
+
+typedef struct xtensa_segment_info_struct
+{
+ fragS *literal_pool_loc;
+ xtensa_block_info *blocks[max_xt_sec];
+} xtensa_segment_info;
+
+typedef struct xtensa_symfield_type_struct
+{
+ unsigned int plt : 1;
+} xtensa_symfield_type;
+
+
+/* Section renaming is only supported in Tensilica's version of GAS. */
+#define XTENSA_SECTION_RENAME 1
+#ifdef XTENSA_SECTION_RENAME
+extern const char *xtensa_section_rename
+ PARAMS ((const char *));
+#else
+/* Tensilica's section renaming feature is not included here. */
+#define xtensa_section_rename(name) (name)
+#endif /* XTENSA_SECTION_RENAME */
+
+
+extern const char *xtensa_target_format
+ PARAMS ((void));
+extern void xtensa_frag_init
+ PARAMS ((fragS *));
+extern void xtensa_cons_fix_new
+ PARAMS ((fragS *, int, int, expressionS *));
+extern void xtensa_frob_label
+ PARAMS ((struct symbol *));
+extern void xtensa_end
+ PARAMS ((void));
+extern void xtensa_post_relax_hook
+ PARAMS ((void));
+extern void xtensa_file_arch_init
+ PARAMS ((bfd *));
+extern void xtensa_flush_pending_output
+ PARAMS ((void));
+extern bfd_boolean xtensa_fix_adjustable
+ PARAMS ((struct fix *));
+extern void xtensa_symbol_new_hook
+ PARAMS ((symbolS *));
+extern long xtensa_relax_frag
+ PARAMS ((fragS *, long, int *));
+
+#define TARGET_FORMAT xtensa_target_format ()
+#define TARGET_ARCH bfd_arch_xtensa
+#define TC_SEGMENT_INFO_TYPE xtensa_segment_info
+#define TC_SYMFIELD_TYPE xtensa_symfield_type
+#define TC_FRAG_TYPE struct xtensa_frag_type
+#define TC_FRAG_INIT(frag) xtensa_frag_init (frag)
+#define TC_CONS_FIX_NEW xtensa_cons_fix_new
+#define tc_canonicalize_symbol_name(s) xtensa_section_rename (s)
+#define tc_init_after_args() xtensa_file_arch_init (stdoutput)
+#define tc_fix_adjustable(fix) xtensa_fix_adjustable (fix)
+#define tc_frob_label(sym) xtensa_frob_label (sym)
+#define tc_symbol_new_hook(s) xtensa_symbol_new_hook (s)
+#define md_elf_section_rename(name) xtensa_section_rename (name)
+#define md_end xtensa_end
+#define md_flush_pending_output() xtensa_flush_pending_output ()
+#define md_operand(x)
+#define TEXT_SECTION_NAME xtensa_section_rename (".text")
+#define DATA_SECTION_NAME xtensa_section_rename (".data")
+#define BSS_SECTION_NAME xtensa_section_rename (".bss")
+
+
+/* The renumber_section function must be mapped over all the sections
+ after calling xtensa_post_relax_hook. That function is static in
+ write.c so it cannot be called from xtensa_post_relax_hook itself. */
+
+#define md_post_relax_hook \
+ do \
+ { \
+ int i = 0; \
+ xtensa_post_relax_hook (); \
+ bfd_map_over_sections (stdoutput, renumber_sections, &i); \
+ } \
+ while (0)
+
+
+/* Because xtensa relaxation can insert a new literal into the middle of
+ fragment and thus require re-running the relaxation pass on the
+ section, we need an explicit flag here. We explicitly use the name
+ "stretched" here to avoid changing the source code in write.c. */
+
+#define md_relax_frag(segment, fragP, stretch) \
+ xtensa_relax_frag (fragP, stretch, &stretched)
+
+
+#define LOCAL_LABELS_FB 1
+#define WORKING_DOT_WORD 1
+#define DOUBLESLASH_LINE_COMMENTS
+#define TC_HANDLES_FX_DONE
+#define TC_FINALIZE_SYMS_BEFORE_SIZE_SEG 0
+
+#define MD_APPLY_SYM_VALUE(FIX) 0
+
+/* The default literal sections should always be marked as "code" (i.e.,
+ SHF_EXECINSTR). This is particularly important for the Linux kernel
+ module loader so that the literals are not placed after the text. */
+#define ELF_TC_SPECIAL_SECTIONS \
+ { ".literal", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, \
+ { ".init.literal", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, \
+ { ".fini.literal", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
+
+#endif /* TC_XTENSA */