aboutsummaryrefslogtreecommitdiff
ModeNameSize
-rw-r--r--.cvsignore393logplain
-rw-r--r--COPYING18002logplain
-rw-r--r--COPYING.LIB25291logplain
-rw-r--r--COPYING.LIBGLOSS12017logplain
-rw-r--r--COPYING.NEWLIB38255logplain
-rw-r--r--COPYING335147logplain
-rw-r--r--COPYING3.LIB7639logplain
-rw-r--r--ChangeLog413534logplain
-rw-r--r--MAINTAINERS4277logplain
-rw-r--r--Makefile.def26180logplain
-rw-r--r--Makefile.in1725001logplain
-rw-r--r--Makefile.tpl62592logplain
-rw-r--r--README1719logplain
-rw-r--r--README-maintainer-mode713logplain
d---------bfd16375logplain
d---------binutils3918logplain
-rwxr-xr-xcompile3707logplain
-rw-r--r--config-ml.in25088logplain
-rwxr-xr-xconfig.guess45630logplain
-rwxr-xr-xconfig.rpath14979logplain
-rwxr-xr-xconfig.sub33958logplain
d---------config2842logplain
-rwxr-xr-xconfigure416212logplain
-rw-r--r--configure.ac98770logplain
d---------cpu846logplain
-rwxr-xr-xdepcomp16619logplain
-rwxr-xr-xdjunpack.bat1875logplain
d---------elfcpp444logplain
d---------etc766logplain
d---------gas3535logplain
d---------gdb26472logplain
d---------gold4198logplain
d---------gprof2380logplain
d---------include1888logplain
-rwxr-xr-xinstall-sh9233logplain
d---------intl1632logplain
d---------ld2615logplain
d---------libdecnumber1506logplain
d---------libiberty4992logplain
-rw-r--r--libtool.m4259988logplain
-rw-r--r--ltgcc.m41768logplain
-rw-r--r--ltmain.sh243267logplain
-rw-r--r--ltoptions.m411938logplain
-rw-r--r--ltsugar.m44372logplain
-rw-r--r--ltversion.m4701logplain
-rw-r--r--lt~obsolete.m45707logplain
-rw-r--r--makefile.vms1087logplain
-rwxr-xr-xmissing11014logplain
-rwxr-xr-xmkdep2179logplain
-rwxr-xr-xmkinstalldirs3474logplain
-rwxr-xr-xmove-if-change384logplain
d---------opcodes9324logplain
d---------readline2707logplain
-rw-r--r--setup.com841logplain
d---------sim991logplain
-rw-r--r--src-release10696logplain
-rwxr-xr-xsymlink-tree2265logplain
d---------texinfo39logplain
-rwxr-xr-xylwrap6193logplain
a id='n977' href='#n977'>977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568
/* Interface between GDB and target environments, including files and processes

   Copyright (C) 1990-2019 Free Software Foundation, Inc.

   Contributed by Cygnus Support.  Written by John Gilmore.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#if !defined (TARGET_H)
#define TARGET_H

struct objfile;
struct ui_file;
struct mem_attrib;
struct target_ops;
struct bp_location;
struct bp_target_info;
struct regcache;
struct target_section_table;
struct trace_state_variable;
struct trace_status;
struct uploaded_tsv;
struct uploaded_tp;
struct static_tracepoint_marker;
struct traceframe_info;
struct expression;
struct dcache_struct;
struct inferior;

#include "infrun.h" /* For enum exec_direction_kind.  */
#include "breakpoint.h" /* For enum bptype.  */
#include "common/scoped_restore.h"

/* This include file defines the interface between the main part
   of the debugger, and the part which is target-specific, or
   specific to the communications interface between us and the
   target.

   A TARGET is an interface between the debugger and a particular
   kind of file or process.  Targets can be STACKED in STRATA,
   so that more than one target can potentially respond to a request.
   In particular, memory accesses will walk down the stack of targets
   until they find a target that is interested in handling that particular
   address.  STRATA are artificial boundaries on the stack, within
   which particular kinds of targets live.  Strata exist so that
   people don't get confused by pushing e.g. a process target and then
   a file target, and wondering why they can't see the current values
   of variables any more (the file target is handling them and they
   never get to the process target).  So when you push a file target,
   it goes into the file stratum, which is always below the process
   stratum.

   Note that rather than allow an empty stack, we always have the
   dummy target at the bottom stratum, so we can call the target
   methods without checking them.  */

#include "target/target.h"
#include "target/resume.h"
#include "target/wait.h"
#include "target/waitstatus.h"
#include "bfd.h"
#include "symtab.h"
#include "memattr.h"
#include "common/vec.h"
#include "common/gdb_signals.h"
#include "btrace.h"
#include "record.h"
#include "command.h"
#include "disasm.h"
#include "tracepoint.h"

#include "common/break-common.h" /* For enum target_hw_bp_type.  */

enum strata
  {
    dummy_stratum,		/* The lowest of the low */
    file_stratum,		/* Executable files, etc */
    process_stratum,		/* Executing processes or core dump files */
    thread_stratum,		/* Executing threads */
    record_stratum,		/* Support record debugging */
    arch_stratum,		/* Architecture overrides */
    debug_stratum		/* Target debug.  Must be last.  */
  };

enum thread_control_capabilities
  {
    tc_none = 0,		/* Default: can't control thread execution.  */
    tc_schedlock = 1,		/* Can lock the thread scheduler.  */
  };

/* The structure below stores information about a system call.
   It is basically used in the "catch syscall" command, and in
   every function that gives information about a system call.
   
   It's also good to mention that its fields represent everything
   that we currently know about a syscall in GDB.  */
struct syscall
  {
    /* The syscall number.  */
    int number;

    /* The syscall name.  */
    const char *name;
  };

/* Return a pretty printed form of TARGET_OPTIONS.  */
extern std::string target_options_to_string (int target_options);

/* Possible types of events that the inferior handler will have to
   deal with.  */
enum inferior_event_type
  {
    /* Process a normal inferior event which will result in target_wait
       being called.  */
    INF_REG_EVENT,
    /* We are called to do stuff after the inferior stops.  */
    INF_EXEC_COMPLETE,
  };

/* Target objects which can be transfered using target_read,
   target_write, et cetera.  */

enum target_object
{
  /* AVR target specific transfer.  See "avr-tdep.c" and "remote.c".  */
  TARGET_OBJECT_AVR,
  /* SPU target specific transfer.  See "spu-tdep.c".  */
  TARGET_OBJECT_SPU,
  /* Transfer up-to LEN bytes of memory starting at OFFSET.  */
  TARGET_OBJECT_MEMORY,
  /* Memory, avoiding GDB's data cache and trusting the executable.
     Target implementations of to_xfer_partial never need to handle
     this object, and most callers should not use it.  */
  TARGET_OBJECT_RAW_MEMORY,
  /* Memory known to be part of the target's stack.  This is cached even
     if it is not in a region marked as such, since it is known to be
     "normal" RAM.  */
  TARGET_OBJECT_STACK_MEMORY,
  /* Memory known to be part of the target code.   This is cached even
     if it is not in a region marked as such.  */
  TARGET_OBJECT_CODE_MEMORY,
  /* Kernel Unwind Table.  See "ia64-tdep.c".  */
  TARGET_OBJECT_UNWIND_TABLE,
  /* Transfer auxilliary vector.  */
  TARGET_OBJECT_AUXV,
  /* StackGhost cookie.  See "sparc-tdep.c".  */
  TARGET_OBJECT_WCOOKIE,
  /* Target memory map in XML format.  */
  TARGET_OBJECT_MEMORY_MAP,
  /* Flash memory.  This object can be used to write contents to
     a previously erased flash memory.  Using it without erasing
     flash can have unexpected results.  Addresses are physical
     address on target, and not relative to flash start.  */
  TARGET_OBJECT_FLASH,
  /* Available target-specific features, e.g. registers and coprocessors.
     See "target-descriptions.c".  ANNEX should never be empty.  */
  TARGET_OBJECT_AVAILABLE_FEATURES,
  /* Currently loaded libraries, in XML format.  */
  TARGET_OBJECT_LIBRARIES,
  /* Currently loaded libraries specific for SVR4 systems, in XML format.  */
  TARGET_OBJECT_LIBRARIES_SVR4,
  /* Currently loaded libraries specific to AIX systems, in XML format.  */
  TARGET_OBJECT_LIBRARIES_AIX,
  /* Get OS specific data.  The ANNEX specifies the type (running
     processes, etc.).  The data being transfered is expected to follow
     the DTD specified in features/osdata.dtd.  */
  TARGET_OBJECT_OSDATA,
  /* Extra signal info.  Usually the contents of `siginfo_t' on unix
     platforms.  */
  TARGET_OBJECT_SIGNAL_INFO,
  /* The list of threads that are being debugged.  */
  TARGET_OBJECT_THREADS,
  /* Collected static trace data.  */
  TARGET_OBJECT_STATIC_TRACE_DATA,
  /* Traceframe info, in XML format.  */
  TARGET_OBJECT_TRACEFRAME_INFO,
  /* Load maps for FDPIC systems.  */
  TARGET_OBJECT_FDPIC,
  /* Darwin dynamic linker info data.  */
  TARGET_OBJECT_DARWIN_DYLD_INFO,
  /* OpenVMS Unwind Information Block.  */
  TARGET_OBJECT_OPENVMS_UIB,
  /* Branch trace data, in XML format.  */
  TARGET_OBJECT_BTRACE,
  /* Branch trace configuration, in XML format.  */
  TARGET_OBJECT_BTRACE_CONF,
  /* The pathname of the executable file that was run to create
     a specified process.  ANNEX should be a string representation
     of the process ID of the process in question, in hexadecimal
     format.  */
  TARGET_OBJECT_EXEC_FILE,
  /* FreeBSD virtual memory mappings.  */
  TARGET_OBJECT_FREEBSD_VMMAP,
  /* FreeBSD process strings.  */
  TARGET_OBJECT_FREEBSD_PS_STRINGS,
  /* Possible future objects: TARGET_OBJECT_FILE, ...  */
};

