-#ifdef TARGET_bfin
- case R_pcrel12_jump:
- case R_pcrel12_jump_s:
- case R_pcrel24:
- case R_pcrel24_jump_l:
- case R_pcrel24_jump_x:
- case R_pcrel24_call_x:
- case R_pcrel10:
- case R_pcrel11:
- case R_pcrel5m2:
- sym_addr += q->addend;// get the symbol addr
- sym_vma = bfd_section_vma(abs_bfd, sym_section);
- sym_addr -= q->address; // make it PC relative
- // implicitly assumes code section and symbol section are same
- break;
- case R_got:
- /* Ignore these. */
- break;
-
- case R_rimm16:
- sym_addr += q->addend;
- if(weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr))))
- continue;
- if(0xFFFF0000 & sym_addr){
- fprintf (stderr, "Relocation overflow for rN = %s\n",sym_name);
- bad_relocs++;
- }
- flat_relocs = (uint32_t *)
- (realloc (flat_relocs, (flat_reloc_count + 1) * sizeof (uint32_t)));
- if (bfin_set_reloc (flat_relocs + flat_reloc_count,
- sym_section->name, sym_name,
- (*(q->sym_ptr_ptr)),
- 0, FLAT_RELOC_PART_LO,
- section_vma + q->address))
- bad_relocs++;
- flat_reloc_count++;
- break;
-
- case R_luimm16:
- case R_huimm16:
- {
- unsigned int sp;
- unsigned int reloc_count_incr;
- unsigned int hi_lo;
-
- if (q->howto->type == R_luimm16)
- hi_lo = FLAT_RELOC_PART_LO;
- else
- hi_lo = FLAT_RELOC_PART_HI;
-
- sym_addr += q->addend;
-
- flat_relocs = (uint32_t *)
- (realloc (flat_relocs, (flat_reloc_count + 2) * sizeof (uint32_t)));
- reloc_count_incr = 1;
- if (weak_und_symbol (sym_section->name, (*(q->sym_ptr_ptr))))
- continue;
- if (0xFFFF0000 & sym_addr) {
- /* value is > 16 bits - use an extra field */
- /* see if we have already output that symbol */
- /* reloc may be addend from symbol and */
- /* we can only store 16 bit offsets */
- sp = 1;
- if ((*(q->sym_ptr_ptr))->udata.i == 0
- || flat_relocs[(*(q->sym_ptr_ptr))->udata.i] != sym_addr
- || ((*(q->sym_ptr_ptr))->udata.i & 0xFFFF0000))
- {
- reloc_count_incr = 2;
- flat_relocs[flat_reloc_count + 1] = sym_addr;
- (*(q->sym_ptr_ptr))->udata.i = flat_reloc_count + 1;
- sym_addr = 0; // indication to loader to read next
- } else{
- sym_addr = (*(q->sym_ptr_ptr))->udata.i;
- }
- } else {
- sp = 0;
- }
-
- if (bfin_set_reloc (flat_relocs + flat_reloc_count,
- sym_section->name, sym_name,
- (*(q->sym_ptr_ptr)),
- sp, hi_lo,
- section_vma + q->address))
- bad_relocs++;
- flat_reloc_count += reloc_count_incr;
- break;
- }
- case R_byte4_data:
- sym_addr += q->addend;
-
- if (weak_und_symbol (sym_section->name, *q->sym_ptr_ptr))
- continue;
-
- flat_relocs = (uint32_t *)
- (realloc (flat_relocs, (flat_reloc_count + 1) * sizeof (uint32_t)));
- if (bfin_set_reloc (flat_relocs + flat_reloc_count,
- sym_section->name, sym_name,
- (*(q->sym_ptr_ptr)),
- 2, FLAT_RELOC_PART_LO,
- section_vma + q->address))
- bad_relocs++;
-
- flat_reloc_count++;
- break;
-
-#endif //TARGET_bfin