This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: assembler relaxation


Hi Nick,


Nick Clifton wrote:
Hi Nagaraju,

   case 6:
   value = (long) (target_address - (address_of_var_part  + 4)) + 4;
   value >>= 1;
   switch (opcodep[0])
   {
       case BEZ:
       //printf("BEZ 16 value = %d\n",value);
       opcodep[2] = 0x54; //emit beq, insertng its opcode
       break;
       case BNEZ:
       //printf("BNEZ 16 value = %d\n",value);
       opcodep[2] = 0x94; //emit bne, insertng its opcode
       break;
   }
   opcodep[0] = 0x7; //insert cmp instruction instead of bez
   opcodep[3] = ( value & 0xff );//insert offset
   fixp = fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol,
          fragp->fr_offset, 1, BFD_RELOC_RPINE_S8_PCREL);
   fixp->fx_pcrel_adjust = 2;
   fragp->fr_fix += 2;

OK, so at this point you are presumably expecting that:


  opcodep[0] contains the CMP instruction.
  opcodep[1] contains zero.
(Nagaraju) opcodep[1] contains the register which is to compared.
  opcodep[2] contains the BEQ or BNE instruction.
  opcodep[3] contains offset to LABEL.

Right ? But in some cases it would appear that opcodep[2] and opcodep[3] are being replaced with zeroes.
(Nagaraju) absolutely right.

Obviously some other part of the assembler is corrupting the contents of the opcodep[] array. If you have access to a debugger (eg gdb) I would suggest that you run it and place a watchpoint on opcodep[2] and opcodep[3] to see how they get corrupted.
(Nagaraju) I have kept the watchpoint at that location but no where it is getting hit.

Without knowing more, my guess would be that it is connected with how/where this opcodep[] array is declared. Is it part of a bigger structure that gets reused maybe ?
(Nagaraju) opcodep[] is pointing to fragp->fr_opcode.
it is declared in md_convert_frag
{
unsigned char *opcodep;


opcodep = fragp->fr_opcode;
....
}

Cheers Nick




Thanks,
Nagaraju


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]