/* Possible values returned by target_xfer_partial, etc.  */

enum target_xfer_status
{
  /* Some bytes are transferred.  */
  TARGET_XFER_OK = 1,

  /* No further transfer is possible.  */
  TARGET_XFER_EOF = 0,

  /* The piece of the object requested is unavailable.  */
  TARGET_XFER_UNAVAILABLE = 2,

  /* Generic I/O error.  Note that it's important that this is '-1',
     as we still have target_xfer-related code returning hardcoded
     '-1' on error.  */
  TARGET_XFER_E_IO = -1,

  /* Keep list in sync with target_xfer_status_to_string.  */
};

/* Return the string form of STATUS.  */

extern const char *
  target_xfer_status_to_string (enum target_xfer_status status);

typedef enum target_xfer_status
  target_xfer_partial_ftype (struct target_ops *ops,
			     enum target_object object,
			     const char *annex,
			     gdb_byte *readbuf,
			     const gdb_byte *writebuf,
			     ULONGEST offset,
			     ULONGEST len,
			     ULONGEST *xfered_len);

enum target_xfer_status
  raw_memory_xfer_partial (struct target_ops *ops, gdb_byte *readbuf,
			   const gdb_byte *writebuf, ULONGEST memaddr,
			   LONGEST len, ULONGEST *xfered_len);

/* Request that OPS transfer up to LEN addressable units of the target's
   OBJECT.  When reading from a memory object, the size of an addressable unit
   is architecture dependent and can be found using
   gdbarch_addressable_memory_unit_size.  Otherwise, an addressable unit is 1
   byte long.  BUF should point to a buffer large enough to hold the read data,
   taking into account the addressable unit size.  The OFFSET, for a seekable
   object, specifies the starting point.  The ANNEX can be used to provide
   additional data-specific information to the target.

   Return the number of addressable units actually transferred, or a negative
   error code (an 'enum target_xfer_error' value) if the transfer is not
   supported or otherwise fails.  Return of a positive value less than
   LEN indicates that no further transfer is possible.  Unlike the raw
   to_xfer_partial interface, callers of these functions do not need
   to retry partial transfers.  */

extern LONGEST target_read (struct target_ops *ops,
			    enum target_object object,
			    const char *annex, gdb_byte *buf,
			    ULONGEST offset, LONGEST len);

struct memory_read_result
{
  memory_read_result (ULONGEST begin_, ULONGEST end_,
		      gdb::unique_xmalloc_ptr<gdb_byte> &&data_)
    : begin (begin_),
      end (end_),
      data (std::move (data_))
  {
  }

  ~memory_read_result () = default;

  memory_read_result (memory_read_result &&other) = default;

  DISABLE_COPY_AND_ASSIGN (memory_read_result);

  /* First address that was read.  */
  ULONGEST begin;
  /* Past-the-end address.  */
  ULONGEST end;
  /* The data.  */
  gdb::unique_xmalloc_ptr<gdb_byte> data;
};

extern std::vector<memory_read_result> read_memory_robust
    (struct target_ops *ops, const ULONGEST offset, const LONGEST len);

/* Request that OPS transfer up to LEN addressable units from BUF to the
   target's OBJECT.  When writing to a memory object, the addressable unit
   size is architecture dependent and can be found using
   gdbarch_addressable_memory_unit_size.  Otherwise, an addressable unit is 1
   byte long.  The OFFSET, for a seekable object, specifies the starting point.
   The ANNEX can be used to provide additional data-specific information to
   the target.

   Return the number of addressable units actually transferred, or a negative
   error code (an 'enum target_xfer_status' value) if the transfer is not
   supported or otherwise fails.  Return of a positive value less than
   LEN indicates that no further transfer is possible.  Unlike the raw
   to_xfer_partial interface, callers of these functions do not need to
   retry partial transfers.  */

extern LONGEST target_write (struct target_ops *ops,
			     enum target_object object,
			     const char *annex, const gdb_byte *buf,
			     ULONGEST offset, LONGEST len);

/* Similar to target_write, except that it also calls PROGRESS with
   the number of bytes written and the opaque BATON after every
   successful partial write (and before the first write).  This is
   useful for progress reporting and user interaction while writing
   data.  To abort the transfer, the progress callback can throw an
   exception.  */

LONGEST target_write_with_progress (struct target_ops *ops,
				    enum target_object object,
				    const char *annex, const gdb_byte *buf,
				    ULONGEST offset, LONGEST len,
				    void (*progress) (ULONGEST, void *),
				    void *baton);

/* Wrapper to perform a full read of unknown size.  OBJECT/ANNEX will be read
   using OPS.  The return value will be uninstantiated if the transfer fails or
   is not supported.

   This method should be used for objects sufficiently small to store
   in a single xmalloc'd buffer, when no fixed bound on the object's
   size is known in advance.  Don't try to read TARGET_OBJECT_MEMORY
   through this function.  */

extern gdb::optional<gdb::byte_vector> target_read_alloc
    (struct target_ops *ops, enum target_object object, const char *annex);

/* Read OBJECT/ANNEX using OPS.  The result is a NUL-terminated character vector
   (therefore usable as a NUL-terminated string).  If an error occurs or the
   transfer is unsupported, the return value will be uninstantiated.  Empty
   objects are returned as allocated but empty strings.  Therefore, on success,
   the returned vector is guaranteed to have at least one element.  A warning is
   issued if the result contains any embedded NUL bytes.  */

extern gdb::optional<gdb::char_vector> target_read_stralloc
    (struct target_ops *ops, enum target_object object, const char *annex);

/* See target_ops->to_xfer_partial.  */
extern target_xfer_partial_ftype target_xfer_partial;

/* Wrappers to target read/write that perform memory transfers.  They
   throw an error if the memory transfer fails.

   NOTE: cagney/2003-10-23: The naming schema is lifted from
   "frame.h".  The parameter order is lifted from get_frame_memory,
   which in turn lifted it from read_memory.  */

extern void get_target_memory (struct target_ops *ops, CORE_ADDR addr,
			       gdb_byte *buf, LONGEST len);
extern ULONGEST get_target_memory_unsigned (struct target_ops *ops,
					    CORE_ADDR addr, int len,
					    enum bfd_endian byte_order);

struct thread_info;		/* fwd decl for parameter list below: */

/* The type of the callback to the to_async method.  */

typedef void async_callback_ftype (enum inferior_event_type event_type,
				   void *context);

/* Normally target debug printing is purely type-based.  However,
   sometimes it is necessary to override the debug printing on a
   per-argument basis.  This macro can be used, attribute-style, to
   name the target debug printing function for a particular method
   argument.  FUNC is the name of the function.  The macro's
   definition is empty because it is only used by the
   make-target-delegates script.  */

#define TARGET_DEBUG_PRINTER(FUNC)

