| /* write.h |
| Copyright (C) 1987-2024 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 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 __write_h__ |
| #define __write_h__ |
| |
| /* This is the name of a fake symbol which will never appear in the |
| assembler output. S_IS_LOCAL detects it because of the \001. */ |
| #ifndef FAKE_LABEL_NAME |
| #define FAKE_LABEL_NAME "L0\001" |
| #endif |
| |
| /* This is a special character that is used to indicate a fake label. |
| It must be present in FAKE_LABEL_NAME, although it does not have to |
| be the first character. It must not be a character that would be |
| found in a valid symbol name. |
| |
| Also be aware that the function _bfd_elf_is_local_label_name in |
| bfd/elf.c has an implicit assumption that FAKE_LABEL_CHAR is '\001'. |
| If this is not the case then FAKE_LABEL_NAME must start with ".L" in |
| order for the function to continue working. */ |
| #ifndef FAKE_LABEL_CHAR |
| #define FAKE_LABEL_CHAR '\001' |
| #endif |
| |
| /* |
| * FixSs may be built up in any order. |
| */ |
| |
| struct fix |
| { |
| /* Next fixS in linked list, or NULL. */ |
| struct fix *fx_next; |
| |
| /* These small fields are grouped together for compactness of |
| this structure, and efficiency of access on some architectures. */ |
| |
| /* pc-relative offset adjust (only used by some CPU specific code). |
| A 4-bit field would be sufficient for most uses, except for ppc |
| which pokes an operand table index here. Bits may be stolen |
| from here should that be necessary, provided PPC_OPINDEX_MAX is |
| adjusted suitably. */ |
| int fx_pcrel_adjust : 16; |
| |
| /* How many bytes are involved? */ |
| unsigned fx_size : 8; |
| |
| /* Is this a pc-relative relocation? */ |
| unsigned fx_pcrel : 1; |
| |
| /* Has this relocation already been applied? */ |
| unsigned fx_done : 1; |
| |
| /* Suppress overflow complaints on large addends. This is used |
| in the PowerPC ELF config to allow large addends on the |
| BFD_RELOC_{LO16,HI16,HI16_S} relocations. |
| |
| @@ Can this be determined from BFD? */ |
| unsigned fx_no_overflow : 1; |
| |
| /* The value is signed when checking for overflow. */ |
| unsigned fx_signed : 1; |
| |
| /* Some bits for the CPU specific code. */ |
| unsigned fx_tcbit : 1; |
| unsigned fx_tcbit2 : 1; |
| unsigned fx_tcbit3 : 1; |
| |
| /* Spare bits. */ |
| unsigned fx_unused : 1; |
| |
| bfd_reloc_code_real_type fx_r_type; |
| |
| /* Which frag does this fix apply to? */ |
| fragS *fx_frag; |
| |
| /* The location within the frag where the fixup occurs. */ |
| unsigned long fx_where; |
| |
| /* NULL or Symbol whose value we add in. */ |
| symbolS *fx_addsy; |
| |
| /* NULL or Symbol whose value we subtract. */ |
| symbolS *fx_subsy; |
| |
| /* Absolute number we add in. */ |
| valueT fx_offset; |
| |
| /* The value of dot when the fixup expression was parsed. */ |
| addressT fx_dot_value; |
| |
| /* The frag fx_dot_value is based on. */ |
| fragS *fx_dot_frag; |
| |
| /* This field is sort of misnamed. It appears to be a sort of random |
| scratch field, for use by the back ends. The main gas code doesn't |
| do anything but initialize it to zero. The use of it does need to |
| be coordinated between the cpu and format files, though. E.g., some |
| coff targets pass the `addend' field from the cpu file via this |
| field. I don't know why the `fx_offset' field above can't be used |
| for that; investigate later and document. KR */ |
| valueT fx_addnumber; |
| |
| /* The location of the instruction which created the reloc, used |
| in error messages. */ |
| const char *fx_file; |
| unsigned fx_line; |
| |
| #ifdef USING_CGEN |
| struct { |
| /* CGEN_INSN entry for this instruction. */ |
| const struct cgen_insn *insn; |
| /* Target specific data, usually reloc number. */ |
| int opinfo; |
| /* Which ifield this fixup applies to. */ |
| struct cgen_maybe_multi_ifield * field; |
| /* is this field is the MSB field in a set? */ |
| int msb_field_p; |
| } fx_cgen; |
| #endif |
| |
| #ifdef TC_FIX_TYPE |
| /* Location where a backend can attach additional data |
| needed to perform fixups. */ |
| TC_FIX_TYPE tc_fix_data; |
| #endif |
| }; |
| |
| typedef struct fix fixS; |
| |
| struct reloc_list |
| { |
| struct reloc_list *next; |
| union |
| { |
| struct |
| { |
| symbolS *offset_sym; |
| reloc_howto_type *howto; |
| symbolS *sym; |
| bfd_vma addend; |
| } a; |
| struct |
| { |
| asection *sec; |
| asymbol *s; |
| arelent r; |
| } b; |
| } u; |
| const char *file; |
| unsigned int line; |
| }; |
| |
| extern int finalize_syms; |
| extern symbolS *abs_section_sym; |
| extern addressT dot_value; |
| extern fragS *dot_frag; |
| extern struct reloc_list* reloc_list; |
| |
| extern void append (char **, char *, unsigned long); |
| extern void record_alignment (segT, unsigned); |
| extern int get_recorded_alignment (segT); |
| extern void write_object_file (void); |
| extern long relax_frag (segT, fragS *, long); |
| extern int relax_segment (struct frag *, segT, int); |
| extern void number_to_chars_littleendian (char *, valueT, int); |
| extern void number_to_chars_bigendian (char *, valueT, int); |
| extern fixS *fix_new (fragS *, unsigned long, unsigned long, symbolS *, |
| offsetT, int, bfd_reloc_code_real_type); |
| extern fixS *fix_at_start (fragS *, unsigned long, symbolS *, |
| offsetT, int, bfd_reloc_code_real_type); |
| extern fixS *fix_new_exp (fragS *, unsigned long, unsigned long, |
| expressionS *, int, bfd_reloc_code_real_type); |
| extern void write_print_statistics (FILE *); |
| extern void as_bad_subtract (fixS *); |
| |
| #endif /* __write_h__ */ |