Mercurial > hg > truffle
comparison src/os/bsd/vm/os_bsd.cpp @ 11173:6b0fd0964b87
Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 31 Jul 2013 11:00:54 +0200 |
parents | 836a62f43af9 59b052799158 |
children | cefad50507d8 |
comparison
equal
deleted
inserted
replaced
10912:4ea54634f03e | 11173:6b0fd0964b87 |
---|---|
1232 bool os::address_is_in_vm(address addr) { | 1232 bool os::address_is_in_vm(address addr) { |
1233 static address libjvm_base_addr; | 1233 static address libjvm_base_addr; |
1234 Dl_info dlinfo; | 1234 Dl_info dlinfo; |
1235 | 1235 |
1236 if (libjvm_base_addr == NULL) { | 1236 if (libjvm_base_addr == NULL) { |
1237 dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo); | 1237 if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) { |
1238 libjvm_base_addr = (address)dlinfo.dli_fbase; | 1238 libjvm_base_addr = (address)dlinfo.dli_fbase; |
1239 } | |
1239 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); | 1240 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); |
1240 } | 1241 } |
1241 | 1242 |
1242 if (dladdr((void *)addr, &dlinfo)) { | 1243 if (dladdr((void *)addr, &dlinfo) != 0) { |
1243 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; | 1244 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; |
1244 } | 1245 } |
1245 | 1246 |
1246 return false; | 1247 return false; |
1247 } | 1248 } |
1249 | 1250 |
1250 #define MACH_MAXSYMLEN 256 | 1251 #define MACH_MAXSYMLEN 256 |
1251 | 1252 |
1252 bool os::dll_address_to_function_name(address addr, char *buf, | 1253 bool os::dll_address_to_function_name(address addr, char *buf, |
1253 int buflen, int *offset) { | 1254 int buflen, int *offset) { |
1255 // buf is not optional, but offset is optional | |
1256 assert(buf != NULL, "sanity check"); | |
1257 | |
1254 Dl_info dlinfo; | 1258 Dl_info dlinfo; |
1255 char localbuf[MACH_MAXSYMLEN]; | 1259 char localbuf[MACH_MAXSYMLEN]; |
1256 | 1260 |
1257 // dladdr will find names of dynamic functions only, but does | 1261 if (dladdr((void*)addr, &dlinfo) != 0) { |
1258 // it set dli_fbase with mach_header address when it "fails" ? | 1262 // see if we have a matching symbol |
1259 if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) { | 1263 if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) { |
1260 if (buf != NULL) { | 1264 if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) { |
1261 if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) { | |
1262 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); | 1265 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); |
1263 } | 1266 } |
1264 } | 1267 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; |
1265 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; | 1268 return true; |
1266 return true; | 1269 } |
1267 } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { | 1270 // no matching symbol so try for just file info |
1268 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), | 1271 if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) { |
1269 buf, buflen, offset, dlinfo.dli_fname)) { | 1272 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), |
1270 return true; | 1273 buf, buflen, offset, dlinfo.dli_fname)) { |
1271 } | 1274 return true; |
1272 } | 1275 } |
1273 | 1276 } |
1274 // Handle non-dymanic manually: | 1277 |
1275 if (dlinfo.dli_fbase != NULL && | 1278 // Handle non-dynamic manually: |
1276 Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset, dlinfo.dli_fbase)) { | 1279 if (dlinfo.dli_fbase != NULL && |
1277 if(!Decoder::demangle(localbuf, buf, buflen)) { | 1280 Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset, |
1278 jio_snprintf(buf, buflen, "%s", localbuf); | 1281 dlinfo.dli_fbase)) { |
1279 } | 1282 if (!Decoder::demangle(localbuf, buf, buflen)) { |
1280 return true; | 1283 jio_snprintf(buf, buflen, "%s", localbuf); |
1281 } | 1284 } |
1282 if (buf != NULL) buf[0] = '\0'; | 1285 return true; |
1286 } | |
1287 } | |
1288 buf[0] = '\0'; | |
1283 if (offset != NULL) *offset = -1; | 1289 if (offset != NULL) *offset = -1; |
1284 return false; | 1290 return false; |
1285 } | 1291 } |
1286 | 1292 |
1287 // ported from solaris version | 1293 // ported from solaris version |
1288 bool os::dll_address_to_library_name(address addr, char* buf, | 1294 bool os::dll_address_to_library_name(address addr, char* buf, |
1289 int buflen, int* offset) { | 1295 int buflen, int* offset) { |
1296 // buf is not optional, but offset is optional | |
1297 assert(buf != NULL, "sanity check"); | |
1298 | |
1290 Dl_info dlinfo; | 1299 Dl_info dlinfo; |
1291 | 1300 |
1292 if (dladdr((void*)addr, &dlinfo)){ | 1301 if (dladdr((void*)addr, &dlinfo) != 0) { |
1293 if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); | 1302 if (dlinfo.dli_fname != NULL) { |
1294 if (offset) *offset = addr - (address)dlinfo.dli_fbase; | 1303 jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); |
1295 return true; | 1304 } |
1296 } else { | 1305 if (dlinfo.dli_fbase != NULL && offset != NULL) { |
1297 if (buf) buf[0] = '\0'; | 1306 *offset = addr - (address)dlinfo.dli_fbase; |
1298 if (offset) *offset = -1; | 1307 } |
1299 return false; | 1308 return true; |
1300 } | 1309 } |
1310 | |
1311 buf[0] = '\0'; | |
1312 if (offset) *offset = -1; | |
1313 return false; | |
1301 } | 1314 } |
1302 | 1315 |
1303 // Loads .dll/.so and | 1316 // Loads .dll/.so and |
1304 // in case of error it checks if .dll/.so was built for the | 1317 // in case of error it checks if .dll/.so was built for the |
1305 // same architecture as Hotspot is running on | 1318 // same architecture as Hotspot is running on |
1518 | 1531 |
1519 return true; | 1532 return true; |
1520 } | 1533 } |
1521 | 1534 |
1522 void os::print_dll_info(outputStream *st) { | 1535 void os::print_dll_info(outputStream *st) { |
1523 st->print_cr("Dynamic libraries:"); | 1536 st->print_cr("Dynamic libraries:"); |
1524 #ifdef RTLD_DI_LINKMAP | 1537 #ifdef RTLD_DI_LINKMAP |
1525 Dl_info dli; | 1538 Dl_info dli; |
1526 void *handle; | 1539 void *handle; |
1527 Link_map *map; | 1540 Link_map *map; |
1528 Link_map *p; | 1541 Link_map *p; |
1529 | 1542 |
1530 if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) { | 1543 if (dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli) == 0 || |
1531 st->print_cr("Error: Cannot print dynamic libraries."); | 1544 dli.dli_fname == NULL) { |
1532 return; | 1545 st->print_cr("Error: Cannot print dynamic libraries."); |
1533 } | 1546 return; |
1534 handle = dlopen(dli.dli_fname, RTLD_LAZY); | 1547 } |
1535 if (handle == NULL) { | 1548 handle = dlopen(dli.dli_fname, RTLD_LAZY); |
1536 st->print_cr("Error: Cannot print dynamic libraries."); | 1549 if (handle == NULL) { |
1537 return; | 1550 st->print_cr("Error: Cannot print dynamic libraries."); |
1538 } | 1551 return; |
1539 dlinfo(handle, RTLD_DI_LINKMAP, &map); | 1552 } |
1540 if (map == NULL) { | 1553 dlinfo(handle, RTLD_DI_LINKMAP, &map); |
1541 st->print_cr("Error: Cannot print dynamic libraries."); | 1554 if (map == NULL) { |
1542 return; | 1555 st->print_cr("Error: Cannot print dynamic libraries."); |
1543 } | 1556 return; |
1544 | 1557 } |
1545 while (map->l_prev != NULL) | 1558 |
1546 map = map->l_prev; | 1559 while (map->l_prev != NULL) |
1547 | 1560 map = map->l_prev; |
1548 while (map != NULL) { | 1561 |
1549 st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name); | 1562 while (map != NULL) { |
1550 map = map->l_next; | 1563 st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name); |
1551 } | 1564 map = map->l_next; |
1552 | 1565 } |
1553 dlclose(handle); | 1566 |
1567 dlclose(handle); | |
1554 #elif defined(__APPLE__) | 1568 #elif defined(__APPLE__) |
1555 uint32_t count; | 1569 uint32_t count; |
1556 uint32_t i; | 1570 uint32_t i; |
1557 | 1571 |
1558 count = _dyld_image_count(); | 1572 count = _dyld_image_count(); |
1559 for (i = 1; i < count; i++) { | 1573 for (i = 1; i < count; i++) { |
1560 const char *name = _dyld_get_image_name(i); | 1574 const char *name = _dyld_get_image_name(i); |
1561 intptr_t slide = _dyld_get_image_vmaddr_slide(i); | 1575 intptr_t slide = _dyld_get_image_vmaddr_slide(i); |
1562 st->print_cr(PTR_FORMAT " \t%s", slide, name); | 1576 st->print_cr(PTR_FORMAT " \t%s", slide, name); |
1563 } | 1577 } |
1564 #else | 1578 #else |
1565 st->print_cr("Error: Cannot print dynamic libraries."); | 1579 st->print_cr("Error: Cannot print dynamic libraries."); |
1566 #endif | 1580 #endif |
1567 } | 1581 } |
1568 | 1582 |
1569 void os::print_os_info_brief(outputStream* st) { | 1583 void os::print_os_info_brief(outputStream* st) { |
1570 st->print("Bsd"); | 1584 st->print("Bsd"); |
1705 | 1719 |
1706 char dli_fname[MAXPATHLEN]; | 1720 char dli_fname[MAXPATHLEN]; |
1707 bool ret = dll_address_to_library_name( | 1721 bool ret = dll_address_to_library_name( |
1708 CAST_FROM_FN_PTR(address, os::jvm_path), | 1722 CAST_FROM_FN_PTR(address, os::jvm_path), |
1709 dli_fname, sizeof(dli_fname), NULL); | 1723 dli_fname, sizeof(dli_fname), NULL); |
1710 assert(ret != 0, "cannot locate libjvm"); | 1724 assert(ret, "cannot locate libjvm"); |
1711 char *rp = realpath(dli_fname, buf); | 1725 char *rp = NULL; |
1726 if (ret && dli_fname[0] != '\0') { | |
1727 rp = realpath(dli_fname, buf); | |
1728 } | |
1712 if (rp == NULL) | 1729 if (rp == NULL) |
1713 return; | 1730 return; |
1714 | 1731 |
1715 if (Arguments::created_by_gamma_launcher()) { | 1732 if (Arguments::created_by_gamma_launcher()) { |
1716 // Support for the gamma launcher. Typical value for buf is | 1733 // Support for the gamma launcher. Typical value for buf is |
2072 ::close(fd); | 2089 ::close(fd); |
2073 unlink(buf); | 2090 unlink(buf); |
2074 } | 2091 } |
2075 } | 2092 } |
2076 | 2093 |
2094 static void warn_fail_commit_memory(char* addr, size_t size, bool exec, | |
2095 int err) { | |
2096 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT | |
2097 ", %d) failed; error='%s' (errno=%d)", addr, size, exec, | |
2098 strerror(err), err); | |
2099 } | |
2100 | |
2077 // NOTE: Bsd kernel does not really reserve the pages for us. | 2101 // NOTE: Bsd kernel does not really reserve the pages for us. |
2078 // All it does is to check if there are enough free pages | 2102 // All it does is to check if there are enough free pages |
2079 // left at the time of mmap(). This could be a potential | 2103 // left at the time of mmap(). This could be a potential |
2080 // problem. | 2104 // problem. |
2081 bool os::pd_commit_memory(char* addr, size_t size, bool exec) { | 2105 bool os::pd_commit_memory(char* addr, size_t size, bool exec) { |
2082 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; | 2106 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; |
2083 #ifdef __OpenBSD__ | 2107 #ifdef __OpenBSD__ |
2084 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD | 2108 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD |
2085 return ::mprotect(addr, size, prot) == 0; | 2109 if (::mprotect(addr, size, prot) == 0) { |
2110 return true; | |
2111 } | |
2086 #else | 2112 #else |
2087 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, | 2113 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, |
2088 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); | 2114 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); |
2089 return res != (uintptr_t) MAP_FAILED; | 2115 if (res != (uintptr_t) MAP_FAILED) { |
2090 #endif | 2116 return true; |
2091 } | 2117 } |
2092 | 2118 #endif |
2119 | |
2120 // Warn about any commit errors we see in non-product builds just | |
2121 // in case mmap() doesn't work as described on the man page. | |
2122 NOT_PRODUCT(warn_fail_commit_memory(addr, size, exec, errno);) | |
2123 | |
2124 return false; | |
2125 } | |
2093 | 2126 |
2094 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, | 2127 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, |
2095 bool exec) { | 2128 bool exec) { |
2096 return commit_memory(addr, size, exec); | 2129 // alignment_hint is ignored on this OS |
2130 return pd_commit_memory(addr, size, exec); | |
2131 } | |
2132 | |
2133 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec, | |
2134 const char* mesg) { | |
2135 assert(mesg != NULL, "mesg must be specified"); | |
2136 if (!pd_commit_memory(addr, size, exec)) { | |
2137 // add extra info in product mode for vm_exit_out_of_memory(): | |
2138 PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);) | |
2139 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg); | |
2140 } | |
2141 } | |
2142 | |
2143 void os::pd_commit_memory_or_exit(char* addr, size_t size, | |
2144 size_t alignment_hint, bool exec, | |
2145 const char* mesg) { | |
2146 // alignment_hint is ignored on this OS | |
2147 pd_commit_memory_or_exit(addr, size, exec, mesg); | |
2097 } | 2148 } |
2098 | 2149 |
2099 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { | 2150 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { |
2100 } | 2151 } |
2101 | 2152 |
2146 return res != (uintptr_t) MAP_FAILED; | 2197 return res != (uintptr_t) MAP_FAILED; |
2147 #endif | 2198 #endif |
2148 } | 2199 } |
2149 | 2200 |
2150 bool os::pd_create_stack_guard_pages(char* addr, size_t size) { | 2201 bool os::pd_create_stack_guard_pages(char* addr, size_t size) { |
2151 return os::commit_memory(addr, size); | 2202 return os::commit_memory(addr, size, !ExecMem); |
2152 } | 2203 } |
2153 | 2204 |
2154 // If this is a growable mapping, remove the guard pages entirely by | 2205 // If this is a growable mapping, remove the guard pages entirely by |
2155 // munmap()ping them. If not, just call uncommit_memory(). | 2206 // munmap()ping them. If not, just call uncommit_memory(). |
2156 bool os::remove_stack_guard_pages(char* addr, size_t size) { | 2207 bool os::remove_stack_guard_pages(char* addr, size_t size) { |
2318 } | 2369 } |
2319 return NULL; | 2370 return NULL; |
2320 } | 2371 } |
2321 | 2372 |
2322 // The memory is committed | 2373 // The memory is committed |
2323 address pc = CALLER_PC; | 2374 MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC); |
2324 MemTracker::record_virtual_memory_reserve((address)addr, bytes, pc); | |
2325 MemTracker::record_virtual_memory_commit((address)addr, bytes, pc); | |
2326 | 2375 |
2327 return addr; | 2376 return addr; |
2328 } | 2377 } |
2329 | 2378 |
2330 bool os::release_memory_special(char* base, size_t bytes) { | 2379 bool os::release_memory_special(char* base, size_t bytes) { |
2380 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker(); | |
2331 // detaching the SHM segment will also delete it, see reserve_memory_special() | 2381 // detaching the SHM segment will also delete it, see reserve_memory_special() |
2332 int rslt = shmdt(base); | 2382 int rslt = shmdt(base); |
2333 if (rslt == 0) { | 2383 if (rslt == 0) { |
2334 MemTracker::record_virtual_memory_uncommit((address)base, bytes); | 2384 tkr.record((address)base, bytes); |
2335 MemTracker::record_virtual_memory_release((address)base, bytes); | |
2336 return true; | 2385 return true; |
2337 } else { | 2386 } else { |
2387 tkr.discard(); | |
2338 return false; | 2388 return false; |
2339 } | 2389 } |
2340 | 2390 |
2341 } | 2391 } |
2342 | 2392 |
3510 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page); | 3560 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page); |
3511 #endif | 3561 #endif |
3512 | 3562 |
3513 if (!UseMembar) { | 3563 if (!UseMembar) { |
3514 address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); | 3564 address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); |
3515 guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page"); | 3565 guarantee( mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page"); |
3516 os::set_memory_serialize_page( mem_serialize_page ); | 3566 os::set_memory_serialize_page( mem_serialize_page ); |
3517 | 3567 |
3518 #ifndef PRODUCT | 3568 #ifndef PRODUCT |
3519 if(Verbose && PrintMiscellaneous) | 3569 if(Verbose && PrintMiscellaneous) |
3520 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page); | 3570 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page); |
3712 // debug support | 3762 // debug support |
3713 | 3763 |
3714 bool os::find(address addr, outputStream* st) { | 3764 bool os::find(address addr, outputStream* st) { |
3715 Dl_info dlinfo; | 3765 Dl_info dlinfo; |
3716 memset(&dlinfo, 0, sizeof(dlinfo)); | 3766 memset(&dlinfo, 0, sizeof(dlinfo)); |
3717 if (dladdr(addr, &dlinfo)) { | 3767 if (dladdr(addr, &dlinfo) != 0) { |
3718 st->print(PTR_FORMAT ": ", addr); | 3768 st->print(PTR_FORMAT ": ", addr); |
3719 if (dlinfo.dli_sname != NULL) { | 3769 if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) { |
3720 st->print("%s+%#x", dlinfo.dli_sname, | 3770 st->print("%s+%#x", dlinfo.dli_sname, |
3721 addr - (intptr_t)dlinfo.dli_saddr); | 3771 addr - (intptr_t)dlinfo.dli_saddr); |
3722 } else if (dlinfo.dli_fname) { | 3772 } else if (dlinfo.dli_fbase != NULL) { |
3723 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase); | 3773 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase); |
3724 } else { | 3774 } else { |
3725 st->print("<absolute address>"); | 3775 st->print("<absolute address>"); |
3726 } | 3776 } |
3727 if (dlinfo.dli_fname) { | 3777 if (dlinfo.dli_fname != NULL) { |
3728 st->print(" in %s", dlinfo.dli_fname); | 3778 st->print(" in %s", dlinfo.dli_fname); |
3729 } | 3779 } |
3730 if (dlinfo.dli_fbase) { | 3780 if (dlinfo.dli_fbase != NULL) { |
3731 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); | 3781 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); |
3732 } | 3782 } |
3733 st->cr(); | 3783 st->cr(); |
3734 | 3784 |
3735 if (Verbose) { | 3785 if (Verbose) { |
3738 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); | 3788 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); |
3739 address lowest = (address) dlinfo.dli_sname; | 3789 address lowest = (address) dlinfo.dli_sname; |
3740 if (!lowest) lowest = (address) dlinfo.dli_fbase; | 3790 if (!lowest) lowest = (address) dlinfo.dli_fbase; |
3741 if (begin < lowest) begin = lowest; | 3791 if (begin < lowest) begin = lowest; |
3742 Dl_info dlinfo2; | 3792 Dl_info dlinfo2; |
3743 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr | 3793 if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr |
3744 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) | 3794 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) |
3745 end = (address) dlinfo2.dli_saddr; | 3795 end = (address) dlinfo2.dli_saddr; |
3746 Disassembler::decode(begin, end, st); | 3796 Disassembler::decode(begin, end, st); |
3747 } | 3797 } |
3748 return true; | 3798 return true; |