/* These defines are used to mark target_ops methods.  The script
   make-target-delegates scans these and auto-generates the base
   method implementations.  There are four macros that can be used:
   
   1. TARGET_DEFAULT_IGNORE.  There is no argument.  The base method
   does nothing.  This is only valid if the method return type is
   'void'.
   
   2. TARGET_DEFAULT_NORETURN.  The argument is a function call, like
   'tcomplain ()'.  The base method simply makes this call, which is
   assumed not to return.
   
   3. TARGET_DEFAULT_RETURN.  The argument is a C expression.  The
   base method returns this expression's value.
   
   4. TARGET_DEFAULT_FUNC.  The argument is the name of a function.
   make-target-delegates does not generate a base method in this case,
   but instead uses the argument function as the base method.  */

#define TARGET_DEFAULT_IGNORE()
#define TARGET_DEFAULT_NORETURN(ARG)
#define TARGET_DEFAULT_RETURN(ARG)
#define TARGET_DEFAULT_FUNC(ARG)

/* Each target that can be activated with "target TARGET_NAME" passes
   the address of one of these objects to add_target, which uses the
   object's address as unique identifier, and registers the "target
   TARGET_NAME" command using SHORTNAME as target name.  */

struct target_info
{
  /* Name of this target.  */
  const char *shortname;

  /* Name for printing.  */
  const char *longname;

  /* Documentation.  Does not include trailing newline, and starts
     with a one-line description (probably similar to longname).  */
  const char *doc;
};

