Lines Matching defs:unwind

45 /* Must be at least the size of the largest unwind opcode (currently two).  */
77 } unwind;
4116 /* Directives: AEABI stack-unwind tables. */
4124 if (unwind.proc_start)
4131 unwind.proc_start = expr_build_dot ();
4133 /* Reset the rest of the unwind info. */
4134 unwind.opcode_count = 0;
4135 unwind.table_entry = NULL;
4136 unwind.personality_routine = NULL;
4137 unwind.personality_index = -1;
4138 unwind.frame_size = 0;
4139 unwind.fp_offset = 0;
4140 unwind.fp_reg = REG_SP;
4141 unwind.fp_used = 0;
4142 unwind.sp_restored = 0;
4153 if (!unwind.proc_start)
4156 if (unwind.table_entry)
4174 if (!unwind.proc_start)
4181 if (unwind.table_entry == NULL)
4187 start_unwind_section (unwind.saved_seg, 1);
4196 fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
4203 if (unwind.personality_index >= 0 && unwind.personality_index < 3
4204 && !(marked_pr_dependency & (1 << unwind.personality_index)))
4212 symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
4215 |= 1 << unwind.personality_index;
4223 fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
4227 subseg_set (unwind.saved_seg, unwind.saved_subseg);
4229 unwind.proc_start = NULL;
4239 if (!unwind.proc_start)
4242 if (unwind.personality_routine || unwind.personality_index != -1)
4245 unwind.personality_index = -2;
4256 if (!unwind.proc_start)
4259 if (unwind.personality_routine || unwind.personality_index != -1)
4272 unwind.personality_index = exp.X_add_number;
4285 if (!unwind.proc_start)
4288 if (unwind.personality_routine || unwind.personality_index != -1)
4295 unwind.personality_routine = symbol_find_or_make (name);
4323 if (unwind.sp_restored && unwind.fp_reg == 12
4326 unwind.opcode_count--;
4327 unwind.sp_restored = 0;
4329 unwind.pending_offset = 0;
4373 unwind.frame_size += 4;
4423 unwind.frame_size += num_regs * 12;
4475 unwind.frame_size += count * 8;
4512 unwind.frame_size += count * 8 + 4;
4575 unwind.frame_size += 8;
4579 likes to output separate unwind directives for a single block of
4581 if (unwind.opcode_count > 0)
4583 i = unwind.opcodes[unwind.opcode_count - 1];
4593 unwind.opcode_count--;
4596 else if (i == 6 && unwind.opcode_count >= 2)
4598 i = unwind.opcodes[unwind.opcode_count - 2];
4609 unwind.opcode_count -= 2;
4709 unwind.frame_size += 4;
4729 if (!unwind.proc_start)
4798 if (!unwind.proc_start)
4826 if (unwind.fp_reg != REG_SP)
4834 unwind.fp_reg = reg;
4835 unwind.fp_offset = unwind.frame_size - offset;
4836 unwind.sp_restored = 1;
4846 if (!unwind.proc_start)
4860 unwind.frame_size += offset;
4861 unwind.pending_offset += offset;
4875 if (!unwind.proc_start)
4902 if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4910 unwind.fp_reg = fp_reg;
4911 unwind.fp_used = 1;
4913 unwind.fp_offset = unwind.frame_size - offset;
4915 unwind.fp_offset -= offset;
4928 if (!unwind.proc_start)
4935 unwind.frame_size += exp.X_add_number;
4955 as_bad (_("unwind opcode too long"));
4960 as_bad (_("invalid unwind opcode"));
27412 /* Link an unlinked unwind index table section to the .text section. */
27432 /* Generate any deferred unwind frame offset. */
27439 offset = unwind.pending_offset;
27440 unwind.pending_offset = 0;
27453 if (unwind.pending_offset)
27456 unwind.sp_restored = 0;
27458 if (unwind.opcode_count + length > unwind.opcode_alloc)
27460 unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
27461 if (unwind.opcodes)
27462 unwind.opcodes = XRESIZEVEC (unsigned char, unwind.opcodes,
27463 unwind.opcode_alloc);
27465 unwind.opcodes = XNEWVEC (unsigned char, unwind.opcode_alloc);
27470 unwind.opcodes[unwind.opcode_count] = op & 0xff;
27472 unwind.opcode_count++;
27476 /* Add unwind opcodes to adjust the stack pointer. */
27538 /* Finish the list of unwind opcodes for this function. */
27545 if (unwind.fp_used)
27548 unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
27552 op = 0x90 | unwind.fp_reg;
27629 /* Start an unwind table entry. HAVE_DATA is nonzero if we have additional
27647 unwind.saved_seg = now_seg;
27648 unwind.saved_subseg = now_subseg;
27652 if (unwind.personality_routine == NULL)
27654 if (unwind.personality_index == -2)
27662 if (unwind.personality_index == -1)
27664 if (unwind.opcode_count > 3)
27665 unwind.personality_index = 1;
27667 unwind.personality_index = 0;
27671 if (unwind.personality_index == 0)
27673 if (unwind.opcode_count > 3)
27674 as_bad (_("too many unwind opcodes for personality routine 0"));
27681 while (unwind.opcode_count > 0)
27683 unwind.opcode_count--;
27684 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
27698 size = unwind.opcode_count - 2;
27702 /* PR 16765: Missing or misplaced unwind directives can trigger this. */
27703 if (unwind.personality_index != -1)
27705 as_bad (_("attempt to recreate an unwind entry"));
27710 size = unwind.opcode_count + 1;
27715 as_bad (_("too many unwind opcodes"));
27719 unwind.table_entry = expr_build_dot ();
27727 switch (unwind.personality_index)
27732 fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
27753 data = ((0x80 + unwind.personality_index) << 8) | size;
27764 while (unwind.opcode_count > 0)
27773 unwind.opcode_count--;
27775 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
27799 /* Initialize the DWARF-2 unwind information for this procedure. */