* 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:
Jeff Law 1999-06-18 13:35:16 +00:00
parent 72b60c230f
commit 49863f82f0
2 changed files with 214 additions and 128 deletions

View file

@ -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> 1999-06-16 Nick Clifton <nickc@cygnus.com>
* config/tc-arm.c (thumb_set): New pseudo op. * config/tc-arm.c (thumb_set): New pseudo op.

View file

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