struct target_ops
  {
    /* Return this target's stratum.  */
    virtual strata stratum () const = 0;

    /* To the target under this one.  */
    target_ops *beneath () const;

    /* Free resources associated with the target.  Note that singleton
       targets, like e.g., native targets, are global objects, not
       heap allocated, and are thus only deleted on GDB exit.  The
       main teardown entry point is the "close" method, below.  */
    virtual ~target_ops () {}

    /* Return a reference to this target's unique target_info
       object.  */
    virtual const target_info &info () const = 0;

    /* Name this target type.  */
    const char *shortname ()
    { return info ().shortname; }

    const char *longname ()
    { return info ().longname; }

    /* Close the target.  This is where the target can handle
       teardown.  Heap-allocated targets should delete themselves
       before returning.  */
    virtual void close ();

    /* Attaches to a process on the target side.  Arguments are as
       passed to the `attach' command by the user.  This routine can
       be called when the target is not on the target-stack, if the
       target_ops::can_run method returns 1; in that case, it must push
       itself onto the stack.  Upon exit, the target should be ready
       for normal operations, and should be ready to deliver the
       status of the process immediately (without waiting) to an
       upcoming target_wait call.  */
    virtual bool can_attach ();
    virtual void attach (const char *, int);
    virtual void post_attach (int)
      TARGET_DEFAULT_IGNORE ();
    virtual void detach (inferior *, int)
      TARGET_DEFAULT_IGNORE ();
    virtual void disconnect (const char *, int)
      TARGET_DEFAULT_NORETURN (tcomplain ());
    virtual void resume (ptid_t,
			 int TARGET_DEBUG_PRINTER (target_debug_print_step),
			 enum gdb_signal)
      TARGET_DEFAULT_NORETURN (noprocess ());
    virtual void commit_resume ()
      TARGET_DEFAULT_IGNORE ();
    virtual ptid_t wait (ptid_t, struct target_waitstatus *,
			 int TARGET_DEBUG_PRINTER (target_debug_print_options))
      TARGET_DEFAULT_FUNC (default_target_wait);
    virtual void fetch_registers (struct regcache *, int)
      TARGET_DEFAULT_IGNORE ();
    virtual void store_registers (struct regcache *, int)
      TARGET_DEFAULT_NORETURN (noprocess ());
    virtual void prepare_to_store (struct regcache *)
      TARGET_DEFAULT_NORETURN (noprocess ());

    virtual void files_info ()
      TARGET_DEFAULT_IGNORE ();
    virtual int insert_breakpoint (struct gdbarch *,
				 struct bp_target_info *)
      TARGET_DEFAULT_NORETURN (noprocess ());
    virtual int remove_breakpoint (struct gdbarch *,
				 struct bp_target_info *,
				 enum remove_bp_reason)
      TARGET_DEFAULT_NORETURN (noprocess ());

    /* Returns true if the target stopped because it executed a
       software breakpoint.  This is necessary for correct background
       execution / non-stop mode operation, and for correct PC
       adjustment on targets where the PC needs to be adjusted when a
       software breakpoint triggers.  In these modes, by the time GDB
       processes a breakpoint event, the breakpoint may already be
       done from the target, so GDB needs to be able to tell whether
       it should ignore the event and whether it should adjust the PC.
       See adjust_pc_after_break.  */
    virtual bool stopped_by_sw_breakpoint ()
      TARGET_DEFAULT_RETURN (false);
    /* Returns true if the above method is supported.  */
    virtual bool supports_stopped_by_sw_breakpoint ()
      TARGET_DEFAULT_RETURN (false);

    /* Returns true if the target stopped for a hardware breakpoint.
       Likewise, if the target supports hardware breakpoints, this
       method is necessary for correct background execution / non-stop
       mode operation.  Even though hardware breakpoints do not
       require PC adjustment, GDB needs to be able to tell whether the
       hardware breakpoint event is a delayed event for a breakpoint
       that is already gone and should thus be ignored.  */
    virtual bool stopped_by_hw_breakpoint ()
      TARGET_DEFAULT_RETURN (false);
    /* Returns true if the above method is supported.  */
    virtual bool supports_stopped_by_hw_breakpoint ()
      TARGET_DEFAULT_RETURN (false);

    virtual int can_use_hw_breakpoint (enum bptype, int, int)
      TARGET_DEFAULT_RETURN (0);
    virtual int ranged_break_num_registers ()
      TARGET_DEFAULT_RETURN (-1);
    virtual int insert_hw_breakpoint (struct gdbarch *,
				      struct bp_target_info *)
      TARGET_DEFAULT_RETURN (-1);
    virtual int remove_hw_breakpoint (struct gdbarch *,
				      struct bp_target_info *)
      TARGET_DEFAULT_RETURN (-1);

    /* Documentation of what the two routines below are expected to do is
       provided with the corresponding target_* macros.  */
    virtual int remove_watchpoint (CORE_ADDR, int,
				 enum target_hw_bp_type, struct expression *)
      TARGET_DEFAULT_RETURN (-1);
    virtual int insert_watchpoint (CORE_ADDR, int,
				 enum target_hw_bp_type, struct expression *)
      TARGET_DEFAULT_RETURN (-1);

    virtual int insert_mask_watchpoint (CORE_ADDR, CORE_ADDR,
					enum target_hw_bp_type)
      TARGET_DEFAULT_RETURN (1);
    virtual int remove_mask_watchpoint (CORE_ADDR, CORE_ADDR,
					enum target_hw_bp_type)
      TARGET_DEFAULT_RETURN (1);
    virtual bool stopped_by_watchpoint ()
      TARGET_DEFAULT_RETURN (false);
    virtual bool have_steppable_watchpoint ()
      TARGET_DEFAULT_RETURN (false);
    virtual bool stopped_data_address (CORE_ADDR *)
      TARGET_DEFAULT_RETURN (false);
    virtual bool watchpoint_addr_within_range (CORE_ADDR, CORE_ADDR, int)
      TARGET_DEFAULT_FUNC (default_watchpoint_addr_within_range);

    /* Documentation of this routine is provided with the corresponding
       target_* macro.  */
    virtual int region_ok_for_hw_watchpoint (CORE_ADDR, int)
      TARGET_DEFAULT_FUNC (default_region_ok_for_hw_watchpoint);

    virtual bool can_accel_watchpoint_condition (CORE_ADDR, int, int,
						 struct expression *)
      TARGET_DEFAULT_RETURN (false);
    virtual int masked_watch_num_registers (CORE_ADDR, CORE_ADDR)
      TARGET_DEFAULT_RETURN (-1);

    /* Return 1 for sure target can do single step.  Return -1 for
       unknown.  Return 0 for target can't do.  */
    virtual int can_do_single_step ()
      TARGET_DEFAULT_RETURN (-1);

    virtual bool supports_terminal_ours ()
      TARGET_DEFAULT_RETURN (false);
    virtual void terminal_init ()
      TARGET_DEFAULT_IGNORE ();
    virtual void terminal_inferior ()
      TARGET_DEFAULT_IGNORE ();
    virtual void terminal_save_inferior ()
      TARGET_DEFAULT_IGNORE ();
    virtual void terminal_ours_for_output ()
      TARGET_DEFAULT_IGNORE ();
    virtual void terminal_ours ()
      TARGET_DEFAULT_IGNORE ();
    virtual void terminal_info (const char *, int)
      TARGET_DEFAULT_FUNC (default_terminal_info);
    virtual void kill ()
      TARGET_DEFAULT_NORETURN (noprocess ());
    virtual void load (const char *, int)
      TARGET_DEFAULT_NORETURN (tcomplain ());
    /* Start an inferior process and set inferior_ptid to its pid.
       EXEC_FILE is the file to run.
       ALLARGS is a string containing the arguments to the program.
       ENV is the environment vector to pass.  Errors reported with error().
       On VxWorks and various standalone systems, we ignore exec_file.  */
    virtual bool can_create_inferior ();
    virtual void create_inferior (const char *, const std::string &,
				  char **, int);
    virtual void post_startup_inferior (ptid_t)
      TARGET_DEFAULT_IGNORE ();
    virtual int insert_fork_catchpoint (int)
      TARGET_DEFAULT_RETURN (1);
    virtual int remove_fork_catchpoint (int)
      TARGET_DEFAULT_RETURN (1);
    virtual int insert_vfork_catchpoint (int)
      TARGET_DEFAULT_RETURN (1);
    virtual int remove_vfork_catchpoint (int)
      TARGET_DEFAULT_RETURN (1);
    virtual int follow_fork (int, int)
      TARGET_DEFAULT_FUNC (default_follow_fork);
    virtual int insert_exec_catchpoint (int)
      TARGET_DEFAULT_RETURN (1);
    virtual int remove_exec_catchpoint (int)
      TARGET_DEFAULT_RETURN (1);
    virtual void follow_exec (struct inferior *, char *)
      TARGET_DEFAULT_IGNORE ();
    virtual int set_syscall_catchpoint (int, bool, int,
					gdb::array_view<const int>)
      TARGET_DEFAULT_RETURN (1);
    virtual void mourn_inferior ()
      TARGET_DEFAULT_FUNC (default_mourn_inferior);

    /* Note that can_run is special and can be invoked on an unpushed
       target.  Targets defining this method must also define
       to_can_async_p and to_supports_non_stop.  */
    virtual bool can_run ();

    /* Documentation of this routine is provided with the corresponding
       target_* macro.  */
    virtual void pass_signals (gdb::array_view<const unsigned char> TARGET_DEBUG_PRINTER (target_debug_print_signals))
      TARGET_DEFAULT_IGNORE ();

    /* Documentation of this routine is provided with the
       corresponding target_* function.  */
    virtual void program_signals (gdb::array_view<const unsigned char> TARGET_DEBUG_PRINTER (target_debug_print_signals))
      TARGET_DEFAULT_IGNORE ();

    virtual bool thread_alive (ptid_t ptid)
      TARGET_DEFAULT_RETURN (false);
    virtual void update_thread_list ()
      TARGET_DEFAULT_IGNORE ();
    virtual const char *pid_to_str (ptid_t)
      TARGET_DEFAULT_FUNC (default_pid_to_str);
    virtual const char *extra_thread_info (thread_info *)
      TARGET_DEFAULT_RETURN (NULL);
    virtual const char *thread_name (thread_info *)
      TARGET_DEFAULT_RETURN (NULL);
    virtual thread_info *thread_handle_to_thread_info (const gdb_byte *,
						       int,
						       inferior *inf)
      TARGET_DEFAULT_RETURN (NULL);
    virtual void stop (ptid_t)
      TARGET_DEFAULT_IGNORE ();
    virtual void interrupt ()
      TARGET_DEFAULT_IGNORE ();
    virtual void pass_ctrlc ()
      TARGET_DEFAULT_FUNC (default_target_pass_ctrlc);
    virtual void rcmd (const char *command, struct ui_file *output)
      TARGET_DEFAULT_FUNC (default_rcmd);
    virtual char *pid_to_exec_file (int pid)
      TARGET_DEFAULT_RETURN (NULL);
    virtual void log_command (const char *)
      TARGET_DEFAULT_IGNORE ();
    virtual struct target_section_table *get_section_table ()
      TARGET_DEFAULT_RETURN (NULL);

    /* Provide default values for all "must have" methods.  */
    virtual bool has_all_memory () { return false; }
    virtual bool has_memory () { return false; }
    virtual bool has_stack () { return false; }
    virtual bool has_registers () { return false; }
    virtual bool has_execution (ptid_t) { return false; }

    /* Control thread execution.  */
    virtual thread_control_capabilities get_thread_control_capabilities ()
      TARGET_DEFAULT_RETURN (tc_none);
    virtual bool attach_no_wait ()
      TARGET_DEFAULT_RETURN (0);
    /* This method must be implemented in some situations.  See the
       comment on 'can_run'.  */
    virtual bool can_async_p ()
      TARGET_DEFAULT_RETURN (false);
    virtual bool is_async_p ()
      TARGET_DEFAULT_RETURN (false);
    virtual void async (int)
      TARGET_DEFAULT_NORETURN (tcomplain ());
    virtual void thread_events (int)
      TARGET_DEFAULT_IGNORE ();
    /* This method must be implemented in some situations.  See the
       comment on 'can_run'.  */
    virtual bool supports_non_stop ()
      TARGET_DEFAULT_RETURN (false);
    /* Return true if the target operates in non-stop mode even with
       "set non-stop off".  */
    virtual bool always_non_stop_p ()
      TARGET_DEFAULT_RETURN (false);
    /* find_memory_regions support method for gcore */
    virtual int find_memory_regions (find_memory_region_ftype func, void *data)
      TARGET_DEFAULT_FUNC (dummy_find_memory_regions);
    /* make_corefile_notes support method for gcore */
    virtual char *make_corefile_notes (bfd *, int *)
      TARGET_DEFAULT_FUNC (dummy_make_corefile_notes);
    /* get_bookmark support method for bookmarks */
    virtual gdb_byte *get_bookmark (const char *, int)
      TARGET_DEFAULT_NORETURN (tcomplain ());
    /* goto_bookmark support method for bookmarks */
    virtual void goto_bookmark (const gdb_byte *, int)
      TARGET_DEFAULT_NORETURN (tcomplain ());
    /* Return the thread-local address at OFFSET in the
       thread-local storage for the thread PTID and the shared library
       or executable file given by OBJFILE.  If that block of
       thread-local storage hasn't been allocated yet, this function
       may return an error.  LOAD_MODULE_ADDR may be zero for statically
       linked multithreaded inferiors.  */
    virtual CORE_ADDR get_thread_local_address (ptid_t ptid,
						CORE_ADDR load_module_addr,
						CORE_ADDR offset)
      TARGET_DEFAULT_NORETURN (generic_tls_error ());

    /* Request that OPS transfer up to LEN addressable units of the target's
       OBJECT.  When reading from a memory object, the size of an addressable
       unit is architecture dependent and can be found using
       gdbarch_addressable_memory_unit_size.  Otherwise, an addressable unit is
       1 byte long.  The OFFSET, for a seekable object, specifies the
       starting point.  The ANNEX can be used to provide additional
       data-specific information to the target.

       Return the transferred status, error or OK (an
       'enum target_xfer_status' value).  Save the number of addressable units
       actually transferred in *XFERED_LEN if transfer is successful
       (TARGET_XFER_OK) or the number unavailable units if the requested
       data is unavailable (TARGET_XFER_UNAVAILABLE).  *XFERED_LEN
       smaller than LEN does not indicate the end of the object, only
       the end of the transfer; higher level code should continue
       transferring if desired.  This is handled in target.c.

       The interface does not support a "retry" mechanism.  Instead it
       assumes that at least one addressable unit will be transfered on each
       successful call.

       NOTE: cagney/2003-10-17: The current interface can lead to
       fragmented transfers.  Lower target levels should not implement
       hacks, such as enlarging the transfer, in an attempt to
       compensate for this.  Instead, the target stack should be
       extended so that it implements supply/collect methods and a
       look-aside object cache.  With that available, the lowest
       target can safely and freely "push" data up the stack.

       See target_read and target_write for more information.  One,
       and only one, of readbuf or writebuf must be non-NULL.  */

    virtual enum target_xfer_status xfer_partial (enum target_object object,
						  const char *annex,
						  gdb_byte *readbuf,
						  const gdb_byte *writebuf,
						  ULONGEST offset, ULONGEST len,
						  ULONGEST *xfered_len)
      TARGET_DEFAULT_RETURN (TARGET_XFER_E_IO);

    /* Return the limit on the size of any single memory transfer
       for the target.  */

    virtual ULONGEST get_memory_xfer_limit ()
      TARGET_DEFAULT_RETURN (ULONGEST_MAX);

    /* Returns the memory map for the target.  A return value of NULL
       means that no memory map is available.  If a memory address
       does not fall within any returned regions, it's assumed to be
       RAM.  The returned memory regions should not overlap.

       The order of regions does not matter; target_memory_map will
       sort regions by starting address.  For that reason, this
       function should not be called directly except via
       target_memory_map.

       This method should not cache data; if the memory map could
       change unexpectedly, it should be invalidated, and higher
       layers will re-fetch it.  */
    virtual std::vector<mem_region> memory_map ()
      TARGET_DEFAULT_RETURN (std::vector<mem_region> ());

    /* Erases the region of flash memory starting at ADDRESS, of
       length LENGTH.

       Precondition: both ADDRESS and ADDRESS+LENGTH should be aligned
       on flash block boundaries, as reported by 'to_memory_map'.  */
    virtual void flash_erase (ULONGEST address, LONGEST length)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Finishes a flash memory write sequence.  After this operation
       all flash memory should be available for writing and the result
       of reading from areas written by 'to_flash_write' should be
       equal to what was written.  */
    virtual void flash_done ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Describe the architecture-specific features of this target.  If
       OPS doesn't have a description, this should delegate to the
       "beneath" target.  Returns the description found, or NULL if no
       description was available.  */
    virtual const struct target_desc *read_description ()
	 TARGET_DEFAULT_RETURN (NULL);

    /* Build the PTID of the thread on which a given task is running,
       based on LWP and THREAD.  These values are extracted from the
       task Private_Data section of the Ada Task Control Block, and
       their interpretation depends on the target.  */
    virtual ptid_t get_ada_task_ptid (long lwp, long thread)
      TARGET_DEFAULT_FUNC (default_get_ada_task_ptid);

    /* Read one auxv entry from *READPTR, not reading locations >= ENDPTR.
       Return 0 if *READPTR is already at the end of the buffer.
       Return -1 if there is insufficient buffer for a whole entry.
       Return 1 if an entry was read into *TYPEP and *VALP.  */
    virtual int auxv_parse (gdb_byte **readptr,
			    gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
      TARGET_DEFAULT_FUNC (default_auxv_parse);

    /* Search SEARCH_SPACE_LEN bytes beginning at START_ADDR for the
       sequence of bytes in PATTERN with length PATTERN_LEN.

       The result is 1 if found, 0 if not found, and -1 if there was an error
       requiring halting of the search (e.g. memory read error).
       If the pattern is found the address is recorded in FOUND_ADDRP.  */
    virtual int search_memory (CORE_ADDR start_addr, ULONGEST search_space_len,
			       const gdb_byte *pattern, ULONGEST pattern_len,
			       CORE_ADDR *found_addrp)
      TARGET_DEFAULT_FUNC (default_search_memory);

    /* Can target execute in reverse?  */
    virtual bool can_execute_reverse ()
      TARGET_DEFAULT_RETURN (false);

    /* The direction the target is currently executing.  Must be
       implemented on targets that support reverse execution and async
       mode.  The default simply returns forward execution.  */
    virtual enum exec_direction_kind execution_direction ()
      TARGET_DEFAULT_FUNC (default_execution_direction);

    /* Does this target support debugging multiple processes
       simultaneously?  */
    virtual bool supports_multi_process ()
      TARGET_DEFAULT_RETURN (false);

    /* Does this target support enabling and disabling tracepoints while a trace
       experiment is running?  */
    virtual bool supports_enable_disable_tracepoint ()
      TARGET_DEFAULT_RETURN (false);

    /* Does this target support disabling address space randomization?  */
    virtual bool supports_disable_randomization ()
      TARGET_DEFAULT_FUNC (find_default_supports_disable_randomization);

    /* Does this target support the tracenz bytecode for string collection?  */
    virtual bool supports_string_tracing ()
      TARGET_DEFAULT_RETURN (false);

    /* Does this target support evaluation of breakpoint conditions on its
       end?  */
    virtual bool supports_evaluation_of_breakpoint_conditions ()
      TARGET_DEFAULT_RETURN (false);

    /* Does this target support evaluation of breakpoint commands on its
       end?  */
    virtual bool can_run_breakpoint_commands ()
      TARGET_DEFAULT_RETURN (false);

    /* Determine current architecture of thread PTID.

       The target is supposed to determine the architecture of the code where
       the target is currently stopped at (on Cell, if a target is in spu_run,
       to_thread_architecture would return SPU, otherwise PPC32 or PPC64).
       This is architecture used to perform decr_pc_after_break adjustment,
       and also determines the frame architecture of the innermost frame.
       ptrace operations need to operate according to target_gdbarch ().  */
    virtual struct gdbarch *thread_architecture (ptid_t)
      TARGET_DEFAULT_RETURN (NULL);

    /* Determine current address space of thread PTID.  */
    virtual struct address_space *thread_address_space (ptid_t)
      TARGET_DEFAULT_RETURN (NULL);

    /* Target file operations.  */

    /* Return nonzero if the filesystem seen by the current inferior
       is the local filesystem, zero otherwise.  */
    virtual bool filesystem_is_local ()
      TARGET_DEFAULT_RETURN (true);

    /* Open FILENAME on the target, in the filesystem as seen by INF,
       using FLAGS and MODE.  If INF is NULL, use the filesystem seen
       by the debugger (GDB or, for remote targets, the remote stub).
       If WARN_IF_SLOW is nonzero, print a warning message if the file
       is being accessed over a link that may be slow.  Return a
       target file descriptor, or -1 if an error occurs (and set
       *TARGET_ERRNO).  */
    virtual int fileio_open (struct inferior *inf, const char *filename,
			     int flags, int mode, int warn_if_slow,
			     int *target_errno);

    /* Write up to LEN bytes from WRITE_BUF to FD on the target.
       Return the number of bytes written, or -1 if an error occurs
       (and set *TARGET_ERRNO).  */
    virtual int fileio_pwrite (int fd, const gdb_byte *write_buf, int len,
			       ULONGEST offset, int *target_errno);

    /* Read up to LEN bytes FD on the target into READ_BUF.
       Return the number of bytes read, or -1 if an error occurs
       (and set *TARGET_ERRNO).  */
    virtual int fileio_pread (int fd, gdb_byte *read_buf, int len,
			      ULONGEST offset, int *target_errno);

    /* Get information about the file opened as FD and put it in
       SB.  Return 0 on success, or -1 if an error occurs (and set
       *TARGET_ERRNO).  */
    virtual int fileio_fstat (int fd, struct stat *sb, int *target_errno);

    /* Close FD on the target.  Return 0, or -1 if an error occurs
       (and set *TARGET_ERRNO).  */
    virtual int fileio_close (int fd, int *target_errno);

    /* Unlink FILENAME on the target, in the filesystem as seen by
       INF.  If INF is NULL, use the filesystem seen by the debugger
       (GDB or, for remote targets, the remote stub).  Return 0, or
       -1 if an error occurs (and set *TARGET_ERRNO).  */
    virtual int fileio_unlink (struct inferior *inf,
			       const char *filename,
			       int *target_errno);

    /* Read value of symbolic link FILENAME on the target, in the
       filesystem as seen by INF.  If INF is NULL, use the filesystem
       seen by the debugger (GDB or, for remote targets, the remote
       stub).  Return a string, or an empty optional if an error
       occurs (and set *TARGET_ERRNO).  */
    virtual gdb::optional<std::string> fileio_readlink (struct inferior *inf,
							const char *filename,
							int *target_errno);

    /* Implement the "info proc" command.  Returns true if the target
       actually implemented the command, false otherwise.  */
    virtual bool info_proc (const char *, enum info_proc_what);

    /* Tracepoint-related operations.  */

    /* Prepare the target for a tracing run.  */
    virtual void trace_init ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Send full details of a tracepoint location to the target.  */
    virtual void download_tracepoint (struct bp_location *location)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Is the target able to download tracepoint locations in current
       state?  */
    virtual bool can_download_tracepoint ()
      TARGET_DEFAULT_RETURN (false);

    /* Send full details of a trace state variable to the target.  */
    virtual void download_trace_state_variable (const trace_state_variable &tsv)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Enable a tracepoint on the target.  */
    virtual void enable_tracepoint (struct bp_location *location)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Disable a tracepoint on the target.  */
    virtual void disable_tracepoint (struct bp_location *location)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Inform the target info of memory regions that are readonly
       (such as text sections), and so it should return data from
       those rather than look in the trace buffer.  */
    virtual void trace_set_readonly_regions ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Start a trace run.  */
    virtual void trace_start ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Get the current status of a tracing run.  */
    virtual int get_trace_status (struct trace_status *ts)
      TARGET_DEFAULT_RETURN (-1);

    virtual void get_tracepoint_status (struct breakpoint *tp,
					struct uploaded_tp *utp)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Stop a trace run.  */
    virtual void trace_stop ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

   /* Ask the target to find a trace frame of the given type TYPE,
      using NUM, ADDR1, and ADDR2 as search parameters.  Returns the
      number of the trace frame, and also the tracepoint number at
      TPP.  If no trace frame matches, return -1.  May throw if the
      operation fails.  */
    virtual int trace_find (enum trace_find_type type, int num,
			    CORE_ADDR addr1, CORE_ADDR addr2, int *tpp)
      TARGET_DEFAULT_RETURN (-1);

    /* Get the value of the trace state variable number TSV, returning
       1 if the value is known and writing the value itself into the
       location pointed to by VAL, else returning 0.  */
    virtual bool get_trace_state_variable_value (int tsv, LONGEST *val)
      TARGET_DEFAULT_RETURN (false);

    virtual int save_trace_data (const char *filename)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    virtual int upload_tracepoints (struct uploaded_tp **utpp)
      TARGET_DEFAULT_RETURN (0);

    virtual int upload_trace_state_variables (struct uploaded_tsv **utsvp)
      TARGET_DEFAULT_RETURN (0);

    virtual LONGEST get_raw_trace_data (gdb_byte *buf,
					ULONGEST offset, LONGEST len)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Get the minimum length of instruction on which a fast tracepoint
       may be set on the target.  If this operation is unsupported,
       return -1.  If for some reason the minimum length cannot be
       determined, return 0.  */
    virtual int get_min_fast_tracepoint_insn_len ()
      TARGET_DEFAULT_RETURN (-1);

    /* Set the target's tracing behavior in response to unexpected
       disconnection - set VAL to 1 to keep tracing, 0 to stop.  */
    virtual void set_disconnected_tracing (int val)
      TARGET_DEFAULT_IGNORE ();
    virtual void set_circular_trace_buffer (int val)
      TARGET_DEFAULT_IGNORE ();
    /* Set the size of trace buffer in the target.  */
    virtual void set_trace_buffer_size (LONGEST val)
      TARGET_DEFAULT_IGNORE ();

    /* Add/change textual notes about the trace run, returning 1 if
       successful, 0 otherwise.  */
    virtual bool set_trace_notes (const char *user, const char *notes,
				  const char *stopnotes)
      TARGET_DEFAULT_RETURN (false);

    /* Return the processor core that thread PTID was last seen on.
       This information is updated only when:
       - update_thread_list is called
       - thread stops
       If the core cannot be determined -- either for the specified
       thread, or right now, or in this debug session, or for this
       target -- return -1.  */
    virtual int core_of_thread (ptid_t ptid)
      TARGET_DEFAULT_RETURN (-1);

    /* Verify that the memory in the [MEMADDR, MEMADDR+SIZE) range
       matches the contents of [DATA,DATA+SIZE).  Returns 1 if there's
       a match, 0 if there's a mismatch, and -1 if an error is
       encountered while reading memory.  */
    virtual int verify_memory (const gdb_byte *data,
			       CORE_ADDR memaddr, ULONGEST size)
      TARGET_DEFAULT_FUNC (default_verify_memory);

    /* Return the address of the start of the Thread Information Block
       a Windows OS specific feature.  */
    virtual bool get_tib_address (ptid_t ptid, CORE_ADDR *addr)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Send the new settings of write permission variables.  */
    virtual void set_permissions ()
      TARGET_DEFAULT_IGNORE ();

    /* Look for a static tracepoint marker at ADDR, and fill in MARKER
       with its details.  Return true on success, false on failure.  */
    virtual bool static_tracepoint_marker_at (CORE_ADDR,
					      static_tracepoint_marker *marker)
      TARGET_DEFAULT_RETURN (false);

    /* Return a vector of all tracepoints markers string id ID, or all
       markers if ID is NULL.  */
    virtual std::vector<static_tracepoint_marker>
      static_tracepoint_markers_by_strid (const char *id)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Return a traceframe info object describing the current
       traceframe's contents.  This method should not cache data;
       higher layers take care of caching, invalidating, and
       re-fetching when necessary.  */
    virtual traceframe_info_up traceframe_info ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Ask the target to use or not to use agent according to USE.
       Return true if successful, false otherwise.  */
    virtual bool use_agent (bool use)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Is the target able to use agent in current state?  */
    virtual bool can_use_agent ()
      TARGET_DEFAULT_RETURN (false);

    /* Enable branch tracing for PTID using CONF configuration.
       Return a branch trace target information struct for reading and for
       disabling branch trace.  */
    virtual struct btrace_target_info *enable_btrace (ptid_t ptid,
						      const struct btrace_config *conf)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Disable branch tracing and deallocate TINFO.  */
    virtual void disable_btrace (struct btrace_target_info *tinfo)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Disable branch tracing and deallocate TINFO.  This function is similar
       to to_disable_btrace, except that it is called during teardown and is
       only allowed to perform actions that are safe.  A counter-example would
       be attempting to talk to a remote target.  */
    virtual void teardown_btrace (struct btrace_target_info *tinfo)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Read branch trace data for the thread indicated by BTINFO into DATA.
       DATA is cleared before new trace is added.  */
    virtual enum btrace_error read_btrace (struct btrace_data *data,
					   struct btrace_target_info *btinfo,
					   enum btrace_read_type type)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Get the branch trace configuration.  */
    virtual const struct btrace_config *btrace_conf (const struct btrace_target_info *)
      TARGET_DEFAULT_RETURN (NULL);

    /* Current recording method.  */
    virtual enum record_method record_method (ptid_t ptid)
      TARGET_DEFAULT_RETURN (RECORD_METHOD_NONE);

    /* Stop trace recording.  */
    virtual void stop_recording ()
      TARGET_DEFAULT_IGNORE ();

    /* Print information about the recording.  */
    virtual void info_record ()
      TARGET_DEFAULT_IGNORE ();

    /* Save the recorded execution trace into a file.  */
    virtual void save_record (const char *filename)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Delete the recorded execution trace from the current position
       onwards.  */
    virtual bool supports_delete_record ()
      TARGET_DEFAULT_RETURN (false);
    virtual void delete_record ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Query if the record target is currently replaying PTID.  */
    virtual bool record_is_replaying (ptid_t ptid)
      TARGET_DEFAULT_RETURN (false);

    /* Query if the record target will replay PTID if it were resumed in
       execution direction DIR.  */
    virtual bool record_will_replay (ptid_t ptid, int dir)
      TARGET_DEFAULT_RETURN (false);

    /* Stop replaying.  */
    virtual void record_stop_replaying ()
      TARGET_DEFAULT_IGNORE ();

    /* Go to the begin of the execution trace.  */
    virtual void goto_record_begin ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Go to the end of the execution trace.  */
    virtual void goto_record_end ()
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Go to a specific location in the recorded execution trace.  */
    virtual void goto_record (ULONGEST insn)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Disassemble SIZE instructions in the recorded execution trace from
       the current position.
       If SIZE < 0, disassemble abs (SIZE) preceding instructions; otherwise,
       disassemble SIZE succeeding instructions.  */
    virtual void insn_history (int size, gdb_disassembly_flags flags)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Disassemble SIZE instructions in the recorded execution trace around
       FROM.
       If SIZE < 0, disassemble abs (SIZE) instructions before FROM; otherwise,
       disassemble SIZE instructions after FROM.  */
    virtual void insn_history_from (ULONGEST from, int size,
				    gdb_disassembly_flags flags)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Disassemble a section of the recorded execution trace from instruction
       BEGIN (inclusive) to instruction END (inclusive).  */
    virtual void insn_history_range (ULONGEST begin, ULONGEST end,
				     gdb_disassembly_flags flags)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Print a function trace of the recorded execution trace.
       If SIZE < 0, print abs (SIZE) preceding functions; otherwise, print SIZE
       succeeding functions.  */
    virtual void call_history (int size, record_print_flags flags)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Print a function trace of the recorded execution trace starting
       at function FROM.
       If SIZE < 0, print abs (SIZE) functions before FROM; otherwise, print
       SIZE functions after FROM.  */
    virtual void call_history_from (ULONGEST begin, int size, record_print_flags flags)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* Print a function trace of an execution trace section from function BEGIN
       (inclusive) to function END (inclusive).  */
    virtual void call_history_range (ULONGEST begin, ULONGEST end, record_print_flags flags)
      TARGET_DEFAULT_NORETURN (tcomplain ());

    /* True if TARGET_OBJECT_LIBRARIES_SVR4 may be read with a
       non-empty annex.  */
    virtual bool augmented_libraries_svr4_read ()
      TARGET_DEFAULT_RETURN (false);

    /* Those unwinders are tried before any other arch unwinders.  If
       SELF doesn't have unwinders, it should delegate to the
       "beneath" target.  */
    virtual const struct frame_unwind *get_unwinder ()
      TARGET_DEFAULT_RETURN (NULL);

    virtual const struct frame_unwind *get_tailcall_unwinder ()
      TARGET_DEFAULT_RETURN (NULL);

    /* Prepare to generate a core file.  */
    virtual void prepare_to_generate_core ()
      TARGET_DEFAULT_IGNORE ();

    /* Cleanup after generating a core file.  */
    virtual void done_generating_core ()
      TARGET_DEFAULT_IGNORE ();
  };

/* Deleter for std::unique_ptr.  See comments in
   target_ops::~target_ops and target_ops::close about heap-allocated
   targets.  */
struct target_ops_deleter
{
  void operator() (target_ops *target)
  {
    target->close ();
  }
};

/* A unique pointer for target_ops.  */
typedef std::unique_ptr<target_ops, target_ops_deleter> target_ops_up;

/* Native target backends call this once at initialization time to
   inform the core about which is the target that can respond to "run"
   or "attach".  Note: native targets are always singletons.  */
extern void set_native_target (target_ops *target);

/* Get the registered native target, if there's one.  Otherwise return
   NULL.  */
extern target_ops *get_native_target ();

/* Type that manages a target stack.  See description of target stacks
   and strata at the top of the file.  */

class target_stack
{
public:
  target_stack () = default;
  DISABLE_COPY_AND_ASSIGN (target_stack);

  /* Push a new target into the stack of the existing target
     accessors, possibly superseding some existing accessor.  */
  void push (target_ops *t);

  /* Remove a target from the stack, wherever it may be.  Return true
     if it was removed, false otherwise.  */
  bool unpush (target_ops *t);

  /* Returns true if T is pushed on the target stack.  */
  bool is_pushed (target_ops *t) const
  { return at (t->stratum ()) == t; }

  /* Return the target at STRATUM.  */
  target_ops *at (strata stratum) const { return m_stack[stratum]; }

  /* Return the target at the top of the stack.  */
  target_ops *top () const { return at (m_top); }

  /* Find the next target down the stack from the specified target.  */
  target_ops *find_beneath (const target_ops *t) const;

private:
  /* The stratum of the top target.  */
  enum strata m_top {};

  /* The stack, represented as an array, with one slot per stratum.
     If no target is pushed at some stratum, the corresponding slot is
     null.  */
  target_ops *m_stack[(int) debug_stratum + 1] {};
};

/* The ops structure for our "current" target process.  This should
   never be NULL.  If there is no target, it points to the dummy_target.  */

extern target_ops *current_top_target ();

/* Define easy words for doing these operations on our current target.  */

#define	target_shortname	(current_top_target ()->shortname ())
#define	target_longname		(current_top_target ()->longname ())

/* Does whatever cleanup is required for a target that we are no
   longer going to be calling.  This routine is automatically always
   called after popping the target off the target stack - the target's
   own methods are no longer available through the target vector.
   Closing file descriptors and freeing all memory allocated memory are
   typical things it should do.  */

void target_close (struct target_ops *targ);

/* Find the correct target to use for "attach".  If a target on the
   current stack supports attaching, then it is returned.  Otherwise,
   the default run target is returned.  */

extern struct target_ops *find_attach_target (void);

/* Find the correct target to use for "run".  If a target on the
   current stack supports creating a new inferior, then it is
   returned.  Otherwise, the default run target is returned.  */

extern struct target_ops *find_run_target (void);

/* Some targets don't generate traps when attaching to the inferior,
   or their target_attach implementation takes care of the waiting.
   These targets must set to_attach_no_wait.  */

#define target_attach_no_wait() \
  (current_top_target ()->attach_no_wait ())

/* The target_attach operation places a process under debugger control,
   and stops the process.

   This operation provides a target-specific hook that allows the
   necessary bookkeeping to be performed after an attach completes.  */
#define target_post_attach(pid) \
     (current_top_target ()->post_attach) (pid)

/* Display a message indicating we're about to detach from the current
   inferior process.  */

extern void target_announce_detach (int from_tty);

/* Takes a program previously attached to and detaches it.
   The program may resume execution (some targets do, some don't) and will
   no longer stop on signals, etc.  We better not have left any breakpoints
   in the program or it'll die when it hits one.  FROM_TTY says whether to be
   verbose or not.  */

extern void target_detach (inferior *inf, int from_tty);

/* Disconnect from the current target without resuming it (leaving it
   waiting for a debugger).  */

extern void target_disconnect (const char *, int);

/* Resume execution (or prepare for execution) of a target thread,
   process or all processes.  STEP says whether to hardware
   single-step or to run free; SIGGNAL is the signal to be given to
   the target, or GDB_SIGNAL_0 for no signal.  The caller may not pass
   GDB_SIGNAL_DEFAULT.  A specific PTID means `step/resume only this
   process id'.  A wildcard PTID (all threads, or all threads of
   process) means `step/resume INFERIOR_PTID, and let other threads
   (for which the wildcard PTID matches) resume with their
   'thread->suspend.stop_signal' signal (usually GDB_SIGNAL_0) if it
   is in "pass" state, or with no signal if in "no pass" state.

   In order to efficiently handle batches of resumption requests,
   targets may implement this method such that it records the
   resumption request, but defers the actual resumption to the
   target_commit_resume method implementation.  See
   target_commit_resume below.  */
extern void target_resume (ptid_t ptid, int step, enum gdb_signal signal);

/* Commit a series of resumption requests previously prepared with
   target_resume calls.

   GDB always calls target_commit_resume after calling target_resume
   one or more times.  A target may thus use this method in
   coordination with the target_resume method to batch target-side
   resumption requests.  In that case, the target doesn't actually
   resume in its target_resume implementation.  Instead, it prepares
   the resumption in target_resume, and defers the actual resumption
   to target_commit_resume.  E.g., the remote target uses this to
   coalesce multiple resumption requests in a single vCont packet.  */
extern void target_commit_resume ();

/* Setup to defer target_commit_resume calls, and reactivate
   target_commit_resume on destruction, if it was previously
   active.  */
extern scoped_restore_tmpl<int> make_scoped_defer_target_commit_resume ();

/* For target_read_memory see target/target.h.  */

/* The default target_ops::to_wait implementation.  */

extern ptid_t default_target_wait (struct target_ops *ops,
				   ptid_t ptid,
				   struct target_waitstatus *status,
				   int options);

/* Fetch at least register REGNO, or all regs if regno == -1.  No result.  */

extern void target_fetch_registers (struct regcache *regcache, int regno);

/* Store at least register REGNO, or all regs if REGNO == -1.
   It can store as many registers as it wants to, so target_prepare_to_store
   must have been previously called.  Calls error() if there are problems.  */

extern void target_store_registers (struct regcache *regcache, int regs);

/* Get ready to modify the registers array.  On machines which store
   individual registers, this doesn't need to do anything.  On machines
   which store all the registers in one fell swoop, this makes sure
   that REGISTERS contains all the registers from the program being
   debugged.  */

#define	target_prepare_to_store(regcache)	\
     (current_top_target ()->prepare_to_store) (regcache)

/* Determine current address space of thread PTID.  */

struct address_space *target_thread_address_space (ptid_t);

/* Implement the "info proc" command.  This returns one if the request
   was handled, and zero otherwise.  It can also throw an exception if
   an error was encountered while attempting to handle the
   request.  */

int target_info_proc (const char *, enum info_proc_what);

/* Returns true if this target can disable address space randomization.  */

int target_supports_disable_randomization (void);

/* Returns true if this target can enable and disable tracepoints
   while a trace experiment is running.  */

#define target_supports_enable_disable_tracepoint() \
  (current_top_target ()->supports_enable_disable_tracepoint) ()

#define target_supports_string_tracing() \
  (current_top_target ()->supports_string_tracing) ()

/* Returns true if this target can handle breakpoint conditions
   on its end.  */

#define target_supports_evaluation_of_breakpoint_conditions() \
  (current_top_target ()->supports_evaluation_of_breakpoint_conditions) ()

/* Returns true if this target can handle breakpoint commands
   on its end.  */

#define target_can_run_breakpoint_commands() \
  (current_top_target ()->can_run_breakpoint_commands) ()

extern int target_read_string (CORE_ADDR, gdb::unique_xmalloc_ptr<char> *,
			       int, int *);

/* For target_read_memory see target/target.h.  */

extern int target_read_raw_memory (CORE_ADDR memaddr, gdb_byte *myaddr,
				   ssize_t len);

extern int target_read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len);

