Mercurial > hg > graal-jvmci-8
comparison src/os/linux/vm/os_linux.cpp @ 14405:438e13354adf
Merge
author | kvn |
---|---|
date | Fri, 19 Jul 2013 13:32:53 -0700 |
parents | f4f6ae481e1a 59b052799158 |
children | f42f2e2a1518 |
comparison
equal
deleted
inserted
replaced
14404:6cc7093e1341 | 14405:438e13354adf |
---|---|
1682 bool os::address_is_in_vm(address addr) { | 1682 bool os::address_is_in_vm(address addr) { |
1683 static address libjvm_base_addr; | 1683 static address libjvm_base_addr; |
1684 Dl_info dlinfo; | 1684 Dl_info dlinfo; |
1685 | 1685 |
1686 if (libjvm_base_addr == NULL) { | 1686 if (libjvm_base_addr == NULL) { |
1687 dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo); | 1687 if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) { |
1688 libjvm_base_addr = (address)dlinfo.dli_fbase; | 1688 libjvm_base_addr = (address)dlinfo.dli_fbase; |
1689 } | |
1689 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); | 1690 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); |
1690 } | 1691 } |
1691 | 1692 |
1692 if (dladdr((void *)addr, &dlinfo)) { | 1693 if (dladdr((void *)addr, &dlinfo) != 0) { |
1693 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; | 1694 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; |
1694 } | 1695 } |
1695 | 1696 |
1696 return false; | 1697 return false; |
1697 } | 1698 } |
1698 | 1699 |
1699 bool os::dll_address_to_function_name(address addr, char *buf, | 1700 bool os::dll_address_to_function_name(address addr, char *buf, |
1700 int buflen, int *offset) { | 1701 int buflen, int *offset) { |
1702 // buf is not optional, but offset is optional | |
1703 assert(buf != NULL, "sanity check"); | |
1704 | |
1701 Dl_info dlinfo; | 1705 Dl_info dlinfo; |
1702 | 1706 |
1703 if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) { | 1707 if (dladdr((void*)addr, &dlinfo) != 0) { |
1704 if (buf != NULL) { | 1708 // see if we have a matching symbol |
1705 if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) { | 1709 if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) { |
1710 if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) { | |
1706 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); | 1711 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); |
1707 } | 1712 } |
1708 } | 1713 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; |
1709 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; | 1714 return true; |
1710 return true; | 1715 } |
1711 } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { | 1716 // no matching symbol so try for just file info |
1712 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), | 1717 if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) { |
1713 buf, buflen, offset, dlinfo.dli_fname)) { | 1718 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), |
1714 return true; | 1719 buf, buflen, offset, dlinfo.dli_fname)) { |
1715 } | 1720 return true; |
1716 } | 1721 } |
1717 | 1722 } |
1718 if (buf != NULL) buf[0] = '\0'; | 1723 } |
1724 | |
1725 buf[0] = '\0'; | |
1719 if (offset != NULL) *offset = -1; | 1726 if (offset != NULL) *offset = -1; |
1720 return false; | 1727 return false; |
1721 } | 1728 } |
1722 | 1729 |
1723 struct _address_to_library_name { | 1730 struct _address_to_library_name { |
1764 return 0; | 1771 return 0; |
1765 } | 1772 } |
1766 | 1773 |
1767 bool os::dll_address_to_library_name(address addr, char* buf, | 1774 bool os::dll_address_to_library_name(address addr, char* buf, |
1768 int buflen, int* offset) { | 1775 int buflen, int* offset) { |
1776 // buf is not optional, but offset is optional | |
1777 assert(buf != NULL, "sanity check"); | |
1778 | |
1769 Dl_info dlinfo; | 1779 Dl_info dlinfo; |
1770 struct _address_to_library_name data; | 1780 struct _address_to_library_name data; |
1771 | 1781 |
1772 // There is a bug in old glibc dladdr() implementation that it could resolve | 1782 // There is a bug in old glibc dladdr() implementation that it could resolve |
1773 // to wrong library name if the .so file has a base address != NULL. Here | 1783 // to wrong library name if the .so file has a base address != NULL. Here |
1782 | 1792 |
1783 if (rslt) { | 1793 if (rslt) { |
1784 // buf already contains library name | 1794 // buf already contains library name |
1785 if (offset) *offset = addr - data.base; | 1795 if (offset) *offset = addr - data.base; |
1786 return true; | 1796 return true; |
1787 } else if (dladdr((void*)addr, &dlinfo)){ | 1797 } |
1788 if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); | 1798 if (dladdr((void*)addr, &dlinfo) != 0) { |
1789 if (offset) *offset = addr - (address)dlinfo.dli_fbase; | 1799 if (dlinfo.dli_fname != NULL) { |
1790 return true; | 1800 jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); |
1791 } else { | 1801 } |
1792 if (buf) buf[0] = '\0'; | 1802 if (dlinfo.dli_fbase != NULL && offset != NULL) { |
1793 if (offset) *offset = -1; | 1803 *offset = addr - (address)dlinfo.dli_fbase; |
1794 return false; | 1804 } |
1795 } | 1805 return true; |
1806 } | |
1807 | |
1808 buf[0] = '\0'; | |
1809 if (offset) *offset = -1; | |
1810 return false; | |
1796 } | 1811 } |
1797 | 1812 |
1798 // Loads .dll/.so and | 1813 // Loads .dll/.so and |
1799 // in case of error it checks if .dll/.so was built for the | 1814 // in case of error it checks if .dll/.so was built for the |
1800 // same architecture as Hotspot is running on | 1815 // same architecture as Hotspot is running on |
2317 | 2332 |
2318 char dli_fname[MAXPATHLEN]; | 2333 char dli_fname[MAXPATHLEN]; |
2319 bool ret = dll_address_to_library_name( | 2334 bool ret = dll_address_to_library_name( |
2320 CAST_FROM_FN_PTR(address, os::jvm_path), | 2335 CAST_FROM_FN_PTR(address, os::jvm_path), |
2321 dli_fname, sizeof(dli_fname), NULL); | 2336 dli_fname, sizeof(dli_fname), NULL); |
2322 assert(ret != 0, "cannot locate libjvm"); | 2337 assert(ret, "cannot locate libjvm"); |
2323 char *rp = realpath(dli_fname, buf); | 2338 char *rp = NULL; |
2339 if (ret && dli_fname[0] != '\0') { | |
2340 rp = realpath(dli_fname, buf); | |
2341 } | |
2324 if (rp == NULL) | 2342 if (rp == NULL) |
2325 return; | 2343 return; |
2326 | 2344 |
2327 if (Arguments::created_by_gamma_launcher()) { | 2345 if (Arguments::created_by_gamma_launcher()) { |
2328 // Support for the gamma launcher. Typical value for buf is | 2346 // Support for the gamma launcher. Typical value for buf is |
4729 // debug support | 4747 // debug support |
4730 | 4748 |
4731 bool os::find(address addr, outputStream* st) { | 4749 bool os::find(address addr, outputStream* st) { |
4732 Dl_info dlinfo; | 4750 Dl_info dlinfo; |
4733 memset(&dlinfo, 0, sizeof(dlinfo)); | 4751 memset(&dlinfo, 0, sizeof(dlinfo)); |
4734 if (dladdr(addr, &dlinfo)) { | 4752 if (dladdr(addr, &dlinfo) != 0) { |
4735 st->print(PTR_FORMAT ": ", addr); | 4753 st->print(PTR_FORMAT ": ", addr); |
4736 if (dlinfo.dli_sname != NULL) { | 4754 if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) { |
4737 st->print("%s+%#x", dlinfo.dli_sname, | 4755 st->print("%s+%#x", dlinfo.dli_sname, |
4738 addr - (intptr_t)dlinfo.dli_saddr); | 4756 addr - (intptr_t)dlinfo.dli_saddr); |
4739 } else if (dlinfo.dli_fname) { | 4757 } else if (dlinfo.dli_fbase != NULL) { |
4740 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase); | 4758 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase); |
4741 } else { | 4759 } else { |
4742 st->print("<absolute address>"); | 4760 st->print("<absolute address>"); |
4743 } | 4761 } |
4744 if (dlinfo.dli_fname) { | 4762 if (dlinfo.dli_fname != NULL) { |
4745 st->print(" in %s", dlinfo.dli_fname); | 4763 st->print(" in %s", dlinfo.dli_fname); |
4746 } | 4764 } |
4747 if (dlinfo.dli_fbase) { | 4765 if (dlinfo.dli_fbase != NULL) { |
4748 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); | 4766 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); |
4749 } | 4767 } |
4750 st->cr(); | 4768 st->cr(); |
4751 | 4769 |
4752 if (Verbose) { | 4770 if (Verbose) { |
4755 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); | 4773 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); |
4756 address lowest = (address) dlinfo.dli_sname; | 4774 address lowest = (address) dlinfo.dli_sname; |
4757 if (!lowest) lowest = (address) dlinfo.dli_fbase; | 4775 if (!lowest) lowest = (address) dlinfo.dli_fbase; |
4758 if (begin < lowest) begin = lowest; | 4776 if (begin < lowest) begin = lowest; |
4759 Dl_info dlinfo2; | 4777 Dl_info dlinfo2; |
4760 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr | 4778 if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr |
4761 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) | 4779 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) |
4762 end = (address) dlinfo2.dli_saddr; | 4780 end = (address) dlinfo2.dli_saddr; |
4763 Disassembler::decode(begin, end, st); | 4781 Disassembler::decode(begin, end, st); |
4764 } | 4782 } |
4765 return true; | 4783 return true; |