Lines Matching defs:unwind

45 /* Must be at least the size of the largest unwind opcode (currently two).  */
77 } unwind;
4113 /* Directives: AEABI stack-unwind tables. */
4121 if (unwind.proc_start)
4128 unwind.proc_start = expr_build_dot ();
4130 /* Reset the rest of the unwind info. */
4131 unwind.opcode_count = 0;
4132 unwind.table_entry = NULL;
4133 unwind.personality_routine = NULL;
4134 unwind.personality_index = -1;
4135 unwind.frame_size = 0;
4136 unwind.fp_offset = 0;
4137 unwind.fp_reg = REG_SP;
4138 unwind.fp_used = 0;
4139 unwind.sp_restored = 0;
4150 if (!unwind.proc_start)
4153 if (unwind.table_entry)
4171 if (!unwind.proc_start)
4178 if (unwind.table_entry == NULL)
4184 start_unwind_section (unwind.saved_seg, 1);
4193 fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
4200 if (unwind.personality_index >= 0 && unwind.personality_index < 3
4201 && !(marked_pr_dependency & (1 << unwind.personality_index)))
4209 symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
4212 |= 1 << unwind.personality_index;
4220 fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
4224 subseg_set (unwind.saved_seg, unwind.saved_subseg);
4226 unwind.proc_start = NULL;
4236 if (!unwind.proc_start)
4239 if (unwind.personality_routine || unwind.personality_index != -1)
4242 unwind.personality_index = -2;
4253 if (!unwind.proc_start)
4256 if (unwind.personality_routine || unwind.personality_index != -1)
4269 unwind.personality_index = exp.X_add_number;
4282 if (!unwind.proc_start)
4285 if (unwind.personality_routine || unwind.personality_index != -1)
4292 unwind.personality_routine = symbol_find_or_make (name);
4324 if (unwind.sp_restored && unwind.fp_reg == 12
4327 unwind.opcode_count--;
4328 unwind.sp_restored = 0;
4330 unwind.pending_offset = 0;
4374 unwind.frame_size += 4;
4424 unwind.frame_size += num_regs * 12;
4476 unwind.frame_size += count * 8;
4513 unwind.frame_size += count * 8 + 4;
4576 unwind.frame_size += 8;
4580 likes to output separate unwind directives for a single block of
4582 if (unwind.opcode_count > 0)
4584 i = unwind.opcodes[unwind.opcode_count - 1];
4594 unwind.opcode_count--;
4597 else if (i == 6 && unwind.opcode_count >= 2)
4599 i = unwind.opcodes[unwind.opcode_count - 2];
4610 unwind.opcode_count -= 2;
4710 unwind.frame_size += 4;
4755 if (!unwind.proc_start)
4837 if (!unwind.proc_start)
4865 if (unwind.fp_reg != REG_SP)
4873 unwind.fp_reg = reg;
4874 unwind.fp_offset = unwind.frame_size - offset;
4875 unwind.sp_restored = 1;
4885 if (!unwind.proc_start)
4899 unwind.frame_size += offset;
4900 unwind.pending_offset += offset;
4914 if (!unwind.proc_start)
4941 if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4949 unwind.fp_reg = fp_reg;
4950 unwind.fp_used = 1;
4952 unwind.fp_offset = unwind.frame_size - offset;
4954 unwind.fp_offset -= offset;
4967 if (!unwind.proc_start)
4974 unwind.frame_size += exp.X_add_number;
4994 as_bad (_("unwind opcode too long"));
4999 as_bad (_("invalid unwind opcode"));
27537 /* Link an unlinked unwind index table section to the .text section. */
27557 /* Generate any deferred unwind frame offset. */
27564 offset = unwind.pending_offset;
27565 unwind.pending_offset = 0;
27578 if (unwind.pending_offset)
27581 unwind.sp_restored = 0;
27583 if (unwind.opcode_count + length > unwind.opcode_alloc)
27585 unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
27586 if (unwind.opcodes)
27587 unwind.opcodes = XRESIZEVEC (unsigned char, unwind.opcodes,
27588 unwind.opcode_alloc);
27590 unwind.opcodes = XNEWVEC (unsigned char, unwind.opcode_alloc);
27595 unwind.opcodes[unwind.opcode_count] = op & 0xff;
27597 unwind.opcode_count++;
27601 /* Add unwind opcodes to adjust the stack pointer. */
27663 /* Finish the list of unwind opcodes for this function. */
27670 if (unwind.fp_used)
27673 unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
27677 op = 0x90 | unwind.fp_reg;
27753 /* Start an unwind table entry. HAVE_DATA is nonzero if we have additional
27771 unwind.saved_seg = now_seg;
27772 unwind.saved_subseg = now_subseg;
27776 if (unwind.personality_routine == NULL)
27778 if (unwind.personality_index == -2)
27786 if (unwind.personality_index == -1)
27788 if (unwind.opcode_count > 3)
27789 unwind.personality_index = 1;
27791 unwind.personality_index = 0;
27795 if (unwind.personality_index == 0)
27797 if (unwind.opcode_count > 3)
27798 as_bad (_("too many unwind opcodes for personality routine 0"));
27805 while (unwind.opcode_count > 0)
27807 unwind.opcode_count--;
27808 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
27822 size = unwind.opcode_count - 2;
27826 /* PR 16765: Missing or misplaced unwind directives can trigger this. */
27827 if (unwind.personality_index != -1)
27829 as_bad (_("attempt to recreate an unwind entry"));
27834 size = unwind.opcode_count + 1;
27839 as_bad (_("too many unwind opcodes"));
27843 unwind.table_entry = expr_build_dot ();
27851 switch (unwind.personality_index)
27856 fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
27877 data = ((0x80 + unwind.personality_index) << 8) | size;
27888 while (unwind.opcode_count > 0)
27897 unwind.opcode_count--;
27899 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
27923 /* Initialize the DWARF-2 unwind information for this procedure. */