extern int target_read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len);

/* For target_write_memory see target/target.h.  */

extern int target_write_raw_memory (CORE_ADDR memaddr, const gdb_byte *myaddr,
				    ssize_t len);

/* Fetches the target's memory map.  If one is found it is sorted
   and returned, after some consistency checking.  Otherwise, NULL
   is returned.  */
std::vector<mem_region> target_memory_map (void);

/* Erases all flash memory regions on the target.  */
void flash_erase_command (const char *cmd, int from_tty);

/* Erase the specified flash region.  */
void target_flash_erase (ULONGEST address, LONGEST length);

/* Finish a sequence of flash operations.  */
void target_flash_done (void);

/* Describes a request for a memory write operation.  */
struct memory_write_request
{
  memory_write_request (ULONGEST begin_, ULONGEST end_,
			gdb_byte *data_ = nullptr, void *baton_ = nullptr)
    : begin (begin_), end (end_), data (data_), baton (baton_)
  {}

  /* Begining address that must be written.  */
  ULONGEST begin;
  /* Past-the-end address.  */
  ULONGEST end;
  /* The data to write.  */
  gdb_byte *data;
  /* A callback baton for progress reporting for this request.  */
  void *baton;
};

/* Enumeration specifying different flash preservation behaviour.  */
enum flash_preserve_mode
  {
    flash_preserve,
    flash_discard
  };

