52 #include "gdb/sim-arm.h" 55 #include "coff/internal.h" 85 #define MSYMBOL_SET_SPECIAL(msym) \ 86 MSYMBOL_TARGET_FLAG_1 (msym) = 1 88 #define MSYMBOL_IS_SPECIAL(msym) \ 89 MSYMBOL_TARGET_FLAG_1 (msym) 204 {
"r0",
"r1",
"r2",
"r3",
205 "r4",
"r5",
"r6",
"r7",
206 "r8",
"r9",
"r10",
"r11",
207 "r12",
"sp",
"lr",
"pc",
208 "f0",
"f1",
"f2",
"f3",
209 "f4",
"f5",
"f6",
"f7",
277 #define DISPLACED_STEPPING_ARCH_VERSION 5 304 return (cpsr & t_bit) != 0;
321 return (cpsr & t_bit) != 0;
375 return map_sym->
type;
384 return map_sym->
type;
412 "displaced: check mode of %.8lx instead of %.8lx\n",
414 (
unsigned long) memaddr);
529 return (val & 0x03fffffc);
543 if (msym.minsym != NULL
551 if (strstr (
name,
"_from_thumb") != NULL)
589 #define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \ 590 ((bits ((insn1), 0, 3) << 12) \ 591 | (bits ((insn1), 10, 10) << 11) \ 592 | (bits ((insn2), 12, 14) << 8) \ 593 | bits ((insn2), 0, 7)) 597 #define EXTRACT_MOVW_MOVT_IMM_A(insn) \ 598 ((bits ((insn), 16, 19) << 12) \ 599 | bits ((insn), 0, 11)) 606 unsigned int count = imm >> 7;
614 return (imm & 0xff) | ((imm & 0xff) << 16);
616 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
618 return (imm & 0xff) | ((imm & 0xff) << 8)
619 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
622 return (0x80 | (imm & 0x7f)) << (32 - count);
631 return (insn == 0x46bd
632 || (insn & 0xff80) == 0xb000
633 || (insn & 0xfe00) == 0xbc00);
654 for (i = 0; i < 16; i++)
658 while (start < limit)
664 if ((insn & 0xfe00) == 0xb400)
674 mask = (insn & 0xff) | ((insn & 0x100) << 6);
678 if (mask & (1 << regno))
685 else if ((insn & 0xff80) == 0xb080)
687 offset = (insn & 0x7f) << 2;
696 else if ((insn & 0xf800) == 0xa800)
699 else if ((insn & 0xfe00) == 0x1c00
703 else if ((insn & 0xf800) == 0x3000
707 else if ((insn & 0xfe00) == 0x1800
711 regs[
bits (insn, 6, 8)]);
712 else if ((insn & 0xff00) == 0x4400
715 int rd = (
bit (insn, 7) << 3) +
bits (insn, 0, 2);
716 int rm =
bits (insn, 3, 6);
717 regs[rd] =
pv_add (regs[rd], regs[rm]);
719 else if ((insn & 0xff00) == 0x4600)
721 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
722 int src_reg = (insn & 0x78) >> 3;
723 regs[dst_reg] = regs[src_reg];
725 else if ((insn & 0xf800) == 0x9000)
730 int regno = (insn >> 8) & 0x7;
733 offset = (insn & 0xff) << 2;
739 stack.
store (addr, 4, regs[regno]);
741 else if ((insn & 0xf800) == 0x6000)
743 int rd =
bits (insn, 0, 2);
744 int rn =
bits (insn, 3, 5);
753 stack.
store (addr, 4, regs[rd]);
755 else if (((insn & 0xf800) == 0x7000
756 || (insn & 0xf800) == 0x8000)
760 else if ((insn & 0xf800) == 0xc800
765 else if ((insn & 0xf800) == 0x9800
766 || ((insn & 0xf800) == 0x6800
770 else if ((insn & 0xffc0) == 0x0000
771 || (insn & 0xffc0) == 0x1c00)
775 else if ((insn & 0xf800) == 0x2000)
779 else if ((insn & 0xf800) == 0x4800)
782 unsigned int constant;
785 loc = start + 4 +
bits (insn, 0, 7) * 4;
791 unsigned short inst2;
794 byte_order_for_code);
796 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
802 int j1, j2, imm1, imm2;
804 imm1 =
sbits (insn, 0, 10);
805 imm2 =
bits (inst2, 0, 10);
806 j1 =
bit (inst2, 13);
807 j2 =
bit (inst2, 11);
809 offset = ((imm1 << 12) + (imm2 << 1));
810 offset ^= ((!j2) << 22) | ((!j1) << 23);
812 nextpc = start + 4 +
offset;
814 if (
bit (inst2, 12) == 0)
815 nextpc = nextpc & 0xfffffffc;
818 bit (inst2, 12) != 0))
822 else if ((insn & 0xffd0) == 0xe900
826 pv_t addr = regs[
bits (insn, 0, 3)];
834 if (inst2 & (1 << regno))
837 stack.
store (addr, 4, regs[regno]);
841 regs[
bits (insn, 0, 3)] = addr;
844 else if ((insn & 0xff50) == 0xe940
848 int regno1 =
bits (inst2, 12, 15);
849 int regno2 =
bits (inst2, 8, 11);
850 pv_t addr = regs[
bits (insn, 0, 3)];
861 stack.
store (addr, 4, regs[regno1]);
866 regs[
bits (insn, 0, 3)] = addr;
869 else if ((insn & 0xfff0) == 0xf8c0
870 && (inst2 & 0x0c00) == 0x0c00
873 int regno =
bits (inst2, 12, 15);
874 pv_t addr = regs[
bits (insn, 0, 3)];
885 stack.
store (addr, 4, regs[regno]);
888 regs[
bits (insn, 0, 3)] = addr;
891 else if ((insn & 0xfff0) == 0xf8c0
894 int regno =
bits (inst2, 12, 15);
903 stack.
store (addr, 4, regs[regno]);
906 else if ((insn & 0xffd0) == 0xf880
911 else if ((insn & 0xffd0) == 0xf800
912 && (inst2 & 0x0d00) == 0x0c00
917 else if ((insn & 0xffd0) == 0xe890
919 && (inst2 & 0x8000) == 0x0000
925 else if ((insn & 0xffb0) == 0xe950
931 else if ((insn & 0xfff0) == 0xf850
932 && (inst2 & 0x0d00) == 0x0c00
937 else if ((insn & 0xfff0) == 0xf8d0
942 else if ((insn & 0xfbf0) == 0xf100
943 && (inst2 & 0x8000) == 0x0000)
945 unsigned int imm = ((
bits (insn, 10, 10) << 11)
946 | (
bits (inst2, 12, 14) << 8)
947 |
bits (inst2, 0, 7));
949 regs[
bits (inst2, 8, 11)]
954 else if ((insn & 0xfbf0) == 0xf200
955 && (inst2 & 0x8000) == 0x0000)
957 unsigned int imm = ((
bits (insn, 10, 10) << 11)
958 | (
bits (inst2, 12, 14) << 8)
959 |
bits (inst2, 0, 7));
961 regs[
bits (inst2, 8, 11)]
965 else if ((insn & 0xfbf0) == 0xf1a0
966 && (inst2 & 0x8000) == 0x0000)
968 unsigned int imm = ((
bits (insn, 10, 10) << 11)
969 | (
bits (inst2, 12, 14) << 8)
970 |
bits (inst2, 0, 7));
972 regs[
bits (inst2, 8, 11)]
977 else if ((insn & 0xfbf0) == 0xf2a0
978 && (inst2 & 0x8000) == 0x0000)
980 unsigned int imm = ((
bits (insn, 10, 10) << 11)
981 | (
bits (inst2, 12, 14) << 8)
982 |
bits (inst2, 0, 7));
984 regs[
bits (inst2, 8, 11)]
988 else if ((insn & 0xfbff) == 0xf04f)
990 unsigned int imm = ((
bits (insn, 10, 10) << 11)
991 | (
bits (inst2, 12, 14) << 8)
992 |
bits (inst2, 0, 7));
994 regs[
bits (inst2, 8, 11)]
998 else if ((insn & 0xfbf0) == 0xf240)
1006 else if (insn == 0xea5f
1007 && (inst2 & 0xf0f0) == 0)
1009 int dst_reg = (inst2 & 0x0f00) >> 8;
1010 int src_reg = inst2 & 0xf;
1011 regs[dst_reg] = regs[src_reg];
1014 else if ((insn & 0xff7f) == 0xf85f)
1017 unsigned int constant;
1030 else if ((insn & 0xff7f) == 0xe95f)
1033 unsigned int constant;
1058 unrecognized_pc = start;
1072 unrecognized_pc = start;
1082 if (unrecognized_pc == 0)
1083 unrecognized_pc = start;
1086 return unrecognized_pc;
1107 for (i = 0; i < 16; i++)
1111 return unrecognized_pc;
1123 unsigned int *destreg,
int *
offset)
1127 unsigned int low, high, address;
1132 unsigned short insn1
1135 if ((insn1 & 0xf800) == 0x4800)
1137 *destreg =
bits (insn1, 8, 10);
1139 address = (pc & 0xfffffffc) + 4 + (
bits (insn1, 0, 7) << 2);
1141 byte_order_for_code);
1143 else if ((insn1 & 0xfbf0) == 0xf240)
1145 unsigned short insn2
1156 if ((insn1 & 0xfbc0) == 0xf2c0)
1159 *destreg =
bits (insn2, 8, 11);
1161 address = (high << 16 | low);
1170 if ((insn & 0x0e5f0000) == 0x041f0000)
1172 address =
bits (insn, 0, 11) + pc + 8;
1174 byte_order_for_code);
1176 *destreg =
bits (insn, 12, 15);
1179 else if ((insn & 0x0ff00000) == 0x03000000)
1186 if ((insn & 0x0ff00000) == 0x03400000)
1189 *destreg =
bits (insn, 12, 15);
1191 address = (high << 16 | low);
1233 unsigned int basereg;
1248 if (stack_chk_guard.
minsym == NULL
1254 unsigned int destreg;
1259 if ((insn & 0xf800) != 0x6800)
1261 if (
bits (insn, 3, 5) != basereg)
1263 destreg =
bits (insn, 0, 2);
1266 byte_order_for_code);
1268 if ((insn & 0xf800) != 0x6000)
1270 if (destreg !=
bits (insn, 0, 2))
1275 unsigned int destreg;
1280 if ((insn & 0x0e500000) != 0x04100000)
1282 if (
bits (insn, 16, 19) != basereg)
1284 destreg =
bits (insn, 12, 15);
1287 4, byte_order_for_code);
1288 if ((insn & 0x0e500000) != 0x04000000)
1290 if (
bits (insn, 12, 15) != destreg)
1330 if (post_prologue_pc)
1341 if (post_prologue_pc
1346 return post_prologue_pc;
1348 if (post_prologue_pc != 0)
1363 post_prologue_pc, NULL);
1366 post_prologue_pc, NULL);
1368 if (analyzed_limit != post_prologue_pc)
1371 return post_prologue_pc;
1428 if (prologue_end > prologue_start + 64)
1430 prologue_end = prologue_start + 64;
1438 prologue_end = std::min (prologue_end, prev_pc);
1451 if ((insn & 0x0df0f000) == 0x0080d000
1453 || (insn & 0x0df0f000) == 0x0040d000
1455 || (insn & 0x0ffffff0) == 0x01a0d000
1457 || (insn & 0x0fff0000) == 0x08bd0000
1459 || (insn & 0x0fff0000) == 0x049d0000)
1502 for (current_pc = prologue_start;
1503 current_pc < prologue_end;
1509 if (insn == 0xe1a0c00d)
1514 else if ((insn & 0xfff00000) == 0xe2800000
1517 unsigned imm = insn & 0xff;
1518 unsigned rot = (insn & 0xf00) >> 7;
1519 int rd =
bits (insn, 12, 15);
1520 imm = (imm >> rot) | (imm << (32 - rot));
1524 else if ((insn & 0xfff00000) == 0xe2400000
1527 unsigned imm = insn & 0xff;
1528 unsigned rot = (insn & 0xf00) >> 7;
1529 int rd =
bits (insn, 12, 15);
1530 imm = (imm >> rot) | (imm << (32 - rot));
1534 else if ((insn & 0xffff0fff) == 0xe52d0004)
1541 regs[
bits (insn, 12, 15)]);
1544 else if ((insn & 0xffff0000) == 0xe92d0000)
1549 int mask = insn & 0xffff;
1556 if (mask & (1 << regno))
1563 else if ((insn & 0xffff0000) == 0xe54b0000
1564 || (insn & 0xffff00f0) == 0xe14b00b0
1565 || (insn & 0xffffc000) == 0xe50b0000)
1570 else if ((insn & 0xffff0000) == 0xe5cd0000
1571 || (insn & 0xffff00f0) == 0xe1cd00b0
1572 || (insn & 0xffffc000) == 0xe58d0000)
1577 else if ((insn & 0xfff00000) == 0xe8800000
1584 else if ((insn & 0xfffff000) == 0xe24cb000)
1586 unsigned imm = insn & 0xff;
1587 unsigned rot = (insn & 0xf00) >> 7;
1588 imm = (imm >> rot) | (imm << (32 - rot));
1591 else if ((insn & 0xfffff000) == 0xe24dd000)
1593 unsigned imm = insn & 0xff;
1594 unsigned rot = (insn & 0xf00) >> 7;
1595 imm = (imm >> rot) | (imm << (32 - rot));
1598 else if ((insn & 0xffff7fff) == 0xed6d0103
1609 else if ((insn & 0xffbf0fff) == 0xec2d0200
1613 int n_saved_fp_regs;
1614 unsigned int fp_start_reg, fp_bound_reg;
1619 if ((insn & 0x800) == 0x800)
1621 if ((insn & 0x40000) == 0x40000)
1622 n_saved_fp_regs = 3;
1624 n_saved_fp_regs = 1;
1628 if ((insn & 0x40000) == 0x40000)
1629 n_saved_fp_regs = 2;
1631 n_saved_fp_regs = 4;
1635 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1636 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
1640 regs[fp_start_reg++]);
1643 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL)
1655 else if ((insn & 0xf0000000) != 0xe0000000)
1665 else if ((insn & 0xfe500000) == 0xe8100000
1670 else if ((insn & 0xfc500000) == 0xe4100000
1674 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1686 unrecognized_pc = current_pc;
1694 if (unrecognized_pc == 0)
1695 unrecognized_pc = current_pc;
1699 int framereg, framesize;
1728 return unrecognized_pc;
1789 if (prologue_end > prologue_start + 64)
1791 prologue_end = prologue_start + 64;
1812 prologue_end = prologue_start + 64;
1816 if (prev_pc < prologue_end)
1817 prologue_end = prev_pc;
1835 if (unwound_fp == 0)
1858 if (*this_cache == NULL)
1865 return UNWIND_OUTERMOST;
1869 return UNWIND_OUTERMOST;
1871 return UNWIND_NO_REASON;
1886 if (*this_cache == NULL)
1902 static struct value *
1910 if (*this_cache == NULL)
1995 for (i = 0; i <
objfile->
obfd->section_count; i++)
2015 bfd_vma start,
size;
2019 if (start <= vma && vma < start +
size)
2045 asection *exidx, *extab;
2046 bfd_vma exidx_vma = 0, extab_vma = 0;
2047 bfd_size_type exidx_size = 0, extab_size = 0;
2048 gdb_byte *exidx_data = NULL, *extab_data = NULL;
2057 exidx = bfd_get_section_by_name (
objfile->
obfd, ELF_STRING_ARM_unwind);
2060 exidx_vma = bfd_section_vma (
objfile->
obfd, exidx);
2061 exidx_size = bfd_get_section_size (exidx);
2065 if (!bfd_get_section_contents (
objfile->
obfd, exidx,
2066 exidx_data, 0, exidx_size))
2073 extab = bfd_get_section_by_name (
objfile->
obfd,
".ARM.extab");
2076 extab_vma = bfd_section_vma (
objfile->
obfd, extab);
2077 extab_size = bfd_get_section_size (extab);
2081 if (!bfd_get_section_contents (
objfile->
obfd, extab,
2082 extab_data, 0, extab_size))
2097 for (i = 0; i < exidx_size / 8; i++)
2100 bfd_vma idx = bfd_h_get_32 (
objfile->
obfd, exidx_data + i * 8);
2101 bfd_vma val = bfd_h_get_32 (
objfile->
obfd, exidx_data + i * 8 + 4);
2102 bfd_vma
addr = 0, word = 0;
2103 int n_bytes = 0, n_words = 0;
2108 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2109 idx += exidx_vma + i * 8;
2122 else if ((val & 0xff000000) == 0x80000000)
2129 else if (!(val & 0x80000000))
2132 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2133 addr += exidx_vma + i * 8 + 4;
2135 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_size)
2138 extab_data + addr - extab_vma);
2141 if ((word & 0xff000000) == 0x80000000)
2146 else if ((word & 0xff000000) == 0x81000000
2147 || (word & 0xff000000) == 0x82000000)
2151 n_words = ((word >> 16) & 0xff);
2153 else if (!(word & 0x80000000))
2157 int gnu_personality = 0;
2160 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2168 static const char *personality[] =
2170 "__gcc_personality_v0",
2171 "__gxx_personality_v0",
2172 "__gcj_personality_v0",
2173 "__gnu_objc_personality_v0",
2180 for (k = 0; personality[k]; k++)
2182 (pc, personality[k],
objfile))
2184 gnu_personality = 1;
2193 && addr + 4 <= extab_vma + extab_size)
2196 extab_data + addr - extab_vma);
2199 n_words = ((word >> 24) & 0xff);
2207 if (addr < extab_vma || addr + 4 * n_words > extab_vma + extab_size)
2208 n_words = n_bytes = 0;
2213 if (n_bytes || n_words)
2217 n_bytes + n_words * 4 + 1);
2220 *p++ = (
gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2225 extab_data + addr - extab_vma);
2228 *p++ = (
gdb_byte) ((word >> 24) & 0xff);
2229 *p++ = (
gdb_byte) ((word >> 16) & 0xff);
2230 *p++ = (
gdb_byte) ((word >> 8) & 0xff);
2240 new_exidx_entry.
addr = idx;
2241 new_exidx_entry.
entry = entry;
2290 return map_sym->
entry;
2299 return map_sym->
entry;
2352 if ((insn & 0xc0) == 0)
2354 int offset = insn & 0x3f;
2355 vsp += (
offset << 2) + 4;
2357 else if ((insn & 0xc0) == 0x40)
2359 int offset = insn & 0x3f;
2360 vsp -= (
offset << 2) + 4;
2362 else if ((insn & 0xf0) == 0x80)
2364 int mask = ((insn & 0xf) << 8) | *entry++;
2374 for (i = 0; i < 12; i++)
2375 if (mask & (1 << i))
2385 else if ((insn & 0xf0) == 0x90)
2387 int reg = insn & 0xf;
2397 else if ((insn & 0xf0) == 0xa0)
2399 int count = insn & 0x7;
2400 int pop_lr = (insn & 0x8) != 0;
2404 for (i = 0; i <= count; i++)
2417 else if (insn == 0xb0)
2428 else if (insn == 0xb1)
2430 int mask = *entry++;
2434 if (mask == 0 || mask >= 16)
2438 for (i = 0; i < 4; i++)
2439 if (mask & (1 << i))
2445 else if (insn == 0xb2)
2452 offset |= (*entry & 0x7f) << shift;
2455 while (*entry++ & 0x80);
2457 vsp += 0x204 + (
offset << 2);
2459 else if (insn == 0xb3)
2461 int start = *entry >> 4;
2462 int count = (*entry++) & 0xf;
2466 if (start + count >= 16)
2470 for (i = 0; i <= count; i++)
2479 else if ((insn & 0xf8) == 0xb8)
2481 int count = insn & 0x7;
2485 for (i = 0; i <= count; i++)
2494 else if (insn == 0xc6)
2496 int start = *entry >> 4;
2497 int count = (*entry++) & 0xf;
2501 if (start + count >= 16)
2505 for (i = 0; i <= count; i++)
2511 else if (insn == 0xc7)
2513 int mask = *entry++;
2517 if (mask == 0 || mask >= 16)
2521 for (i = 0; i < 4; i++)
2522 if (mask & (1 << i))
2528 else if ((insn & 0xf8) == 0xc0)
2530 int count = insn & 0x7;
2534 for (i = 0; i <= count; i++)
2540 else if (insn == 0xc8)
2542 int start = *entry >> 4;
2543 int count = (*entry++) & 0xf;
2547 if (start + count >= 16)
2552 for (i = 0; i <= count; i++)
2558 else if (insn == 0xc9)
2560 int start = *entry >> 4;
2561 int count = (*entry++) & 0xf;
2565 for (i = 0; i <= count; i++)
2571 else if ((insn & 0xf8) == 0xd0)
2573 int count = insn & 0x7;
2577 for (i = 0; i <= count; i++)
2615 void **this_prologue_cache)
2619 CORE_ADDR addr_in_block, exidx_region, func_start;
2658 2, byte_order_for_code, &insn)
2659 && (insn & 0xff00) == 0xdf00 )
2667 4, byte_order_for_code, &insn)
2668 && (insn & 0x0f000000) == 0x0f000000 )
2688 if (func_start > exidx_region)
2698 *this_prologue_cache = cache;
2746 if (*this_cache == NULL)
2764 static struct value *
2766 void **this_cache,
int regnum)
2768 if (*this_cache == NULL)
2785 void **this_prologue_cache)
2856 if ((insn & 0xff80) == 0x4700)
2893 if (*this_cache == NULL)
2903 void **this_prologue_cache)
2969 cache->
prev_sp = unwound_sp + 32;
2971 && (xpsr & (1 << 9)) != 0)
2987 if (*this_cache == NULL)
2999 static struct value *
3006 if (*this_cache == NULL)
3025 void **this_prologue_cache)
3053 if (*this_cache == NULL)
3099 static struct value *
3130 _(
"Unexpected register %d"),
regnum);
3158 unsigned int insn, insn2;
3159 int found_return = 0, found_stack_adjust = 0;
3185 while (scan_pc < func_end && !found_return)
3193 if ((insn & 0xff80) == 0x4700)
3195 else if (insn == 0x46f7)
3199 if ((insn & 0xff00) == 0xbd00)
3215 else if (insn == 0xf85d
3216 && (insn2 & 0x0fff) == 0x0b04)
3218 if ((insn2 & 0xf000) == 0xf000)
3221 else if ((insn & 0xffbf) == 0xecbd
3222 && (insn2 & 0x0e00) == 0x0a00)
3240 if (pc - 4 < func_start)
3249 found_stack_adjust = 1;
3250 else if (insn == 0xe8bd)
3251 found_stack_adjust = 1;
3252 else if (insn == 0xf85d
3253 && (insn2 & 0x0fff) == 0x0b04)
3254 found_stack_adjust = 1;
3255 else if ((insn & 0xffbf) == 0xecbd
3256 && (insn2 & 0x0e00) == 0x0a00)
3257 found_stack_adjust = 1;
3259 return found_stack_adjust;
3283 if ((insn & 0x0ffffff0) == 0x012fff10)
3286 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3289 else if ((insn & 0x0fff0000) == 0x08bd0000
3290 && (insn & 0x0000c000) != 0)
3301 if (pc < func_start + 4)
3340 memcpy (si->
data, contents,
len);
3575 else if (count == 0)
3596 if (sub_count == -1)
3605 else if (count == 0)
3622 if (sub_count == -1)
3624 count = (count > sub_count ? count : sub_count);
3631 else if (count == 0)
3658 if (c <= 0 || c > 4)
3701 unsigned vfp_regs_free = (1 << 16) - 1;
3736 for (argnum = 0; argnum < nargs; argnum++)
3739 struct type *arg_type;
3740 struct type *target_type;
3742 const bfd_byte *val;
3746 int may_use_core_reg = 1;
3785 may_use_core_reg = 0;
3788 shift = unit_length / 4;
3789 mask = (1 << (shift * vfp_base_count)) - 1;
3790 for (regno = 0; regno < 16; regno += shift)
3791 if (((vfp_regs_free >> regno) & mask) == mask)
3800 vfp_regs_free &= ~(mask << regno);
3801 reg_scaled = regno / shift;
3803 for (i = 0; i < vfp_base_count; i++)
3807 if (reg_char ==
'q')
3809 val + i * unit_length);
3812 xsnprintf (name_buf,
sizeof (name_buf),
"%c%d",
3813 reg_char, reg_scaled + i);
3817 val + i * unit_length);
3831 if (nstack & (align - 1))
3838 if (may_use_core_reg
3848 && target_type != NULL
3854 bfd_byte *copy = (bfd_byte *) alloca (len);
3874 if (byte_order == BFD_ENDIAN_BIG)
3889 memset (buf, 0,
sizeof (buf));
3936 if (
flags & (1 << 0))
3938 if (
flags & (1 << 1))
3940 if (
flags & (1 << 2))
3942 if (
flags & (1 << 3))
3944 if (
flags & (1 << 4))
3972 static struct type *
3985 static struct type *
3992 struct type *t, *elem;
4024 static struct type *
4031 struct type *t, *elem;
4059 static struct type *
4069 &&
regnum >= num_regs + 32 &&
regnum < num_regs + 32 + 16)
4113 if (
reg >= 0 &&
reg <= 15)
4120 if (
reg >= 16 &&
reg <= 23)
4124 if (
reg >= 96 &&
reg <= 103)
4128 if (
reg >= 104 &&
reg <= 111)
4131 if (
reg >= 112 &&
reg <= 127)
4134 if (
reg >= 192 &&
reg <= 199)
4145 if (
reg >= 64 &&
reg <= 95)
4149 xsnprintf (name_buf,
sizeof (name_buf),
"s%d",
reg - 64);
4156 if (
reg >= 256 &&
reg <= 287)
4160 xsnprintf (name_buf,
sizeof (name_buf),
"d%d",
reg - 256);
4185 return SIM_ARM_R0_REGNUM +
reg;
4189 return SIM_ARM_FP0_REGNUM +
reg;
4193 return SIM_ARM_FPS_REGNUM +
reg;
4205 int old_len,
int new_len)
4208 int bytes_to_read = new_len - old_len;
4211 memcpy (new_buf + bytes_to_read, buf, old_len);
4225 #define MAX_IT_BLOCK_PREFIX 14 4229 #define IT_SCAN_THRESHOLD 32 4242 int i, any, last_it, last_it_count;
4264 && func_start > boundary)
4265 boundary = func_start;
4280 for (i = 0; i < buf_len; i += 2)
4283 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4316 for (i = 0; i < buf_len -
sizeof (buf) && ! definite; i += 2)
4337 buf_len = bpaddr - boundary;
4346 buf_len = bpaddr - boundary;
4357 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4362 else if (inst1 & 0x0002)
4364 else if (inst1 & 0x0004)
4378 if (last_it_count < 1)
4384 return bpaddr - buf_len + last_it;
4409 #define ARM_NOP 0xe1a00000 4410 #define THUMB_NOP 0x4600 4438 (
unsigned long) from);
4446 regno, (
unsigned long) ret);
4459 return (
ps & t_bit) == 0;
4493 else if ((val & 2) == 0)
4502 warning (
_(
"Single-stepping BX to non-word-aligned ARM instruction."));
4544 (
unsigned long) val);
4564 warning (
_(
"Instruction wrote to PC in an unexpected way when " 4565 "single-stepping"));
4570 _(
"Invalid argument to displaced_write_reg"));
4579 regno, (
unsigned long) val);
4593 uint32_t lowbit = 1;
4595 while (bitmask != 0)
4599 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
4605 mask = lowbit * 0xf;
4607 if ((insn & mask) == mask)
4625 "opcode/class '%s' unmodified\n", (
unsigned long) insn,
4635 uint16_t insn2,
const char *iname,
4640 "opcode/class '%s' unmodified\n", insn1, insn2,
4659 "opcode/class '%s' unmodified\n", insn,
4701 unsigned int rn =
bits (insn, 16, 19);
4708 (
unsigned long) insn);
4710 dsc->
modinsn[0] = insn & 0xfff0ffff;
4721 unsigned int rn =
bits (insn1, 0, 3);
4722 unsigned int u_bit =
bit (insn1, 7);
4723 int imm12 =
bits (insn2, 0, 11);
4733 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
4734 (
unsigned int) dsc->
insn_addr, u_bit ?
'+' :
'-',
4757 dsc->
modinsn[0] = insn1 & 0xfff0;
4796 unsigned int rn =
bits (insn, 16, 19);
4797 unsigned int rm =
bits (insn, 0, 3);
4805 (
unsigned long) insn);
4807 dsc->
modinsn[0] = (insn & 0xfff0fff0) | 0x1;
4824 if (dsc->
u.
ldst.writeback)
4831 int writeback,
unsigned int rn)
4846 rn_val = rn_val & 0xfffffffc;
4849 dsc->
u.
ldst.writeback = writeback;
4850 dsc->
u.
ldst.rn = rn;
4860 unsigned int rn =
bits (insn, 16, 19);
4867 "load/store insn %.8lx\n", (
unsigned long) insn);
4869 dsc->
modinsn[0] = insn & 0xfff0ffff;
4878 uint16_t insn2,
struct regcache *regs,
4881 unsigned int rn =
bits (insn1, 0, 3);
4885 "copro load/store", dsc);
4889 "load/store insn %.4x%.4x\n", insn1, insn2);
4891 dsc->
modinsn[0] = insn1 & 0xfff0;
4925 next_insn_addr |= 0x1;
4939 unsigned int cond,
int exchange,
int link,
long offset)
4951 dsc->
u.
branch.exchange = exchange;
4954 if (link && exchange)
4969 unsigned int cond =
bits (insn, 28, 31);
4970 int exchange = (cond == 0xf);
4971 int link = exchange ||
bit (insn, 24);
4976 "%.8lx\n", (exchange) ?
"blx" : (link) ?
"bl" :
"b",
4977 (
unsigned long) insn);
4981 offset = (
bits (insn, 0, 23) << 2) | (
bit (insn, 24) << 1) | 1;
4996 uint16_t insn2,
struct regcache *regs,
4999 int link =
bit (insn2, 14);
5000 int exchange = link && !
bit (insn2, 12);
5003 int j1 =
bit (insn2, 13);
5004 int j2 =
bit (insn2, 11);
5005 int s =
sbits (insn1, 10, 10);
5006 int i1 = !(j1 ^
bit (insn1, 10));
5007 int i2 = !(j2 ^
bit (insn1, 10));
5009 if (!link && !exchange)
5012 if (
bit (insn2, 12))
5026 cond =
bits (insn1, 6, 9);
5032 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
5034 (
bits (insn2, 1, 10) << 2) : (
bits (insn2, 0, 10) << 1);
5039 "%.4x %.4x with offset %.8lx\n",
5040 link ? (exchange) ?
"blx" :
"bl" :
"b",
5054 unsigned int cond = 0;
5056 unsigned short bit_12_15 =
bits (insn, 12, 15);
5059 if (bit_12_15 == 0xd)
5063 cond =
bits (insn, 8, 11);
5065 else if (bit_12_15 == 0xe)
5073 "displaced: copying b immediate insn %.4x " 5074 "with offset %d\n", insn,
offset);
5093 unsigned int cond,
unsigned int rm)
5117 unsigned int cond =
bits (insn, 28, 31);
5120 int link =
bit (insn, 5);
5121 unsigned int rm =
bits (insn, 0, 3);
5125 (
unsigned long) insn);
5138 int link =
bit (insn, 7);
5139 unsigned int rm =
bits (insn, 3, 6);
5143 (
unsigned short) insn);
5169 unsigned int rn =
bits (insn, 16, 19);
5170 unsigned int rd =
bits (insn, 12, 15);
5171 unsigned int op =
bits (insn, 21, 24);
5172 int is_mov = (op == 0xd);
5180 "%.8lx\n", is_mov ?
"move" :
"ALU",
5181 (
unsigned long) insn);
5204 dsc->
modinsn[0] = insn & 0xfff00fff;
5206 dsc->
modinsn[0] = (insn & 0xfff00fff) | 0x10000;
5215 uint16_t insn2,
struct regcache *regs,
5218 unsigned int op =
bits (insn1, 5, 8);
5219 unsigned int rn, rm, rd;
5222 rn =
bits (insn1, 0, 3);
5223 rm =
bits (insn2, 0, 3);
5224 rd =
bits (insn2, 8, 11);
5234 "ALU", insn1, insn2);
5257 dsc->
modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
5276 for (i = 0; i < 3; i++)
5285 unsigned int rd,
unsigned int rn,
unsigned int rm)
5319 unsigned int op =
bits (insn, 21, 24);
5320 int is_mov = (op == 0xd);
5327 is_mov ?
"move" :
"ALU", (
unsigned long) insn);
5330 dsc->
modinsn[0] = (insn & 0xfff00ff0) | 0x2;
5332 dsc->
modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
5346 rm =
bits (insn, 3, 6);
5347 rd = (
bit (insn, 7) << 3) |
bits (insn, 0, 2);
5354 (
unsigned short) insn);
5356 dsc->
modinsn[0] = ((insn & 0xff00) | 0x10);
5373 for (i = 0; i < 4; i++)
5382 unsigned int rd,
unsigned int rn,
unsigned int rm,
5386 ULONGEST rd_val, rn_val, rm_val, rs_val;
5402 for (i = 0; i < 4; i++)
5422 unsigned int op =
bits (insn, 21, 24);
5423 int is_mov = (op == 0xd);
5424 unsigned int rd, rn, rm, rs;
5431 "%.8lx\n", is_mov ?
"move" :
"ALU",
5432 (
unsigned long) insn);
5434 rn =
bits (insn, 16, 19);
5435 rm =
bits (insn, 0, 3);
5436 rs =
bits (insn, 8, 11);
5437 rd =
bits (insn, 12, 15);
5440 dsc->
modinsn[0] = (insn & 0xfff000f0) | 0x302;
5442 dsc->
modinsn[0] = (insn & 0xfff000f0) | 0x10302;
5455 ULONGEST rt_val, rt_val2 = 0, rn_val;
5458 if (dsc->
u.
ldst.xfersize == 8)
5463 if (dsc->
u.
ldst.xfersize > 4)
5466 if (!dsc->
u.
ldst.immed)
5470 if (dsc->
u.
ldst.writeback)
5474 if (dsc->
u.
ldst.xfersize == 8)
5487 if (dsc->
u.
ldst.xfersize > 4)
5490 if (!dsc->
u.
ldst.immed)
5492 if (!dsc->
u.
ldst.restore_r4)
5496 if (dsc->
u.
ldst.writeback)
5507 unsigned int op1 =
bits (insn, 20, 24);
5508 unsigned int op2 =
bits (insn, 5, 6);
5509 unsigned int rt =
bits (insn, 12, 15);
5510 unsigned int rn =
bits (insn, 16, 19);
5511 unsigned int rm =
bits (insn, 0, 3);
5512 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
5513 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
5514 int immed = (op1 & 0x4) != 0;
5516 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
5523 "insn %.8lx\n", unprivileged ?
"unprivileged " :
"",
5524 (
unsigned long) insn);
5526 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
5530 _(
"copy_extra_ld_st: instruction decode error"));
5539 if (bytesize[opcode] == 8)
5546 if (bytesize[opcode] == 8)
5553 dsc->
u.
ldst.xfersize = bytesize[opcode];
5554 dsc->
u.
ldst.rn = rn;
5555 dsc->
u.
ldst.immed = immed;
5556 dsc->
u.
ldst.writeback =
bit (insn, 24) == 0 ||
bit (insn, 21) != 0;
5557 dsc->
u.
ldst.restore_r4 = 0;
5563 dsc->
modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5568 dsc->
modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5580 int immed,
int writeback,
int size,
int usermode,
5581 int rt,
int rm,
int rn)
5583 ULONGEST rt_val, rn_val, rm_val = 0;
5603 dsc->
u.
ldst.rn = rn;
5604 dsc->
u.
ldst.immed = immed;
5605 dsc->
u.
ldst.writeback = writeback;
5634 uint16_t insn2,
struct regcache *regs,
5637 unsigned int u_bit =
bit (insn1, 7);
5638 unsigned int rt =
bits (insn2, 12, 15);
5639 int imm12 =
bits (insn2, 0, 11);
5644 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
5645 (
unsigned int) dsc->
insn_addr, rt, u_bit ?
'+' :
'-',
5666 pc_val = pc_val & 0xfffffffc;
5674 dsc->
u.
ldst.immed = 0;
5675 dsc->
u.
ldst.writeback = 0;
5676 dsc->
u.
ldst.restore_r4 = 0;
5690 uint16_t insn2,
struct regcache *regs,
5692 int writeback,
int immed)
5694 unsigned int rt =
bits (insn2, 12, 15);
5695 unsigned int rn =
bits (insn1, 0, 3);
5696 unsigned int rm =
bits (insn2, 0, 3);
5706 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
5707 rt, rn, insn1, insn2);
5712 dsc->
u.
ldst.restore_r4 = 0;
5719 dsc->
modinsn[0] = (insn1 & 0xfff0) | 0x2;
5720 dsc->
modinsn[1] = insn2 & 0x0fff;
5727 dsc->
modinsn[0] = (insn1 & 0xfff0) | 0x2;
5728 dsc->
modinsn[1] = (insn2 & 0x0ff0) | 0x3;
5741 int load,
int size,
int usermode)
5743 int immed = !
bit (insn, 25);
5744 int writeback = (
bit (insn, 24) == 0 ||
bit (insn, 21) != 0);
5745 unsigned int rt =
bits (insn, 12, 15);
5746 unsigned int rn =
bits (insn, 16, 19);
5747 unsigned int rm =
bits (insn, 0, 3);
5754 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
5755 load ? (
size == 1 ?
"ldrb" :
"ldr")
5756 : (
size == 1 ?
"strb" :
"str"), usermode ?
"t" :
"",
5758 (
unsigned long) insn);
5761 usermode, rt, rm, rn);
5765 dsc->
u.
ldst.restore_r4 = 0;
5771 dsc->
modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5776 dsc->
modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5781 dsc->
u.
ldst.restore_r4 = 1;
5790 dsc->
modinsn[5] = (insn & 0xfff00fff) | 0x20000;
5792 dsc->
modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
5826 int inc = dsc->
u.
block.increment;
5827 int bump_before = dsc->
u.
block.before ? (inc ? 4 : -4) : 0;
5828 int bump_after = dsc->
u.
block.before ? 0 : (inc ? 4 : -4);
5829 uint32_t regmask = dsc->
u.
block.regmask;
5830 int regno = inc ? 0 : 15;
5832 int exception_return = dsc->
u.
block.load && dsc->
u.
block.user
5833 && (regmask & 0x8000) != 0;
5843 if (exception_return)
5844 error (
_(
"Cannot single-step exception return"));
5851 "%s %s %s\n", dsc->
u.
block.load ?
"ldm" :
"stm",
5852 dsc->
u.
block.increment ?
"inc" :
"dec",
5853 dsc->
u.
block.before ?
"before" :
"after");
5860 while (regno <=
ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
5863 while (regno >= 0 && (regmask & (1 << regno)) == 0)
5866 xfer_addr += bump_before;
5871 xfer_addr += bump_after;
5873 regmask &= ~(1 << regno);
5876 if (dsc->
u.
block.writeback)
5896 if (!store_executed)
5899 if (dsc->
u.
block.increment)
5901 pc_stored_at = dsc->
u.
block.xfer_addr + 4 * transferred_regs;
5908 pc_stored_at = dsc->
u.
block.xfer_addr;
5916 offset = pc_val - stm_insn_addr;
5920 "STM instruction\n",
offset);
5941 unsigned int regs_loaded =
bitcount (mask);
5942 unsigned int num_to_shuffle = regs_loaded, clobbered;
5951 clobbered = (1 << num_to_shuffle) - 1;
5953 while (num_to_shuffle > 0)
5955 if ((mask & (1 << write_reg)) != 0)
5957 unsigned int read_reg = num_to_shuffle - 1;
5959 if (read_reg != write_reg)
5965 "loaded register r%d to r%d\n"), read_reg,
5970 "r%d already in the right place\n"),
5973 clobbered &= ~(1 << write_reg);
5982 for (write_reg = 0; clobbered != 0; write_reg++)
5984 if ((clobbered & (1 << write_reg)) != 0)
5990 "clobbered register r%d\n"), write_reg);
5991 clobbered &= ~(1 << write_reg);
5996 if (dsc->
u.
block.writeback)
6000 if (dsc->
u.
block.increment)
6001 new_rn_val += regs_loaded * 4;
6003 new_rn_val -= regs_loaded * 4;
6018 int load =
bit (insn, 20);
6019 int user =
bit (insn, 22);
6020 int increment =
bit (insn, 23);
6021 int before =
bit (insn, 24);
6022 int writeback =
bit (insn, 21);
6023 int rn =
bits (insn, 16, 19);
6032 warning (
_(
"displaced: Unpredictable LDM or STM with " 6033 "base register r15"));
6039 "%.8lx\n", (
unsigned long) insn);
6044 dsc->
u.
block.load = load;
6045 dsc->
u.
block.user = user;
6046 dsc->
u.
block.increment = increment;
6047 dsc->
u.
block.before = before;
6048 dsc->
u.
block.writeback = writeback;
6051 dsc->
u.
block.regmask = insn & 0xffff;
6055 if ((insn & 0xffff) == 0xffff)
6072 unsigned int regmask = insn & 0xffff;
6073 unsigned int num_in_list =
bitcount (regmask), new_regmask;
6076 for (i = 0; i < num_in_list; i++)
6098 new_regmask = (1 << num_in_list) - 1;
6102 "{..., pc}: original reg list %.4x, modified " 6103 "list %.4x\n"), rn, writeback ?
"!" :
"",
6104 (
int) insn & 0xffff, new_regmask);
6106 dsc->
modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
6132 int rn =
bits (insn1, 0, 3);
6133 int load =
bit (insn1, 4);
6134 int writeback =
bit (insn1, 5);
6143 warning (
_(
"displaced: Unpredictable LDM or STM with " 6144 "base register r15"));
6146 "unpredictable ldm/stm", dsc);
6151 "%.4x%.4x\n", insn1, insn2);
6154 dsc->
u.
block.regmask = (insn2 & 0xdfff);
6157 dsc->
u.
block.load = load;
6159 dsc->
u.
block.increment =
bit (insn1, 7);
6161 dsc->
u.
block.writeback = writeback;
6167 if (dsc->
u.
block.regmask == 0xffff)
6174 unsigned int regmask = dsc->
u.
block.regmask;
6175 unsigned int num_in_list =
bitcount (regmask), new_regmask;
6178 for (i = 0; i < num_in_list; i++)
6184 new_regmask = (1 << num_in_list) - 1;
6188 "{..., pc}: original reg list %.4x, modified " 6189 "list %.4x\n"), rn, writeback ?
"!" :
"",
6190 (
int) dsc->
u.
block.regmask, new_regmask);
6193 dsc->
modinsn[1] = (new_regmask & 0xffff);
6217 (
enum bfd_endian) byte_order);
6250 std::vector<CORE_ADDR>
6282 "%.8lx\n", (
unsigned long) resume_addr);
6303 if (dsc->
u.
svc.copy_svc_os)
6304 return dsc->
u.
svc.copy_svc_os (
gdbarch, regs, dsc);
6319 (
unsigned long) insn);
6348 "displaced: copying undefined insn %.8lx\n",
6349 (
unsigned long) insn);
6363 "%.4x %.4x\n", (
unsigned short) insn1,
6364 (
unsigned short) insn2);
6381 "%.8lx\n", (
unsigned long) insn);
6396 unsigned int op1 =
bits (insn, 20, 26), op2 =
bits (insn, 4, 7);
6397 unsigned int rn =
bits (insn, 16, 19);
6399 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0x1) == 0x0)
6401 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0x1) == 0x1)
6403 else if ((op1 & 0x60) == 0x20)
6405 else if ((op1 & 0x71) == 0x40)
6408 else if ((op1 & 0x77) == 0x41)
6410 else if ((op1 & 0x77) == 0x45)
6412 else if ((op1 & 0x77) == 0x51)
6419 else if ((op1 & 0x77) == 0x55)
6421 else if (op1 == 0x57)
6430 else if ((op1 & 0x63) == 0x43)
6432 else if ((op2 & 0x1) == 0x0)
6433 switch (op1 & ~0x80)
6439 case 0x71:
case 0x75:
6442 case 0x63:
case 0x67:
case 0x73:
case 0x77:
6456 if (
bit (insn, 27) == 0)
6459 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
6467 case 0x4:
case 0x5:
case 0x6:
case 0x7:
6471 switch ((insn & 0xe00000) >> 21)
6473 case 0x1:
case 0x3:
case 0x4:
case 0x5:
case 0x6:
case 0x7:
6486 int rn_f = (
bits (insn, 16, 19) == 0xf);
6487 switch ((insn & 0xe00000) >> 21)
6497 case 0x4:
case 0x5:
case 0x6:
case 0x7:
6511 if (
bits (insn, 16, 19) == 0xf)
6541 unsigned int op2 =
bits (insn, 4, 6);
6542 unsigned int op =
bits (insn, 21, 22);
6592 switch (
bits (insn, 20, 24))
6600 case 0x12:
case 0x16:
6608 uint32_t op1 =
bits (insn, 20, 24), op2 =
bits (insn, 4, 7);
6610 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
6612 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
6614 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
6616 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
6618 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
6620 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
6622 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
6637 int a =
bit (insn, 25), b =
bit (insn, 4);
6638 uint32_t op1 =
bits (insn, 20, 24);
6640 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
6641 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
6643 else if ((!a && (op1 & 0x17) == 0x02)
6644 || (a && (op1 & 0x17) == 0x02 && !b))
6646 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
6647 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
6649 else if ((!a && (op1 & 0x17) == 0x03)
6650 || (a && (op1 & 0x17) == 0x03 && !b))
6652 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
6653 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
6655 else if ((!a && (op1 & 0x17) == 0x06)
6656 || (a && (op1 & 0x17) == 0x06 && !b))
6658 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
6659 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
6661 else if ((!a && (op1 & 0x17) == 0x07)
6662 || (a && (op1 & 0x17) == 0x07 && !b))
6673 switch (
bits (insn, 20, 24))
6675 case 0x00:
case 0x01:
case 0x02:
case 0x03:
6678 case 0x04:
case 0x05:
case 0x06:
case 0x07:
6681 case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
6682 case 0x0c:
case 0x0d:
case 0x0e:
case 0x0f:
6684 "decode/pack/unpack/saturate/reverse", dsc);
6687 if (
bits (insn, 5, 7) == 0)
6689 if (
bits (insn, 12, 15) == 0xf)
6697 case 0x1a:
case 0x1b:
6698 if (
bits (insn, 5, 6) == 0x2)
6703 case 0x1c:
case 0x1d:
6704 if (
bits (insn, 5, 6) == 0x0)
6706 if (
bits (insn, 0, 3) == 0xf)
6714 case 0x1e:
case 0x1f:
6715 if (
bits (insn, 5, 6) == 0x2)
6741 unsigned int opcode =
bits (insn, 20, 24);
6745 case 0x04:
case 0x05:
6748 case 0x08:
case 0x0a:
case 0x0c:
case 0x0e:
6749 case 0x12:
case 0x16:
6752 case 0x09:
case 0x0b:
case 0x0d:
case 0x0f:
6753 case 0x13:
case 0x17:
6756 case 0x10:
case 0x14:
case 0x18:
case 0x1c:
6757 case 0x11:
case 0x15:
case 0x19:
case 0x1d:
6771 uint16_t insn2,
struct regcache *regs,
6776 unsigned int op =
bits (insn1, 5, 8);
6777 unsigned int rn =
bits (insn1, 0, 3);
6779 if (op == 0x2 && rn == 0xf)
6783 "dp (shift reg)", dsc);
6792 uint16_t insn2,
struct regcache *regs,
6795 unsigned int opcode =
bits (insn1, 4, 8);
6799 case 0x04:
case 0x05:
6801 "vfp/neon vmov", dsc);
6803 case 0x08:
case 0x0c:
6804 case 0x0a:
case 0x0e:
6805 case 0x12:
case 0x16:
6807 "vfp/neon vstm/vpush", dsc);
6809 case 0x09:
case 0x0d:
6810 case 0x0b:
case 0x0f:
6811 case 0x13:
case 0x17:
6813 "vfp/neon vldm/vpop", dsc);
6815 case 0x10:
case 0x14:
case 0x18:
case 0x1c:
6818 case 0x11:
case 0x15:
case 0x19:
case 0x1d:
6830 unsigned int op1 =
bits (insn, 20, 25);
6831 int op =
bit (insn, 4);
6832 unsigned int coproc =
bits (insn, 8, 11);
6834 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
6836 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
6837 && (coproc & 0xe) != 0xa)
6840 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
6841 && (coproc & 0xe) != 0xa)
6844 else if ((op1 & 0x3e) == 0x00)
6846 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
6848 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
6850 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
6852 else if ((op1 & 0x30) == 0x20 && !op)
6854 if ((coproc & 0xe) == 0xa)
6859 else if ((op1 & 0x30) == 0x20 && op)
6861 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
6863 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
6865 else if ((op1 & 0x30) == 0x30)
6873 uint16_t insn2,
struct regcache *regs,
6876 unsigned int coproc =
bits (insn2, 8, 11);
6877 unsigned int bit_5_8 =
bits (insn1, 5, 8);
6878 unsigned int bit_9 =
bit (insn1, 9);
6879 unsigned int bit_4 =
bit (insn1, 4);
6885 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
6887 else if (bit_5_8 == 0)
6892 if ((coproc & 0xe) == 0xa)
6933 int rd,
unsigned int imm)
6937 dsc->
modinsn[0] = (0x3000 | (rd << 8) | imm);
6949 unsigned int rd =
bits (insn, 8, 10);
6950 unsigned int imm8 =
bits (insn, 0, 7);
6954 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
6962 uint16_t insn2,
struct regcache *regs,
6965 unsigned int rd =
bits (insn2, 8, 11);
6970 unsigned int imm_3_8 = insn2 & 0x70ff;
6971 unsigned int imm_i = insn1 & 0x0400;
6975 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
6976 rd, imm_i, imm_3_8, insn1, insn2);
6981 dsc->
modinsn[0] = (0xf1a0 | rd | imm_i);
6982 dsc->
modinsn[1] = ((rd << 8) | imm_3_8);
6987 dsc->
modinsn[0] = (0xf100 | rd | imm_i);
6988 dsc->
modinsn[1] = ((rd << 8) | imm_3_8);
7002 unsigned int rt =
bits (insn1, 8, 10);
7004 int imm8 = (
bits (insn1, 0, 7) << 2);
7017 "displaced: copying thumb ldr r%d [pc #%d]\n" 7026 pc = pc & 0xfffffffc;
7032 dsc->
u.
ldst.xfersize = 4;
7034 dsc->
u.
ldst.immed = 0;
7035 dsc->
u.
ldst.writeback = 0;
7036 dsc->
u.
ldst.restore_r4 = 0;
7052 int non_zero =
bit (insn1, 11);
7053 unsigned int imm5 = (
bit (insn1, 9) << 6) | (
bits (insn1, 3, 7) << 1);
7055 int rn =
bits (insn1, 0, 2);
7058 dsc->
u.
branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
7065 dsc->
u.
branch.dest = from + 4 + imm5;
7068 dsc->
u.
branch.dest = from + 2;
7075 " insn %.4x to %.8lx\n", non_zero ?
"cbnz" :
"cbz",
7076 rn, rn_val, insn1, dsc->
u.
branch.dest);
7087 uint16_t insn2,
struct regcache *regs,
7091 int is_tbh =
bit (insn2, 4);
7115 " offset 0x%x\n", is_tbh ?
"tbh" :
"tbb",
7116 (
unsigned int) rn_val, (
unsigned int) rm_val,
7117 (
unsigned int) halfwords);
7151 dsc->
u.
block.regmask = insn1 & 0x00ff;
7176 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
7177 dsc->
u.
block.regmask, insn1);
7179 if (dsc->
u.
block.regmask == 0xff)
7183 dsc->
modinsn[0] = (insn1 & 0xfeff);
7194 unsigned int new_regmask;
7196 for (i = 0; i < num_in_list + 1; i++)
7199 new_regmask = (1 << (num_in_list + 1)) - 1;
7203 "{..., pc}: original reg list %.4x," 7204 " modified list %.4x\n"),
7205 (
int) dsc->
u.
block.regmask, new_regmask);
7207 dsc->
u.
block.regmask |= 0x8000;
7208 dsc->
u.
block.writeback = 0;
7211 dsc->
modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
7224 unsigned short op_bit_12_15 =
bits (insn1, 12, 15);
7225 unsigned short op_bit_10_11 =
bits (insn1, 10, 11);
7229 switch (op_bit_12_15)
7232 case 0:
case 1:
case 2:
case 3:
7234 "shift/add/sub/mov/cmp",
7238 switch (op_bit_10_11)
7247 unsigned short op =
bits (insn1, 7, 9);
7248 if (op == 6 || op == 7)
7250 else if (
bits (insn1, 6, 7) != 0)
7261 case 5:
case 6:
case 7:
case 8:
case 9:
7265 if (op_bit_10_11 < 2)
7272 switch (
bits (insn1, 8, 11))
7274 case 1:
case 3:
case 9:
case 11:
7284 if (
bits (insn1, 0, 3))
7299 if (op_bit_10_11 < 2)
7305 if (
bits (insn1, 9, 11) != 7)
7319 _(
"thumb_process_displaced_16bit_insn: Instruction decode error"));
7324 uint16_t insn1, uint16_t insn2,
7328 int rt =
bits (insn2, 12, 15);
7329 int rn =
bits (insn1, 0, 3);
7330 int op1 =
bits (insn1, 7, 8);
7332 switch (
bits (insn1, 5, 6))
7351 "ldrb{reg, immediate}/ldrbt",
7359 "pld/unalloc memhint", dsc);
7372 int insn2_bit_8_11 =
bits (insn2, 8, 11);
7376 else if (op1 == 0x1)
7381 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
7384 dsc,
bit (insn2, 8), 1);
7385 else if (insn2_bit_8_11 == 0xe)
7404 uint16_t insn2,
struct regcache *regs,
7408 unsigned short op =
bit (insn2, 15);
7409 unsigned int op1 =
bits (insn1, 11, 12);
7415 switch (
bits (insn1, 9, 10))
7421 if (
bits (insn1, 7, 8) == 1 &&
bits (insn1, 4, 5) == 1
7422 &&
bits (insn2, 5, 7) == 0)
7429 "load/store dual/ex", dsc);
7433 switch (
bits (insn1, 7, 8))
7462 || (
bits (insn1, 7, 9) != 0x7))
7472 int op =
bits (insn1, 4, 8);
7473 int rn =
bits (insn1, 0, 3);
7474 if ((op == 0 || op == 0xa) && rn == 0xf)
7487 switch (
bits (insn1, 9, 10))
7495 "neon elt/struct load/store",
7499 switch (
bits (insn1, 7, 8))
7507 "mul/mua/diff", dsc);
7526 _(
"thumb_process_displaced_32bit_insn: Instruction decode error"));
7541 "at %.8lx\n", insn1, (
unsigned long) from);
7580 "at %.8lx\n", (
unsigned long) insn,
7581 (
unsigned long) from);
7583 if ((insn & 0xf0000000) == 0xf0000000)
7585 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
7587 case 0x0:
case 0x1:
case 0x2:
case 0x3:
7591 case 0x4:
case 0x5:
case 0x6:
7599 case 0x8:
case 0x9:
case 0xa:
case 0xb:
7603 case 0xc:
case 0xd:
case 0xe:
case 0xf:
7610 _(
"arm_process_displaced_insn: Instruction decode error"));
7620 unsigned int i, len,
offset;
7627 for (i = 0; i < dsc->
numinsns; i++)
7637 (
unsigned short)dsc->
modinsn[i]);
7640 (
unsigned long) to +
offset);
7644 byte_order_for_code,
7689 #include "bfd-in2.h" 7690 #include "libcoff.h" 7701 static asymbol *asym;
7702 static combined_entry_type ce;
7703 static struct coff_symbol_struct csym;
7704 static struct bfd fake_bfd;
7705 static bfd_target fake_target;
7707 if (csym.native == NULL)
7715 fake_target.flavour = bfd_target_coff_flavour;
7716 fake_bfd.xvec = &fake_target;
7717 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
7719 csym.symbol.the_bfd = &fake_bfd;
7720 csym.symbol.name =
"fake";
7721 asym = (asymbol *) & csym;
7725 info->symbols = &asym;
7728 info->symbols = NULL;
7736 info->flags |= USER_SPECIFIED_MACHINE_TYPE;
7770 #define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7} 7771 #define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE} 7772 #define THUMB_LE_BREAKPOINT {0xbe,0xbe} 7773 #define THUMB_BE_BREAKPOINT {0xbe,0xbe} 7800 unsigned short inst1;
7923 _(
"arm_extract_return_value: " 7924 "Floating point model not supported"));
7967 memcpy (valbuf, tmpbuf,
8127 _(
"arm_store_return_value: Floating " 8128 "point model not supported"));
8176 memcpy (tmpbuf, valbuf,
8204 for (i = 0; i < vfp_base_count; i++)
8206 if (reg_char ==
'q')
8210 writebuf + i * unit_length);
8214 readbuf + i * unit_length);
8221 xsnprintf (name_buf,
sizeof (name_buf),
"%c%d", reg_char, i);
8226 writebuf + i * unit_length);
8229 readbuf + i * unit_length);
8294 if (start_addr != 0)
8310 static const char *table[15] =
8311 {
"r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
8312 "r8",
"r9",
"sl",
"fp",
"ip",
"sp",
"lr" 8317 for (regno = 0; regno <= 14; regno++)
8318 if (strcmp (&
name[
offset], table[regno]) == 0)
8325 namelen = strlen (
name);
8326 if (
name[0] ==
'_' &&
name[1] ==
'_' 8327 && ((namelen > 2 + strlen (
"_from_thumb")
8328 &&
startswith (
name + namelen - strlen (
"_from_thumb"),
"_from_thumb"))
8329 || (namelen > 2 + strlen (
"_from_arm")
8330 &&
startswith (
name + namelen - strlen (
"_from_arm"),
"_from_arm"))))
8333 int target_len = namelen - 2;
8338 if (
name[namelen - 1] ==
'b')
8339 target_len -= strlen (
"_from_thumb");
8341 target_len -= strlen (
"_from_arm");
8350 if (minsym.
minsym != NULL)
8363 \"set arm\" must be followed by an apporpriate subcommand.\n"));
8386 internal_error (__FILE__, __LINE__,
_(
"could not update architecture"));
8403 internal_error (__FILE__, __LINE__,
_(
"Invalid fp model accepted: %s."),
8418 The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
8422 The current ARM floating point model is \"%s\".\n"),
8455 The current ARM ABI is \"auto\" (currently \"%s\").\n"),
8467 _(
"The current execution mode assumed " 8468 "(when symbols are unavailable) is \"%s\".\n"),
8477 _(
"The current execution mode assumed " 8478 "(even when symbols are available) is \"%s\".\n"),
8503 const char *style =
"";
8507 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
8508 if (CONST_STRNEQ (opt,
"reg-names-"))
8510 style = &opt[strlen (
"reg-names-")];
8511 len = strcspn (style,
",");
8526 static const char *
const vfp_pseudo_names[] = {
8527 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
8528 "s8",
"s9",
"s10",
"s11",
"s12",
"s13",
"s14",
"s15",
8529 "s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
"s23",
8530 "s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
8533 return vfp_pseudo_names[i -
num_regs];
8539 static const char *
const neon_pseudo_names[] = {
8540 "q0",
"q1",
"q2",
"q3",
"q4",
"q5",
"q6",
"q7",
8541 "q8",
"q9",
"q10",
"q11",
"q12",
"q13",
"q14",
"q15",
8544 return neon_pseudo_names[i -
num_regs - 32];
8561 return (val == C_THUMBEXT
8562 || val == C_THUMBSTAT
8563 || val == C_THUMBEXTFUNC
8564 || val == C_THUMBSTATFUNC
8565 || val == C_THUMBLABEL);
8578 elf_symbol_type *elfsym = (elf_symbol_type *) sym;
8580 if (ARM_GET_SYM_BRANCH_TYPE (elfsym->internal_elf_sym.st_target_internal)
8581 == ST_BRANCH_TO_THUMB)
8598 for (i = 0; i <
objfile->
obfd->section_count; i++)
8606 const char *
name = bfd_asymbol_name (sym);
8612 if (
name[1] !=
'a' &&
name[1] !=
't' &&
name[1] !=
'd')
8626 map_p = &data->section_maps[bfd_get_section (sym)->index];
8628 new_map_sym.
value = sym->value;
8639 if (prev_map_sym->
value >= sym->value)
8686 int offset, double_regnum;
8702 memcpy (buf +
offset, reg_buf, 8);
8708 memcpy (buf +
offset, reg_buf, 8);
8720 int offset, double_regnum;
8747 memcpy (buf, reg_buf +
offset, 4);
8764 int offset, double_regnum;
8788 int offset, double_regnum;
8812 memcpy (reg_buf +
offset, buf, 4);
8817 static struct value *
8820 const int *reg_p = (
const int *) baton;
8827 unsigned int elfosabi;
8830 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
8832 if (elfosabi == ELFOSABI_ARM)
8835 bfd_map_over_sections (abfd,
8936 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
8937 int have_wmmx_registers = 0;
8939 int have_fpa_registers = 1;
8947 int ei_osabi, e_flags;
8949 switch (bfd_get_flavour (info.
abfd))
8951 case bfd_target_coff_flavour:
8957 case bfd_target_elf_flavour:
8958 ei_osabi = elf_elfheader (info.
abfd)->e_ident[EI_OSABI];
8959 e_flags = elf_elfheader (info.
abfd)->e_flags;
8961 if (ei_osabi == ELFOSABI_ARM)
8968 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
8970 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
8971 int attr_arch, attr_profile;
8975 case EF_ARM_EABI_UNKNOWN:
8980 case EF_ARM_EABI_VER4:
8981 case EF_ARM_EABI_VER5:
8990 switch (bfd_elf_get_obj_attr_int (info.
abfd,
8994 case AEABI_VFP_args_base:
9000 case AEABI_VFP_args_vfp:
9006 case AEABI_VFP_args_toolchain:
9012 case AEABI_VFP_args_compatible:
9033 warning (
_(
"unknown ARM EABI version 0x%x"), eabi_ver);
9042 attr_arch = bfd_elf_get_obj_attr_int (info.
abfd, OBJ_ATTR_PROC,
9044 attr_profile = bfd_elf_get_obj_attr_int (info.
abfd,
9046 Tag_CPU_arch_profile);
9052 && (attr_arch == TAG_CPU_ARCH_V6_M
9053 || attr_arch == TAG_CPU_ARCH_V6S_M
9054 || attr_profile ==
'M'))
9061 int e_flags = elf_elfheader (info.
abfd)->e_flags;
9063 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
9071 case EF_ARM_SOFT_FLOAT:
9074 case EF_ARM_VFP_FLOAT:
9077 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
9083 if (e_flags & EF_ARM_BE8)
9099 static const char *
const arm_sp_names[] = {
"r13",
"sp", NULL };
9100 static const char *
const arm_lr_names[] = {
"r14",
"lr", NULL };
9101 static const char *
const arm_pc_names[] = {
"r15",
"pc", NULL };
9107 "org.gnu.gdb.arm.core");
9108 if (feature == NULL)
9111 "org.gnu.gdb.arm.m-profile");
9112 if (feature == NULL)
9147 "org.gnu.gdb.arm.fpa");
9148 if (feature != NULL)
9161 have_fpa_registers = 0;
9164 "org.gnu.gdb.xscale.iwmmxt");
9165 if (feature != NULL)
9167 static const char *
const iwmmxt_names[] = {
9168 "wR0",
"wR1",
"wR2",
"wR3",
"wR4",
"wR5",
"wR6",
"wR7",
9169 "wR8",
"wR9",
"wR10",
"wR11",
"wR12",
"wR13",
"wR14",
"wR15",
9170 "wCID",
"wCon",
"wCSSF",
"wCASF",
"",
"",
"",
"",
9171 "wCGR0",
"wCGR1",
"wCGR2",
"wCGR3",
"",
"",
"",
"",
9197 have_wmmx_registers = 1;
9204 "org.gnu.gdb.arm.vfp");
9205 if (feature != NULL)
9207 static const char *
const vfp_double_names[] = {
9208 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
9209 "d8",
"d9",
"d10",
"d11",
"d12",
"d13",
"d14",
"d15",
9210 "d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
"d23",
9211 "d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
9217 for (i = 0; i < 32; i++)
9221 vfp_double_names[i]);
9225 if (!valid_p && i == 16)
9238 have_vfp_pseudos = 1;
9240 vfp_register_count = i;
9246 "org.gnu.gdb.arm.neon");
9247 if (feature != NULL)
9260 have_neon_pseudos = 1;
9293 if (best_arch != NULL)
9311 || vfp_register_count == 16
9312 || vfp_register_count == 32);
9323 case BFD_ENDIAN_BIG:
9331 case BFD_ENDIAN_LITTLE:
9341 _(
"arm_gdbarch_init: bad byte order for float format"));
9470 if (tdep->
jb_pc >= 0)
9488 if (have_vfp_pseudos)
9494 int num_pseudos = 32;
9495 if (have_neon_pseudos)
9541 static void arm_record_test (
void);
9550 char regdesc[1024], *rdptr = regdesc;
9551 size_t rest =
sizeof (regdesc);
9565 bfd_target_elf_flavour,
9579 _(
"Various ARM-specific commands."),
9583 _(
"Various ARM-specific commands."),
9588 const disasm_options_t *disasm_options = disassembler_options_arm ();
9589 int num_disassembly_styles = 0;
9590 for (i = 0; disasm_options->name[i] != NULL; i++)
9591 if (CONST_STRNEQ (disasm_options->name[i],
"reg-names-"))
9592 num_disassembly_styles++;
9596 num_disassembly_styles + 1);
9597 for (i = j = 0; disasm_options->name[i] != NULL; i++)
9598 if (CONST_STRNEQ (disasm_options->name[i],
"reg-names-"))
9600 size_t offset = strlen (
"reg-names-");
9601 const char *style = disasm_options->name[i];
9603 length = snprintf (rdptr, rest,
"%s - %s\n", &style[
offset],
9604 disasm_options->description[i]);
9613 _(
"The valid values are:\n"),
9615 _(
"The default is \"std\"."));
9619 _(
"Set the disassembly style."),
9620 _(
"Show the disassembly style."),
9627 _(
"Set usage of ARM 32-bit mode."),
9628 _(
"Show usage of ARM 32-bit mode."),
9629 _(
"When off, a 26-bit PC will be used."),
9637 _(
"Set the floating point type."),
9638 _(
"Show the floating point type."),
9639 _(
"auto - Determine the FP typefrom the OS-ABI.\n\ 9640 softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\ 9641 fpa - FPA co-processor (GCC compiled).\n\ 9642 softvfp - Software FP with pure-endian doubles.\n\ 9643 vfp - VFP co-processor."),
9658 _(
"Set the mode assumed when symbols are unavailable."),
9659 _(
"Show the mode assumed when symbols are unavailable."),
9664 _(
"Set the mode assumed even when symbols are available."),
9665 _(
"Show the mode assumed even when symbols are available."),
9671 _(
"Set ARM debugging."),
9672 _(
"Show ARM debugging."),
9673 _(
"When on, arm-specific debugging is enabled."),
9686 #define ARM_INSN_SIZE_BYTES 4 9687 #define THUMB_INSN_SIZE_BYTES 2 9688 #define THUMB2_INSN_SIZE_BYTES 4 9693 #define INSN_S_L_BIT_NUM 20 9695 #define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \ 9698 unsigned int reg_len = LENGTH; \ 9701 REGS = XNEWVEC (uint32_t, reg_len); \ 9702 memcpy(®S[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \ 9707 #define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \ 9710 unsigned int mem_len = LENGTH; \ 9713 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \ 9714 memcpy(&MEMS->len, &RECORD_BUF[0], \ 9715 sizeof(struct arm_mem_r) * LENGTH); \ 9721 #define INSN_RECORDED(ARM_RECORD) \ 9722 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count) 9755 sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t
len, uint32_t sbo)
9757 uint32_t ones =
bits (insn, bit_num - 1, (bit_num -1) + (
len - 1));
9804 uint32_t reg_src1 = 0, reg_src2 = 0;
9805 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
9810 if (14 == arm_insn_r->
opcode || 10 == arm_insn_r->
opcode)
9821 u_regval[0] = u_regval[0] + 8;
9823 offset_8 = (immed_high << 4) | immed_low;
9825 if (14 == arm_insn_r->
opcode)
9827 tgt_mem_addr = u_regval[0] + offset_8;
9831 tgt_mem_addr = u_regval[0] - offset_8;
9835 record_buf_mem[0] = 2;
9836 record_buf_mem[1] = tgt_mem_addr;
9841 record_buf_mem[0] = 4;
9842 record_buf_mem[1] = tgt_mem_addr;
9843 record_buf_mem[2] = 4;
9844 record_buf_mem[3] = tgt_mem_addr + 4;
9848 else if (12 == arm_insn_r->
opcode || 8 == arm_insn_r->
opcode)
9860 u_regval[0] = u_regval[0] + 8;
9863 if (12 == arm_insn_r->
opcode)
9865 tgt_mem_addr = u_regval[0] + u_regval[1];
9869 tgt_mem_addr = u_regval[1] - u_regval[0];
9873 record_buf_mem[0] = 2;
9874 record_buf_mem[1] = tgt_mem_addr;
9879 record_buf_mem[0] = 4;
9880 record_buf_mem[1] = tgt_mem_addr;
9881 record_buf_mem[2] = 4;
9882 record_buf_mem[3] = tgt_mem_addr + 4;
9886 else if (11 == arm_insn_r->
opcode || 15 == arm_insn_r->
opcode 9893 offset_8 = (immed_high << 4) | immed_low;
9897 if (15 == arm_insn_r->
opcode || 6 == arm_insn_r->
opcode)
9899 tgt_mem_addr = u_regval[0] + offset_8;
9903 tgt_mem_addr = u_regval[0] - offset_8;
9907 record_buf_mem[0] = 2;
9908 record_buf_mem[1] = tgt_mem_addr;
9913 record_buf_mem[0] = 4;
9914 record_buf_mem[1] = tgt_mem_addr;
9915 record_buf_mem[2] = 4;
9916 record_buf_mem[3] = tgt_mem_addr + 4;
9923 else if (9 == arm_insn_r->
opcode || 13 == arm_insn_r->
opcode 9933 if (13 == arm_insn_r->
opcode || 4 == arm_insn_r->
opcode)
9935 tgt_mem_addr = u_regval[0] + u_regval[1];
9939 tgt_mem_addr = u_regval[1] - u_regval[0];
9943 record_buf_mem[0] = 2;
9944 record_buf_mem[1] = tgt_mem_addr;
9949 record_buf_mem[0] = 4;
9950 record_buf_mem[1] = tgt_mem_addr;
9951 record_buf_mem[2] = 4;
9952 record_buf_mem[3] = tgt_mem_addr + 4;
9968 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
9969 uint32_t record_buf[8], record_buf_mem[8];
9970 uint32_t reg_src1 = 0;
9979 if (arm_insn_r->
cond)
9983 if (5 == ((opcode1 & 0xE0) >> 5))
9995 if (3 == opcode1 &&
bit (arm_insn_r->
arm_insn, 4))
10007 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->
cond 10033 if (!opcode1 && 2 == opcode2 && !
bit (arm_insn_r->
arm_insn, 20)
10040 if ((0 == insn_op1) || (2 == insn_op1))
10046 else if (1 == insn_op1)
10052 else if (3 == insn_op1)
10067 else if (3 == insn_op1)
10104 if (0 == insn_op1 || 1 == insn_op1)
10113 else if (2 == insn_op1)
10120 else if (3 == insn_op1)
10137 else if (3 == insn_op1)
10165 if (8 == arm_insn_r->
opcode)
10167 record_buf_mem[0] = 4;
10172 record_buf_mem[0] = 1;
10174 record_buf_mem[1] = u_regval;
10179 else if (1 == insn_op1 && !
bit (arm_insn_r->
arm_insn, 20))
10185 else if (2 == insn_op1 && !
bit (arm_insn_r->
arm_insn, 20))
10189 record_buf[1] = record_buf[0] + 1;
10192 else if (3 == insn_op1 && !
bit (arm_insn_r->
arm_insn, 20))
10198 else if (
bit (arm_insn_r->
arm_insn, 20) && insn_op1 <= 3)
10208 if (24 == opcode1 &&
bit (arm_insn_r->
arm_insn, 21)
10231 uint32_t record_buf[8], record_buf_mem[8];
10234 uint32_t reg_src1 = 0, reg_dest = 0;
10235 uint32_t opcode1 = 0;
10242 if (9 == arm_insn_r->
decode 10243 && ((4 <= arm_insn_r->
opcode && 7 >= arm_insn_r->
opcode)
10244 || (0 == arm_insn_r->
opcode || 1 == arm_insn_r->
opcode)))
10248 if (0 == arm_insn_r->
opcode || 1 == arm_insn_r->
opcode)
10255 else if (4 <= arm_insn_r->
opcode && 7 >= arm_insn_r->
opcode)
10265 && (11 == arm_insn_r->
decode || 13 == arm_insn_r->
decode))
10275 if (15 != reg_dest)
10282 record_buf[0] = reg_dest;
10287 else if ((9 == arm_insn_r->
opcode || 11 == arm_insn_r->
opcode)
10293 if (9 == arm_insn_r->
opcode)
10306 else if (9 == arm_insn_r->
decode 10307 && (8 == arm_insn_r->
opcode || 10 == arm_insn_r->
opcode)
10317 if (8 == arm_insn_r->
opcode)
10319 record_buf_mem[0] = 4;
10324 record_buf_mem[0] = 1;
10326 record_buf_mem[1] = u_regval[0];
10331 else if (3 == arm_insn_r->
decode && 0x12 == opcode1
10335 if (9 == arm_insn_r->
opcode)
10344 else if (7 == arm_insn_r->
decode && 0x12 == opcode1)
10360 else if (11 == arm_insn_r->
decode 10369 else if (1 == arm_insn_r->
decode && 0x12 == opcode1
10377 else if (1 == arm_insn_r->
decode && 0x16 == opcode1
10386 && (8 == arm_insn_r->
opcode || 10 == arm_insn_r->
opcode)
10395 else if (arm_insn_r->
opcode <= 15)
10419 uint32_t record_buf[8], record_buf_mem[8];
10424 if ((9 == arm_insn_r->
opcode || 11 == arm_insn_r->
opcode)
10430 if (9 == arm_insn_r->
opcode)
10441 else if (arm_insn_r->
opcode <= 15)
10463 uint32_t record_buf[8];
10486 unsigned int op1 =
bits (arm_insn_r->
arm_insn, 20, 22);
10491 else if (op1 == 0x4)
10549 uint32_t reg_base , reg_dest;
10550 uint32_t offset_12, tgt_mem_addr;
10551 uint32_t record_buf[8], record_buf_mem[8];
10552 unsigned char wback;
10593 tgt_mem_addr = (uint32_t) u_regval + offset_12;
10598 tgt_mem_addr = (uint32_t) u_regval - offset_12;
10606 record_buf_mem[0] = 1;
10611 record_buf_mem[0] = 4;
10616 record_buf_mem[1] = tgt_mem_addr;
10618 record_buf_mem[1] = (uint32_t) u_regval;
10640 uint32_t shift_imm = 0;
10641 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10642 uint32_t offset_12 = 0, tgt_mem_addr = 0;
10643 uint32_t record_buf[8], record_buf_mem[8];
10666 if (15 != reg_dest)
10673 record_buf[0] = reg_dest;
10692 if (15 == reg_src2)
10696 u_regval[0] = u_regval[0] + 8;
10702 tgt_mem_addr = u_regval[0] + u_regval[1];
10706 tgt_mem_addr = u_regval[1] - u_regval[0];
10709 switch (arm_insn_r->
opcode)
10723 record_buf_mem[0] = 4;
10738 record_buf_mem[0] = 1;
10745 record_buf_mem[1] = tgt_mem_addr;
10748 if (9 == arm_insn_r->
opcode || 11 == arm_insn_r->
opcode 10749 || 13 == arm_insn_r->
opcode || 15 == arm_insn_r->
opcode 10758 record_buf[0] = reg_src2;
10780 offset_12 = u_regval[0] << shift_imm;
10784 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
10790 if (
bit (u_regval[0], 31))
10792 offset_12 = 0xFFFFFFFF;
10802 offset_12 = s_word >> shift_imm;
10812 offset_12 = (((
bit (u_regval[1], 29)) << 31) \
10813 | (u_regval[0]) >> 1);
10817 offset_12 = (u_regval[0] >> shift_imm) \
10819 (
sizeof(uint32_t) - shift_imm));
10832 tgt_mem_addr = u_regval[1] + offset_12;
10836 tgt_mem_addr = u_regval[1] - offset_12;
10839 switch (arm_insn_r->
opcode)
10853 record_buf_mem[0] = 4;
10868 record_buf_mem[0] = 1;
10875 record_buf_mem[1] = tgt_mem_addr;
10878 if (9 == arm_insn_r->
opcode || 11 == arm_insn_r->
opcode 10879 || 13 == arm_insn_r->
opcode || 15 == arm_insn_r->
opcode 10888 record_buf[0] = reg_src2;
10905 uint32_t register_count = 0, register_bits;
10906 uint32_t reg_base, addr_mode;
10907 uint32_t record_buf[24], record_buf_mem[48];
10927 while (register_bits)
10929 if (register_bits & 0x00000001)
10931 register_bits = register_bits >> 1;
10953 while (register_bits)
10955 if (register_bits & 0x00000001)
10957 register_bits = register_bits >> 1;
10964 record_buf_mem[1] = (uint32_t) u_regval
10969 record_buf_mem[1] = (uint32_t) u_regval;
10973 record_buf_mem[1] = (uint32_t) u_regval
11004 uint32_t record_buf[8];
11025 "0x%0x at address %s.\n"),arm_insn_r->
arm_insn,
11036 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
11037 uint32_t record_buf[4];
11046 if (bit_l && bit_c)
11048 record_buf[0] = reg_t;
11051 else if (bit_l && !bit_c)
11054 if (bits_a == 0x00)
11056 record_buf[0] = reg_t;
11060 else if (bits_a == 0x07)
11065 record_buf[0] = reg_t;
11069 else if (!bit_l && !bit_c)
11072 if (bits_a == 0x00)
11079 else if (bits_a == 0x07)
11085 else if (!bit_l && bit_c)
11088 if (!(bits_a & 0x04))
11090 record_buf[0] = (reg_v | (
bit (arm_insn_r->
arm_insn, 7) << 4))
11099 reg_v = reg_v | (
bit (arm_insn_r->
arm_insn, 7) << 4);
11106 reg_v = reg_v | (
bit (arm_insn_r->
arm_insn, 7) << 4);
11122 uint32_t opcode, single_reg;
11123 uint8_t op_vldm_vstm;
11124 uint32_t record_buf[8], record_buf_mem[128];
11131 op_vldm_vstm = opcode & 0x1b;
11134 if ((opcode & 0x1e) == 0x04)
11172 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
11173 || op_vldm_vstm == 0x12)
11175 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
11176 uint32_t memory_index = 0;
11181 imm_off32 = imm_off8 << 2;
11182 memory_count = imm_off8;
11185 start_address = u_regval;
11187 start_address = u_regval - imm_off32;
11191 record_buf[0] = reg_rn;
11195 while (memory_count > 0)
11199 record_buf_mem[memory_index] = 4;
11200 record_buf_mem[memory_index + 1] = start_address;
11201 start_address = start_address + 4;
11202 memory_index = memory_index + 2;
11206 record_buf_mem[memory_index] = 4;
11207 record_buf_mem[memory_index + 1] = start_address;
11208 record_buf_mem[memory_index + 2] = 4;
11209 record_buf_mem[memory_index + 3] = start_address + 4;
11210 start_address = start_address + 8;
11211 memory_index = memory_index + 4;
11218 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
11219 || op_vldm_vstm == 0x13)
11221 uint32_t reg_count, reg_vd;
11222 uint32_t reg_index = 0;
11233 reg_vd = reg_vd | (bit_d << 4);
11236 record_buf[reg_index++] =
bits (arm_insn_r->
arm_insn, 16, 19);
11242 reg_count = reg_count / 2;
11243 if (single_reg && bit_d)
11250 while (reg_count > 0)
11252 record_buf[reg_index++] =
ARM_D0_REGNUM + reg_vd + reg_count - 1;
11258 else if ((opcode & 0x13) == 0x10)
11260 uint32_t start_address, reg_rn, imm_off32, imm_off8;
11261 uint32_t memory_index = 0;
11266 imm_off32 = imm_off8 << 2;
11269 start_address = u_regval + imm_off32;
11271 start_address = u_regval - imm_off32;
11275 record_buf_mem[memory_index] = 4;
11276 record_buf_mem[memory_index + 1] = start_address;
11281 record_buf_mem[memory_index] = 4;
11282 record_buf_mem[memory_index + 1] = start_address;
11283 record_buf_mem[memory_index + 2] = 4;
11284 record_buf_mem[memory_index + 3] = start_address + 4;
11289 else if ((opcode & 0x13) == 0x11)
11291 uint32_t reg_vd =
bits (arm_insn_r->
arm_insn, 12, 15);
11295 reg_vd = reg_vd | (
bit (arm_insn_r->
arm_insn, 22) << 4);
11300 reg_vd = (reg_vd << 1) |
bit (arm_insn_r->
arm_insn, 22);
11317 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
11318 uint32_t record_buf[4];
11319 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
11320 enum insn_types curr_insn_type = INSN_INV;
11328 opc1 = opc1 & 0x04;
11336 curr_insn_type = INSN_T0;
11338 curr_insn_type = INSN_T1;
11343 curr_insn_type = INSN_T1;
11345 curr_insn_type = INSN_T2;
11349 else if (opc1 == 0x01)
11352 curr_insn_type = INSN_T1;
11354 curr_insn_type = INSN_T2;
11357 else if (opc1 == 0x02 && !(opc3 & 0x01))
11362 curr_insn_type = INSN_T0;
11364 curr_insn_type = INSN_T1;
11369 curr_insn_type = INSN_T1;
11371 curr_insn_type = INSN_T2;
11375 else if (opc1 == 0x03)
11380 curr_insn_type = INSN_T0;
11382 curr_insn_type = INSN_T1;
11387 curr_insn_type = INSN_T1;
11389 curr_insn_type = INSN_T2;
11393 else if (opc1 == 0x0b)
11396 curr_insn_type = INSN_T1;
11398 curr_insn_type = INSN_T2;
11401 else if (opc1 == 0x0b)
11404 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
11409 curr_insn_type = INSN_T0;
11411 curr_insn_type = INSN_T1;
11416 curr_insn_type = INSN_T1;
11418 curr_insn_type = INSN_T2;
11422 else if ((opc2 == 0x01 && opc3 == 0x01)
11423 || (opc2 == 0x00 && opc3 == 0x03))
11428 curr_insn_type = INSN_T0;
11430 curr_insn_type = INSN_T1;
11435 curr_insn_type = INSN_T1;
11437 curr_insn_type = INSN_T2;
11441 else if (opc2 == 0x01 && opc3 == 0x03)
11444 curr_insn_type = INSN_T1;
11446 curr_insn_type = INSN_T2;
11449 else if (opc2 == 0x07 && opc3 == 0x03)
11452 curr_insn_type = INSN_T1;
11454 curr_insn_type = INSN_T2;
11456 else if (opc3 & 0x01)
11459 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
11462 curr_insn_type = INSN_T2;
11466 curr_insn_type = INSN_T1;
11468 curr_insn_type = INSN_T2;
11472 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
11475 curr_insn_type = INSN_T1;
11477 curr_insn_type = INSN_T2;
11480 else if ((opc2 & 0x0e) == 0x02)
11481 curr_insn_type = INSN_T2;
11483 else if ((opc2 & 0x0e) == 0x04)
11484 curr_insn_type = INSN_T3;
11488 switch (curr_insn_type)
11491 reg_vd = reg_vd | (bit_d << 4);
11498 reg_vd = reg_vd | (bit_d << 4);
11504 reg_vd = (reg_vd << 1) | bit_d;
11528 uint32_t op1, op1_ebit, coproc;
11534 if ((coproc & 0x0e) == 0x0a)
11541 if ((op1 & 0x3e) == 0x04)
11582 uint32_t op, op1_sbit, op1_ebit, coproc;
11599 svc_operand = (0x00ffffff & arm_insn_r->
arm_insn);
11602 svc_number = svc_operand - 0x900000;
11615 if ((coproc & 0x0e) == 0x0a)
11618 if (!op1_sbit && !op)
11622 if (!op1_sbit && op)
11628 if (!op1_sbit && !op)
11632 if (!op1_sbit && !op1_ebit && op)
11636 if (!op1_sbit && op1_ebit && op)
11638 uint32_t record_buf[1];
11641 if (record_buf[0] == 15)
11659 uint32_t record_buf[8];
11660 uint32_t reg_src1 = 0;
11665 record_buf[1] = reg_src1;
11679 uint32_t record_buf[8];
11680 uint32_t reg_src1 = 0;
11685 record_buf[1] = reg_src1;
11699 uint32_t record_buf[8], record_buf_mem[8];
11701 uint32_t reg_src1 = 0, reg_src2 = 0;
11702 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11717 record_buf[0] = reg_src1;
11728 record_buf_mem[0] = 4;
11730 record_buf_mem[0] = 1;
11732 record_buf_mem[0] = 2;
11733 record_buf_mem[1] = u_regval[0] + u_regval[1];
11742 record_buf[0] = reg_src1;
11750 if ((3 == opcode2) && (!opcode3))
11760 record_buf[1] = (
bit (thumb_insn_r->
arm_insn, 7) << 3
11771 reg_src1 = reg_src1 + 8;
11774 record_buf[1] = reg_src1;
11791 uint32_t record_buf[8], record_buf_mem[8];
11793 uint32_t reg_src1 = 0;
11794 uint32_t opcode = 0, immed_5 = 0;
11804 record_buf[0] = reg_src1;
11813 record_buf_mem[0] = 4;
11814 record_buf_mem[1] = u_regval + (immed_5 * 4);
11831 uint32_t record_buf[8], record_buf_mem[8];
11833 uint32_t reg_src1 = 0;
11834 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
11844 record_buf[0] = reg_src1;
11847 else if (1 == opcode)
11851 record_buf[0] = reg_src1;
11854 else if (2 == opcode)
11859 record_buf_mem[0] = 4;
11860 record_buf_mem[1] = u_regval + (immed_8 * 4);
11863 else if (0 == opcode)
11869 record_buf_mem[0] = 2;
11870 record_buf_mem[1] = u_regval + (immed_5 * 2);
11888 uint32_t opcode = 0;
11889 uint32_t register_bits = 0, register_count = 0;
11890 uint32_t index = 0, start_address = 0;
11891 uint32_t record_buf[24], record_buf_mem[48];
11898 if (opcode == 0 || opcode == 1)
11903 record_buf[0] = reg_src1;
11909 uint32_t opcode2 =
bits (thumb_insn_r->
arm_insn, 8, 11);
11938 while (register_bits)
11940 if (register_bits & 0x00000001)
11942 register_bits = register_bits >> 1;
11944 start_address = u_regval - \
11945 (4 * (
bit (thumb_insn_r->
arm_insn, 8) + register_count));
11947 while (register_count)
11949 record_buf_mem[(register_count * 2) - 1] = start_address;
11950 record_buf_mem[(register_count * 2) - 2] = 4;
11951 start_address = start_address + 4;
11966 while (register_bits)
11968 if (register_bits & 0x00000001)
11969 record_buf[index++] = register_count;
11970 register_bits = register_bits >> 1;
11990 "0x%0x at address %s.\n"),
12020 uint32_t reg_src1 = 0;
12021 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
12022 uint32_t index = 0, start_address = 0;
12023 uint32_t record_buf[24], record_buf_mem[48];
12037 while (register_bits)
12039 if (register_bits & 0x00000001)
12040 record_buf[index++] = register_count;
12041 register_bits = register_bits >> 1;
12044 record_buf[index++] = reg_src1;
12047 else if (0 == opcode2)
12054 while (register_bits)
12056 if (register_bits & 0x00000001)
12058 register_bits = register_bits >> 1;
12060 start_address = u_regval;
12062 while (register_count)
12064 record_buf_mem[(register_count * 2) - 1] = start_address;
12065 record_buf_mem[(register_count * 2) - 2] = 4;
12066 start_address = start_address + 4;
12070 else if (0x1F == opcode1)
12100 uint32_t record_buf[8];
12101 uint32_t bits_h = 0;
12105 if (2 == bits_h || 3 == bits_h)
12111 else if (1 == bits_h)
12134 uint32_t reg_rn, op;
12135 uint32_t register_bits = 0, register_count = 0;
12136 uint32_t index = 0, start_address = 0;
12137 uint32_t record_buf[24], record_buf_mem[48];
12144 if (0 == op || 3 == op)
12158 else if (1 == op || 2 == op)
12163 register_bits =
bits (thumb2_insn_r->
arm_insn, 0, 15);
12164 while (register_bits)
12166 if (register_bits & 0x00000001)
12167 record_buf[index++] = register_count;
12170 register_bits = register_bits >> 1;
12172 record_buf[index++] = reg_rn;
12179 register_bits =
bits (thumb2_insn_r->
arm_insn, 0, 15);
12181 while (register_bits)
12183 if (register_bits & 0x00000001)
12186 register_bits = register_bits >> 1;
12192 start_address = u_regval;
12197 start_address = u_regval - register_count * 4;
12201 while (register_count)
12203 record_buf_mem[register_count * 2 - 1] = start_address;
12204 record_buf_mem[register_count * 2 - 2] = 4;
12205 start_address = start_address + 4;
12208 record_buf[0] = reg_rn;
12229 uint32_t reg_rd, reg_rn, offset_imm;
12230 uint32_t reg_dest1, reg_dest2;
12231 uint32_t address, offset_addr;
12232 uint32_t record_buf[8], record_buf_mem[8];
12233 uint32_t op1, op2, op3;
12243 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
12246 record_buf[0] = reg_dest1;
12251 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
12254 record_buf[2] = reg_dest2;
12263 if (0 == op1 && 0 == op2)
12267 address = u_regval[0] + (offset_imm * 4);
12268 record_buf_mem[0] = 4;
12269 record_buf_mem[1] = address;
12272 record_buf[0] = reg_rd;
12275 else if (1 == op1 && 0 == op2)
12278 record_buf[0] = reg_rd;
12280 address = u_regval[0];
12281 record_buf_mem[1] = address;
12286 record_buf_mem[0] = 1;
12292 record_buf_mem[0] = 2 ;
12298 address = u_regval[0];
12299 record_buf_mem[0] = 4;
12300 record_buf_mem[2] = 4;
12301 record_buf_mem[3] = address + 4;
12312 offset_addr = u_regval[0] + (offset_imm * 4);
12314 offset_addr = u_regval[0] - (offset_imm * 4);
12316 address = offset_addr;
12319 address = u_regval[0];
12321 record_buf_mem[0] = 4;
12322 record_buf_mem[1] = address;
12323 record_buf_mem[2] = 4;
12324 record_buf_mem[3] = address + 4;
12326 record_buf[0] = reg_rn;
12344 uint32_t reg_rd, op;
12345 uint32_t record_buf[8];
12350 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
12357 record_buf[0] = reg_rd;
12374 uint32_t record_buf[8];
12378 record_buf[0] = reg_rd;
12392 uint32_t op, op1, op2;
12393 uint32_t record_buf[8];
12400 if (!(op1 & 0x2) && 0x38 == op)
12414 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
12434 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
12435 uint32_t address, offset_addr;
12436 uint32_t record_buf[8], record_buf_mem[8];
12450 offset_addr = u_regval[0] + offset_imm;
12451 address = offset_addr;
12456 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
12462 offset_addr = u_regval[1] << shift_imm;
12463 address = u_regval[0] + offset_addr;
12471 offset_addr = u_regval[0] + offset_imm;
12473 offset_addr = u_regval[0] - offset_imm;
12475 address = offset_addr;
12478 address = u_regval[0];
12487 record_buf_mem[0] = 1;
12492 record_buf_mem[0] = 2;
12497 record_buf_mem[0] = 4;
12505 record_buf_mem[1] = address;
12507 record_buf[0] = reg_rn;
12522 uint32_t record_buf[8];
12523 uint32_t reg_rt, reg_rn;
12530 record_buf[0] = reg_rt;
12531 record_buf[1] = reg_rn;
12548 uint32_t record_buf[8];
12550 record_buf[0] =
bits (thumb2_insn_r->
arm_insn, 12, 15);
12565 uint32_t opcode1 = 0, opcode2 = 0;
12566 uint32_t record_buf[8];
12571 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
12575 record_buf[0] =
bits (thumb2_insn_r->
arm_insn, 16, 19);
12576 record_buf[1] =
bits (thumb2_insn_r->
arm_insn, 12, 15);
12580 else if (1 == opcode1 || 3 == opcode2)
12583 record_buf[0] =
bits (thumb2_insn_r->
arm_insn, 16, 19);
12584 record_buf[1] =
bits (thumb2_insn_r->
arm_insn, 12, 15);
12613 uint32_t l_bit, a_bit, b_bits;
12614 uint32_t record_buf[128], record_buf_mem[128];
12615 uint32_t reg_rn, reg_vd, address, f_elem;
12616 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
12624 reg_vd = (
bit (thumb2_insn_r->
arm_insn, 22) << 4) | reg_vd;
12625 f_ebytes = (1 <<
bits (thumb2_insn_r->
arm_insn, 6, 7));
12626 f_elem = 8 / f_ebytes;
12632 address = u_regval;
12637 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12639 if (b_bits == 0x07)
12641 else if (b_bits == 0x0a)
12643 else if (b_bits == 0x06)
12645 else if (b_bits == 0x02)
12650 for (index_r = 0; index_r < bf_regs; index_r++)
12652 for (index_e = 0; index_e < f_elem; index_e++)
12654 record_buf_mem[index_m++] = f_ebytes;
12655 record_buf_mem[index_m++] = address;
12656 address = address + f_ebytes;
12662 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12664 if (b_bits == 0x09 || b_bits == 0x08)
12666 else if (b_bits == 0x03)
12671 for (index_r = 0; index_r < bf_regs; index_r++)
12672 for (index_e = 0; index_e < f_elem; index_e++)
12674 for (loop_t = 0; loop_t < 2; loop_t++)
12676 record_buf_mem[index_m++] = f_ebytes;
12677 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12680 address = address + (2 * f_ebytes);
12684 else if ((b_bits & 0x0e) == 0x04)
12686 for (index_e = 0; index_e < f_elem; index_e++)
12688 for (loop_t = 0; loop_t < 3; loop_t++)
12690 record_buf_mem[index_m++] = f_ebytes;
12691 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12694 address = address + (3 * f_ebytes);
12698 else if (!(b_bits & 0x0e))
12700 for (index_e = 0; index_e < f_elem; index_e++)
12702 for (loop_t = 0; loop_t < 4; loop_t++)
12704 record_buf_mem[index_m++] = f_ebytes;
12705 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12708 address = address + (4 * f_ebytes);
12714 uint8_t bft_size =
bits (thumb2_insn_r->
arm_insn, 10, 11);
12716 if (bft_size == 0x00)
12718 else if (bft_size == 0x01)
12720 else if (bft_size == 0x02)
12726 if (!(b_bits & 0x0b) || b_bits == 0x08)
12729 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
12732 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
12735 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
12738 for (index_m = 0; index_m < thumb2_insn_r->
mem_rec_count; index_m++)
12740 record_buf_mem[index_m] = f_ebytes;
12741 record_buf_mem[index_m] = address + (index_m * f_ebytes);
12750 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12753 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12756 else if ((b_bits & 0x0e) == 0x04)
12759 else if (!(b_bits & 0x0e))
12765 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
12768 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
12771 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
12774 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
12777 for (index_r = 0; index_r < thumb2_insn_r->
reg_rec_count; index_r++)
12784 record_buf[index_r] = reg_rn;
12797 static unsigned int 12800 uint32_t op, op1, op2;
12808 if (!(op2 & 0x64 ))
12813 else if ((op2 & 0x64) == 0x4)
12818 else if ((op2 & 0x60) == 0x20)
12823 else if (op2 & 0x40)
12829 else if (op1 == 0x02)
12836 else if (op2 & 0x20)
12847 else if (op1 == 0x03)
12849 if (!(op2 & 0x71 ))
12854 else if (!((op2 & 0x71) ^ 0x10))
12859 else if (!((op2 & 0x67) ^ 0x01))
12864 else if (!((op2 & 0x67) ^ 0x03))
12869 else if (!((op2 & 0x67) ^ 0x05))
12874 else if (!((op2 & 0x70) ^ 0x20))
12879 else if (!((op2 & 0x78) ^ 0x30))
12884 else if (!((op2 & 0x78) ^ 0x38))
12889 else if (op2 & 0x40)
12902 class abstract_memory_reader
12913 class instruction_reader :
public abstract_memory_reader
12936 memset (&buf[0], 0, insn_size);
12938 if (!reader.read (insn_record->
this_addr, buf, insn_size))
12974 thumb_record_shift_add_sub,
12985 uint32_t insn_id = 0;
12992 "addr %s len = %d.\n"),
13003 if (arm_record->
cond == 0xf)
13009 ret = arm_handle_insn[insn_id] (arm_record);
13020 arm_record->
cond = -1;
13022 ret = thumb_handle_insn[insn_id] (arm_record);
13032 arm_record->
cond = -1;
13060 class instruction_reader_thumb :
public abstract_memory_reader
13063 template<
size_t SIZE>
13064 instruction_reader_thumb (
enum bfd_endian endian,
13065 const uint16_t (&insns)[
SIZE])
13066 : m_endian (endian), m_insns (insns), m_insns_size (
SIZE)
13079 m_insns[memaddr / 2 + 1]);
13085 enum bfd_endian m_endian;
13086 const uint16_t *m_insns;
13087 size_t m_insns_size;
13091 arm_record_test (
void)
13095 info.bfd_arch_info = bfd_scan_arch (
"arm");
13108 static const uint16_t insns[] = {
13116 instruction_reader_thumb reader (endian, insns);
13142 static const uint16_t insns[] = {
13148 instruction_reader_thumb reader (endian, insns);
13180 uint32_t no_of_rec = 0;
13201 instruction_reader reader;
13207 "addr %s len = %d.\n"),
13220 if (!(u_regval & t_bit))
13229 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
13248 for (no_of_rec = 0; no_of_rec < arm_record.
reg_rec_count; no_of_rec++)
13258 for (no_of_rec = 0; no_of_rec < arm_record.
mem_rec_count; no_of_rec++)
struct gdbarch * target_gdbarch(void)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t err
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
static void arm_update_current_architecture(void)
struct arm_displaced_step_closure::@5::@7 branch
static void arm_prologue_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
static int arm_record_asimd_vfp_coproc(insn_decode_record *arm_insn_r)
void set_gdbarch_frame_align(struct gdbarch *gdbarch, gdbarch_frame_align_ftype frame_align)
void set_gdbarch_have_nonsteppable_watchpoint(struct gdbarch *gdbarch, int have_nonsteppable_watchpoint)
bool store_would_trash(pv_t addr)
void set_gdbarch_float_format(struct gdbarch *gdbarch, const struct floatformat **float_format)
ssize_t read(int fd, void *buf, size_t count)
static void install_preload(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, unsigned int rn)
static int arm_decode_misc_memhint_neon(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static enum arm_float_model arm_fp_model
#define target_has_registers
static void cleanup_pop_pc_16bit_all(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
static int arm_decode_ld_st_word_ubyte(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static CORE_ADDR arm_unwind_sp(struct gdbarch *gdbarch, struct frame_info *this_frame)
ULONGEST regcache_raw_get_unsigned(struct regcache *regcache, int regnum)
static int insn_references_pc(uint32_t insn, uint32_t bitmask)
static int arm_vfp_cprc_reg_char(enum arm_vfp_cprc_base_type b)
static int thumb_record_ld_st_imm_offset(insn_decode_record *thumb_insn_r)
static int skip_prologue_function(struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
static int arm_record_data_proc_imm(insn_decode_record *arm_insn_r)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
#define ARM_INSN_SIZE_BYTES
static int arm_copy_alu_reg(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static struct gdbarch * arm_gdbarch_init(struct gdbarch_info info, struct gdbarch_list *arches)
static CORE_ADDR arm_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
void set_gdbarch_get_longjmp_target(struct gdbarch *gdbarch, gdbarch_get_longjmp_target_ftype get_longjmp_target)
static const char * arm_force_mode_string
CORE_ADDR get_frame_address_in_block(struct frame_info *this_frame)
#define OBSTACK_CALLOC(OBSTACK, NUMBER, TYPE)
static void arm_exidx_data_free(struct objfile *objfile, void *arg)
void set_gdbarch_coff_make_msymbol_special(struct gdbarch *gdbarch, gdbarch_coff_make_msymbol_special_ftype coff_make_msymbol_special)
static int sbo_sbz(uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
static void initialize_tdesc_arm_with_m_fpa_layout(void)
#define EXTRACT_MOVW_MOVT_IMM_A(insn)
static void arm_store_return_value(struct type *type, struct regcache *regs, const gdb_byte *valbuf)
static int thumb_copy_pop_pc_16bit(struct gdbarch *gdbarch, uint16_t insn1, struct regcache *regs, arm_displaced_step_closure *dsc)
static CORE_ADDR arm_push_dummy_call(struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr)
static enum arm_abi_kind arm_abi_global
struct type * builtin_func_ptr
static struct stack_item * pop_stack_item(struct stack_item *si)
void set_tdesc_pseudo_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype *pseudo_name)
static void branch_write_pc(struct regcache *regs, arm_displaced_step_closure *dsc, ULONGEST val)
static int arm_decode_ext_reg_ld_st(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
CORE_ADDR get_frame_pc(struct frame_info *frame)
static int thumb2_record_coproc_insn(insn_decode_record *thumb2_insn_r)
#define IS_THUMB_ADDR(addr)
const gdb_byte * thumb_breakpoint
static int thumb_copy_svc(struct gdbarch *gdbarch, uint16_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
struct insn_decode_record_t insn_decode_record
#define MSYMBOL_LINKAGE_NAME(symbol)
static struct arm_prologue_cache * arm_exidx_fill_cache(struct frame_info *this_frame, gdb_byte *entry)
static void cleanup_store(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
int trad_frame_realreg_p(struct trad_frame_saved_reg this_saved_regs[], int regnum)
struct frame_info * get_current_frame(void)
#define DISPLACED_STEPPING_ARCH_VERSION
void gdbarch_init_osabi(struct gdbarch_info info, struct gdbarch *gdbarch)
static struct type * arm_neon_quad_type(struct gdbarch *gdbarch)
static int thumb2_copy_load_literal(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc, int size)
static int thumb2_record_str_single_data(insn_decode_record *thumb2_insn_r)
pv_t pv_add_constant(pv_t v, CORE_ADDR k)
int safe_read_memory_unsigned_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order, ULONGEST *return_value)
struct value * trad_frame_get_prev_register(struct frame_info *this_frame, struct trad_frame_saved_reg this_saved_regs[], int regnum)
static enum unwind_stop_reason arm_prologue_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
static void cleanup_block_store_pc(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
static struct arm_prologue_cache * arm_make_prologue_cache(struct frame_info *this_frame)
static void set_disassembly_style_sfunc(const char *, int, struct cmd_list_element *)
const struct floatformat * floatformats_ieee_double[BFD_ENDIAN_UNKNOWN]
static void install_alu_reg(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, unsigned int rd, unsigned int rn, unsigned int rm)
static int arm_epilogue_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
int trad_frame_addr_p(struct trad_frame_saved_reg this_saved_regs[], int regnum)
static int arm_type_align(struct type *t)
int record_full_arch_list_add_reg(struct regcache *regcache, int regnum)
void write_memory_unsigned_integer(CORE_ADDR addr, int len, enum bfd_endian byte_order, ULONGEST value)
static void initialize_tdesc_arm_with_m(void)
static void cleanup_alu_imm(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
struct bfd_section * the_bfd_section
static int install_svc(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
#define BMSYMBOL_VALUE_ADDRESS(symbol)
static int arm_exidx_unwind_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
void set_gdbarch_skip_trampoline_code(struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
void warning(const char *fmt,...)
int fputc_filtered(int c, struct ui_file *stream)
#define THUMB_INSN_SIZE_BYTES
static int thumb_instruction_restores_sp(unsigned short insn)
static CORE_ADDR arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
#define obj_section_offset(s)
static const char *const arm_mode_strings[]
#define TYPE_NAME(thistype)
static int gdb_print_insn_arm(bfd_vma memaddr, disassemble_info *info)
void set_gdbarch_write_pc(struct gdbarch *gdbarch, gdbarch_write_pc_ftype write_pc)
void set_gdbarch_addr_bits_remove(struct gdbarch *gdbarch, gdbarch_addr_bits_remove_ftype addr_bits_remove)
static int arm_copy_unmodified(struct gdbarch *gdbarch, uint32_t insn, const char *iname, arm_displaced_step_closure *dsc)
static CORE_ADDR arm_addr_bits_remove(struct gdbarch *gdbarch, CORE_ADDR val)
static int arm_code_of_frame_writable(struct gdbarch *gdbarch, struct frame_info *frame)
int arm_psr_thumb_bit(struct gdbarch *gdbarch)
static int arm_record_unsupported_insn(insn_decode_record *arm_insn_r)
static const char *const arm_register_names[]
static int thumb2_record_data_proc_sreg_mimm(insn_decode_record *thumb2_insn_r)
static unsigned int thumb_expand_immediate(unsigned int imm)
static struct stack_item * push_stack_item(struct stack_item *prev, const gdb_byte *contents, int len)
static CORE_ADDR arm_get_next_pcs_syscall_next_pc(struct arm_get_next_pcs *self)
static int arm_register_sim_regno(struct gdbarch *gdbarch, int regnum)
ULONGEST frame_unwind_register_unsigned(struct frame_info *frame, int regnum)
def record(name, number, comment=None)
static int arm_m_exception_unwind_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
struct frame_unwind arm_stub_unwind
int arm_frame_is_thumb(struct frame_info *frame)
static void arm_dump_tdep(struct gdbarch *gdbarch, struct ui_file *file)
enum arm_float_model fp_model
static int thumb_record_ld_st_stack(insn_decode_record *thumb_insn_r)
static int arm_record_vdata_transfer_insn(insn_decode_record *arm_insn_r)
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
char * phex(ULONGEST l, int sizeof_l)
static void initialize_tdesc_arm_with_vfpv3(void)
#define INSN_RECORDED(ARM_RECORD)
ULONGEST displaced_read_reg(struct regcache *regs, arm_displaced_step_closure *dsc, int regno)
struct gdbarch * gdbarch_find_by_info(struct gdbarch_info info)
static int thumb2_record_ld_st_multiple(insn_decode_record *thumb2_insn_r)
static gdb_byte * arm_find_exidx_entry(CORE_ADDR memaddr, CORE_ADDR *start)
int pv_is_register(pv_t a, int r)
void * memset(T *s, int c, size_t n)=delete
#define BranchDest(addr, instr)
void internal_error(const char *file, int line, const char *fmt,...)
static const char *const fp_model_strings[]
int gdbarch_update_p(struct gdbarch_info info)
unsigned int record_debug
static int arm_compare_exidx_entries(const struct arm_exidx_entry *lhs, const struct arm_exidx_entry *rhs)
#define THUMB_LE_BREAKPOINT
struct type * builtin_uint8
void add_setshow_enum_cmd(const char *name, enum command_class theclass, const char *const *enumlist, const char **var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
static void show_fp_model(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
static void initialize_tdesc_arm_with_vfpv2(void)
static char arm_find_mapping_symbol(CORE_ADDR memaddr, CORE_ADDR *start)
static void arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
void gdbarch_register_osabi_sniffer(enum bfd_architecture arch, enum bfd_flavour flavour, enum gdb_osabi(*sniffer_fn)(bfd *))
struct type * builtin_uint16
void set_gdbarch_register_reggroup_p(struct gdbarch *gdbarch, gdbarch_register_reggroup_p_ftype register_reggroup_p)
void target_float_convert(const gdb_byte *from, const struct type *from_type, gdb_byte *to, const struct type *to_type)
int safe_read_memory_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order, LONGEST *return_value)
#define THUMB2_INSN_SIZE_BYTES
void arm_displaced_init_closure(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, arm_displaced_step_closure *dsc)
const gdb_byte * arm_breakpoint
static int thumb_copy_b(struct gdbarch *gdbarch, uint16_t insn, arm_displaced_step_closure *dsc)
#define MSYMBOL_IS_SPECIAL(msym)
#define ALL_OBJFILE_OSECTIONS(objfile, osect)
struct gdbarch_list * gdbarch_list_lookup_by_info(struct gdbarch_list *arches, const struct gdbarch_info *info)
CORE_ADDR skip_prologue_using_sal(struct gdbarch *gdbarch, CORE_ADDR func_addr)
#define VEC_safe_push(T, V, O)
static const gdb_byte arm_default_thumb_be_breakpoint[]
void generic_elf_osabi_sniff_abi_tag_sections(bfd *abfd, asection *sect, void *obj)
static int arm_record_ld_st_reg_offset(insn_decode_record *arm_insn_r)
struct gdbarch_list * next
struct reggroup *const restore_reggroup
static int thumb2_record_ld_st_dual_ex_tbb(insn_decode_record *thumb2_insn_r)
static void load_write_pc(struct regcache *regs, arm_displaced_step_closure *dsc, ULONGEST val)
int gdbarch_num_regs(struct gdbarch *gdbarch)
static int arm_decode_media(struct gdbarch *gdbarch, uint32_t insn, arm_displaced_step_closure *dsc)
struct reggroup *const all_reggroup
std::vector< CORE_ADDR > arm_get_next_pcs(struct arm_get_next_pcs *self)
static int thumb_copy_unmodified_16bit(struct gdbarch *gdbarch, uint16_t insn, const char *iname, arm_displaced_step_closure *dsc)
static int thumb2_copy_load_reg_imm(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc, int writeback, int immed)
ULONGEST get_frame_memory_unsigned(struct frame_info *this_frame, CORE_ADDR addr, int len)
static const char * arm_register_name(struct gdbarch *gdbarch, int i)
static struct value * value_of_arm_user_reg(struct frame_info *frame, const void *baton)
static const char * disassembly_style
static int thumb2_decode_svc_copro(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
static int arm_instruction_restores_sp(unsigned int insn)
void set_gdbarch_dwarf2_reg_to_regnum(struct gdbarch *gdbarch, gdbarch_dwarf2_reg_to_regnum_ftype dwarf2_reg_to_regnum)
static int arm_record_data_proc_misc_ld_str(insn_decode_record *arm_insn_r)
#define TYPE_FIELD(thistype, n)
#define bits(obj, st, fn)
static void initialize_tdesc_arm_with_neon(void)
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
static void arm_extract_return_value(struct type *type, struct regcache *regs, gdb_byte *valbuf)
static int thumb_copy_unmodified_32bit(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, const char *iname, arm_displaced_step_closure *dsc)
static int arm_copy_undef(struct gdbarch *gdbarch, uint32_t insn, arm_displaced_step_closure *dsc)
#define VEC_lower_bound(T, V, O, LT)
static void print_fpu_flags(struct ui_file *file, int flags)
void tdesc_data_cleanup(void *data_untyped)
#define TYPE_FIELD_TYPE(thistype, n)
static void arm_set_abi(const char *args, int from_tty, struct cmd_list_element *c)
static void arm_stub_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
static void thumb_process_displaced_insn(struct gdbarch *gdbarch, CORE_ADDR from, struct regcache *regs, arm_displaced_step_closure *dsc)
static void arm_show_abi(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
void displaced_write_reg(struct regcache *regs, arm_displaced_step_closure *dsc, int regno, ULONGEST val, enum pc_write_style write_pc)
static unsigned int thumb2_record_decode_insn_handler(insn_decode_record *thumb2_insn_r)
static int arm_decode_b_bl_ldmstm(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
int thumb_instruction_changes_pc(unsigned short inst)
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
pv_t pv_constant(CORE_ADDR k)
static const gdb_byte arm_default_arm_le_breakpoint[]
void set_gdbarch_elf_make_msymbol_special(struct gdbarch *gdbarch, gdbarch_elf_make_msymbol_special_ftype elf_make_msymbol_special)
static void arm_write_pc(struct regcache *regcache, CORE_ADDR pc)
void set_gdbarch_wchar_signed(struct gdbarch *gdbarch, int wchar_signed)
#define FRAME_OBSTACK_ZALLOC(TYPE)
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
enum arm_abi_kind arm_abi
struct value * frame_unwind_got_constant(struct frame_info *frame, int regnum, ULONGEST val)
#define TYPE_IS_REFERENCE(t)
ULONGEST read_code_unsigned_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
static int arm_breakpoint_kind_from_pc(struct gdbarch *gdbarch, CORE_ADDR *pcptr)
struct type * neon_double_type
static struct type * arm_register_type(struct gdbarch *gdbarch, int regnum)
struct cmd_list_element * add_prefix_cmd(const char *name, enum command_class theclass, cmd_const_cfunc_ftype *fun, const char *doc, struct cmd_list_element **prefixlist, const char *prefixname, int allow_unknown, struct cmd_list_element **list)
struct compunit_symtab * find_pc_compunit_symtab(CORE_ADDR pc)
int target_read_code(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
static int extract_arm_insn(abstract_memory_reader &reader, insn_decode_record *insn_record, uint32_t insn_size)
static void deallocate_reg_mem(insn_decode_record *record)
void gdbarch_register(enum bfd_architecture bfd_architecture, gdbarch_init_ftype *init, gdbarch_dump_tdep_ftype *dump_tdep)
struct minimal_symbol * lookup_minimal_symbol_by_pc_name(CORE_ADDR pc, const char *name, struct objfile *objf)
static int arm_stack_frame_destroyed_p_1(struct gdbarch *gdbarch, CORE_ADDR pc)
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
struct arm_displaced_step_closure::@5::@10 svc
void null_cleanup(void *arg)
static void install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, unsigned int rn, unsigned int rm)
static int arm_copy_preload_reg(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
struct reggroup *const float_reggroup
static int thumb2_record_branch_misc_cntrl(insn_decode_record *thumb2_insn_r)
int tdesc_numbered_register(const struct tdesc_feature *feature, struct tdesc_arch_data *data, int regno, const char *name)
void frame_base_set_default(struct gdbarch *gdbarch, const struct frame_base *default_base)
struct cmd_list_element * setlist
#define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2)
enum frame_type get_frame_type(struct frame_info *frame)
void set_gdbarch_pseudo_register_write(struct gdbarch *gdbarch, gdbarch_pseudo_register_write_ftype pseudo_register_write)
static void install_load_store(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, int load, int immed, int writeback, int size, int usermode, int rt, int rm, int rn)
int arm_process_record(struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR insn_addr)
void append_composite_type_field(struct type *t, const char *name, struct type *field)
static void install_pc_relative(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, int rd)
static void arm_m_exception_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
void set_gdbarch_register_type(struct gdbarch *gdbarch, gdbarch_register_type_ftype register_type)
static int arm_register_reggroup_p(struct gdbarch *gdbarch, int regnum, struct reggroup *group)
struct type * check_typedef(struct type *type)
struct frame_unwind arm_m_exception_unwind
#define ARM_LE_BREAKPOINT
const gdb_byte * value_contents(struct value *value)
int tdesc_numbered_register_choices(const struct tdesc_feature *feature, struct tdesc_arch_data *data, int regno, const char *const names[])
static void initialize_tdesc_arm_with_m_vfp_d16(void)
static struct value * arm_epilogue_frame_prev_register(struct frame_info *this_frame, void **this_cache, int regnum)
void register_remote_g_packet_guess(struct gdbarch *gdbarch, int bytes, const struct target_desc *tdesc)
int thumb_breakpoint_size
static int thumb2_copy_block_xfer(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
static int arm_stack_frame_destroyed_p(struct gdbarch *gdbarch, CORE_ADDR pc)
static void arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
enum struct_return struct_return
static struct cmd_list_element * setarmcmdlist
static int arm_copy_copro_load_store(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static void cleanup_block_load_pc(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
#define sbits(obj, st, fn)
CORE_ADDR gdbarch_addr_bits_remove(struct gdbarch *gdbarch, CORE_ADDR addr)
static int arm_copy_b_bl_blx(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
int field_is_static(struct field *f)
objfile(bfd *, const char *, objfile_flags)
static struct value * arm_dwarf2_prev_register(struct frame_info *this_frame, void **this_cache, int regnum)
static struct arm_prologue_cache * arm_make_epilogue_frame_cache(struct frame_info *this_frame)
struct target_desc * tdesc_arm_with_m_fpa_layout
void fprintf_filtered(struct ui_file *stream, const char *format,...)
static struct value * arm_m_exception_prev_register(struct frame_info *this_frame, void **this_cache, int prev_regnum)
static int thumb2_copy_b_bl_blx(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
void set_gdbarch_stack_frame_destroyed_p(struct gdbarch *gdbarch, gdbarch_stack_frame_destroyed_p_ftype stack_frame_destroyed_p)
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
enum register_status regcache_cooked_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
struct type * arch_float_type(struct gdbarch *gdbarch, int bit, const char *name, const struct floatformat **floatformats)
void set_gdbarch_sp_regnum(struct gdbarch *gdbarch, int sp_regnum)
void set_gdbarch_dummy_id(struct gdbarch *gdbarch, gdbarch_dummy_id_ftype dummy_id)
static int thumb_record_shift_add_sub(insn_decode_record *thumb_insn_r)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
struct cmd_list_element * showlist
static int thumb2_record_lmul_lmla_div(insn_decode_record *thumb2_insn_r)
void fputs_filtered(const char *linebuffer, struct ui_file *stream)
static void thumb_scan_prologue(struct gdbarch *gdbarch, CORE_ADDR prev_pc, CORE_ADDR block_addr, struct arm_prologue_cache *cache)
static const char * arm_fallback_mode_string
char * get_disassembler_options(struct gdbarch *gdbarch)
const struct floatformat * floatformats_ieee_double_littlebyte_bigword[BFD_ENDIAN_UNKNOWN]
#define gdb_assert_not_reached(message)
static void cleanup_alu_shifted_reg(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
static int arm_record_strx(insn_decode_record *arm_insn_r, uint32_t *record_buf, uint32_t *record_buf_mem, arm_record_strx_t str_type)
int default_print_insn(bfd_vma memaddr, disassemble_info *info)
static int thumb2_record_ld_mem_hints(insn_decode_record *thumb2_insn_r)
void set_gdbarch_adjust_breakpoint_address(struct gdbarch *gdbarch, gdbarch_adjust_breakpoint_address_ftype adjust_breakpoint_address)
static int thumb2_copy_copro_load_store(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
static void cleanup_preload(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
void set_gdbarch_register_sim_regno(struct gdbarch *gdbarch, gdbarch_register_sim_regno_ftype register_sim_regno)
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
static CORE_ADDR thumb_analyze_prologue(struct gdbarch *gdbarch, CORE_ADDR start, CORE_ADDR limit, struct arm_prologue_cache *cache)
static struct arm_prologue_cache * arm_m_exception_cache(struct frame_info *this_frame)
static void arm_record_special_symbol(struct gdbarch *gdbarch, struct objfile *objfile, asymbol *sym)
void arm_displaced_step_fixup(struct gdbarch *gdbarch, struct displaced_step_closure *dsc_, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
int thumb_insn_size(unsigned short inst1)
int find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr)
static int arm_copy_alu_shifted_reg(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
struct type * init_vector_type(struct type *elt_type, int n)
struct type * builtin_int0
static int thumb2_record_ps_dest_generic(insn_decode_record *thumb2_insn_r)
#define VEC_index(T, V, I)
static int arm_vfp_cprc_sub_candidate(struct type *t, enum arm_vfp_cprc_base_type *base_type)
static int thumb2_decode_dp_shift_reg(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
static void set_arm_command(const char *args, int from_tty)
int arm_is_thumb(struct regcache *regcache)
static int thumb2_decode_ext_reg_ld_st(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
void set_gdbarch_unwind_pc(struct gdbarch *gdbarch, gdbarch_unwind_pc_ftype unwind_pc)
struct frame_unwind arm_prologue_unwind
struct type * builtin_uint32
static const gdb_byte arm_default_thumb_le_breakpoint[]
struct gdbarch * get_current_arch(void)
int default_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
#define COMPUNIT_PRODUCER(cust)
void set_gdbarch_code_of_frame_writable(struct gdbarch *gdbarch, gdbarch_code_of_frame_writable_ftype code_of_frame_writable)
int arm_instruction_changes_pc(uint32_t this_instr)
#define REG_ALLOC(REGS, LENGTH, RECORD_BUF)
void store(pv_t addr, CORE_ADDR size, pv_t value)
static void arm_scan_prologue(struct frame_info *this_frame, struct arm_prologue_cache *cache)
const char * gdbarch_register_name(struct gdbarch *gdbarch, int regnr)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
static int startswith(const char *string, const char *pattern)
static struct type * arm_neon_double_type(struct gdbarch *gdbarch)
static void thumb_process_displaced_32bit_insn(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
static int arm_copy_unpred(struct gdbarch *gdbarch, uint32_t insn, arm_displaced_step_closure *dsc)
static int arm_vfp_call_candidate(struct type *t, enum arm_vfp_cprc_base_type *base_type, int *count)
#define ARM_BE_BREAKPOINT
static int arm_record_exreg_ld_st_insn(insn_decode_record *arm_insn_r)
static const struct @4 arm_register_aliases[]
static void show_disassembly_style_sfunc(struct ui_file *, int, struct cmd_list_element *, const char *)
int gdbarch_addr_bit(struct gdbarch *gdbarch)
void set_gdbarch_unwind_sp(struct gdbarch *gdbarch, gdbarch_unwind_sp_ftype unwind_sp)
static int arm_dwarf_reg_to_regnum(struct gdbarch *gdbarch, int reg)
static void arm_show_force_mode(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
static int arm_record_extension_space(insn_decode_record *arm_insn_r)
#define MAX_IT_BLOCK_PREFIX
static CORE_ADDR arm_frame_align(struct gdbarch *gdbarch, CORE_ADDR sp)
void arm_process_displaced_insn(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs, arm_displaced_step_closure *dsc)
static int arm_copy_bx_blx_reg(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static void alu_write_pc(struct regcache *regs, arm_displaced_step_closure *dsc, ULONGEST val)
void printf_unfiltered(const char *format,...)
static void arm_print_float_info(struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, const char *args)
struct cmd_list_element * setdebuglist
static struct cmd_list_element * showarmcmdlist
static void initialize_tdesc_arm_with_iwmmxt(void)
static int thumb_decode_pc_relative_16bit(struct gdbarch *gdbarch, uint16_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
CORE_ADDR arm_get_next_pcs_addr_bits_remove(struct arm_get_next_pcs *self, CORE_ADDR val)
struct obj_section * find_pc_section(CORE_ADDR pc)
static void cleanup_load(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
int user_reg_map_name_to_regnum(struct gdbarch *gdbarch, const char *name, int len)
static int decode_insn(abstract_memory_reader &reader, insn_decode_record *arm_record, record_type_t record_type, uint32_t insn_size)
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
static void cleanup_copro_load_store(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
int arm_pc_is_thumb(struct gdbarch *gdbarch, CORE_ADDR memaddr)
#define TYPE_FIELD_BITSIZE(thistype, n)
static void install_copro_load_store(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, int writeback, unsigned int rn)
void set_gdbarch_breakpoint_kind_from_pc(struct gdbarch *gdbarch, gdbarch_breakpoint_kind_from_pc_ftype breakpoint_kind_from_pc)
struct trad_frame_saved_reg * trad_frame_alloc_saved_regs(struct gdbarch *gdbarch)
LONGEST unpack_long(struct type *type, const gdb_byte *valaddr)
void cmd_show_list(struct cmd_list_element *list, int from_tty, const char *prefix)
static int arm_record_media(insn_decode_record *arm_insn_r)
#define TYPE_FIELD_BITPOS(thistype, n)
static gdb_byte * extend_buffer_earlier(gdb_byte *buf, CORE_ADDR endaddr, int old_len, int new_len)
static void cleanup_block_load_all(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
static int thumb_32bit_copy_undef(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, arm_displaced_step_closure *dsc)
static int thumb_record_misc(insn_decode_record *thumb_insn_r)
static int arm_get_longjmp_target(struct frame_info *frame, CORE_ADDR *pc)
int record_full_arch_list_add_mem(CORE_ADDR addr, int len)
static int arm_compare_mapping_symbols(const struct arm_mapping_symbol *lhs, const struct arm_mapping_symbol *rhs)
DEF_VEC_O(arm_mapping_symbol_s)
const struct target_desc * target_desc
#define INT_REGISTER_SIZE
static enum gdb_osabi arm_elf_osabi_sniffer(bfd *abfd)
void _initialize_arm_tdep(void)
int(* arm_syscall_record)(struct regcache *regcache, unsigned long svc_number)
static int arm_copy_ldr_str_ldrb_strb(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc, int load, int size, int usermode)
void(* cleanup)(struct gdbarch *, struct regcache *, arm_displaced_step_closure *)
void set_gdbarch_disassembler_options(struct gdbarch *gdbarch, char **disassembler_options)
const struct floatformat * floatformats_ieee_single[BFD_ENDIAN_UNKNOWN]
struct type * neon_quad_type
static int thumb_record_ldm_stm_swi(insn_decode_record *thumb_insn_r)
ULONGEST arm_get_next_pcs_read_memory_unsigned_integer(CORE_ADDR memaddr, int len, int byte_order)
static int arm_decode_dp_misc(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static int arm_record_coproc_data_proc(insn_decode_record *arm_insn_r)
static int arm_return_in_memory(struct gdbarch *gdbarch, struct type *type)
static void arm_show_fallback_mode(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
#define MSYMBOL_SET_SPECIAL(msym)
void tdesc_use_registers(struct gdbarch *gdbarch, const struct target_desc *target_desc, struct tdesc_arch_data *early_data)
gdbarch_return_value_ftype * return_value
static unsigned arm_vfp_cprc_unit_length(enum arm_vfp_cprc_base_type b)
static struct frame_id arm_dummy_id(struct gdbarch *gdbarch, struct frame_info *this_frame)
int core_addr_lessthan(CORE_ADDR lhs, CORE_ADDR rhs)
struct frame_info * get_next_frame(struct frame_info *this_frame)
struct type * arm_ext_type
void help_list(struct cmd_list_element *list, const char *cmdtype, enum command_class theclass, struct ui_file *stream)
static void bx_write_pc(struct regcache *regs, ULONGEST val)
void set_gdbarch_pseudo_register_read(struct gdbarch *gdbarch, gdbarch_pseudo_register_read_ftype pseudo_register_read)
static struct type * arm_ext_type(struct gdbarch *gdbarch)
void set_gdbarch_char_signed(struct gdbarch *gdbarch, int char_signed)
static void arm_objfile_data_free(struct objfile *objfile, void *arg)
const gdb_byte * thumb2_breakpoint
#define TYPE_TARGET_TYPE(thistype)
struct type * builtin_double
struct bound_minimal_symbol lookup_minimal_symbol_by_pc(CORE_ADDR pc)
static const struct frame_unwind arm_epilogue_frame_unwind
struct frame_base arm_normal_base
static void arm_epilogue_frame_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
int thumb2_breakpoint_size
static void show_arm_command(const char *args, int from_tty)
static const struct objfile_data * arm_exidx_data_key
static void install_b_bl_blx(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, unsigned int cond, int exchange, int link, long offset)
static int thumb_record_branch(insn_decode_record *thumb_insn_r)
static int arm_decode_svc_copro(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
#define VFP_REGISTER_SIZE
static int arm_copy_block_xfer(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static void cleanup_branch(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
void set_gdbarch_breakpoint_kind_from_current_state(struct gdbarch *gdbarch, gdbarch_breakpoint_kind_from_current_state_ftype breakpoint_kind_from_current_state)
int frame_relative_level(struct frame_info *fi)
int xsnprintf(char *str, size_t size, const char *format,...)
static void arm_register_g_packet_guesses(struct gdbarch *gdbarch)
#define TYPE_CODE(thistype)
static int thumb_stack_frame_destroyed_p(struct gdbarch *gdbarch, CORE_ADDR pc)
struct value * value_of_register(int regnum, struct frame_info *frame)
static struct value * arm_prologue_prev_register(struct frame_info *this_frame, void **this_cache, int prev_regnum)
enum register_status regcache_raw_read(struct regcache *regcache, int regnum, gdb_byte *buf)
static int arm_breakpoint_kind_from_current_state(struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR *pcptr)
void regcache_cooked_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
static int thumb_copy_pc_relative_16bit(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, int rd, unsigned int imm)
static enum register_status arm_pseudo_read(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, gdb_byte *buf)
static int thumb_copy_bx_blx_reg(struct gdbarch *gdbarch, uint16_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
struct regcache * regcache
unsigned long modinsn[DISPLACED_MODIFIED_INSNS]
void gdbarch_info_init(struct gdbarch_info *info)
static int arm_vfp_abi_for_function(struct gdbarch *gdbarch, struct type *func_type)
CORE_ADDR regcache_read_pc(struct regcache *regcache)
struct type * builtin_data_ptr
static int in_plt_section(CORE_ADDR pc)
static int thumb2_record_asimd_struct_ld_st(insn_decode_record *thumb2_insn_r)
static const char * arm_abi_string
static int thumb2_record_ld_word(insn_decode_record *thumb2_insn_r)
struct minimal_symbol * minsym
static const char * current_fp_model
struct arm_displaced_step_closure::@5::@6 ldst
void set_gdbarch_record_special_symbol(struct gdbarch *gdbarch, gdbarch_record_special_symbol_ftype record_special_symbol)
int bitcount(unsigned long val)
static enum register_status arm_neon_quad_read(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, gdb_byte *buf)
static const gdb_byte * arm_sw_breakpoint_from_kind(struct gdbarch *gdbarch, int kind, int *size)
#define obj_section_addr(s)
static CORE_ADDR arm_adjust_breakpoint_address(struct gdbarch *gdbarch, CORE_ADDR bpaddr)
struct type * tdesc_register_type(struct gdbarch *gdbarch, int regno)
struct arm_displaced_step_closure::@5::@8 block
void add_setshow_boolean_cmd(const char *name, enum command_class theclass, int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
void set_gdbarch_print_float_info(struct gdbarch *gdbarch, gdbarch_print_float_info_ftype print_float_info)
#define TYPE_NFIELDS(thistype)
void set_gdbarch_num_pseudo_regs(struct gdbarch *gdbarch, int num_pseudo_regs)
static const struct objfile_data * arm_objfile_data_key
static int thumb2_copy_alu_imm(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
#define THUMB_BE_BREAKPOINT
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
enum register_status regcache_cooked_read(struct regcache *regcache, int regnum, gdb_byte *buf)
static int thumb_copy_16bit_ldr_literal(struct gdbarch *gdbarch, uint16_t insn1, struct regcache *regs, arm_displaced_step_closure *dsc)
int arm_get_next_pcs_is_thumb(struct arm_get_next_pcs *self)
static int arm_copy_svc(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static int thumb_record_add_sub_cmp_mov(insn_decode_record *thumb_insn_r)
static int thumb_copy_cbnz_cbz(struct gdbarch *gdbarch, uint16_t insn1, struct regcache *regs, arm_displaced_step_closure *dsc)
struct target_desc * tdesc_arm_with_m_vfp_d16
struct m32c_reg regs[M32C_MAX_NUM_REGS]
static void install_alu_shifted_reg(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, unsigned int rd, unsigned int rn, unsigned int rm, unsigned rs)
static int thumb2_copy_preload(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
void arm_get_next_pcs_ctor(struct arm_get_next_pcs *self, struct arm_get_next_pcs_ops *ops, int byte_order, int byte_order_for_code, int has_thumb2_breakpoint, struct regcache *regcache)
static void set_fp_model_sfunc(const char *args, int from_tty, struct cmd_list_element *c)
std::string string_printf(const char *fmt,...)
static int thumb_copy_alu_reg(struct gdbarch *gdbarch, uint16_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static int displaced_in_arm_mode(struct regcache *regs)
static int arm_record_ld_st_imm_offset(insn_decode_record *arm_insn_r)
static enum return_value_convention arm_return_value(struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
struct target_desc * tdesc_arm_with_m
enum bfd_endian byte_order_for_code
void set_gdbarch_valid_disassembler_options(struct gdbarch *gdbarch, const disasm_options_t *valid_disassembler_options)
static int thumb2_copy_table_branch(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
void set_gdbarch_double_format(struct gdbarch *gdbarch, const struct floatformat **double_format)
struct tdesc_arch_data * tdesc_data_alloc(void)
static struct obj_section * arm_obj_section_from_vma(struct objfile *objfile, bfd_vma vma)
static int arm_decode_miscellaneous(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static CORE_ADDR arm_normal_frame_base(struct frame_info *this_frame, void **this_cache)
static const char *const arm_abi_strings[]
#define DISPLACED_MODIFIED_INSNS
static void cleanup_svc(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
int(* sti_arm_hdl_fp_t)(insn_decode_record *)
static int arm_record_vfp_data_proc_insn(insn_decode_record *arm_insn_r)
static char * arm_disassembler_options
unsigned long long ULONGEST
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF)
const struct tdesc_feature * tdesc_find_feature(const struct target_desc *target_desc, const char *name)
struct arm_displaced_step_closure::@5::@9 preload
struct observer * observer_attach_new_objfile(observer_new_objfile_ftype *f)
void user_reg_add(struct gdbarch *gdbarch, const char *name, user_reg_read_ftype *read, const void *baton)
std::vector< CORE_ADDR > arm_software_single_step(struct regcache *regcache)
#define IT_SCAN_THRESHOLD
struct type * value_type(const struct value *value)
enum bfd_endian byte_order_for_code
static struct arm_prologue_cache * arm_make_stub_cache(struct frame_info *this_frame)
static const char ** valid_disassembly_styles
static void arm_exidx_new_objfile(struct objfile *objfile)
static int arm_copy_preload(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
union arm_displaced_step_closure::@5 u
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype return_value)
const struct bfd_arch_info * gdbarch_bfd_arch_info(struct gdbarch *gdbarch)
void dwarf2_frame_set_init_reg(struct gdbarch *gdbarch, void(*init_reg)(struct gdbarch *, int, struct dwarf2_frame_state_reg *, struct frame_info *))
struct cmd_list_element * showdebuglist
bool find_reg(struct gdbarch *gdbarch, int reg, CORE_ADDR *offset_p)
static int coff_sym_is_thumb(int val)
static void arm_dwarf2_frame_init_reg(struct gdbarch *gdbarch, int regnum, struct dwarf2_frame_state_reg *reg, struct frame_info *this_frame)
void set_gdbarch_long_double_format(struct gdbarch *gdbarch, const struct floatformat **long_double_format)
int condition_true(unsigned long cond, unsigned long status_reg)
ULONGEST tmp[DISPLACED_TEMPS]
struct frame_unwind arm_exidx_unwind
#define VEC_safe_insert(T, V, I, O)
int default_register_reggroup_p(struct gdbarch *gdbarch, int regnum, struct reggroup *group)
struct reggroup *const save_reggroup
#define OBSTACK_ZALLOC(OBSTACK, TYPE)
#define TYPE_LENGTH(thistype)
static void cleanup_alu_reg(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
static int arm_stub_unwind_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
enum register_status regcache_raw_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
void set_gdbarch_push_dummy_call(struct gdbarch *gdbarch, gdbarch_push_dummy_call_ftype push_dummy_call)
int thumb2_instruction_changes_pc(unsigned short inst1, unsigned short inst2)
static int arm_m_addr_is_magic(CORE_ADDR addr)
static const gdb_byte arm_default_arm_be_breakpoint[]
ULONGEST read_memory_unsigned_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
static bool in_inclusive_range(T value, T low, T high)
static int arm_record_b_bl(insn_decode_record *arm_insn_r)
struct trad_frame_saved_reg * saved_regs
struct type * builtin_uint64
void set_gdbarch_sw_breakpoint_from_kind(struct gdbarch *gdbarch, gdbarch_sw_breakpoint_from_kind_ftype sw_breakpoint_from_kind)
struct arm_mem_r * arm_mems
static CORE_ADDR arm_unwind_pc(struct gdbarch *gdbarch, struct frame_info *this_frame)
static int arm_copy_extra_ld_st(struct gdbarch *gdbarch, uint32_t insn, int unprivileged, struct regcache *regs, arm_displaced_step_closure *dsc)
void write_memory(CORE_ADDR memaddr, const bfd_byte *myaddr, ssize_t len)
void set_gdbarch_skip_prologue(struct gdbarch *gdbarch, gdbarch_skip_prologue_ftype skip_prologue)
static int arm_copy_alu_imm(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
static void arm_pseudo_write(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, const gdb_byte *buf)
const struct floatformat * floatformats_arm_ext[BFD_ENDIAN_UNKNOWN]
static struct gdbarch_data * tdesc_data
static int decode_thumb_32bit_ld_mem_hints(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
#define UNMAKE_THUMB_ADDR(addr)
struct displaced_step_closure * get_displaced_step_closure_by_addr(CORE_ADDR addr)
enum bfd_endian byte_order
enum bfd_endian gdbarch_byte_order_for_code(struct gdbarch *gdbarch)
static int thumb_record_ld_st_reg_offset(insn_decode_record *thumb_insn_r)
void set_gdbarch_pc_regnum(struct gdbarch *gdbarch, int pc_regnum)
void set_gdbarch_max_insn_length(struct gdbarch *gdbarch, ULONGEST max_insn_length)
struct type * builtin_void
int record_full_arch_list_add_end(void)
static CORE_ADDR arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch, unsigned int *destreg, int *offset)
pv_t pv_add(pv_t a, pv_t b)
int tdesc_has_registers(const struct target_desc *target_desc)
void set_gdbarch_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype register_name)
void register_test(const std::string &name, selftest *test)
int pv_is_constant(pv_t a)
CORE_ADDR get_frame_func(struct frame_info *this_frame)
static void arm_neon_quad_write(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, const gdb_byte *buf)
static void store_signed_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, LONGEST val)
void error(const char *fmt,...)
static void install_bx_blx_reg(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc, int link, unsigned int cond, unsigned int rm)
pv_t pv_register(int reg, CORE_ADDR k)
struct gdbarch * gdbarch_alloc(const struct gdbarch_info *info, struct gdbarch_tdep *tdep)
void set_disassembler_options(char *prospective_options)
void set_gdbarch_inner_than(struct gdbarch *gdbarch, gdbarch_inner_than_ftype inner_than)
static void thumb_process_displaced_16bit_insn(struct gdbarch *gdbarch, uint16_t insn1, struct regcache *regs, arm_displaced_step_closure *dsc)
CORE_ADDR arm_skip_stub(struct frame_info *frame, CORE_ADDR pc)
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
static CORE_ADDR arm_analyze_prologue(struct gdbarch *gdbarch, CORE_ADDR prologue_start, CORE_ADDR prologue_end, struct arm_prologue_cache *cache)
struct type * arch_composite_type(struct gdbarch *gdbarch, const char *name, enum type_code code)
static int arm_decode_unconditional(struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs, arm_displaced_step_closure *dsc)
void do_cleanups(struct cleanup *old_chain)
void regcache_cooked_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
static int arm_record_ld_st_multiple(insn_decode_record *arm_insn_r)
#define SELF_CHECK(VALUE)
int tdesc_unnumbered_register(const struct tdesc_feature *feature, const char *name)
void set_gdbarch_print_insn(struct gdbarch *gdbarch, gdbarch_print_insn_ftype print_insn)
struct type * builtin_float
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)
const struct target_desc * gdbarch_target_desc(struct gdbarch *gdbarch)
static CORE_ADDR arm_skip_bx_reg(struct frame_info *frame, CORE_ADDR pc)
void regcache_raw_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
void set_gdbarch_vbit_in_delta(struct gdbarch *gdbarch, int vbit_in_delta)
enum register_status regcache_raw_read_signed(struct regcache *regcache, int regnum, LONGEST *val)
#define MAKE_THUMB_ADDR(addr)
static int thumb_copy_pc_relative_32bit(struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2, struct regcache *regs, arm_displaced_step_closure *dsc)