|
34 | 34 | #include "swift/Runtime/Unreachable.h" |
35 | 35 |
|
36 | 36 | #include <set> |
37 | | -#include <vector> |
| 37 | +#include <sstream> |
38 | 38 | #include <unordered_map> |
39 | 39 | #include <utility> |
| 40 | +#include <vector> |
40 | 41 |
|
41 | 42 | namespace { |
42 | 43 |
|
@@ -794,7 +795,7 @@ class ReflectionContext |
794 | 795 | llvm::Optional<std::string> iterateConformances( |
795 | 796 | std::function<void(StoredPointer Type, StoredPointer Proto)> Call) { |
796 | 797 | std::string ConformancesPointerName = |
797 | | - "__swift_debug_protocolConformanceStatePointer"; |
| 798 | + "_swift_debug_protocolConformanceStatePointer"; |
798 | 799 | auto ConformancesAddrAddr = |
799 | 800 | getReader().getSymbolAddress(ConformancesPointerName); |
800 | 801 | if (!ConformancesAddrAddr) |
@@ -844,9 +845,9 @@ class ReflectionContext |
844 | 845 | llvm::Optional<std::string> iterateMetadataAllocations( |
845 | 846 | std::function<void (MetadataAllocation<Runtime>)> Call) { |
846 | 847 | std::string IterationEnabledName = |
847 | | - "__swift_debug_metadataAllocationIterationEnabled"; |
| 848 | + "_swift_debug_metadataAllocationIterationEnabled"; |
848 | 849 | std::string AllocationPoolPointerName = |
849 | | - "__swift_debug_allocationPoolPointer"; |
| 850 | + "_swift_debug_allocationPoolPointer"; |
850 | 851 |
|
851 | 852 | auto IterationEnabledAddr = |
852 | 853 | getReader().getSymbolAddress(IterationEnabledName); |
@@ -922,6 +923,50 @@ class ReflectionContext |
922 | 923 | return llvm::None; |
923 | 924 | } |
924 | 925 |
|
| 926 | + llvm::Optional<std::string> iterateMetadataAllocationBacktraces( |
| 927 | + std::function<void(StoredPointer, uint32_t, const StoredPointer *)> |
| 928 | + Call) { |
| 929 | + std::string BacktraceListName = |
| 930 | + "_swift_debug_metadataAllocationBacktraceList"; |
| 931 | + |
| 932 | + auto BacktraceListAddr = getReader().getSymbolAddress(BacktraceListName); |
| 933 | + if (!BacktraceListAddr) |
| 934 | + return "unable to look up debug variable " + BacktraceListName; |
| 935 | + auto BacktraceListNextPtr = |
| 936 | + getReader().readPointer(BacktraceListAddr, sizeof(StoredPointer)); |
| 937 | + if (!BacktraceListNextPtr) |
| 938 | + return llvm::None; |
| 939 | + |
| 940 | + auto BacktraceListNext = BacktraceListNextPtr->getResolvedAddress(); |
| 941 | + while (BacktraceListNext) { |
| 942 | + auto HeaderBytes = getReader().readBytes( |
| 943 | + RemoteAddress(BacktraceListNext), |
| 944 | + sizeof(MetadataAllocationBacktraceHeader<Runtime>)); |
| 945 | + auto HeaderPtr = |
| 946 | + reinterpret_cast<const MetadataAllocationBacktraceHeader<Runtime> *>( |
| 947 | + HeaderBytes.get()); |
| 948 | + if (HeaderPtr == nullptr) { |
| 949 | + std::stringstream stream; |
| 950 | + stream << "unable to read Next pointer 0x" << std::hex |
| 951 | + << BacktraceListNext.getAddressData(); |
| 952 | + return stream.str(); |
| 953 | + } |
| 954 | + auto BacktraceAddrPtr = |
| 955 | + BacktraceListNext + |
| 956 | + sizeof(MetadataAllocationBacktraceHeader<Runtime>); |
| 957 | + auto BacktraceBytes = |
| 958 | + getReader().readBytes(RemoteAddress(BacktraceAddrPtr), |
| 959 | + HeaderPtr->Count * sizeof(StoredPointer)); |
| 960 | + auto BacktracePtr = |
| 961 | + reinterpret_cast<const StoredPointer *>(BacktraceBytes.get()); |
| 962 | + |
| 963 | + Call(HeaderPtr->Allocation, HeaderPtr->Count, BacktracePtr); |
| 964 | + |
| 965 | + BacktraceListNext = RemoteAddress(HeaderPtr->Next); |
| 966 | + } |
| 967 | + return llvm::None; |
| 968 | + } |
| 969 | + |
925 | 970 | private: |
926 | 971 | const TypeInfo *getClosureContextInfo(StoredPointer Context, |
927 | 972 | const ClosureContextInfo &Info) { |
|
0 commit comments