/* tc-or1k.c -- Assembler for the OpenRISC family.
- Copyright (C) 2001-2015 Free Software Foundation, Inc.
+ Copyright (C) 2001-2022 Free Software Foundation, Inc.
Contributed for OR32 by Johan Rydberg, jrydberg@opencores.org
This file is part of GAS, the GNU Assembler.
unsigned long or1k_machine = 0; /* default */
int
-md_parse_option (int c ATTRIBUTE_UNUSED, char * arg ATTRIBUTE_UNUSED)
+md_parse_option (int c ATTRIBUTE_UNUSED, const char * arg ATTRIBUTE_UNUSED)
{
return 0;
}
discard_rest_of_line ();
}
-static bfd_boolean nodelay = FALSE;
+static bool nodelay = false;
static void
s_nodelay (int val ATTRIBUTE_UNUSED)
{
- nodelay = TRUE;
+ nodelay = true;
}
const char or1k_comment_chars [] = ";#";
valueT
md_section_align (segT segment, valueT size)
{
- int align = bfd_get_section_alignment (stdoutput, segment);
- return ((size + (1 << align) - 1) & (-1 << align));
+ int align = bfd_section_alignment (segment);
+ return ((size + (1 << align) - 1) & -(1 << align));
}
symbolS *
type, and store the appropriate bytes in *litP. The number of LITTLENUMS
emitted is stored in *sizeP . An error message is returned, or NULL on OK. */
-/* Equal to MAX_PRECISION in atof-ieee.c. */
-#define MAX_LITTLENUMS 6
-
-char *
+const char *
md_atof (int type, char * litP, int * sizeP)
{
- return ieee_md_atof (type, litP, sizeP, TRUE);
+ return ieee_md_atof (type, litP, sizeP, true);
}
-bfd_boolean
+bool
or1k_fix_adjustable (fixS * fixP)
{
/* We need the symbol name for the VTABLE entries. */
if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
|| fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
- return FALSE;
+ return false;
- return TRUE;
+ return true;
}
#define GOT_NAME "_GLOBAL_OFFSET_TABLE_"
arelent *
-tc_gen_reloc (asection *sec, fixS *fx)
+tc_gen_reloc (asection * section, fixS * fixp)
{
- bfd_reloc_code_real_type code = fx->fx_r_type;
+ arelent *reloc;
+ bfd_reloc_code_real_type code;
+
+ reloc = XNEW (arelent);
+
+ reloc->sym_ptr_ptr = XNEW (asymbol *);
+ *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+ reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
+
+ if (fixp->fx_pcrel)
+ {
+ if (section->use_rela_p)
+ fixp->fx_offset -= md_pcrel_from_section (fixp, section);
+ else
+ fixp->fx_offset = reloc->address;
+ }
+ reloc->addend = fixp->fx_offset;
+
+ code = fixp->fx_r_type;
+ switch (code)
+ {
+ case BFD_RELOC_16:
+ if (fixp->fx_pcrel)
+ code = BFD_RELOC_16_PCREL;
+ break;
+
+ case BFD_RELOC_32:
+ if (fixp->fx_pcrel)
+ code = BFD_RELOC_32_PCREL;
+ break;
+
+ case BFD_RELOC_64:
+ if (fixp->fx_pcrel)
+ code = BFD_RELOC_64_PCREL;
+ break;
+
+ default:
+ break;
+ }
- if (fx->fx_addsy != NULL
- && strcmp (S_GET_NAME (fx->fx_addsy), GOT_NAME) == 0
- && (code == BFD_RELOC_OR1K_GOTPC_HI16
- || code == BFD_RELOC_OR1K_GOTPC_LO16))
+ reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
+ if (reloc->howto == NULL)
{
- arelent * reloc;
-
- reloc = xmalloc (sizeof (* reloc));
- reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
- *reloc->sym_ptr_ptr = symbol_get_bfdsym (fx->fx_addsy);
- reloc->address = fx->fx_frag->fr_address + fx->fx_where;
- reloc->howto = bfd_reloc_type_lookup (stdoutput, fx->fx_r_type);
- reloc->addend = fx->fx_offset;
- return reloc;
+ as_bad_where (fixp->fx_file, fixp->fx_line,
+ _
+ ("cannot represent %s relocation in this object file format"),
+ bfd_get_reloc_code_name (code));
+ return NULL;
}
- return gas_cgen_tc_gen_reloc (sec, fx);
+ return reloc;
}
void
{
case BFD_RELOC_OR1K_TLS_GD_HI16:
case BFD_RELOC_OR1K_TLS_GD_LO16:
+ case BFD_RELOC_OR1K_TLS_GD_PG21:
+ case BFD_RELOC_OR1K_TLS_GD_LO13:
case BFD_RELOC_OR1K_TLS_LDM_HI16:
case BFD_RELOC_OR1K_TLS_LDM_LO16:
+ case BFD_RELOC_OR1K_TLS_LDM_PG21:
+ case BFD_RELOC_OR1K_TLS_LDM_LO13:
case BFD_RELOC_OR1K_TLS_LDO_HI16:
case BFD_RELOC_OR1K_TLS_LDO_LO16:
case BFD_RELOC_OR1K_TLS_IE_HI16:
case BFD_RELOC_OR1K_TLS_IE_LO16:
+ case BFD_RELOC_OR1K_TLS_IE_PG21:
+ case BFD_RELOC_OR1K_TLS_IE_LO13:
case BFD_RELOC_OR1K_TLS_LE_HI16:
case BFD_RELOC_OR1K_TLS_LE_LO16:
S_SET_THREAD_LOCAL (f->fx_addsy);