| 1145 | } |
| 1146 | |
| 1147 | static int CallstackDataCb( void* /*data*/, uintptr_t pc, uintptr_t lowaddr, const char* fn, int lineno, const char* function ) |
| 1148 | { |
| 1149 | cb_data[cb_num].symLen = 0; |
| 1150 | cb_data[cb_num].symAddr = (uint64_t)lowaddr; |
| 1151 | |
| 1152 | if( !fn && !function ) |
| 1153 | { |
| 1154 | const char* symname = nullptr; |
| 1155 | auto vptr = (void*)pc; |
| 1156 | ptrdiff_t symoff = 0; |
| 1157 | |
| 1158 | Dl_info dlinfo; |
| 1159 | if( dladdr( vptr, &dlinfo ) ) |
| 1160 | { |
| 1161 | symname = dlinfo.dli_sname; |
| 1162 | symoff = (char*)pc - (char*)dlinfo.dli_saddr; |
| 1163 | const char* demangled = ___tracy_demangle( symname ); |
| 1164 | if( demangled ) symname = demangled; |
| 1165 | } |
| 1166 | |
| 1167 | if( !symname ) symname = "[unknown]"; |
| 1168 | |
| 1169 | if( symoff == 0 ) |
| 1170 | { |
| 1171 | const auto len = std::min<size_t>( strlen( symname ), std::numeric_limits<uint16_t>::max() ); |
| 1172 | cb_data[cb_num].name = CopyStringFast( symname, len ); |
| 1173 | } |
| 1174 | else |
| 1175 | { |
| 1176 | char buf[32]; |
| 1177 | const auto offlen = sprintf( buf, " + %td", symoff ); |
| 1178 | const auto namelen = std::min<size_t>( strlen( symname ), std::numeric_limits<uint16_t>::max() - offlen ); |
| 1179 | auto name = (char*)tracy_malloc_fast( namelen + offlen + 1 ); |
| 1180 | memcpy( name, symname, namelen ); |
| 1181 | memcpy( name + namelen, buf, offlen ); |
| 1182 | name[namelen + offlen] = '\0'; |
| 1183 | cb_data[cb_num].name = name; |
| 1184 | } |
| 1185 | |
| 1186 | cb_data[cb_num].file = CopyStringFast( "[unknown]" ); |
| 1187 | cb_data[cb_num].line = 0; |
| 1188 | } |
| 1189 | else |
| 1190 | { |
| 1191 | if( !fn ) fn = "[unknown]"; |
| 1192 | if( !function ) |
| 1193 | { |
| 1194 | function = "[unknown]"; |
| 1195 | } |
| 1196 | else |
| 1197 | { |
| 1198 | const char* demangled = ___tracy_demangle( function ); |
| 1199 | if( demangled ) function = demangled; |
| 1200 | } |
| 1201 | |
| 1202 | const auto len = std::min<size_t>( strlen( function ), std::numeric_limits<uint16_t>::max() ); |
| 1203 | cb_data[cb_num].name = CopyStringFast( function, len ); |
| 1204 | cb_data[cb_num].file = NormalizePath( fn ); |
nothing calls this directly
no test coverage detected