/* Write several memory blocks at once.  This version can be more
   efficient than making several calls to target_write_memory, in
   particular because it can optimize accesses to flash memory.

   Moreover, this is currently the only memory access function in gdb
   that supports writing to flash memory, and it should be used for
   all cases where access to flash memory is desirable.

   REQUESTS is the vector (see vec.h) of memory_write_request.
   PRESERVE_FLASH_P indicates what to do with blocks which must be
     erased, but not completely rewritten.
   PROGRESS_CB is a function that will be periodically called to provide
     feedback to user.  It will be called with the baton corresponding
     to the request currently being written.  It may also be called
     with a NULL baton, when preserved flash sectors are being rewritten.

   The function returns 0 on success, and error otherwise.  */
int target_write_memory_blocks
    (const std::vector<memory_write_request> &requests,
     enum flash_preserve_mode preserve_flash_p,
     void (*progress_cb) (ULONGEST, void *));

/* Print a line about the current target.  */

#define	target_files_info()	\
     (current_top_target ()->files_info) ()

/* Insert a breakpoint at address BP_TGT->placed_address in
   the target machine.  Returns 0 for success, and returns non-zero or
   throws an error (with a detailed failure reason error code and
   message) otherwise.  */

extern int target_insert_breakpoint (struct gdbarch *gdbarch,
				     struct bp_target_info *bp_tgt);

