* tc-hppa.c: General cleanups of ELF support. No more spaces
and subspaces for ELF. (GDB_DEBUG_SPACE_NAME): Delete definition for ELF. (GDB_STRINGS_SUBSPACE_NAME): Likewise. (GDB_SYMBOLS_SUBSPACE_NAME): Likewise (UNWIND_SECTION_NAME): Likewise. (space/subspace related structures): Conditionalize definitions on OBJ_SOM. (space/subspace directives and support routines): Conditionalize definitions and references/uses on OBJ_SOM. (label_symbol_struct): For ELF, track the symbol's segment. For SOM track its space. (pa_define_label, pa_undefine_label, pa_get_label): Corresponding changes. (USE_ALIASES): Kill for both SOM & ELF. (pa_def_subspaces, pa_def_spaces): Corresponding changes. (pa_space, pa_subspace): Corresponding changes. (pa_spaces_begin): Corresponding chagnes. (md_begin): Do not muck around with space/subspace stuff for OBJ_ELF. (md_apply_fix): Temporarily disable argument relocation stuff for OBJ_ELF. (tc_gen_reloc): Temporarily disable relocation generation for OBJ_ELF (pa_build_unwind_subspace): Similarly.
This commit is contained in:
parent
72b60c230f
commit
49863f82f0
2 changed files with 214 additions and 128 deletions
|
@ -1,3 +1,31 @@
|
|||
Fri Jun 18 14:34:18 1999 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* tc-hppa.c: General cleanups of ELF support. No more spaces
|
||||
and subspaces for ELF.
|
||||
(GDB_DEBUG_SPACE_NAME): Delete definition for ELF.
|
||||
(GDB_STRINGS_SUBSPACE_NAME): Likewise.
|
||||
(GDB_SYMBOLS_SUBSPACE_NAME): Likewise
|
||||
(UNWIND_SECTION_NAME): Likewise.
|
||||
(space/subspace related structures): Conditionalize definitions
|
||||
on OBJ_SOM.
|
||||
(space/subspace directives and support routines): Conditionalize
|
||||
definitions and references/uses on OBJ_SOM.
|
||||
(label_symbol_struct): For ELF, track the symbol's segment. For
|
||||
SOM track its space.
|
||||
(pa_define_label, pa_undefine_label, pa_get_label): Corresponding
|
||||
changes.
|
||||
(USE_ALIASES): Kill for both SOM & ELF.
|
||||
(pa_def_subspaces, pa_def_spaces): Corresponding changes.
|
||||
(pa_space, pa_subspace): Corresponding changes.
|
||||
(pa_spaces_begin): Corresponding chagnes.
|
||||
(md_begin): Do not muck around with space/subspace stuff for
|
||||
OBJ_ELF.
|
||||
(md_apply_fix): Temporarily disable argument relocation stuff
|
||||
for OBJ_ELF.
|
||||
(tc_gen_reloc): Temporarily disable relocation generation for
|
||||
OBJ_ELF
|
||||
(pa_build_unwind_subspace): Similarly.
|
||||
|
||||
1999-06-16 Nick Clifton <nickc@cygnus.com>
|
||||
|
||||
* config/tc-arm.c (thumb_set): New pseudo op.
|
||||
|
|
|
@ -35,16 +35,13 @@
|
|||
/* Be careful, this file includes data *declarations*. */
|
||||
#include "opcode/hppa.h"
|
||||
|
||||
#if defined (OBJ_ELF) && defined (OBJ_SOM)
|
||||
error only one of OBJ_ELF and OBJ_SOM can be defined
|
||||
#endif
|
||||
|
||||
/* A "convient" place to put object file dependencies which do
|
||||
not need to be seen outside of tc-hppa.c. */
|
||||
#ifdef OBJ_ELF
|
||||
/* Names of various debugging spaces/subspaces. */
|
||||
#define GDB_DEBUG_SPACE_NAME ".stab"
|
||||
#define GDB_STRINGS_SUBSPACE_NAME ".stabstr"
|
||||
#define GDB_SYMBOLS_SUBSPACE_NAME ".stab"
|
||||
#define UNWIND_SECTION_NAME ".PARISC.unwind"
|
||||
/* Nonzero if CODE is a fixup code needing further processing. */
|
||||
|
||||
/* Object file formats specify relocation types. */
|
||||
typedef elf32_hppa_reloc_type reloc_type;
|
||||
|
||||
|
@ -58,9 +55,6 @@ typedef elf_symbol_type obj_symbol_type;
|
|||
to store a copyright string. */
|
||||
#define obj_version obj_elf_version
|
||||
#define obj_copyright obj_elf_version
|
||||
|
||||
/* Use space aliases. */
|
||||
#define USE_ALIASES 1
|
||||
#endif
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
|
@ -77,9 +71,6 @@ typedef int reloc_type;
|
|||
#define obj_version obj_som_version
|
||||
#define obj_copyright obj_som_copyright
|
||||
|
||||
/* Do not use space aliases. */
|
||||
#define USE_ALIASES 0
|
||||
|
||||
/* How to generate a relocation. */
|
||||
#define hppa_gen_reloc_type hppa_som_gen_reloc_type
|
||||
|
||||
|
@ -268,6 +259,7 @@ struct call_desc
|
|||
unsigned int arg_count;
|
||||
};
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* This structure defines an entry in the subspace dictionary
|
||||
chain. */
|
||||
|
||||
|
@ -322,17 +314,6 @@ struct space_dictionary_chain
|
|||
|
||||
typedef struct space_dictionary_chain sd_chain_struct;
|
||||
|
||||
/* Structure for previous label tracking. Needed so that alignments,
|
||||
callinfo declarations, etc can be easily attached to a particular
|
||||
label. */
|
||||
typedef struct label_symbol_struct
|
||||
{
|
||||
symbolS *lss_label;
|
||||
sd_chain_struct *lss_space;
|
||||
struct label_symbol_struct *lss_next;
|
||||
}
|
||||
label_symbol_struct;
|
||||
|
||||
/* This structure defines attributes of the default subspace
|
||||
dictionary entries. */
|
||||
|
||||
|
@ -379,9 +360,6 @@ struct default_subspace_dict
|
|||
/* An index into the default spaces array. */
|
||||
int def_space_index;
|
||||
|
||||
/* An alias for this section (or NULL if no alias exists). */
|
||||
char *alias;
|
||||
|
||||
/* Subsegment associated with this subspace. */
|
||||
subsegT subsegment;
|
||||
};
|
||||
|
@ -412,10 +390,24 @@ struct default_space_dict
|
|||
|
||||
/* Segment associated with this space. */
|
||||
asection *segment;
|
||||
|
||||
/* An alias for this section (or NULL if no alias exists). */
|
||||
char *alias;
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Structure for previous label tracking. Needed so that alignments,
|
||||
callinfo declarations, etc can be easily attached to a particular
|
||||
label. */
|
||||
typedef struct label_symbol_struct
|
||||
{
|
||||
struct symbol *lss_label;
|
||||
#ifdef OBJ_SOM
|
||||
sd_chain_struct *lss_space;
|
||||
#endif
|
||||
#ifdef OBJ_ELF
|
||||
segT lss_segment;
|
||||
#endif
|
||||
struct label_symbol_struct *lss_next;
|
||||
}
|
||||
label_symbol_struct;
|
||||
|
||||
/* Extra information needed to perform fixups (relocations) on the PA. */
|
||||
struct hppa_fix_struct
|
||||
|
@ -462,7 +454,10 @@ struct selector_entry
|
|||
|
||||
/* Prototypes for functions local to tc-hppa.c. */
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
static void pa_check_current_space_and_subspace PARAMS ((void));
|
||||
#endif
|
||||
|
||||
static fp_operand_format pa_parse_fp_format PARAMS ((char **s));
|
||||
static void pa_cons PARAMS ((int));
|
||||
static void pa_data PARAMS ((int));
|
||||
|
@ -484,7 +479,6 @@ static int pa_parse_nonneg_cmpsub_cmpltr PARAMS ((char **, int));
|
|||
static int pa_parse_neg_cmpsub_cmpltr PARAMS ((char **, int));
|
||||
static int pa_parse_neg_add_cmpltr PARAMS ((char **, int));
|
||||
static int pa_parse_nonneg_add_cmpltr PARAMS ((char **, int));
|
||||
static void pa_align PARAMS ((int));
|
||||
static void pa_block PARAMS ((int));
|
||||
static void pa_brtab PARAMS ((int));
|
||||
static void pa_try PARAMS ((int));
|
||||
|
@ -493,9 +487,6 @@ static void pa_call_args PARAMS ((struct call_desc *));
|
|||
static void pa_callinfo PARAMS ((int));
|
||||
static void pa_code PARAMS ((int));
|
||||
static void pa_comm PARAMS ((int));
|
||||
#ifdef OBJ_SOM
|
||||
static void pa_compiler PARAMS ((int));
|
||||
#endif
|
||||
static void pa_copyright PARAMS ((int));
|
||||
static void pa_end PARAMS ((int));
|
||||
static void pa_enter PARAMS ((int));
|
||||
|
@ -511,15 +502,18 @@ static void pa_level PARAMS ((int));
|
|||
static void pa_origin PARAMS ((int));
|
||||
static void pa_proc PARAMS ((int));
|
||||
static void pa_procend PARAMS ((int));
|
||||
static void pa_space PARAMS ((int));
|
||||
static void pa_spnum PARAMS ((int));
|
||||
static void pa_subspace PARAMS ((int));
|
||||
static void pa_param PARAMS ((int));
|
||||
static void pa_undefine_label PARAMS ((void));
|
||||
static int need_pa11_opcode PARAMS ((struct pa_it *,
|
||||
struct pa_11_fp_reg_struct *));
|
||||
static int pa_parse_number PARAMS ((char **, struct pa_11_fp_reg_struct *));
|
||||
static label_symbol_struct *pa_get_label PARAMS ((void));
|
||||
#ifdef OBJ_SOM
|
||||
static void pa_compiler PARAMS ((int));
|
||||
static void pa_align PARAMS ((int));
|
||||
static void pa_space PARAMS ((int));
|
||||
static void pa_spnum PARAMS ((int));
|
||||
static void pa_subspace PARAMS ((int));
|
||||
static sd_chain_struct *create_new_space PARAMS ((char *, int, int,
|
||||
int, int, int,
|
||||
asection *, int));
|
||||
|
@ -540,6 +534,10 @@ static ssd_chain_struct *pa_subsegment_to_subspace PARAMS ((asection *,
|
|||
subsegT));
|
||||
static sd_chain_struct *pa_find_space_by_number PARAMS ((int));
|
||||
static unsigned int pa_subspace_start PARAMS ((sd_chain_struct *, int));
|
||||
static sd_chain_struct *pa_parse_space_stmt PARAMS ((char *, int));
|
||||
static int pa_next_subseg PARAMS ((sd_chain_struct *));
|
||||
static void pa_spaces_begin PARAMS ((void));
|
||||
#endif
|
||||
static void pa_ip PARAMS ((char *));
|
||||
static void fix_new_hppa PARAMS ((fragS *, int, int, symbolS *,
|
||||
long, expressionS *, int,
|
||||
|
@ -551,11 +549,8 @@ static int reg_name_search PARAMS ((char *));
|
|||
static int pa_chk_field_selector PARAMS ((char **));
|
||||
static int is_same_frag PARAMS ((fragS *, fragS *));
|
||||
static void process_exit PARAMS ((void));
|
||||
static sd_chain_struct *pa_parse_space_stmt PARAMS ((char *, int));
|
||||
static int log2 PARAMS ((int));
|
||||
static int pa_next_subseg PARAMS ((sd_chain_struct *));
|
||||
static unsigned int pa_stringer_aux PARAMS ((char *));
|
||||
static void pa_spaces_begin PARAMS ((void));
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
static void hppa_elf_mark_end_of_function PARAMS ((void));
|
||||
|
@ -564,6 +559,7 @@ static void pa_build_unwind_subspace PARAMS ((struct call_info *));
|
|||
|
||||
/* File and gloally scoped variable declarations. */
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* Root and final entry in the space chain. */
|
||||
static sd_chain_struct *space_dict_root;
|
||||
static sd_chain_struct *space_dict_last;
|
||||
|
@ -571,6 +567,7 @@ static sd_chain_struct *space_dict_last;
|
|||
/* The current space and subspace. */
|
||||
static sd_chain_struct *current_space;
|
||||
static ssd_chain_struct *current_subspace;
|
||||
#endif
|
||||
|
||||
/* Root of the call_info chain. */
|
||||
static struct call_info *call_info_root;
|
||||
|
@ -597,7 +594,12 @@ const pseudo_typeS md_pseudo_table[] =
|
|||
{
|
||||
/* align pseudo-ops on the PA specify the actual alignment requested,
|
||||
not the log2 of the requested alignment. */
|
||||
#ifdef OBJ_SOM
|
||||
{"align", pa_align, 8},
|
||||
#endif
|
||||
#ifdef OBJ_ELF
|
||||
{"align", s_align_bytes, 8},
|
||||
#endif
|
||||
{"begin_brtab", pa_brtab, 1},
|
||||
{"begin_try", pa_try, 1},
|
||||
{"block", pa_block, 1},
|
||||
|
@ -632,7 +634,9 @@ const pseudo_typeS md_pseudo_table[] =
|
|||
{"level", pa_level, 0},
|
||||
{"long", pa_cons, 4},
|
||||
{"lsym", pa_lsym, 0},
|
||||
#ifdef OBJ_SOM
|
||||
{"nsubspa", pa_subspace, 1},
|
||||
#endif
|
||||
{"octa", pa_cons, 16},
|
||||
{"org", pa_origin, 0},
|
||||
{"origin", pa_origin, 0},
|
||||
|
@ -643,11 +647,15 @@ const pseudo_typeS md_pseudo_table[] =
|
|||
{"reg", pa_equ, 1},
|
||||
{"short", pa_cons, 2},
|
||||
{"single", pa_float_cons, 'f'},
|
||||
#ifdef OBJ_SOM
|
||||
{"space", pa_space, 0},
|
||||
{"spnum", pa_spnum, 0},
|
||||
#endif
|
||||
{"string", pa_stringer, 0},
|
||||
{"stringz", pa_stringer, 1},
|
||||
#ifdef OBJ_SOM
|
||||
{"subspa", pa_subspace, 0},
|
||||
#endif
|
||||
{"text", pa_text, 0},
|
||||
{"version", pa_version, 0},
|
||||
{"word", pa_cons, 4},
|
||||
|
@ -997,6 +1005,7 @@ static const struct selector_entry selector_table[] =
|
|||
{"t", e_tsel},
|
||||
};
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* default space and subspace dictionaries */
|
||||
|
||||
#define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME
|
||||
|
@ -1014,31 +1023,23 @@ static const struct selector_entry selector_table[] =
|
|||
|
||||
static struct default_subspace_dict pa_def_subspaces[] =
|
||||
{
|
||||
{"$CODE$", 1, 1, 1, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, ".text", SUBSEG_CODE},
|
||||
{"$DATA$", 1, 1, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, ".data", SUBSEG_DATA},
|
||||
{"$LIT$", 1, 1, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, ".text", SUBSEG_LIT},
|
||||
{"$MILLICODE$", 1, 1, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, ".text", SUBSEG_MILLI},
|
||||
{"$BSS$", 1, 1, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, ".bss", SUBSEG_BSS},
|
||||
#ifdef OBJ_ELF
|
||||
{"$UNWIND$", 1, 1, 0, 0, 0, 0, 64, 0x2c, 0, 4, 0, 0, ".PARISC.unwind", SUBSEG_UNWIND},
|
||||
#endif
|
||||
{"$CODE$", 1, 1, 1, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE},
|
||||
{"$DATA$", 1, 1, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA},
|
||||
{"$LIT$", 1, 1, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT},
|
||||
{"$MILLICODE$", 1, 1, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI},
|
||||
{"$BSS$", 1, 1, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS},
|
||||
{NULL, 0, 1, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0}
|
||||
};
|
||||
|
||||
static struct default_space_dict pa_def_spaces[] =
|
||||
{
|
||||
{"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL, ".text"},
|
||||
{"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL, ".data"},
|
||||
{NULL, 0, 0, 0, 0, 0, ASEC_NULL, NULL}
|
||||
{"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL},
|
||||
{"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL},
|
||||
{NULL, 0, 0, 0, 0, 0, ASEC_NULL}
|
||||
};
|
||||
|
||||
/* Misc local definitions used by the assembler. */
|
||||
|
||||
/* Return nonzero if the string pointed to by S potentially represents
|
||||
a right or left half of a FP register */
|
||||
#define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r')
|
||||
#define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l')
|
||||
|
||||
/* These macros are used to maintain spaces/subspaces. */
|
||||
#define SPACE_DEFINED(space_chain) (space_chain)->sd_defined
|
||||
#define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined
|
||||
|
@ -1047,6 +1048,12 @@ static struct default_space_dict pa_def_spaces[] =
|
|||
|
||||
#define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined
|
||||
#define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name
|
||||
#endif
|
||||
|
||||
/* Return nonzero if the string pointed to by S potentially represents
|
||||
a right or left half of a FP register */
|
||||
#define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r')
|
||||
#define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l')
|
||||
|
||||
/* Insert FIELD into OPCODE starting at bit START. Continue pa_ip
|
||||
main loop after insertion. */
|
||||
|
@ -1100,18 +1107,6 @@ pa_check_eof ()
|
|||
as_fatal (_("Missing .procend\n"));
|
||||
}
|
||||
|
||||
/* Check to make sure we have a valid space and subspace. */
|
||||
|
||||
static void
|
||||
pa_check_current_space_and_subspace ()
|
||||
{
|
||||
if (current_space == NULL)
|
||||
as_fatal (_("Not in a space.\n"));
|
||||
|
||||
if (current_subspace == NULL)
|
||||
as_fatal (_("Not in a subspace.\n"));
|
||||
}
|
||||
|
||||
/* Returns a pointer to the label_symbol_struct for the current space.
|
||||
or NULL if no label_symbol_struct exists for the current space. */
|
||||
|
||||
|
@ -1119,13 +1114,20 @@ static label_symbol_struct *
|
|||
pa_get_label ()
|
||||
{
|
||||
label_symbol_struct *label_chain;
|
||||
sd_chain_struct *space_chain = current_space;
|
||||
|
||||
for (label_chain = label_symbols_rootp;
|
||||
label_chain;
|
||||
label_chain = label_chain->lss_next)
|
||||
if (space_chain == label_chain->lss_space && label_chain->lss_label)
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
if (current_space == label_chain->lss_space && label_chain->lss_label)
|
||||
return label_chain;
|
||||
#endif
|
||||
#ifdef OBJ_ELF
|
||||
if (now_seg == label_chain->lss_segment && label_chain->lss_label)
|
||||
return label_chain;
|
||||
#endif
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1138,7 +1140,6 @@ pa_define_label (symbol)
|
|||
symbolS *symbol;
|
||||
{
|
||||
label_symbol_struct *label_chain = pa_get_label ();
|
||||
sd_chain_struct *space_chain = current_space;
|
||||
|
||||
if (label_chain)
|
||||
label_chain->lss_label = symbol;
|
||||
|
@ -1148,7 +1149,12 @@ pa_define_label (symbol)
|
|||
label_chain
|
||||
= (label_symbol_struct *) xmalloc (sizeof (label_symbol_struct));
|
||||
label_chain->lss_label = symbol;
|
||||
label_chain->lss_space = space_chain;
|
||||
#ifdef OBJ_SOM
|
||||
label_chain->lss_space = current_space;
|
||||
#endif
|
||||
#ifdef OBJ_ELF
|
||||
label_chain->lss_segment = now_seg;
|
||||
#endif
|
||||
label_chain->lss_next = NULL;
|
||||
|
||||
if (label_symbols_rootp)
|
||||
|
@ -1166,13 +1172,19 @@ pa_undefine_label ()
|
|||
{
|
||||
label_symbol_struct *label_chain;
|
||||
label_symbol_struct *prev_label_chain = NULL;
|
||||
sd_chain_struct *space_chain = current_space;
|
||||
|
||||
for (label_chain = label_symbols_rootp;
|
||||
label_chain;
|
||||
label_chain = label_chain->lss_next)
|
||||
{
|
||||
if (space_chain == label_chain->lss_space && label_chain->lss_label)
|
||||
if (1
|
||||
#ifdef OBJ_SOM
|
||||
&& current_space == label_chain->lss_space && label_chain->lss_label
|
||||
#endif
|
||||
#ifdef OBJ_ELF
|
||||
&& now_seg == label_chain->lss_segment && label_chain->lss_label
|
||||
#endif
|
||||
)
|
||||
{
|
||||
/* Remove the label from the chain and free its memory. */
|
||||
if (prev_label_chain)
|
||||
|
@ -1306,7 +1318,9 @@ md_begin ()
|
|||
flag_readonly_data_in_text = 0;
|
||||
}
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
pa_spaces_begin ();
|
||||
#endif
|
||||
|
||||
op_hash = hash_new ();
|
||||
|
||||
|
@ -1336,9 +1350,11 @@ md_begin ()
|
|||
if (lose)
|
||||
as_fatal (_("Broken assembler. No assembly attempted."));
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* SOM will change text_section. To make sure we never put
|
||||
anything into the old one switch to the new one now. */
|
||||
subseg_set (text_section, 0);
|
||||
#endif
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
dummy_symbol = symbol_find_or_make ("L$dummy");
|
||||
|
@ -1430,8 +1446,10 @@ pa_ip (str)
|
|||
unsigned long opcode;
|
||||
struct pa_opcode *insn;
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
/* Skip to something interesting. */
|
||||
for (s = str; isupper (*s) || islower (*s) || (*s >= '0' && *s <= '3'); ++s)
|
||||
|
@ -2760,6 +2778,7 @@ tc_gen_reloc (section, fixp)
|
|||
relocs[n_relocs] = NULL;
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
#if 0
|
||||
switch (fixp->fx_r_type)
|
||||
{
|
||||
default:
|
||||
|
@ -2811,6 +2830,7 @@ tc_gen_reloc (section, fixp)
|
|||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#else /* OBJ_SOM */
|
||||
|
||||
/* Walk over reach relocation returned by the BFD backend. */
|
||||
|
@ -3080,9 +3100,11 @@ md_apply_fix (fixP, valp)
|
|||
if ((fmt == 12 || fmt == 17 || fmt == 22)
|
||||
&& fixP->fx_addsy
|
||||
&& fixP->fx_pcrel
|
||||
#ifdef OBJ_SOM
|
||||
&& !arg_reloc_stub_needed ((long) ((obj_symbol_type *)
|
||||
symbol_get_bfdsym (fixP->fx_addsy))->tc_data.ap.hppa_arg_reloc,
|
||||
hppa_fixP->fx_arg_reloc)
|
||||
#endif
|
||||
&& (((int)(*valp) > -262144 && (int)(*valp) < 262143) && fmt != 22)
|
||||
&& S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
|
||||
&& !(fixP->fx_subsy
|
||||
|
@ -4158,6 +4180,7 @@ pa_parse_neg_add_cmpltr (s, isbranch)
|
|||
return cmpltr;
|
||||
}
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* Handle an alignment directive. Special so that we can update the
|
||||
alignment of the subspace if necessary. */
|
||||
static void
|
||||
|
@ -4174,6 +4197,7 @@ pa_align (bytes)
|
|||
if (log2 (bytes) != -1)
|
||||
record_alignment (current_subspace->ssd_seg, log2 (bytes));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Handle a .BLOCK type pseudo-op. */
|
||||
|
||||
|
@ -4186,8 +4210,10 @@ pa_block (z)
|
|||
unsigned int temp_size;
|
||||
unsigned int i;
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
temp_size = get_absolute_expression ();
|
||||
|
||||
|
@ -4265,8 +4291,10 @@ static void
|
|||
pa_call (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
pa_call_args (&last_call_desc);
|
||||
demand_empty_rest_of_line ();
|
||||
|
@ -4350,6 +4378,7 @@ static void
|
|||
pa_build_unwind_subspace (call_info)
|
||||
struct call_info *call_info;
|
||||
{
|
||||
#if 0
|
||||
char *unwind;
|
||||
asection *seg, *save_seg;
|
||||
subsegT subseg, save_subseg;
|
||||
|
@ -4411,6 +4440,7 @@ pa_build_unwind_subspace (call_info)
|
|||
|
||||
/* Return back to the original segment/subsegment. */
|
||||
subseg_set (save_seg, save_subseg);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -4425,8 +4455,10 @@ pa_callinfo (unused)
|
|||
char *name, c, *p;
|
||||
int temp;
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
/* .CALLINFO must appear within a procedure definition. */
|
||||
if (!within_procedure)
|
||||
|
@ -4563,9 +4595,11 @@ static void
|
|||
pa_code (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
current_space = is_defined_space ("$TEXT$");
|
||||
current_subspace
|
||||
= pa_subsegment_to_subspace (current_space->sd_seg, 0);
|
||||
#endif
|
||||
s_text (0);
|
||||
pa_undefine_label ();
|
||||
}
|
||||
|
@ -4634,8 +4668,10 @@ static void
|
|||
pa_enter (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
as_bad (_("The .ENTER pseudo-op is not supported"));
|
||||
demand_empty_rest_of_line ();
|
||||
|
@ -4647,8 +4683,10 @@ static void
|
|||
pa_entry (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
if (!within_procedure)
|
||||
as_bad (_("Misplaced .entry. Ignored."));
|
||||
|
@ -4752,8 +4790,10 @@ static void
|
|||
pa_exit (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
if (!within_procedure)
|
||||
as_bad (_(".EXIT must appear within a procedure"));
|
||||
|
@ -4918,7 +4958,9 @@ pa_type_args (symbolP, is_export)
|
|||
name = input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name));
|
||||
#ifdef OBJ_SOM
|
||||
symbol->tc_data.ap.hppa_arg_reloc |= arg_reloc;
|
||||
#endif
|
||||
*input_line_pointer = c;
|
||||
}
|
||||
/* The return value. */
|
||||
|
@ -4930,7 +4972,9 @@ pa_type_args (symbolP, is_export)
|
|||
name = input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
arg_reloc = pa_build_arg_reloc (name);
|
||||
#ifdef OBJ_SOM
|
||||
symbol->tc_data.ap.hppa_arg_reloc |= arg_reloc;
|
||||
#endif
|
||||
*input_line_pointer = c;
|
||||
}
|
||||
/* Privelege level. */
|
||||
|
@ -4940,7 +4984,9 @@ pa_type_args (symbolP, is_export)
|
|||
*p = c;
|
||||
input_line_pointer++;
|
||||
temp = atoi (input_line_pointer);
|
||||
#ifdef OBJ_SOM
|
||||
symbol->tc_data.ap.hppa_priv_level = temp;
|
||||
#endif
|
||||
c = get_symbol_end ();
|
||||
*input_line_pointer = c;
|
||||
}
|
||||
|
@ -5045,8 +5091,10 @@ static void
|
|||
pa_leave (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
as_bad (_("The .LEAVE pseudo-op is not supported"));
|
||||
demand_empty_rest_of_line ();
|
||||
|
@ -5093,8 +5141,10 @@ static void
|
|||
pa_origin (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
s_org (0);
|
||||
pa_undefine_label ();
|
||||
|
@ -5144,8 +5194,10 @@ pa_proc (unused)
|
|||
{
|
||||
struct call_info *call_info;
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
if (within_procedure)
|
||||
as_fatal (_("Nested procedures"));
|
||||
|
@ -5211,8 +5263,10 @@ pa_procend (unused)
|
|||
int unused;
|
||||
{
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
/* If we are within a procedure definition, make sure we've
|
||||
defined a label for the procedure; handle case where the
|
||||
|
@ -5273,6 +5327,38 @@ pa_procend (unused)
|
|||
pa_undefine_label ();
|
||||
}
|
||||
|
||||
/* If VALUE is an exact power of two between zero and 2^31, then
|
||||
return log2 (VALUE). Else return -1. */
|
||||
|
||||
static int
|
||||
log2 (value)
|
||||
int value;
|
||||
{
|
||||
int shift = 0;
|
||||
|
||||
while ((1 << shift) != value && shift < 32)
|
||||
shift++;
|
||||
|
||||
if (shift >= 32)
|
||||
return -1;
|
||||
else
|
||||
return shift;
|
||||
}
|
||||
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* Check to make sure we have a valid space and subspace. */
|
||||
|
||||
static void
|
||||
pa_check_current_space_and_subspace ()
|
||||
{
|
||||
if (current_space == NULL)
|
||||
as_fatal (_("Not in a space.\n"));
|
||||
|
||||
if (current_subspace == NULL)
|
||||
as_fatal (_("Not in a subspace.\n"));
|
||||
}
|
||||
|
||||
/* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
|
||||
then create a new space entry to hold the information specified
|
||||
by the parameters to the .SPACE directive. */
|
||||
|
@ -5541,24 +5627,6 @@ pa_spnum (unused)
|
|||
demand_empty_rest_of_line ();
|
||||
}
|
||||
|
||||
/* If VALUE is an exact power of two between zero and 2^31, then
|
||||
return log2 (VALUE). Else return -1. */
|
||||
|
||||
static int
|
||||
log2 (value)
|
||||
int value;
|
||||
{
|
||||
int shift = 0;
|
||||
|
||||
while ((1 << shift) != value && shift < 32)
|
||||
shift++;
|
||||
|
||||
if (shift >= 32)
|
||||
return -1;
|
||||
else
|
||||
return shift;
|
||||
}
|
||||
|
||||
/* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
|
||||
given subspace, creating the new subspace if necessary.
|
||||
|
||||
|
@ -5569,7 +5637,7 @@ static void
|
|||
pa_subspace (create_new)
|
||||
int create_new;
|
||||
{
|
||||
char *name, *ss_name, *alias, c;
|
||||
char *name, *ss_name, c;
|
||||
char loadable, code_only, common, dup_common, zero, sort;
|
||||
int i, access, space_index, alignment, quadrant, applicable, flags;
|
||||
sd_chain_struct *space;
|
||||
|
@ -5603,7 +5671,6 @@ pa_subspace (create_new)
|
|||
space_index = ~0;
|
||||
alignment = 1;
|
||||
quadrant = 0;
|
||||
alias = NULL;
|
||||
|
||||
space = current_space;
|
||||
if (create_new)
|
||||
|
@ -5640,8 +5707,6 @@ pa_subspace (create_new)
|
|||
quadrant = pa_def_subspaces[i].quadrant;
|
||||
access = pa_def_subspaces[i].access;
|
||||
sort = pa_def_subspaces[i].sort;
|
||||
if (USE_ALIASES && pa_def_subspaces[i].alias)
|
||||
alias = pa_def_subspaces[i].alias;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
|
@ -5750,14 +5815,6 @@ pa_subspace (create_new)
|
|||
section = subseg_force_new (ss_name, 0);
|
||||
else if (ssd)
|
||||
section = ssd->ssd_seg;
|
||||
else if (alias)
|
||||
section = subseg_new (alias, 0);
|
||||
else if (!alias && USE_ALIASES)
|
||||
{
|
||||
as_warn (_("Ignoring subspace decl due to ELF BFD bugs."));
|
||||
demand_empty_rest_of_line ();
|
||||
return;
|
||||
}
|
||||
else
|
||||
section = subseg_new (ss_name, 0);
|
||||
|
||||
|
@ -5814,10 +5871,7 @@ pa_spaces_begin ()
|
|||
char *name;
|
||||
|
||||
/* Pick the right name to use for the new section. */
|
||||
if (pa_def_spaces[i].alias && USE_ALIASES)
|
||||
name = pa_def_spaces[i].alias;
|
||||
else
|
||||
name = pa_def_spaces[i].name;
|
||||
name = pa_def_spaces[i].name;
|
||||
|
||||
pa_def_spaces[i].segment = subseg_new (name, 0);
|
||||
create_new_space (pa_def_spaces[i].name, pa_def_spaces[i].spnum,
|
||||
|
@ -5837,16 +5891,8 @@ pa_spaces_begin ()
|
|||
|
||||
/* Pick the right name for the new section and pick the right
|
||||
subsegment number. */
|
||||
if (pa_def_subspaces[i].alias && USE_ALIASES)
|
||||
{
|
||||
name = pa_def_subspaces[i].alias;
|
||||
subsegment = pa_def_subspaces[i].subsegment;
|
||||
}
|
||||
else
|
||||
{
|
||||
name = pa_def_subspaces[i].name;
|
||||
subsegment = 0;
|
||||
}
|
||||
name = pa_def_subspaces[i].name;
|
||||
subsegment = 0;
|
||||
|
||||
/* Create the new section. */
|
||||
segment = subseg_new (name, subsegment);
|
||||
|
@ -5855,7 +5901,7 @@ pa_spaces_begin ()
|
|||
/* For SOM we want to replace the standard .text, .data, and .bss
|
||||
sections with our own. We also want to set BFD flags for
|
||||
all the built-in subspaces. */
|
||||
if (!strcmp (pa_def_subspaces[i].name, "$CODE$") && !USE_ALIASES)
|
||||
if (!strcmp (pa_def_subspaces[i].name, "$CODE$"))
|
||||
{
|
||||
text_section = segment;
|
||||
applicable = bfd_applicable_section_flags (stdoutput);
|
||||
|
@ -5865,7 +5911,7 @@ pa_spaces_begin ()
|
|||
| SEC_READONLY
|
||||
| SEC_HAS_CONTENTS));
|
||||
}
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$DATA$") && !USE_ALIASES)
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$DATA$"))
|
||||
{
|
||||
data_section = segment;
|
||||
applicable = bfd_applicable_section_flags (stdoutput);
|
||||
|
@ -5876,14 +5922,14 @@ pa_spaces_begin ()
|
|||
|
||||
|
||||
}
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$BSS$") && !USE_ALIASES)
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$BSS$"))
|
||||
{
|
||||
bss_section = segment;
|
||||
applicable = bfd_applicable_section_flags (stdoutput);
|
||||
bfd_set_section_flags (stdoutput, segment,
|
||||
applicable & SEC_ALLOC);
|
||||
}
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$LIT$") && !USE_ALIASES)
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$LIT$"))
|
||||
{
|
||||
applicable = bfd_applicable_section_flags (stdoutput);
|
||||
bfd_set_section_flags (stdoutput, segment,
|
||||
|
@ -5892,8 +5938,7 @@ pa_spaces_begin ()
|
|||
| SEC_READONLY
|
||||
| SEC_HAS_CONTENTS));
|
||||
}
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$")
|
||||
&& !USE_ALIASES)
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$"))
|
||||
{
|
||||
applicable = bfd_applicable_section_flags (stdoutput);
|
||||
bfd_set_section_flags (stdoutput, segment,
|
||||
|
@ -5902,7 +5947,7 @@ pa_spaces_begin ()
|
|||
| SEC_READONLY
|
||||
| SEC_HAS_CONTENTS));
|
||||
}
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$") && !USE_ALIASES)
|
||||
else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$"))
|
||||
{
|
||||
applicable = bfd_applicable_section_flags (stdoutput);
|
||||
bfd_set_section_flags (stdoutput, segment,
|
||||
|
@ -6053,7 +6098,7 @@ create_new_subspace (space, name, loadable, code_only, common,
|
|||
we'll set it to 1 which "locks-in" the subspace attributes. */
|
||||
SUBSPACE_DEFINED (chain_entry) = 0;
|
||||
|
||||
chain_entry->ssd_subseg = USE_ALIASES ? pa_next_subseg (space) : 0;
|
||||
chain_entry->ssd_subseg = 0;
|
||||
chain_entry->ssd_seg = seg;
|
||||
chain_entry->ssd_next = NULL;
|
||||
|
||||
|
@ -6272,7 +6317,6 @@ pa_subspace_start (space, quadrant)
|
|||
sd_chain_struct *space;
|
||||
int quadrant;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* FIXME. Assumes everyone puts read/write data at 0x4000000, this
|
||||
is not correct for the PA OSF1 port. */
|
||||
if ((strcmp (SPACE_NAME (space), "$PRIVATE$") == 0) && quadrant == 1)
|
||||
|
@ -6281,7 +6325,6 @@ pa_subspace_start (space, quadrant)
|
|||
return 0x40000000;
|
||||
else
|
||||
return 0;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -6294,6 +6337,7 @@ pa_next_subseg (space)
|
|||
space->sd_last_subseg++;
|
||||
return space->sd_last_subseg;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Helper function for pa_stringer. Used to find the end of
|
||||
a string. */
|
||||
|
@ -6304,8 +6348,10 @@ pa_stringer_aux (s)
|
|||
{
|
||||
unsigned int c = *s & CHAR_MASK;
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
switch (c)
|
||||
{
|
||||
|
@ -6446,9 +6492,11 @@ static void
|
|||
pa_data (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
current_space = is_defined_space ("$PRIVATE$");
|
||||
current_subspace
|
||||
= pa_subsegment_to_subspace (current_space->sd_seg, 0);
|
||||
#endif
|
||||
s_data (0);
|
||||
pa_undefine_label ();
|
||||
}
|
||||
|
@ -6469,8 +6517,10 @@ static void
|
|||
pa_fill (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
s_fill (0);
|
||||
pa_undefine_label ();
|
||||
|
@ -6482,8 +6532,10 @@ static void
|
|||
pa_lcomm (needs_align)
|
||||
int needs_align;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
s_lcomm (needs_align);
|
||||
pa_undefine_label ();
|
||||
|
@ -6495,8 +6547,10 @@ static void
|
|||
pa_lsym (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
/* We must have a valid space and subspace. */
|
||||
pa_check_current_space_and_subspace ();
|
||||
#endif
|
||||
|
||||
s_lsym (0);
|
||||
pa_undefine_label ();
|
||||
|
@ -6508,9 +6562,11 @@ static void
|
|||
pa_text (unused)
|
||||
int unused;
|
||||
{
|
||||
#ifdef OBJ_SOM
|
||||
current_space = is_defined_space ("$TEXT$");
|
||||
current_subspace
|
||||
= pa_subsegment_to_subspace (current_space->sd_seg, 0);
|
||||
#endif
|
||||
|
||||
s_text (0);
|
||||
pa_undefine_label ();
|
||||
|
@ -6627,6 +6683,7 @@ hppa_force_relocation (fixp)
|
|||
#define arg_reloc_stub_needed(CALLER, CALLEE) \
|
||||
((CALLEE) && (CALLER) && ((CALLEE) != (CALLER)))
|
||||
|
||||
#ifdef OBJ_SOM
|
||||
/* It is necessary to force PC-relative calls/jumps to have a relocation
|
||||
entry if they're going to need either a argument relocation or long
|
||||
call stub. FIXME. Can't we need the same for absolute calls? */
|
||||
|
@ -6635,6 +6692,7 @@ hppa_force_relocation (fixp)
|
|||
symbol_get_bfdsym (fixp->fx_addsy))->tc_data.ap.hppa_arg_reloc,
|
||||
hppa_fixp->fx_arg_reloc)))
|
||||
return 1;
|
||||
#endif
|
||||
distance = (fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy)
|
||||
- md_pcrel_from (fixp));
|
||||
/* Now check and see if we're going to need a long-branch stub. */
|
||||
|
|
Loading…
Reference in a new issue