* som.c (som_fixup_formats): Case R_ENTRY (0xb3), set both

'T' and 'U' to grab all the unwind information.
	(som_set_reloc_info): Make 'U' unwind bits persist across
	multiple SOM relocations.  Set the addend field of an R_ENTRY
	relocation to the value in 'T'; set the addend field on an
	R_EXIT relocation to the value in 'U'.
This commit is contained in:
Jeff Law 1994-09-14 03:03:15 +00:00
parent e10639db44
commit ae880afc1b
2 changed files with 24 additions and 4 deletions

View File

@ -1,5 +1,12 @@
Tue Sep 13 17:57:00 1994 Jeff Law (law@snake.cs.utah.edu)
* som.c (som_fixup_formats): Case R_ENTRY (0xb3), set both
'T' and 'U' to grab all the unwind information.
(som_set_reloc_info): Make 'U' unwind bits persist across
multiple SOM relocations. Set the addend field of an R_ENTRY
relocation to the value in 'T'; set the addend field on an
R_EXIT relocation to the value in 'U'.
* som.h (som_symbol_type): Delete unwind field.
* som.c (som_write_fixups): For R_ENTRY fixups, get 32bits of

View File

@ -329,7 +329,8 @@ static const struct section_to_type stt[] = {
O = stack operation
R = parameter relocation bits
S = symbol index
U = 64 bits of stack unwind and frame size info (we only keep 32 bits)
T = first 32 bits of stack unwind information
U = second 32 bits of stack unwind information
V = a literal constant (usually used in the next relocation)
P = a previous relocation
@ -570,7 +571,7 @@ static const struct fixup_format som_fixup_formats[256] =
/* R_BREAKPOINT */
0, "L4=", /* 0xb2 */
/* R_ENTRY */
0, "Ui=", /* 0xb3 */
0, "Te=Ue=", /* 0xb3 */
1, "Uf=", /* 0xb4 */
/* R_ALT_ENTRY */
0, "", /* 0xb5 */
@ -3993,7 +3994,7 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count)
const struct fixup_format *fp;
char *cp;
unsigned char *save_fixup;
int variables[26], stack[20], c, v, count, prev_fixup, *sp;
int variables[26], stack[20], c, v, count, prev_fixup, *sp, saved_unwind_bits;
const int *subop;
arelent *rptr= internal_relocs;
unsigned int offset = 0;
@ -4008,6 +4009,7 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count)
memset (stack, 0, sizeof (stack));
count = 0;
prev_fixup = 0;
saved_unwind_bits = 0;
sp = stack;
while (fixup < end_fixups)
@ -4051,6 +4053,7 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count)
into D. */
var ('L') = 0;
var ('D') = fp->D;
var ('U') = saved_unwind_bits;
/* Get the opcode format. */
cp = fp->format;
@ -4160,6 +4163,11 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count)
++subop;
--subop;
break;
/* The lower 32unwind bits must be persistent. */
case 'U':
saved_unwind_bits = var ('U');
break;
default:
break;
}
@ -4183,7 +4191,12 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count)
/* Done with a single reloction. Loop back to the top. */
if (! just_count)
{
rptr->addend = var ('V');
if (som_hppa_howto_table[op].type == R_ENTRY)
rptr->addend = var ('T');
else if (som_hppa_howto_table[op].type == R_EXIT)
rptr->addend = var ('U');
else
rptr->addend = var ('V');
rptr++;
}
count++;