/* Remove a breakpoint at address BP_TGT->placed_address in the target
   machine.  Result is 0 for success, non-zero for error.  */

extern int target_remove_breakpoint (struct gdbarch *gdbarch,
				     struct bp_target_info *bp_tgt,
				     enum remove_bp_reason reason);

/* Return true if the target stack has a non-default
  "terminal_ours" method.  */

extern bool target_supports_terminal_ours (void);

/* Kill the inferior process.   Make it go away.  */

extern void target_kill (void);

/* Load an executable file into the target process.  This is expected
   to not only bring new code into the target process, but also to
   update GDB's symbol tables to match.

   ARG contains command-line arguments, to be broken down with
   buildargv ().  The first non-switch argument is the filename to
   load, FILE; the second is a number (as parsed by strtoul (..., ...,
   0)), which is an offset to apply to the load addresses of FILE's
   sections.  The target may define switches, or other non-switch
   arguments, as it pleases.  */

extern void target_load (const char *arg, int from_tty);

/* Some targets (such as ttrace-based HPUX) don't allow us to request
   notification of inferior events such as fork and vork immediately
   after the inferior is created.  (This because of how gdb gets an
   inferior created via invoking a shell to do it.  In such a scenario,
   if the shell init file has commands in it, the shell will fork and
   exec for each of those commands, and we will see each such fork
   event.  Very bad.)

   Such targets will supply an appropriate definition for this function.  */

