projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
MIPS/GAS: Correct call formatting in `can_swap_branch_p'
[deliverable/binutils-gdb.git]
/
gas
/
cgen.c
diff --git
a/gas/cgen.c
b/gas/cgen.c
index 109b086b77c1846b133d511ddbf668fe31dd0a2a..c04a92187fe8933562b71be315ec5c500257edef 100644
(file)
--- a/
gas/cgen.c
+++ b/
gas/cgen.c
@@
-1,6
+1,5
@@
/* GAS interface for targets using CGEN: Cpu tools GENerator.
/* GAS interface for targets using CGEN: Cpu tools GENerator.
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
- 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1996-2016 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
This file is part of GAS, the GNU Assembler.
@@
-18,8
+17,8
@@
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. */
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. */
-#include <setjmp.h>
#include "as.h"
#include "as.h"
+#include <setjmp.h>
#include "symcat.h"
#include "cgen-desc.h"
#include "subsegs.h"
#include "symcat.h"
#include "cgen-desc.h"
#include "subsegs.h"
@@
-38,7
+37,7
@@
static unsigned long gas_cgen_encode_addend
const unsigned long, const unsigned long, const unsigned long, \
const unsigned long);
const unsigned long, const unsigned long, const unsigned long, \
const unsigned long);
-static char * weak_operand_overflow_check
+static c
onst c
har * weak_operand_overflow_check
(const expressionS *, const CGEN_OPERAND *);
static void queue_fixup_recursively
(const expressionS *, const CGEN_OPERAND *);
static void queue_fixup_recursively
@@
-58,9
+57,7
@@
CGEN_CPU_DESC gas_cgen_cpu_desc;
??? Not currently used. */
void
??? Not currently used. */
void
-cgen_asm_record_register (name, number)
- char *name;
- int number;
+cgen_asm_record_register (char *name, int number)
{
/* Use symbol_create here instead of symbol_new so we don't try to
output registers into the object file's symbol table. */
{
/* Use symbol_create here instead of symbol_new so we don't try to
output registers into the object file's symbol table. */
@@
-103,10
+100,7
@@
gas_cgen_init_parse ()
/* Queue a fixup. */
static void
/* Queue a fixup. */
static void
-queue_fixup (opindex, opinfo, expP)
- int opindex;
- int opinfo;
- expressionS * expP;
+queue_fixup (int opindex, int opinfo, expressionS *expP)
{
/* We need to generate a fixup for this expression. */
if (num_fixups >= GAS_CGEN_MAX_FIXUPS)
{
/* We need to generate a fixup for this expression. */
if (num_fixups >= GAS_CGEN_MAX_FIXUPS)
@@
-169,8
+163,7
@@
gas_cgen_initialize_saved_fixups_array ()
}
void
}
void
-gas_cgen_save_fixups (i)
- int i;
+gas_cgen_save_fixups (int i)
{
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
{
{
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
{
@@
-185,8
+178,7
@@
gas_cgen_save_fixups (i)
}
void
}
void
-gas_cgen_restore_fixups (i)
- int i;
+gas_cgen_restore_fixups (int i)
{
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
{
{
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
{
@@
-201,8
+193,7
@@
gas_cgen_restore_fixups (i)
}
void
}
void
-gas_cgen_swap_fixups (i)
- int i;
+gas_cgen_swap_fixups (int i)
{
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
{
{
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
{
@@
-248,15
+239,9
@@
gas_cgen_swap_fixups (i)
operand type. We pick a BFD reloc type in md_apply_fix. */
fixS *
operand type. We pick a BFD reloc type in md_apply_fix. */
fixS *
-gas_cgen_record_fixup (frag, where, insn, length, operand, opinfo, symbol, offset)
- fragS * frag;
- int where;
- const CGEN_INSN * insn;
- int length;
- const CGEN_OPERAND * operand;
- int opinfo;
- symbolS * symbol;
- offsetT offset;
+gas_cgen_record_fixup (fragS *frag, int where, const CGEN_INSN *insn,
+ int length, const CGEN_OPERAND *operand, int opinfo,
+ symbolS *symbol, offsetT offset)
{
fixS *fixP;
{
fixS *fixP;
@@
-289,14
+274,9
@@
gas_cgen_record_fixup (frag, where, insn, length, operand, opinfo, symbol, offse
operand type. We pick a BFD reloc type in md_apply_fix. */
fixS *
operand type. We pick a BFD reloc type in md_apply_fix. */
fixS *
-gas_cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp)
- fragS * frag;
- int where;
- const CGEN_INSN * insn;
- int length;
- const CGEN_OPERAND * operand;
- int opinfo;
- expressionS * exp;
+gas_cgen_record_fixup_exp (fragS *frag, int where, const CGEN_INSN *insn,
+ int length, const CGEN_OPERAND *operand, int opinfo,
+ expressionS *exp)
{
fixS *fixP;
{
fixS *fixP;
@@
-345,19
+325,11
@@
static int expr_jmp_buf_p;
The resulting value is stored in VALUEP. */
const char *
The resulting value is stored in VALUEP. */
const char *
-gas_cgen_parse_operand (cd, want, strP, opindex, opinfo, resultP, valueP)
-
-#ifdef OBJ_COMPLEX_RELC
- CGEN_CPU_DESC cd;
-#else
- CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
-#endif
- enum cgen_parse_operand_type want;
- const char **strP;
- int opindex;
- int opinfo;
- enum cgen_parse_operand_result *resultP;
- bfd_vma *valueP;
+gas_cgen_parse_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+ enum cgen_parse_operand_type want, const char **strP,
+ int opindex, int opinfo,
+ enum cgen_parse_operand_result *resultP,
+ bfd_vma *valueP)
{
#ifdef __STDC__
/* These are volatile to survive the setjmp. */
{
#ifdef __STDC__
/* These are volatile to survive the setjmp. */
@@
-483,7
+455,8
@@
gas_cgen_parse_operand (cd, want, strP, opindex, opinfo, resultP, valueP)
if (operand && (operand->hw_type == HW_H_SINT))
signed_p = 1;
if (operand && (operand->hw_type == HW_H_SINT))
signed_p = 1;
- if (stmp->bsym && (stmp->bsym->section == expr_section))
+ if (stmp->bsym && (stmp->bsym->section == expr_section)
+ && ! S_IS_LOCAL (stmp))
{
if (signed_p)
stmp->bsym->flags |= BSF_SRELC;
{
if (signed_p)
stmp->bsym->flags |= BSF_SRELC;
@@
-525,8
+498,7
@@
gas_cgen_parse_operand (cd, want, strP, opindex, opinfo, resultP, valueP)
??? This could be done differently by adding code to `expression'. */
void
??? This could be done differently by adding code to `expression'. */
void
-gas_cgen_md_operand (expressionP)
- expressionS *expressionP ATTRIBUTE_UNUSED;
+gas_cgen_md_operand (expressionS *expressionP ATTRIBUTE_UNUSED)
{
/* Don't longjmp if we're not called from within cgen_parse_operand(). */
if (expr_jmp_buf_p)
{
/* Don't longjmp if we're not called from within cgen_parse_operand(). */
if (expr_jmp_buf_p)
@@
-541,12
+513,8
@@
gas_cgen_md_operand (expressionP)
The "result" is stored in RESULT if non-NULL. */
void
The "result" is stored in RESULT if non-NULL. */
void
-gas_cgen_finish_insn (insn, buf, length, relax_p, result)
- const CGEN_INSN *insn;
- CGEN_INSN_BYTES_PTR buf;
- unsigned int length;
- int relax_p;
- finished_insnS *result;
+gas_cgen_finish_insn (const CGEN_INSN *insn, CGEN_INSN_BYTES_PTR buf,
+ unsigned int length, int relax_p, finished_insnS *result)
{
int i;
int relax_operand;
{
int i;
int relax_operand;
@@
-780,7
+748,7
@@
gas_cgen_encode_addend (const unsigned long start, /* in bits */
overflow, so signal it by returning an error string. Any other case is
ambiguous, so we assume it's OK and return NULL. */
overflow, so signal it by returning an error string. Any other case is
ambiguous, so we assume it's OK and return NULL. */
-static char *
+static c
onst c
har *
weak_operand_overflow_check (const expressionS * exp,
const CGEN_OPERAND * operand)
{
weak_operand_overflow_check (const expressionS * exp,
const CGEN_OPERAND * operand)
{
@@
-868,10
+836,7
@@
make_right_shifted_expr (expressionS * exp,
should handle them all. */
void
should handle them all. */
void
-gas_cgen_md_apply_fix (fixP, valP, seg)
- fixS * fixP;
- valueT * valP;
- segT seg ATTRIBUTE_UNUSED;
+gas_cgen_md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
{
char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
valueT value = * valP;
{
char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
valueT value = * valP;
@@
-891,7
+856,6
@@
gas_cgen_md_apply_fix (fixP, valP, seg)
const CGEN_OPERAND *operand = cgen_operand_lookup_by_num (cd, opindex);
const char *errmsg;
bfd_reloc_code_real_type reloc_type;
const CGEN_OPERAND *operand = cgen_operand_lookup_by_num (cd, opindex);
const char *errmsg;
bfd_reloc_code_real_type reloc_type;
- CGEN_FIELDS *fields = alloca (CGEN_CPU_SIZEOF_FIELDS (cd));
const CGEN_INSN *insn = fixP->fx_cgen.insn;
#ifdef OBJ_COMPLEX_RELC
int start;
const CGEN_INSN *insn = fixP->fx_cgen.insn;
#ifdef OBJ_COMPLEX_RELC
int start;
@@
-927,6
+891,8
@@
gas_cgen_md_apply_fix (fixP, valP, seg)
finish the job. Testing for pcrel is a temporary hack. */
|| fixP->fx_pcrel)
{
finish the job. Testing for pcrel is a temporary hack. */
|| fixP->fx_pcrel)
{
+ CGEN_FIELDS *fields = xmalloc (CGEN_CPU_SIZEOF_FIELDS (cd));
+
CGEN_CPU_SET_FIELDS_BITSIZE (cd) (fields, CGEN_INSN_BITSIZE (insn));
CGEN_CPU_SET_VMA_OPERAND (cd) (cd, opindex, fields, (bfd_vma) value);
CGEN_CPU_SET_FIELDS_BITSIZE (cd) (fields, CGEN_INSN_BITSIZE (insn));
CGEN_CPU_SET_VMA_OPERAND (cd) (cd, opindex, fields, (bfd_vma) value);
@@
-950,6
+916,8
@@
gas_cgen_md_apply_fix (fixP, valP, seg)
#endif
if (errmsg)
as_bad_where (fixP->fx_file, fixP->fx_line, "%s", errmsg);
#endif
if (errmsg)
as_bad_where (fixP->fx_file, fixP->fx_line, "%s", errmsg);
+
+ free (fields);
}
if (fixP->fx_done)
}
if (fixP->fx_done)
@@
-1018,19
+986,40
@@
gas_cgen_md_apply_fix (fixP, valP, seg)
fixP->fx_addnumber = value;
}
fixP->fx_addnumber = value;
}
+bfd_reloc_code_real_type
+gas_cgen_pcrel_r_type (bfd_reloc_code_real_type r)
+{
+ switch (r)
+ {
+ case BFD_RELOC_8: r = BFD_RELOC_8_PCREL; break;
+ case BFD_RELOC_16: r = BFD_RELOC_16_PCREL; break;
+ case BFD_RELOC_24: r = BFD_RELOC_24_PCREL; break;
+ case BFD_RELOC_32: r = BFD_RELOC_32_PCREL; break;
+ case BFD_RELOC_64: r = BFD_RELOC_64_PCREL; break;
+ default:
+ break;
+ }
+ return r;
+}
+
/* Translate internal representation of relocation info to BFD target format.
FIXME: To what extent can we get all relevant targets to use this? */
arelent *
/* Translate internal representation of relocation info to BFD target format.
FIXME: To what extent can we get all relevant targets to use this? */
arelent *
-gas_cgen_tc_gen_reloc (section, fixP)
- asection * section ATTRIBUTE_UNUSED;
- fixS * fixP;
+gas_cgen_tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
{
{
+ bfd_reloc_code_real_type r_type = fixP->fx_r_type;
arelent *reloc;
arelent *reloc;
+
reloc = (arelent *) xmalloc (sizeof (arelent));
reloc = (arelent *) xmalloc (sizeof (arelent));
- reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
+#ifdef GAS_CGEN_PCREL_R_TYPE
+ if (fixP->fx_pcrel)
+ r_type = GAS_CGEN_PCREL_R_TYPE (r_type);
+#endif
+ reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type);
+
if (reloc->howto == (reloc_howto_type *) NULL)
{
as_bad_where (fixP->fx_file, fixP->fx_line,
if (reloc->howto == (reloc_howto_type *) NULL)
{
as_bad_where (fixP->fx_file, fixP->fx_line,
This page took
0.037452 seconds
and
4
git commands to generate.