#define target_post_startup_inferior(ptid) \
     (current_top_target ()->post_startup_inferior) (ptid)

/* On some targets, we can catch an inferior fork or vfork event when
   it occurs.  These functions insert/remove an already-created
   catchpoint for such events.  They return  0 for success, 1 if the
   catchpoint type is not supported and -1 for failure.  */

#define target_insert_fork_catchpoint(pid) \
     (current_top_target ()->insert_fork_catchpoint) (pid)

#define target_remove_fork_catchpoint(pid) \
     (current_top_target ()->remove_fork_catchpoint) (pid)

#define target_insert_vfork_catchpoint(pid) \
     (current_top_target ()->insert_vfork_catchpoint) (pid)

#define target_remove_vfork_catchpoint(pid) \
     (current_top_target ()->remove_vfork_catchpoint) (pid)

/* If the inferior forks or vforks, this function will be called at
   the next resume in order to perform any bookkeeping and fiddling
   necessary to continue debugging either the parent or child, as
   requested, and releasing the other.  Information about the fork
   or vfork event is available via get_last_target_status ().
   This function returns 1 if the inferior should not be resumed
   (i.e. there is another event pending).  */

int target_follow_fork (int follow_child, int detach_fork);

/* Handle the target-specific bookkeeping required when the inferior
   makes an exec call.  INF is the exec'd inferior.  */

void target_follow_exec (struct inferior *inf, char *execd_pathname);

/* On some targets, we can catch an inferior exec event when it
   occurs.  These functions insert/remove an already-created
   catchpoint for such events.  They return  0 for success, 1 if the
   catchpoint type is not supported and -1 for failure.  */

#define target_insert_exec_catchpoint(pid) \
     (current_top_target ()->insert_exec_catchpoint) (pid)

#define target_remove_exec_catchpoint(pid) \
     (current_top_target ()->remove_exec_catchpoint) (pid)

/* Syscall catch.

   NEEDED is true if any syscall catch (of any kind) is requested.
   If NEEDED is false, it means the target can disable the mechanism to
   catch system calls because there are no more catchpoints of this type.

   ANY_COUNT is nonzero if a generic (filter-less) syscall catch is
   being requested.  In this case, SYSCALL_COUNTS should be ignored.

   SYSCALL_COUNTS is an array of ints, indexed by syscall number.  An
   element in this array is nonzero if that syscall should be caught.
   This argument only matters if ANY_COUNT is zero.

   Return 0 for success, 1 if syscall catchpoints are not supported or -1
   for failure.  */

#define target_set_syscall_catchpoint(pid, needed, any_count, syscall_counts) \
     (current_top_target ()->set_syscall_catchpoint) (pid, needed, any_count, \
					     syscall_counts)

/* The debugger has completed a blocking wait() call.  There is now
   some process event that must be processed.  This function should
   be defined by those targets that require the debugger to perform
   cleanup or internal state changes in response to the process event.  */

/* For target_mourn_inferior see target/target.h.  */

/* Does target have enough data to do a run or attach command?  */

extern int target_can_run ();