The open source OpenXR runtime

ext/tracy: Update to v0.9.1

+2839 -248
+1 -1
src/external/tracy/COMMIT
··· 1 - v0.9 1 + v0.9.1
+1
src/external/tracy/TracyClient.cpp
··· 28 28 #include "client/tracy_rpmalloc.cpp" 29 29 #include "client/TracyDxt1.cpp" 30 30 #include "client/TracyAlloc.cpp" 31 + #include "client/TracyOverride.cpp" 31 32 32 33 #if TRACY_HAS_CALLSTACK == 2 || TRACY_HAS_CALLSTACK == 3 || TRACY_HAS_CALLSTACK == 4 || TRACY_HAS_CALLSTACK == 6 33 34 # include "libbacktrace/alloc.cpp"
+4
src/external/tracy/client/TracyCallstack.cpp
··· 227 227 const auto res = GetModuleFileNameA( mod[i], name, 1021 ); 228 228 if( res > 0 ) 229 229 { 230 + // This may be a new module loaded since our call to SymInitialize. 231 + // Just in case, force DbgHelp to load its pdb ! 232 + SymLoadModuleEx(proc, NULL, name, NULL, (DWORD64)info.lpBaseOfDll, info.SizeOfImage, NULL, 0); 233 + 230 234 auto ptr = name + res; 231 235 while( ptr > name && *ptr != '\\' && *ptr != '/' ) ptr--; 232 236 if( ptr > name ) ptr++;
+9 -2
src/external/tracy/client/TracyCallstack.hpp
··· 2 2 #define __TRACYCALLSTACK_HPP__ 3 3 4 4 #include "../common/TracyApi.h" 5 + #include "../common/TracyForceInline.hpp" 5 6 #include "TracyCallstack.h" 6 7 7 8 #if TRACY_HAS_CALLSTACK == 2 || TRACY_HAS_CALLSTACK == 5 ··· 11 12 #endif 12 13 13 14 14 - #ifdef TRACY_HAS_CALLSTACK 15 + #ifndef TRACY_HAS_CALLSTACK 16 + 17 + namespace tracy 18 + { 19 + static tracy_force_inline void* Callstack( int depth ) { return nullptr; } 20 + } 21 + 22 + #else 15 23 16 24 #ifdef TRACY_DEBUGINFOD 17 25 # include <elfutils/debuginfod.h> ··· 21 29 #include <stdint.h> 22 30 23 31 #include "../common/TracyAlloc.hpp" 24 - #include "../common/TracyForceInline.hpp" 25 32 26 33 namespace tracy 27 34 {
+26
src/external/tracy/client/TracyOverride.cpp
··· 1 + #ifdef TRACY_ENABLE 2 + # ifdef __linux__ 3 + # include "TracyDebug.hpp" 4 + # ifdef TRACY_VERBOSE 5 + # include <dlfcn.h> 6 + # include <link.h> 7 + # endif 8 + 9 + extern "C" int dlclose( void* hnd ) 10 + { 11 + #ifdef TRACY_VERBOSE 12 + struct link_map* lm; 13 + if( dlinfo( hnd, RTLD_DI_LINKMAP, &lm ) == 0 ) 14 + { 15 + TracyDebug( "Overriding dlclose for %s\n", lm->l_name ); 16 + } 17 + else 18 + { 19 + TracyDebug( "Overriding dlclose for unknown object (%s)\n", dlerror() ); 20 + } 21 + #endif 22 + return 0; 23 + } 24 + 25 + # endif 26 + #endif
+13 -11
src/external/tracy/client/TracyProfiler.cpp
··· 1415 1415 1416 1416 #if defined _WIN32 && !defined TRACY_UWP && !defined TRACY_NO_CRASH_HANDLER 1417 1417 s_profilerThreadId = GetThreadId( s_thread->Handle() ); 1418 + # ifdef TRACY_HAS_CALLSTACK 1418 1419 s_symbolThreadId = GetThreadId( s_symbolThread->Handle() ); 1420 + # endif 1419 1421 m_exceptionHandler = AddVectoredExceptionHandler( 1, CrashFilter ); 1420 1422 #endif 1421 1423 ··· 1454 1456 if( m_crashHandlerInstalled ) RemoveVectoredExceptionHandler( m_exceptionHandler ); 1455 1457 #endif 1456 1458 1457 - #ifdef __linux__ 1459 + #if defined __linux__ && !defined TRACY_NO_CRASH_HANDLER 1458 1460 if( m_crashHandlerInstalled ) 1459 1461 { 1460 1462 sigaction( TRACY_CRASH_SIGNAL, &m_prevSignal.pwr, nullptr ); ··· 1520 1522 1521 1523 void Profiler::Worker() 1522 1524 { 1523 - #ifdef __linux__ 1525 + #if defined __linux__ && !defined TRACY_NO_CRASH_HANDLER 1524 1526 s_profilerTid = syscall( SYS_gettid ); 1525 1527 #endif 1526 1528 ··· 3024 3026 MemWrite( &item.srcloc.file, (uint64_t)srcloc->file ); 3025 3027 MemWrite( &item.srcloc.function, (uint64_t)srcloc->function ); 3026 3028 MemWrite( &item.srcloc.line, srcloc->line ); 3027 - MemWrite( &item.srcloc.r, uint8_t( ( srcloc->color ) & 0xFF ) ); 3029 + MemWrite( &item.srcloc.b, uint8_t( ( srcloc->color ) & 0xFF ) ); 3028 3030 MemWrite( &item.srcloc.g, uint8_t( ( srcloc->color >> 8 ) & 0xFF ) ); 3029 - MemWrite( &item.srcloc.b, uint8_t( ( srcloc->color >> 16 ) & 0xFF ) ); 3031 + MemWrite( &item.srcloc.r, uint8_t( ( srcloc->color >> 16 ) & 0xFF ) ); 3030 3032 AppendData( &item, QueueDataSize[(int)QueueType::SourceLocation] ); 3031 3033 } 3032 3034 ··· 3329 3331 3330 3332 uint8_t type; 3331 3333 uint64_t ptr; 3332 - uint32_t extra; 3333 3334 memcpy( &type, &payload.type, sizeof( payload.type ) ); 3334 3335 memcpy( &ptr, &payload.ptr, sizeof( payload.ptr ) ); 3335 - memcpy( &extra, &payload.extra, sizeof( payload.extra ) ); 3336 3336 3337 3337 switch( type ) 3338 3338 { ··· 3379 3379 break; 3380 3380 #ifndef TRACY_NO_CODE_TRANSFER 3381 3381 case ServerQuerySymbolCode: 3382 - HandleSymbolCodeQuery( ptr, extra ); 3382 + HandleSymbolCodeQuery( ptr, payload.extra ); 3383 3383 break; 3384 3384 #endif 3385 3385 case ServerQuerySourceCode: ··· 3396 3396 break; 3397 3397 case ServerQueryDataTransferPart: 3398 3398 memcpy( m_queryDataPtr, &ptr, 8 ); 3399 - memcpy( m_queryDataPtr+8, &extra, 4 ); 3399 + memcpy( m_queryDataPtr+8, &payload.extra, 4 ); 3400 3400 m_queryDataPtr += 12; 3401 3401 AckServerQuery(); 3402 3402 break; ··· 3546 3546 constexpr int Events = Iterations * 2; // start + end 3547 3547 static_assert( Events < QueuePrealloc, "Delay calibration loop will allocate memory in queue" ); 3548 3548 3549 - static const tracy::SourceLocationData __tracy_source_location { nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; 3549 + static const tracy::SourceLocationData __tracy_source_location { nullptr, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; 3550 3550 const auto t0 = GetTime(); 3551 3551 for( int i=0; i<Iterations; i++ ) 3552 3552 { ··· 4110 4110 #endif 4111 4111 { 4112 4112 TracyQueuePrepareC( tracy::QueueType::ZoneColor ); 4113 - tracy::MemWrite( &item->zoneColor.r, uint8_t( ( color ) & 0xFF ) ); 4113 + tracy::MemWrite( &item->zoneColor.b, uint8_t( ( color ) & 0xFF ) ); 4114 4114 tracy::MemWrite( &item->zoneColor.g, uint8_t( ( color >> 8 ) & 0xFF ) ); 4115 - tracy::MemWrite( &item->zoneColor.b, uint8_t( ( color >> 16 ) & 0xFF ) ); 4115 + tracy::MemWrite( &item->zoneColor.r, uint8_t( ( color >> 16 ) & 0xFF ) ); 4116 4116 TracyQueueCommitC( zoneColorThread ); 4117 4117 } 4118 4118 } ··· 4147 4147 TRACY_API void ___tracy_emit_frame_mark_end( const char* name ) { tracy::Profiler::SendFrameMark( name, tracy::QueueType::FrameMarkMsgEnd ); } 4148 4148 TRACY_API void ___tracy_emit_frame_image( const void* image, uint16_t w, uint16_t h, uint8_t offset, int flip ) { tracy::Profiler::SendFrameImage( image, w, h, offset, flip ); } 4149 4149 TRACY_API void ___tracy_emit_plot( const char* name, double val ) { tracy::Profiler::PlotData( name, val ); } 4150 + TRACY_API void ___tracy_emit_plot_float( const char* name, float val ) { tracy::Profiler::PlotData( name, val ); } 4151 + TRACY_API void ___tracy_emit_plot_int( const char* name, int64_t val ) { tracy::Profiler::PlotData( name, val ); } 4150 4152 TRACY_API void ___tracy_emit_message( const char* txt, size_t size, int callstack ) { tracy::Profiler::Message( txt, size, callstack ); } 4151 4153 TRACY_API void ___tracy_emit_messageL( const char* txt, int callstack ) { tracy::Profiler::Message( txt, callstack ); } 4152 4154 TRACY_API void ___tracy_emit_messageC( const char* txt, size_t size, uint32_t color, int callstack ) { tracy::Profiler::MessageColor( txt, size, color, callstack ); }
+4 -4
src/external/tracy/client/TracyProfiler.hpp
··· 414 414 TracyQueuePrepare( callstack == 0 ? QueueType::MessageColor : QueueType::MessageColorCallstack ); 415 415 MemWrite( &item->messageColorFat.time, GetTime() ); 416 416 MemWrite( &item->messageColorFat.text, (uint64_t)ptr ); 417 - MemWrite( &item->messageColorFat.r, uint8_t( ( color ) & 0xFF ) ); 417 + MemWrite( &item->messageColorFat.b, uint8_t( ( color ) & 0xFF ) ); 418 418 MemWrite( &item->messageColorFat.g, uint8_t( ( color >> 8 ) & 0xFF ) ); 419 - MemWrite( &item->messageColorFat.b, uint8_t( ( color >> 16 ) & 0xFF ) ); 419 + MemWrite( &item->messageColorFat.r, uint8_t( ( color >> 16 ) & 0xFF ) ); 420 420 MemWrite( &item->messageColorFat.size, (uint16_t)size ); 421 421 TracyQueueCommit( messageColorFatThread ); 422 422 } ··· 434 434 TracyQueuePrepare( callstack == 0 ? QueueType::MessageLiteralColor : QueueType::MessageLiteralColorCallstack ); 435 435 MemWrite( &item->messageColorLiteral.time, GetTime() ); 436 436 MemWrite( &item->messageColorLiteral.text, (uint64_t)txt ); 437 - MemWrite( &item->messageColorLiteral.r, uint8_t( ( color ) & 0xFF ) ); 437 + MemWrite( &item->messageColorLiteral.b, uint8_t( ( color ) & 0xFF ) ); 438 438 MemWrite( &item->messageColorLiteral.g, uint8_t( ( color >> 8 ) & 0xFF ) ); 439 - MemWrite( &item->messageColorLiteral.b, uint8_t( ( color >> 16 ) & 0xFF ) ); 439 + MemWrite( &item->messageColorLiteral.r, uint8_t( ( color >> 16 ) & 0xFF ) ); 440 440 TracyQueueCommit( messageColorLiteralThread ); 441 441 } 442 442
+3 -3
src/external/tracy/client/TracyScoped.hpp
··· 143 143 if( GetProfiler().ConnectionId() != m_connectionId ) return; 144 144 #endif 145 145 TracyQueuePrepare( QueueType::ZoneColor ); 146 - MemWrite( &item->zoneColor.r, uint8_t( ( color ) & 0xFF ) ); 146 + MemWrite( &item->zoneColor.b, uint8_t( ( color ) & 0xFF ) ); 147 147 MemWrite( &item->zoneColor.g, uint8_t( ( color >> 8 ) & 0xFF ) ); 148 - MemWrite( &item->zoneColor.b, uint8_t( ( color >> 16 ) & 0xFF ) ); 148 + MemWrite( &item->zoneColor.r, uint8_t( ( color >> 16 ) & 0xFF ) ); 149 149 TracyQueueCommit( zoneColorThread ); 150 150 } 151 151 ··· 166 166 const bool m_active; 167 167 168 168 #ifdef TRACY_ON_DEMAND 169 - uint64_t m_connectionId; 169 + uint64_t m_connectionId = 0; 170 170 #endif 171 171 }; 172 172
+3 -2
src/external/tracy/client/TracySysTrace.cpp
··· 409 409 return false; 410 410 } 411 411 412 + #ifndef TRACY_NO_SAMPLING 412 413 if( isOs64Bit ) 413 414 { 414 415 CLASSIC_EVENT_ID stackId[2] = {}; ··· 423 424 return false; 424 425 } 425 426 } 427 + #endif 426 428 427 429 #ifdef UNICODE 428 430 WCHAR KernelLoggerName[sizeof( KERNEL_LOGGER_NAME )]; ··· 1263 1265 type = QueueType::HwSampleBranchMiss; 1264 1266 break; 1265 1267 default: 1266 - assert( false ); 1267 - break; 1268 + abort(); 1268 1269 } 1269 1270 1270 1271 TracyLfqPrepare( type );
+3 -8
src/external/tracy/client/tracy_concurrentqueue.h
··· 210 210 } 211 211 }; 212 212 213 - #ifdef _MSC_VER 214 - #pragma warning(push) 215 - #pragma warning(disable: 4554) 216 - #endif 217 213 template<typename T> 218 214 static inline bool circular_less_than(T a, T b) 219 215 { 220 216 static_assert(std::is_integral<T>::value && !std::numeric_limits<T>::is_signed, "circular_less_than is intended to be used only with unsigned integer types"); 221 - return static_cast<T>(a - b) > (static_cast<T>(static_cast<T>(1) << static_cast<T>(sizeof(T) * CHAR_BIT - 1))); 217 + return static_cast<T>(a - b) > static_cast<T>(static_cast<T>(1) << (static_cast<T>(sizeof(T) * CHAR_BIT - 1))); 218 + // Note: extra parens around rhs of operator<< is MSVC bug: https://developercommunity2.visualstudio.com/t/C4554-triggers-when-both-lhs-and-rhs-is/10034931 219 + // silencing the bug requires #pragma warning(disable: 4554) around the calling code and has no effect when done here. 222 220 } 223 - #ifdef _MSC_VER 224 - #pragma warning(pop) 225 - #endif 226 221 227 222 template<typename U> 228 223 static inline char* align_for(char* ptr)
+6 -6
src/external/tracy/common/TracyQueue.hpp
··· 166 166 167 167 struct QueueZoneColor 168 168 { 169 - uint8_t r; 170 - uint8_t g; 171 169 uint8_t b; 170 + uint8_t g; 171 + uint8_t r; 172 172 }; 173 173 174 174 struct QueueZoneColorThread : public QueueZoneColor ··· 222 222 uint64_t function; // ptr 223 223 uint64_t file; // ptr 224 224 uint32_t line; 225 - uint8_t r; 226 - uint8_t g; 227 225 uint8_t b; 226 + uint8_t g; 227 + uint8_t r; 228 228 }; 229 229 230 230 struct QueueZoneTextFat ··· 342 342 343 343 struct QueueMessageColor : public QueueMessage 344 344 { 345 - uint8_t r; 346 - uint8_t g; 347 345 uint8_t b; 346 + uint8_t g; 347 + uint8_t r; 348 348 }; 349 349 350 350 struct QueueMessageLiteral : public QueueMessage
+50 -54
src/external/tracy/common/TracySystem.cpp
··· 205 205 } 206 206 ptr = ptr->next; 207 207 } 208 - #else 209 - # if defined _WIN32 210 - # ifdef TRACY_UWP 211 - static auto _GetThreadDescription = &::GetThreadDescription; 212 - # else 213 - static auto _GetThreadDescription = (t_GetThreadDescription)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "GetThreadDescription" ); 214 - # endif 215 - if( _GetThreadDescription ) 216 - { 217 - auto hnd = OpenThread( THREAD_QUERY_LIMITED_INFORMATION, FALSE, (DWORD)id ); 218 - if( hnd != 0 ) 219 - { 220 - PWSTR tmp; 221 - _GetThreadDescription( hnd, &tmp ); 222 - auto ret = wcstombs( buf, tmp, 256 ); 223 - CloseHandle( hnd ); 224 - if( ret != 0 ) 225 - { 226 - return buf; 227 - } 228 - } 229 - } 230 - # elif defined __linux__ 231 - int cs, fd; 232 - char path[32]; 233 - # ifdef __ANDROID__ 234 - int tid = gettid(); 235 - # else 236 - int tid = (int) syscall( SYS_gettid ); 237 - # endif 238 - snprintf( path, sizeof( path ), "/proc/self/task/%d/comm", tid ); 239 - sprintf( buf, "%" PRIu32, id ); 240 - # ifndef __ANDROID__ 241 - pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, &cs ); 242 - # endif 243 - if ( ( fd = open( path, O_RDONLY ) ) > 0) { 244 - int len = read( fd, buf, 255 ); 245 - if( len > 0 ) 246 - { 247 - buf[len] = 0; 248 - if( len > 1 && buf[len-1] == '\n' ) 249 - { 250 - buf[len-1] = 0; 251 - } 252 - } 253 - close( fd ); 254 - } 255 - # ifndef __ANDROID__ 256 - pthread_setcancelstate( cs, 0 ); 257 - # endif 258 - return buf; 259 - # endif 260 208 #endif 261 - sprintf( buf, "%" PRIu32, id ); 262 - return buf; 209 + 210 + #if defined _WIN32 211 + # ifdef TRACY_UWP 212 + static auto _GetThreadDescription = &::GetThreadDescription; 213 + # else 214 + static auto _GetThreadDescription = (t_GetThreadDescription)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "GetThreadDescription" ); 215 + # endif 216 + if( _GetThreadDescription ) 217 + { 218 + auto hnd = OpenThread( THREAD_QUERY_LIMITED_INFORMATION, FALSE, (DWORD)id ); 219 + if( hnd != 0 ) 220 + { 221 + PWSTR tmp; 222 + _GetThreadDescription( hnd, &tmp ); 223 + auto ret = wcstombs( buf, tmp, 256 ); 224 + CloseHandle( hnd ); 225 + if( ret != 0 ) 226 + { 227 + return buf; 228 + } 229 + } 230 + } 231 + #elif defined __linux__ 232 + int cs, fd; 233 + char path[32]; 234 + snprintf( path, sizeof( path ), "/proc/self/task/%d/comm", id ); 235 + sprintf( buf, "%" PRIu32, id ); 236 + # ifndef __ANDROID__ 237 + pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, &cs ); 238 + # endif 239 + if ( ( fd = open( path, O_RDONLY ) ) > 0) { 240 + int len = read( fd, buf, 255 ); 241 + if( len > 0 ) 242 + { 243 + buf[len] = 0; 244 + if( len > 1 && buf[len-1] == '\n' ) 245 + { 246 + buf[len-1] = 0; 247 + } 248 + } 249 + close( fd ); 250 + } 251 + # ifndef __ANDROID__ 252 + pthread_setcancelstate( cs, 0 ); 253 + # endif 254 + return buf; 255 + #endif 256 + 257 + sprintf( buf, "%" PRIu32, id ); 258 + return buf; 263 259 } 264 260 265 261 TRACY_API const char* GetEnvVar( const char* name )
+1 -1
src/external/tracy/common/TracyVersion.hpp
··· 7 7 { 8 8 enum { Major = 0 }; 9 9 enum { Minor = 9 }; 10 - enum { Patch = 0 }; 10 + enum { Patch = 1 }; 11 11 } 12 12 } 13 13
+2589 -70
src/external/tracy/libbacktrace/elf.cpp
··· 193 193 #undef STT_FUNC 194 194 #undef NT_GNU_BUILD_ID 195 195 #undef ELFCOMPRESS_ZLIB 196 + #undef ELFCOMPRESS_ZSTD 196 197 197 198 /* Basic types. */ 198 199 ··· 350 351 #endif /* BACKTRACE_ELF_SIZE != 32 */ 351 352 352 353 #define ELFCOMPRESS_ZLIB 1 354 + #define ELFCOMPRESS_ZSTD 2 353 355 354 356 /* Names of sections, indexed by enum dwarf_section in internal.h. */ 355 357 ··· 1130 1132 on error. */ 1131 1133 1132 1134 static int 1133 - elf_zlib_fetch (const unsigned char **ppin, const unsigned char *pinend, 1135 + elf_fetch_bits (const unsigned char **ppin, const unsigned char *pinend, 1134 1136 uint64_t *pval, unsigned int *pbits) 1135 1137 { 1136 1138 unsigned int bits; ··· 1177 1179 return 1; 1178 1180 } 1179 1181 1182 + /* This is like elf_fetch_bits, but it fetchs the bits backward, and ensures at 1183 + least 16 bits. This is for zstd. */ 1184 + 1185 + static int 1186 + elf_fetch_bits_backward (const unsigned char **ppin, 1187 + const unsigned char *pinend, 1188 + uint64_t *pval, unsigned int *pbits) 1189 + { 1190 + unsigned int bits; 1191 + const unsigned char *pin; 1192 + uint64_t val; 1193 + uint32_t next; 1194 + 1195 + bits = *pbits; 1196 + if (bits >= 16) 1197 + return 1; 1198 + pin = *ppin; 1199 + val = *pval; 1200 + 1201 + if (unlikely (pin <= pinend)) 1202 + { 1203 + if (bits == 0) 1204 + { 1205 + elf_uncompress_failed (); 1206 + return 0; 1207 + } 1208 + return 1; 1209 + } 1210 + 1211 + pin -= 4; 1212 + 1213 + #if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) \ 1214 + && defined(__ORDER_BIG_ENDIAN__) \ 1215 + && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ \ 1216 + || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) 1217 + /* We've ensured that PIN is aligned. */ 1218 + next = *(const uint32_t *)pin; 1219 + 1220 + #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ 1221 + next = __builtin_bswap32 (next); 1222 + #endif 1223 + #else 1224 + next = pin[0] | (pin[1] << 8) | (pin[2] << 16) | (pin[3] << 24); 1225 + #endif 1226 + 1227 + val <<= 32; 1228 + val |= next; 1229 + bits += 32; 1230 + 1231 + if (unlikely (pin < pinend)) 1232 + { 1233 + val >>= (pinend - pin) * 8; 1234 + bits -= (pinend - pin) * 8; 1235 + } 1236 + 1237 + *ppin = pin; 1238 + *pval = val; 1239 + *pbits = bits; 1240 + return 1; 1241 + } 1242 + 1243 + /* Initialize backward fetching when the bitstream starts with a 1 bit in the 1244 + last byte in memory (which is the first one that we read). This is used by 1245 + zstd decompression. Returns 1 on success, 0 on error. */ 1246 + 1247 + static int 1248 + elf_fetch_backward_init (const unsigned char **ppin, 1249 + const unsigned char *pinend, 1250 + uint64_t *pval, unsigned int *pbits) 1251 + { 1252 + const unsigned char *pin; 1253 + unsigned int stream_start; 1254 + uint64_t val; 1255 + unsigned int bits; 1256 + 1257 + pin = *ppin; 1258 + stream_start = (unsigned int)*pin; 1259 + if (unlikely (stream_start == 0)) 1260 + { 1261 + elf_uncompress_failed (); 1262 + return 0; 1263 + } 1264 + val = 0; 1265 + bits = 0; 1266 + 1267 + /* Align to a 32-bit boundary. */ 1268 + while ((((uintptr_t)pin) & 3) != 0) 1269 + { 1270 + val <<= 8; 1271 + val |= (uint64_t)*pin; 1272 + bits += 8; 1273 + --pin; 1274 + } 1275 + 1276 + val <<= 8; 1277 + val |= (uint64_t)*pin; 1278 + bits += 8; 1279 + 1280 + *ppin = pin; 1281 + *pval = val; 1282 + *pbits = bits; 1283 + if (!elf_fetch_bits_backward (ppin, pinend, pval, pbits)) 1284 + return 0; 1285 + 1286 + *pbits -= __builtin_clz (stream_start) - (sizeof (unsigned int) - 1) * 8 + 1; 1287 + 1288 + if (!elf_fetch_bits_backward (ppin, pinend, pval, pbits)) 1289 + return 0; 1290 + 1291 + return 1; 1292 + } 1293 + 1180 1294 /* Huffman code tables, like the rest of the zlib format, are defined 1181 1295 by RFC 1951. We store a Huffman code table as a series of tables 1182 1296 stored sequentially in memory. Each entry in a table is 16 bits. ··· 1211 1325 /* Number of entries we allocate to for one code table. We get a page 1212 1326 for the two code tables we need. */ 1213 1327 1214 - #define HUFFMAN_TABLE_SIZE (1024) 1328 + #define ZLIB_HUFFMAN_TABLE_SIZE (1024) 1215 1329 1216 1330 /* Bit masks and shifts for the values in the table. */ 1217 1331 1218 - #define HUFFMAN_VALUE_MASK 0x01ff 1219 - #define HUFFMAN_BITS_SHIFT 9 1220 - #define HUFFMAN_BITS_MASK 0x7 1221 - #define HUFFMAN_SECONDARY_SHIFT 12 1332 + #define ZLIB_HUFFMAN_VALUE_MASK 0x01ff 1333 + #define ZLIB_HUFFMAN_BITS_SHIFT 9 1334 + #define ZLIB_HUFFMAN_BITS_MASK 0x7 1335 + #define ZLIB_HUFFMAN_SECONDARY_SHIFT 12 1222 1336 1223 1337 /* For working memory while inflating we need two code tables, we need 1224 1338 an array of code lengths (max value 15, so we use unsigned char), ··· 1226 1340 latter two arrays must be large enough to hold the maximum number 1227 1341 of code lengths, which RFC 1951 defines as 286 + 30. */ 1228 1342 1229 - #define ZDEBUG_TABLE_SIZE \ 1230 - (2 * HUFFMAN_TABLE_SIZE * sizeof (uint16_t) \ 1343 + #define ZLIB_TABLE_SIZE \ 1344 + (2 * ZLIB_HUFFMAN_TABLE_SIZE * sizeof (uint16_t) \ 1231 1345 + (286 + 30) * sizeof (uint16_t) \ 1232 1346 + (286 + 30) * sizeof (unsigned char)) 1233 1347 1234 - #define ZDEBUG_TABLE_CODELEN_OFFSET \ 1235 - (2 * HUFFMAN_TABLE_SIZE * sizeof (uint16_t) \ 1348 + #define ZLIB_TABLE_CODELEN_OFFSET \ 1349 + (2 * ZLIB_HUFFMAN_TABLE_SIZE * sizeof (uint16_t) \ 1236 1350 + (286 + 30) * sizeof (uint16_t)) 1237 1351 1238 - #define ZDEBUG_TABLE_WORK_OFFSET \ 1239 - (2 * HUFFMAN_TABLE_SIZE * sizeof (uint16_t)) 1352 + #define ZLIB_TABLE_WORK_OFFSET \ 1353 + (2 * ZLIB_HUFFMAN_TABLE_SIZE * sizeof (uint16_t)) 1240 1354 1241 1355 #ifdef BACKTRACE_GENERATE_FIXED_HUFFMAN_TABLE 1242 1356 ··· 1269 1383 next value after VAL with the same bit length. */ 1270 1384 1271 1385 next = (uint16_t *) (((unsigned char *) zdebug_table) 1272 - + ZDEBUG_TABLE_WORK_OFFSET); 1386 + + ZLIB_TABLE_WORK_OFFSET); 1273 1387 1274 1388 memset (&count[0], 0, 16 * sizeof (uint16_t)); 1275 1389 for (i = 0; i < codes_len; ++i) ··· 1297 1411 /* For each length, fill in the table for the codes of that 1298 1412 length. */ 1299 1413 1300 - memset (table, 0, HUFFMAN_TABLE_SIZE * sizeof (uint16_t)); 1414 + memset (table, 0, ZLIB_HUFFMAN_TABLE_SIZE * sizeof (uint16_t)); 1301 1415 1302 1416 /* Handle the values that do not require a secondary table. */ 1303 1417 ··· 1331 1445 /* In the compressed bit stream, the value VAL is encoded as 1332 1446 J bits with the value C. */ 1333 1447 1334 - if (unlikely ((val & ~HUFFMAN_VALUE_MASK) != 0)) 1448 + if (unlikely ((val & ~ZLIB_HUFFMAN_VALUE_MASK) != 0)) 1335 1449 { 1336 1450 elf_uncompress_failed (); 1337 1451 return 0; 1338 1452 } 1339 1453 1340 - tval = val | ((j - 1) << HUFFMAN_BITS_SHIFT); 1454 + tval = val | ((j - 1) << ZLIB_HUFFMAN_BITS_SHIFT); 1341 1455 1342 1456 /* The table lookup uses 8 bits. If J is less than 8, we 1343 1457 don't know what the other bits will be. We need to fill ··· 1487 1601 { 1488 1602 /* Start a new secondary table. */ 1489 1603 1490 - if (unlikely ((next_secondary & HUFFMAN_VALUE_MASK) 1604 + if (unlikely ((next_secondary & ZLIB_HUFFMAN_VALUE_MASK) 1491 1605 != next_secondary)) 1492 1606 { 1493 1607 elf_uncompress_failed (); ··· 1498 1612 secondary_bits = j - 8; 1499 1613 next_secondary += 1 << secondary_bits; 1500 1614 table[primary] = (secondary 1501 - + ((j - 8) << HUFFMAN_BITS_SHIFT) 1502 - + (1U << HUFFMAN_SECONDARY_SHIFT)); 1615 + + ((j - 8) << ZLIB_HUFFMAN_BITS_SHIFT) 1616 + + (1U << ZLIB_HUFFMAN_SECONDARY_SHIFT)); 1503 1617 } 1504 1618 else 1505 1619 { 1506 1620 /* There is an existing entry. It had better be a 1507 1621 secondary table with enough bits. */ 1508 - if (unlikely ((tprimary & (1U << HUFFMAN_SECONDARY_SHIFT)) 1622 + if (unlikely ((tprimary 1623 + & (1U << ZLIB_HUFFMAN_SECONDARY_SHIFT)) 1509 1624 == 0)) 1510 1625 { 1511 1626 elf_uncompress_failed (); 1512 1627 return 0; 1513 1628 } 1514 - secondary = tprimary & HUFFMAN_VALUE_MASK; 1515 - secondary_bits = ((tprimary >> HUFFMAN_BITS_SHIFT) 1516 - & HUFFMAN_BITS_MASK); 1629 + secondary = tprimary & ZLIB_HUFFMAN_VALUE_MASK; 1630 + secondary_bits = ((tprimary >> ZLIB_HUFFMAN_BITS_SHIFT) 1631 + & ZLIB_HUFFMAN_BITS_MASK); 1517 1632 if (unlikely (secondary_bits < j - 8)) 1518 1633 { 1519 1634 elf_uncompress_failed (); ··· 1524 1639 1525 1640 /* Fill in secondary table entries. */ 1526 1641 1527 - tval = val | ((j - 8) << HUFFMAN_BITS_SHIFT); 1642 + tval = val | ((j - 8) << ZLIB_HUFFMAN_BITS_SHIFT); 1528 1643 1529 1644 for (ind = code >> 8; 1530 1645 ind < (1U << secondary_bits); ··· 1567 1682 1568 1683 #include <stdio.h> 1569 1684 1570 - static uint16_t table[ZDEBUG_TABLE_SIZE]; 1685 + static uint16_t table[ZLIB_TABLE_SIZE]; 1571 1686 static unsigned char codes[288]; 1572 1687 1573 1688 int ··· 1795 1910 const uint16_t *tlit; 1796 1911 const uint16_t *tdist; 1797 1912 1798 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 1913 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 1799 1914 return 0; 1800 1915 1801 1916 last = val & 1; ··· 1883 1998 /* Read a Huffman encoding table. The various magic 1884 1999 numbers here are from RFC 1951. */ 1885 2000 1886 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2001 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 1887 2002 return 0; 1888 2003 1889 2004 nlit = (val & 0x1f) + 257; ··· 1908 2023 /* There are always at least 4 elements in the 1909 2024 table. */ 1910 2025 1911 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2026 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 1912 2027 return 0; 1913 2028 1914 2029 codebits[16] = val & 7; ··· 1928 2043 if (nclen == 5) 1929 2044 goto codebitsdone; 1930 2045 1931 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2046 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 1932 2047 return 0; 1933 2048 1934 2049 codebits[7] = val & 7; ··· 1966 2081 if (nclen == 10) 1967 2082 goto codebitsdone; 1968 2083 1969 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2084 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 1970 2085 return 0; 1971 2086 1972 2087 codebits[11] = val & 7; ··· 2004 2119 if (nclen == 15) 2005 2120 goto codebitsdone; 2006 2121 2007 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2122 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2008 2123 return 0; 2009 2124 2010 2125 codebits[2] = val & 7; ··· 2043 2158 at the end of zdebug_table to hold them. */ 2044 2159 2045 2160 plenbase = (((unsigned char *) zdebug_table) 2046 - + ZDEBUG_TABLE_CODELEN_OFFSET); 2161 + + ZLIB_TABLE_CODELEN_OFFSET); 2047 2162 plen = plenbase; 2048 2163 plenend = plen + nlit + ndist; 2049 2164 while (plen < plenend) ··· 2052 2167 unsigned int b; 2053 2168 uint16_t v; 2054 2169 2055 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2170 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2056 2171 return 0; 2057 2172 2058 2173 t = zdebug_table[val & 0xff]; 2059 2174 2060 2175 /* The compression here uses bit lengths up to 7, so 2061 2176 a secondary table is never necessary. */ 2062 - if (unlikely ((t & (1U << HUFFMAN_SECONDARY_SHIFT)) != 0)) 2177 + if (unlikely ((t & (1U << ZLIB_HUFFMAN_SECONDARY_SHIFT)) 2178 + != 0)) 2063 2179 { 2064 2180 elf_uncompress_failed (); 2065 2181 return 0; 2066 2182 } 2067 2183 2068 - b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK; 2184 + b = (t >> ZLIB_HUFFMAN_BITS_SHIFT) & ZLIB_HUFFMAN_BITS_MASK; 2069 2185 val >>= b + 1; 2070 2186 bits -= b + 1; 2071 2187 2072 - v = t & HUFFMAN_VALUE_MASK; 2188 + v = t & ZLIB_HUFFMAN_VALUE_MASK; 2073 2189 if (v < 16) 2074 2190 *plen++ = v; 2075 2191 else if (v == 16) ··· 2086 2202 } 2087 2203 2088 2204 /* We used up to 7 bits since the last 2089 - elf_zlib_fetch, so we have at least 8 bits 2205 + elf_fetch_bits, so we have at least 8 bits 2090 2206 available here. */ 2091 2207 2092 2208 c = 3 + (val & 0x3); ··· 2121 2237 /* Store zero 3 to 10 times. */ 2122 2238 2123 2239 /* We used up to 7 bits since the last 2124 - elf_zlib_fetch, so we have at least 8 bits 2240 + elf_fetch_bits, so we have at least 8 bits 2125 2241 available here. */ 2126 2242 2127 2243 c = 3 + (val & 0x7); ··· 2167 2283 /* Store zero 11 to 138 times. */ 2168 2284 2169 2285 /* We used up to 7 bits since the last 2170 - elf_zlib_fetch, so we have at least 8 bits 2286 + elf_fetch_bits, so we have at least 8 bits 2171 2287 available here. */ 2172 2288 2173 2289 c = 11 + (val & 0x7f); ··· 2204 2320 zdebug_table)) 2205 2321 return 0; 2206 2322 if (!elf_zlib_inflate_table (plen + nlit, ndist, zdebug_table, 2207 - zdebug_table + HUFFMAN_TABLE_SIZE)) 2323 + (zdebug_table 2324 + + ZLIB_HUFFMAN_TABLE_SIZE))) 2208 2325 return 0; 2209 2326 tlit = zdebug_table; 2210 - tdist = zdebug_table + HUFFMAN_TABLE_SIZE; 2327 + tdist = zdebug_table + ZLIB_HUFFMAN_TABLE_SIZE; 2211 2328 } 2212 2329 2213 2330 /* Inflate values until the end of the block. This is the ··· 2220 2337 uint16_t v; 2221 2338 unsigned int lit; 2222 2339 2223 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2340 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2224 2341 return 0; 2225 2342 2226 2343 t = tlit[val & 0xff]; 2227 - b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK; 2228 - v = t & HUFFMAN_VALUE_MASK; 2344 + b = (t >> ZLIB_HUFFMAN_BITS_SHIFT) & ZLIB_HUFFMAN_BITS_MASK; 2345 + v = t & ZLIB_HUFFMAN_VALUE_MASK; 2229 2346 2230 - if ((t & (1U << HUFFMAN_SECONDARY_SHIFT)) == 0) 2347 + if ((t & (1U << ZLIB_HUFFMAN_SECONDARY_SHIFT)) == 0) 2231 2348 { 2232 2349 lit = v; 2233 2350 val >>= b + 1; ··· 2236 2353 else 2237 2354 { 2238 2355 t = tlit[v + 0x100 + ((val >> 8) & ((1U << b) - 1))]; 2239 - b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK; 2240 - lit = t & HUFFMAN_VALUE_MASK; 2356 + b = (t >> ZLIB_HUFFMAN_BITS_SHIFT) & ZLIB_HUFFMAN_BITS_MASK; 2357 + lit = t & ZLIB_HUFFMAN_VALUE_MASK; 2241 2358 val >>= b + 8; 2242 2359 bits -= b + 8; 2243 2360 } ··· 2282 2399 { 2283 2400 unsigned int extra; 2284 2401 2285 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2402 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2286 2403 return 0; 2287 2404 2288 2405 /* This is an expression for the table of length ··· 2297 2414 bits -= extra; 2298 2415 } 2299 2416 2300 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2417 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2301 2418 return 0; 2302 2419 2303 2420 t = tdist[val & 0xff]; 2304 - b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK; 2305 - v = t & HUFFMAN_VALUE_MASK; 2421 + b = (t >> ZLIB_HUFFMAN_BITS_SHIFT) & ZLIB_HUFFMAN_BITS_MASK; 2422 + v = t & ZLIB_HUFFMAN_VALUE_MASK; 2306 2423 2307 - if ((t & (1U << HUFFMAN_SECONDARY_SHIFT)) == 0) 2424 + if ((t & (1U << ZLIB_HUFFMAN_SECONDARY_SHIFT)) == 0) 2308 2425 { 2309 2426 dist = v; 2310 2427 val >>= b + 1; ··· 2313 2430 else 2314 2431 { 2315 2432 t = tdist[v + 0x100 + ((val >> 8) & ((1U << b) - 1))]; 2316 - b = (t >> HUFFMAN_BITS_SHIFT) & HUFFMAN_BITS_MASK; 2317 - dist = t & HUFFMAN_VALUE_MASK; 2433 + b = ((t >> ZLIB_HUFFMAN_BITS_SHIFT) 2434 + & ZLIB_HUFFMAN_BITS_MASK); 2435 + dist = t & ZLIB_HUFFMAN_VALUE_MASK; 2318 2436 val >>= b + 8; 2319 2437 bits -= b + 8; 2320 2438 } ··· 2354 2472 { 2355 2473 unsigned int extra; 2356 2474 2357 - if (!elf_zlib_fetch (&pin, pinend, &val, &bits)) 2475 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2358 2476 return 0; 2359 2477 2360 2478 /* This is an expression for the table of ··· 2559 2677 return 1; 2560 2678 } 2561 2679 2680 + /* For working memory during zstd compression, we need 2681 + - a literal length FSE table: 512 64-bit values == 4096 bytes 2682 + - a match length FSE table: 512 64-bit values == 4096 bytes 2683 + - a offset FSE table: 256 64-bit values == 2048 bytes 2684 + - a Huffman tree: 2048 uint16_t values == 4096 bytes 2685 + - scratch space, one of 2686 + - to build an FSE table: 512 uint16_t values == 1024 bytes 2687 + - to build a Huffman tree: 512 uint16_t + 256 uint32_t == 2048 bytes 2688 + */ 2689 + 2690 + #define ZSTD_TABLE_SIZE \ 2691 + (2 * 512 * sizeof (struct elf_zstd_fse_baseline_entry) \ 2692 + + 256 * sizeof (struct elf_zstd_fse_baseline_entry) \ 2693 + + 2048 * sizeof (uint16_t) \ 2694 + + 512 * sizeof (uint16_t) + 256 * sizeof (uint32_t)) 2695 + 2696 + #define ZSTD_TABLE_LITERAL_FSE_OFFSET (0) 2697 + 2698 + #define ZSTD_TABLE_MATCH_FSE_OFFSET \ 2699 + (512 * sizeof (struct elf_zstd_fse_baseline_entry)) 2700 + 2701 + #define ZSTD_TABLE_OFFSET_FSE_OFFSET \ 2702 + (ZSTD_TABLE_MATCH_FSE_OFFSET \ 2703 + + 512 * sizeof (struct elf_zstd_fse_baseline_entry)) 2704 + 2705 + #define ZSTD_TABLE_HUFFMAN_OFFSET \ 2706 + (ZSTD_TABLE_OFFSET_FSE_OFFSET \ 2707 + + 256 * sizeof (struct elf_zstd_fse_baseline_entry)) 2708 + 2709 + #define ZSTD_TABLE_WORK_OFFSET \ 2710 + (ZSTD_TABLE_HUFFMAN_OFFSET + 2048 * sizeof (uint16_t)) 2711 + 2712 + /* An entry in a zstd FSE table. */ 2713 + 2714 + struct elf_zstd_fse_entry 2715 + { 2716 + /* The value that this FSE entry represents. */ 2717 + unsigned char symbol; 2718 + /* The number of bits to read to determine the next state. */ 2719 + unsigned char bits; 2720 + /* Add the bits to this base to get the next state. */ 2721 + uint16_t base; 2722 + }; 2723 + 2724 + static int 2725 + elf_zstd_build_fse (const int16_t *, int, uint16_t *, int, 2726 + struct elf_zstd_fse_entry *); 2727 + 2728 + /* Read a zstd FSE table and build the decoding table in *TABLE, updating *PPIN 2729 + as it reads. ZDEBUG_TABLE is scratch space; it must be enough for 512 2730 + uint16_t values (1024 bytes). MAXIDX is the maximum number of symbols 2731 + permitted. *TABLE_BITS is the maximum number of bits for symbols in the 2732 + table: the size of *TABLE is at least 1 << *TABLE_BITS. This updates 2733 + *TABLE_BITS to the actual number of bits. Returns 1 on success, 0 on 2734 + error. */ 2735 + 2736 + static int 2737 + elf_zstd_read_fse (const unsigned char **ppin, const unsigned char *pinend, 2738 + uint16_t *zdebug_table, int maxidx, 2739 + struct elf_zstd_fse_entry *table, int *table_bits) 2740 + { 2741 + const unsigned char *pin; 2742 + int16_t *norm; 2743 + uint16_t *next; 2744 + uint64_t val; 2745 + unsigned int bits; 2746 + int accuracy_log; 2747 + uint32_t remaining; 2748 + uint32_t threshold; 2749 + int bits_needed; 2750 + int idx; 2751 + int prev0; 2752 + 2753 + pin = *ppin; 2754 + 2755 + norm = (int16_t *) zdebug_table; 2756 + next = zdebug_table + 256; 2757 + 2758 + if (unlikely (pin + 3 >= pinend)) 2759 + { 2760 + elf_uncompress_failed (); 2761 + return 0; 2762 + } 2763 + 2764 + /* Align PIN to a 32-bit boundary. */ 2765 + 2766 + val = 0; 2767 + bits = 0; 2768 + while ((((uintptr_t) pin) & 3) != 0) 2769 + { 2770 + val |= (uint64_t)*pin << bits; 2771 + bits += 8; 2772 + ++pin; 2773 + } 2774 + 2775 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2776 + return 0; 2777 + 2778 + accuracy_log = (val & 0xf) + 5; 2779 + if (accuracy_log > *table_bits) 2780 + { 2781 + elf_uncompress_failed (); 2782 + return 0; 2783 + } 2784 + *table_bits = accuracy_log; 2785 + val >>= 4; 2786 + bits -= 4; 2787 + 2788 + /* This code is mostly copied from the reference implementation. */ 2789 + 2790 + /* The number of remaining probabilities, plus 1. This sets the number of 2791 + bits that need to be read for the next value. */ 2792 + remaining = (1 << accuracy_log) + 1; 2793 + 2794 + /* The current difference between small and large values, which depends on 2795 + the number of remaining values. Small values use one less bit. */ 2796 + threshold = 1 << accuracy_log; 2797 + 2798 + /* The number of bits used to compute threshold. */ 2799 + bits_needed = accuracy_log + 1; 2800 + 2801 + /* The next character value. */ 2802 + idx = 0; 2803 + 2804 + /* Whether the last count was 0. */ 2805 + prev0 = 0; 2806 + 2807 + while (remaining > 1 && idx <= maxidx) 2808 + { 2809 + uint32_t max; 2810 + int32_t count; 2811 + 2812 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2813 + return 0; 2814 + 2815 + if (prev0) 2816 + { 2817 + int zidx; 2818 + 2819 + /* Previous count was 0, so there is a 2-bit repeat flag. If the 2820 + 2-bit flag is 0b11, it adds 3 and then there is another repeat 2821 + flag. */ 2822 + zidx = idx; 2823 + while ((val & 0xfff) == 0xfff) 2824 + { 2825 + zidx += 3 * 6; 2826 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2827 + return 0; 2828 + val >>= 12; 2829 + bits -= 12; 2830 + } 2831 + while ((val & 3) == 3) 2832 + { 2833 + zidx += 3; 2834 + if (!elf_fetch_bits (&pin, pinend, &val, &bits)) 2835 + return 0; 2836 + val >>= 2; 2837 + bits -= 2; 2838 + } 2839 + /* We have at least 13 bits here, don't need to fetch. */ 2840 + zidx += val & 3; 2841 + val >>= 2; 2842 + bits -= 2; 2843 + 2844 + if (unlikely (zidx > maxidx)) 2845 + { 2846 + elf_uncompress_failed (); 2847 + return 0; 2848 + } 2849 + 2850 + for (; idx < zidx; idx++) 2851 + norm[idx] = 0; 2852 + 2853 + prev0 = 0; 2854 + continue; 2855 + } 2856 + 2857 + max = (2 * threshold - 1) - remaining; 2858 + if ((val & (threshold - 1)) < max) 2859 + { 2860 + /* A small value. */ 2861 + count = (int32_t) ((uint32_t) val & (threshold - 1)); 2862 + val >>= bits_needed - 1; 2863 + bits -= bits_needed - 1; 2864 + } 2865 + else 2866 + { 2867 + /* A large value. */ 2868 + count = (int32_t) ((uint32_t) val & (2 * threshold - 1)); 2869 + if (count >= (int32_t) threshold) 2870 + count -= (int32_t) max; 2871 + val >>= bits_needed; 2872 + bits -= bits_needed; 2873 + } 2874 + 2875 + count--; 2876 + if (count >= 0) 2877 + remaining -= count; 2878 + else 2879 + remaining--; 2880 + if (unlikely (idx >= 256)) 2881 + { 2882 + elf_uncompress_failed (); 2883 + return 0; 2884 + } 2885 + norm[idx] = (int16_t) count; 2886 + ++idx; 2887 + 2888 + prev0 = count == 0; 2889 + 2890 + while (remaining < threshold) 2891 + { 2892 + bits_needed--; 2893 + threshold >>= 1; 2894 + } 2895 + } 2896 + 2897 + if (unlikely (remaining != 1)) 2898 + { 2899 + elf_uncompress_failed (); 2900 + return 0; 2901 + } 2902 + 2903 + /* If we've read ahead more than a byte, back up. */ 2904 + while (bits >= 8) 2905 + { 2906 + --pin; 2907 + bits -= 8; 2908 + } 2909 + 2910 + *ppin = pin; 2911 + 2912 + for (; idx <= maxidx; idx++) 2913 + norm[idx] = 0; 2914 + 2915 + return elf_zstd_build_fse (norm, idx, next, *table_bits, table); 2916 + } 2917 + 2918 + /* Build the FSE decoding table from a list of probabilities. This reads from 2919 + NORM of length IDX, uses NEXT as scratch space, and writes to *TABLE, whose 2920 + size is TABLE_BITS. */ 2921 + 2922 + static int 2923 + elf_zstd_build_fse (const int16_t *norm, int idx, uint16_t *next, 2924 + int table_bits, struct elf_zstd_fse_entry *table) 2925 + { 2926 + int table_size; 2927 + int high_threshold; 2928 + int i; 2929 + int pos; 2930 + int step; 2931 + int mask; 2932 + 2933 + table_size = 1 << table_bits; 2934 + high_threshold = table_size - 1; 2935 + for (i = 0; i < idx; i++) 2936 + { 2937 + int16_t n; 2938 + 2939 + n = norm[i]; 2940 + if (n >= 0) 2941 + next[i] = (uint16_t) n; 2942 + else 2943 + { 2944 + table[high_threshold].symbol = (unsigned char) i; 2945 + high_threshold--; 2946 + next[i] = 1; 2947 + } 2948 + } 2949 + 2950 + pos = 0; 2951 + step = (table_size >> 1) + (table_size >> 3) + 3; 2952 + mask = table_size - 1; 2953 + for (i = 0; i < idx; i++) 2954 + { 2955 + int n; 2956 + int j; 2957 + 2958 + n = (int) norm[i]; 2959 + for (j = 0; j < n; j++) 2960 + { 2961 + table[pos].symbol = (unsigned char) i; 2962 + pos = (pos + step) & mask; 2963 + while (unlikely (pos > high_threshold)) 2964 + pos = (pos + step) & mask; 2965 + } 2966 + } 2967 + if (pos != 0) 2968 + { 2969 + elf_uncompress_failed (); 2970 + return 0; 2971 + } 2972 + 2973 + for (i = 0; i < table_size; i++) 2974 + { 2975 + unsigned char sym; 2976 + uint16_t next_state; 2977 + int high_bit; 2978 + int bits; 2979 + 2980 + sym = table[i].symbol; 2981 + next_state = next[sym]; 2982 + ++next[sym]; 2983 + 2984 + if (next_state == 0) 2985 + { 2986 + elf_uncompress_failed (); 2987 + return 0; 2988 + } 2989 + high_bit = 31 - __builtin_clz (next_state); 2990 + 2991 + bits = table_bits - high_bit; 2992 + table[i].bits = (unsigned char) bits; 2993 + table[i].base = (uint16_t) ((next_state << bits) - table_size); 2994 + } 2995 + 2996 + return 1; 2997 + } 2998 + 2999 + /* Encode the baseline and bits into a single 32-bit value. */ 3000 + 3001 + #define ZSTD_ENCODE_BASELINE_BITS(baseline, basebits) \ 3002 + ((uint32_t)(baseline) | ((uint32_t)(basebits) << 24)) 3003 + 3004 + #define ZSTD_DECODE_BASELINE(baseline_basebits) \ 3005 + ((uint32_t)(baseline_basebits) & 0xffffff) 3006 + 3007 + #define ZSTD_DECODE_BASEBITS(baseline_basebits) \ 3008 + ((uint32_t)(baseline_basebits) >> 24) 3009 + 3010 + /* Given a literal length code, we need to read a number of bits and add that 3011 + to a baseline. For states 0 to 15 the baseline is the state and the number 3012 + of bits is zero. */ 3013 + 3014 + #define ZSTD_LITERAL_LENGTH_BASELINE_OFFSET (16) 3015 + 3016 + static const uint32_t elf_zstd_literal_length_base[] = 3017 + { 3018 + ZSTD_ENCODE_BASELINE_BITS(16, 1), 3019 + ZSTD_ENCODE_BASELINE_BITS(18, 1), 3020 + ZSTD_ENCODE_BASELINE_BITS(20, 1), 3021 + ZSTD_ENCODE_BASELINE_BITS(22, 1), 3022 + ZSTD_ENCODE_BASELINE_BITS(24, 2), 3023 + ZSTD_ENCODE_BASELINE_BITS(28, 2), 3024 + ZSTD_ENCODE_BASELINE_BITS(32, 3), 3025 + ZSTD_ENCODE_BASELINE_BITS(40, 3), 3026 + ZSTD_ENCODE_BASELINE_BITS(48, 4), 3027 + ZSTD_ENCODE_BASELINE_BITS(64, 6), 3028 + ZSTD_ENCODE_BASELINE_BITS(128, 7), 3029 + ZSTD_ENCODE_BASELINE_BITS(256, 8), 3030 + ZSTD_ENCODE_BASELINE_BITS(512, 9), 3031 + ZSTD_ENCODE_BASELINE_BITS(1024, 10), 3032 + ZSTD_ENCODE_BASELINE_BITS(2048, 11), 3033 + ZSTD_ENCODE_BASELINE_BITS(4096, 12), 3034 + ZSTD_ENCODE_BASELINE_BITS(8192, 13), 3035 + ZSTD_ENCODE_BASELINE_BITS(16384, 14), 3036 + ZSTD_ENCODE_BASELINE_BITS(32768, 15), 3037 + ZSTD_ENCODE_BASELINE_BITS(65536, 16) 3038 + }; 3039 + 3040 + /* The same applies to match length codes. For states 0 to 31 the baseline is 3041 + the state + 3 and the number of bits is zero. */ 3042 + 3043 + #define ZSTD_MATCH_LENGTH_BASELINE_OFFSET (32) 3044 + 3045 + static const uint32_t elf_zstd_match_length_base[] = 3046 + { 3047 + ZSTD_ENCODE_BASELINE_BITS(35, 1), 3048 + ZSTD_ENCODE_BASELINE_BITS(37, 1), 3049 + ZSTD_ENCODE_BASELINE_BITS(39, 1), 3050 + ZSTD_ENCODE_BASELINE_BITS(41, 1), 3051 + ZSTD_ENCODE_BASELINE_BITS(43, 2), 3052 + ZSTD_ENCODE_BASELINE_BITS(47, 2), 3053 + ZSTD_ENCODE_BASELINE_BITS(51, 3), 3054 + ZSTD_ENCODE_BASELINE_BITS(59, 3), 3055 + ZSTD_ENCODE_BASELINE_BITS(67, 4), 3056 + ZSTD_ENCODE_BASELINE_BITS(83, 4), 3057 + ZSTD_ENCODE_BASELINE_BITS(99, 5), 3058 + ZSTD_ENCODE_BASELINE_BITS(131, 7), 3059 + ZSTD_ENCODE_BASELINE_BITS(259, 8), 3060 + ZSTD_ENCODE_BASELINE_BITS(515, 9), 3061 + ZSTD_ENCODE_BASELINE_BITS(1027, 10), 3062 + ZSTD_ENCODE_BASELINE_BITS(2051, 11), 3063 + ZSTD_ENCODE_BASELINE_BITS(4099, 12), 3064 + ZSTD_ENCODE_BASELINE_BITS(8195, 13), 3065 + ZSTD_ENCODE_BASELINE_BITS(16387, 14), 3066 + ZSTD_ENCODE_BASELINE_BITS(32771, 15), 3067 + ZSTD_ENCODE_BASELINE_BITS(65539, 16) 3068 + }; 3069 + 3070 + /* An entry in an FSE table used for literal/match/length values. For these we 3071 + have to map the symbol to a baseline value, and we have to read zero or more 3072 + bits and add that value to the baseline value. Rather than look the values 3073 + up in a separate table, we grow the FSE table so that we get better memory 3074 + caching. */ 3075 + 3076 + struct elf_zstd_fse_baseline_entry 3077 + { 3078 + /* The baseline for the value that this FSE entry represents.. */ 3079 + uint32_t baseline; 3080 + /* The number of bits to read to add to the baseline. */ 3081 + unsigned char basebits; 3082 + /* The number of bits to read to determine the next state. */ 3083 + unsigned char bits; 3084 + /* Add the bits to this base to get the next state. */ 3085 + uint16_t base; 3086 + }; 3087 + 3088 + /* Convert the literal length FSE table FSE_TABLE to an FSE baseline table at 3089 + BASELINE_TABLE. Note that FSE_TABLE and BASELINE_TABLE will overlap. */ 3090 + 3091 + static int 3092 + elf_zstd_make_literal_baseline_fse ( 3093 + const struct elf_zstd_fse_entry *fse_table, 3094 + int table_bits, 3095 + struct elf_zstd_fse_baseline_entry *baseline_table) 3096 + { 3097 + size_t count; 3098 + const struct elf_zstd_fse_entry *pfse; 3099 + struct elf_zstd_fse_baseline_entry *pbaseline; 3100 + 3101 + /* Convert backward to avoid overlap. */ 3102 + 3103 + count = 1U << table_bits; 3104 + pfse = fse_table + count; 3105 + pbaseline = baseline_table + count; 3106 + while (pfse > fse_table) 3107 + { 3108 + unsigned char symbol; 3109 + unsigned char bits; 3110 + uint16_t base; 3111 + 3112 + --pfse; 3113 + --pbaseline; 3114 + symbol = pfse->symbol; 3115 + bits = pfse->bits; 3116 + base = pfse->base; 3117 + if (symbol < ZSTD_LITERAL_LENGTH_BASELINE_OFFSET) 3118 + { 3119 + pbaseline->baseline = (uint32_t)symbol; 3120 + pbaseline->basebits = 0; 3121 + } 3122 + else 3123 + { 3124 + unsigned int idx; 3125 + uint32_t basebits; 3126 + 3127 + if (unlikely (symbol > 35)) 3128 + { 3129 + elf_uncompress_failed (); 3130 + return 0; 3131 + } 3132 + idx = symbol - ZSTD_LITERAL_LENGTH_BASELINE_OFFSET; 3133 + basebits = elf_zstd_literal_length_base[idx]; 3134 + pbaseline->baseline = ZSTD_DECODE_BASELINE(basebits); 3135 + pbaseline->basebits = ZSTD_DECODE_BASEBITS(basebits); 3136 + } 3137 + pbaseline->bits = bits; 3138 + pbaseline->base = base; 3139 + } 3140 + 3141 + return 1; 3142 + } 3143 + 3144 + /* Convert the offset length FSE table FSE_TABLE to an FSE baseline table at 3145 + BASELINE_TABLE. Note that FSE_TABLE and BASELINE_TABLE will overlap. */ 3146 + 3147 + static int 3148 + elf_zstd_make_offset_baseline_fse ( 3149 + const struct elf_zstd_fse_entry *fse_table, 3150 + int table_bits, 3151 + struct elf_zstd_fse_baseline_entry *baseline_table) 3152 + { 3153 + size_t count; 3154 + const struct elf_zstd_fse_entry *pfse; 3155 + struct elf_zstd_fse_baseline_entry *pbaseline; 3156 + 3157 + /* Convert backward to avoid overlap. */ 3158 + 3159 + count = 1U << table_bits; 3160 + pfse = fse_table + count; 3161 + pbaseline = baseline_table + count; 3162 + while (pfse > fse_table) 3163 + { 3164 + unsigned char symbol; 3165 + unsigned char bits; 3166 + uint16_t base; 3167 + 3168 + --pfse; 3169 + --pbaseline; 3170 + symbol = pfse->symbol; 3171 + bits = pfse->bits; 3172 + base = pfse->base; 3173 + if (unlikely (symbol > 31)) 3174 + { 3175 + elf_uncompress_failed (); 3176 + return 0; 3177 + } 3178 + 3179 + /* The simple way to write this is 3180 + 3181 + pbaseline->baseline = (uint32_t)1 << symbol; 3182 + pbaseline->basebits = symbol; 3183 + 3184 + That will give us an offset value that corresponds to the one 3185 + described in the RFC. However, for offset values > 3, we have to 3186 + subtract 3. And for offset values 1, 2, 3 we use a repeated offset. 3187 + The baseline is always a power of 2, and is never 0, so for these low 3188 + values we will see one entry that is baseline 1, basebits 0, and one 3189 + entry that is baseline 2, basebits 1. All other entries will have 3190 + baseline >= 4 and basebits >= 2. 3191 + 3192 + So we can check for RFC offset <= 3 by checking for basebits <= 1. 3193 + And that means that we can subtract 3 here and not worry about doing 3194 + it in the hot loop. */ 3195 + 3196 + pbaseline->baseline = (uint32_t)1 << symbol; 3197 + if (symbol >= 2) 3198 + pbaseline->baseline -= 3; 3199 + pbaseline->basebits = symbol; 3200 + pbaseline->bits = bits; 3201 + pbaseline->base = base; 3202 + } 3203 + 3204 + return 1; 3205 + } 3206 + 3207 + /* Convert the match length FSE table FSE_TABLE to an FSE baseline table at 3208 + BASELINE_TABLE. Note that FSE_TABLE and BASELINE_TABLE will overlap. */ 3209 + 3210 + static int 3211 + elf_zstd_make_match_baseline_fse ( 3212 + const struct elf_zstd_fse_entry *fse_table, 3213 + int table_bits, 3214 + struct elf_zstd_fse_baseline_entry *baseline_table) 3215 + { 3216 + size_t count; 3217 + const struct elf_zstd_fse_entry *pfse; 3218 + struct elf_zstd_fse_baseline_entry *pbaseline; 3219 + 3220 + /* Convert backward to avoid overlap. */ 3221 + 3222 + count = 1U << table_bits; 3223 + pfse = fse_table + count; 3224 + pbaseline = baseline_table + count; 3225 + while (pfse > fse_table) 3226 + { 3227 + unsigned char symbol; 3228 + unsigned char bits; 3229 + uint16_t base; 3230 + 3231 + --pfse; 3232 + --pbaseline; 3233 + symbol = pfse->symbol; 3234 + bits = pfse->bits; 3235 + base = pfse->base; 3236 + if (symbol < ZSTD_MATCH_LENGTH_BASELINE_OFFSET) 3237 + { 3238 + pbaseline->baseline = (uint32_t)symbol + 3; 3239 + pbaseline->basebits = 0; 3240 + } 3241 + else 3242 + { 3243 + unsigned int idx; 3244 + uint32_t basebits; 3245 + 3246 + if (unlikely (symbol > 52)) 3247 + { 3248 + elf_uncompress_failed (); 3249 + return 0; 3250 + } 3251 + idx = symbol - ZSTD_MATCH_LENGTH_BASELINE_OFFSET; 3252 + basebits = elf_zstd_match_length_base[idx]; 3253 + pbaseline->baseline = ZSTD_DECODE_BASELINE(basebits); 3254 + pbaseline->basebits = ZSTD_DECODE_BASEBITS(basebits); 3255 + } 3256 + pbaseline->bits = bits; 3257 + pbaseline->base = base; 3258 + } 3259 + 3260 + return 1; 3261 + } 3262 + 3263 + #ifdef BACKTRACE_GENERATE_ZSTD_FSE_TABLES 3264 + 3265 + /* Used to generate the predefined FSE decoding tables for zstd. */ 3266 + 3267 + #include <stdio.h> 3268 + 3269 + /* These values are straight from RFC 8878. */ 3270 + 3271 + static int16_t lit[36] = 3272 + { 3273 + 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3274 + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, 3275 + -1,-1,-1,-1 3276 + }; 3277 + 3278 + static int16_t match[53] = 3279 + { 3280 + 1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3281 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3282 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,-1,-1, 3283 + -1,-1,-1,-1,-1 3284 + }; 3285 + 3286 + static int16_t offset[29] = 3287 + { 3288 + 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3289 + 1, 1, 1, 1, 1, 1, 1, 1,-1,-1,-1,-1,-1 3290 + }; 3291 + 3292 + static uint16_t next[256]; 3293 + 3294 + static void 3295 + print_table (const struct elf_zstd_fse_baseline_entry *table, size_t size) 3296 + { 3297 + size_t i; 3298 + 3299 + printf ("{\n"); 3300 + for (i = 0; i < size; i += 3) 3301 + { 3302 + int j; 3303 + 3304 + printf (" "); 3305 + for (j = 0; j < 3 && i + j < size; ++j) 3306 + printf (" { %u, %d, %d, %d },", table[i + j].baseline, 3307 + table[i + j].basebits, table[i + j].bits, 3308 + table[i + j].base); 3309 + printf ("\n"); 3310 + } 3311 + printf ("};\n"); 3312 + } 3313 + 3314 + int 3315 + main () 3316 + { 3317 + struct elf_zstd_fse_entry lit_table[64]; 3318 + struct elf_zstd_fse_baseline_entry lit_baseline[64]; 3319 + struct elf_zstd_fse_entry match_table[64]; 3320 + struct elf_zstd_fse_baseline_entry match_baseline[64]; 3321 + struct elf_zstd_fse_entry offset_table[32]; 3322 + struct elf_zstd_fse_baseline_entry offset_baseline[32]; 3323 + 3324 + if (!elf_zstd_build_fse (lit, sizeof lit / sizeof lit[0], next, 3325 + 6, lit_table)) 3326 + { 3327 + fprintf (stderr, "elf_zstd_build_fse failed\n"); 3328 + exit (EXIT_FAILURE); 3329 + } 3330 + 3331 + if (!elf_zstd_make_literal_baseline_fse (lit_table, 6, lit_baseline)) 3332 + { 3333 + fprintf (stderr, "elf_zstd_make_literal_baseline_fse failed\n"); 3334 + exit (EXIT_FAILURE); 3335 + } 3336 + 3337 + printf ("static const struct elf_zstd_fse_baseline_entry " 3338 + "elf_zstd_lit_table[64] =\n"); 3339 + print_table (lit_baseline, 3340 + sizeof lit_baseline / sizeof lit_baseline[0]); 3341 + printf ("\n"); 3342 + 3343 + if (!elf_zstd_build_fse (match, sizeof match / sizeof match[0], next, 3344 + 6, match_table)) 3345 + { 3346 + fprintf (stderr, "elf_zstd_build_fse failed\n"); 3347 + exit (EXIT_FAILURE); 3348 + } 3349 + 3350 + if (!elf_zstd_make_match_baseline_fse (match_table, 6, match_baseline)) 3351 + { 3352 + fprintf (stderr, "elf_zstd_make_match_baseline_fse failed\n"); 3353 + exit (EXIT_FAILURE); 3354 + } 3355 + 3356 + printf ("static const struct elf_zstd_fse_baseline_entry " 3357 + "elf_zstd_match_table[64] =\n"); 3358 + print_table (match_baseline, 3359 + sizeof match_baseline / sizeof match_baseline[0]); 3360 + printf ("\n"); 3361 + 3362 + if (!elf_zstd_build_fse (offset, sizeof offset / sizeof offset[0], next, 3363 + 5, offset_table)) 3364 + { 3365 + fprintf (stderr, "elf_zstd_build_fse failed\n"); 3366 + exit (EXIT_FAILURE); 3367 + } 3368 + 3369 + if (!elf_zstd_make_offset_baseline_fse (offset_table, 5, offset_baseline)) 3370 + { 3371 + fprintf (stderr, "elf_zstd_make_offset_baseline_fse failed\n"); 3372 + exit (EXIT_FAILURE); 3373 + } 3374 + 3375 + printf ("static const struct elf_zstd_fse_baseline_entry " 3376 + "elf_zstd_offset_table[32] =\n"); 3377 + print_table (offset_baseline, 3378 + sizeof offset_baseline / sizeof offset_baseline[0]); 3379 + printf ("\n"); 3380 + 3381 + return 0; 3382 + } 3383 + 3384 + #endif 3385 + 3386 + /* The fixed tables generated by the #ifdef'ed out main function 3387 + above. */ 3388 + 3389 + static const struct elf_zstd_fse_baseline_entry elf_zstd_lit_table[64] = 3390 + { 3391 + { 0, 0, 4, 0 }, { 0, 0, 4, 16 }, { 1, 0, 5, 32 }, 3392 + { 3, 0, 5, 0 }, { 4, 0, 5, 0 }, { 6, 0, 5, 0 }, 3393 + { 7, 0, 5, 0 }, { 9, 0, 5, 0 }, { 10, 0, 5, 0 }, 3394 + { 12, 0, 5, 0 }, { 14, 0, 6, 0 }, { 16, 1, 5, 0 }, 3395 + { 20, 1, 5, 0 }, { 22, 1, 5, 0 }, { 28, 2, 5, 0 }, 3396 + { 32, 3, 5, 0 }, { 48, 4, 5, 0 }, { 64, 6, 5, 32 }, 3397 + { 128, 7, 5, 0 }, { 256, 8, 6, 0 }, { 1024, 10, 6, 0 }, 3398 + { 4096, 12, 6, 0 }, { 0, 0, 4, 32 }, { 1, 0, 4, 0 }, 3399 + { 2, 0, 5, 0 }, { 4, 0, 5, 32 }, { 5, 0, 5, 0 }, 3400 + { 7, 0, 5, 32 }, { 8, 0, 5, 0 }, { 10, 0, 5, 32 }, 3401 + { 11, 0, 5, 0 }, { 13, 0, 6, 0 }, { 16, 1, 5, 32 }, 3402 + { 18, 1, 5, 0 }, { 22, 1, 5, 32 }, { 24, 2, 5, 0 }, 3403 + { 32, 3, 5, 32 }, { 40, 3, 5, 0 }, { 64, 6, 4, 0 }, 3404 + { 64, 6, 4, 16 }, { 128, 7, 5, 32 }, { 512, 9, 6, 0 }, 3405 + { 2048, 11, 6, 0 }, { 0, 0, 4, 48 }, { 1, 0, 4, 16 }, 3406 + { 2, 0, 5, 32 }, { 3, 0, 5, 32 }, { 5, 0, 5, 32 }, 3407 + { 6, 0, 5, 32 }, { 8, 0, 5, 32 }, { 9, 0, 5, 32 }, 3408 + { 11, 0, 5, 32 }, { 12, 0, 5, 32 }, { 15, 0, 6, 0 }, 3409 + { 18, 1, 5, 32 }, { 20, 1, 5, 32 }, { 24, 2, 5, 32 }, 3410 + { 28, 2, 5, 32 }, { 40, 3, 5, 32 }, { 48, 4, 5, 32 }, 3411 + { 65536, 16, 6, 0 }, { 32768, 15, 6, 0 }, { 16384, 14, 6, 0 }, 3412 + { 8192, 13, 6, 0 }, 3413 + }; 3414 + 3415 + static const struct elf_zstd_fse_baseline_entry elf_zstd_match_table[64] = 3416 + { 3417 + { 3, 0, 6, 0 }, { 4, 0, 4, 0 }, { 5, 0, 5, 32 }, 3418 + { 6, 0, 5, 0 }, { 8, 0, 5, 0 }, { 9, 0, 5, 0 }, 3419 + { 11, 0, 5, 0 }, { 13, 0, 6, 0 }, { 16, 0, 6, 0 }, 3420 + { 19, 0, 6, 0 }, { 22, 0, 6, 0 }, { 25, 0, 6, 0 }, 3421 + { 28, 0, 6, 0 }, { 31, 0, 6, 0 }, { 34, 0, 6, 0 }, 3422 + { 37, 1, 6, 0 }, { 41, 1, 6, 0 }, { 47, 2, 6, 0 }, 3423 + { 59, 3, 6, 0 }, { 83, 4, 6, 0 }, { 131, 7, 6, 0 }, 3424 + { 515, 9, 6, 0 }, { 4, 0, 4, 16 }, { 5, 0, 4, 0 }, 3425 + { 6, 0, 5, 32 }, { 7, 0, 5, 0 }, { 9, 0, 5, 32 }, 3426 + { 10, 0, 5, 0 }, { 12, 0, 6, 0 }, { 15, 0, 6, 0 }, 3427 + { 18, 0, 6, 0 }, { 21, 0, 6, 0 }, { 24, 0, 6, 0 }, 3428 + { 27, 0, 6, 0 }, { 30, 0, 6, 0 }, { 33, 0, 6, 0 }, 3429 + { 35, 1, 6, 0 }, { 39, 1, 6, 0 }, { 43, 2, 6, 0 }, 3430 + { 51, 3, 6, 0 }, { 67, 4, 6, 0 }, { 99, 5, 6, 0 }, 3431 + { 259, 8, 6, 0 }, { 4, 0, 4, 32 }, { 4, 0, 4, 48 }, 3432 + { 5, 0, 4, 16 }, { 7, 0, 5, 32 }, { 8, 0, 5, 32 }, 3433 + { 10, 0, 5, 32 }, { 11, 0, 5, 32 }, { 14, 0, 6, 0 }, 3434 + { 17, 0, 6, 0 }, { 20, 0, 6, 0 }, { 23, 0, 6, 0 }, 3435 + { 26, 0, 6, 0 }, { 29, 0, 6, 0 }, { 32, 0, 6, 0 }, 3436 + { 65539, 16, 6, 0 }, { 32771, 15, 6, 0 }, { 16387, 14, 6, 0 }, 3437 + { 8195, 13, 6, 0 }, { 4099, 12, 6, 0 }, { 2051, 11, 6, 0 }, 3438 + { 1027, 10, 6, 0 }, 3439 + }; 3440 + 3441 + static const struct elf_zstd_fse_baseline_entry elf_zstd_offset_table[32] = 3442 + { 3443 + { 1, 0, 5, 0 }, { 64, 6, 4, 0 }, { 512, 9, 5, 0 }, 3444 + { 32768, 15, 5, 0 }, { 2097152, 21, 5, 0 }, { 8, 3, 5, 0 }, 3445 + { 128, 7, 4, 0 }, { 4096, 12, 5, 0 }, { 262144, 18, 5, 0 }, 3446 + { 8388608, 23, 5, 0 }, { 32, 5, 5, 0 }, { 256, 8, 4, 0 }, 3447 + { 16384, 14, 5, 0 }, { 1048576, 20, 5, 0 }, { 4, 2, 5, 0 }, 3448 + { 128, 7, 4, 16 }, { 2048, 11, 5, 0 }, { 131072, 17, 5, 0 }, 3449 + { 4194304, 22, 5, 0 }, { 16, 4, 5, 0 }, { 256, 8, 4, 16 }, 3450 + { 8192, 13, 5, 0 }, { 524288, 19, 5, 0 }, { 2, 1, 5, 0 }, 3451 + { 64, 6, 4, 16 }, { 1024, 10, 5, 0 }, { 65536, 16, 5, 0 }, 3452 + { 268435456, 28, 5, 0 }, { 134217728, 27, 5, 0 }, { 67108864, 26, 5, 0 }, 3453 + { 33554432, 25, 5, 0 }, { 16777216, 24, 5, 0 }, 3454 + }; 3455 + 3456 + /* Read a zstd Huffman table and build the decoding table in *TABLE, reading 3457 + and updating *PPIN. This sets *PTABLE_BITS to the number of bits of the 3458 + table, such that the table length is 1 << *TABLE_BITS. ZDEBUG_TABLE is 3459 + scratch space; it must be enough for 512 uint16_t values + 256 32-bit values 3460 + (2048 bytes). Returns 1 on success, 0 on error. */ 3461 + 3462 + static int 3463 + elf_zstd_read_huff (const unsigned char **ppin, const unsigned char *pinend, 3464 + uint16_t *zdebug_table, uint16_t *table, int *ptable_bits) 3465 + { 3466 + const unsigned char *pin; 3467 + unsigned char hdr; 3468 + unsigned char *weights; 3469 + size_t count; 3470 + uint32_t *weight_mark; 3471 + size_t i; 3472 + uint32_t weight_mask; 3473 + size_t table_bits; 3474 + 3475 + pin = *ppin; 3476 + if (unlikely (pin >= pinend)) 3477 + { 3478 + elf_uncompress_failed (); 3479 + return 0; 3480 + } 3481 + hdr = *pin; 3482 + ++pin; 3483 + 3484 + weights = (unsigned char *) zdebug_table; 3485 + 3486 + if (hdr < 128) 3487 + { 3488 + /* Table is compressed using FSE. */ 3489 + 3490 + struct elf_zstd_fse_entry *fse_table; 3491 + int fse_table_bits; 3492 + uint16_t *scratch; 3493 + const unsigned char *pfse; 3494 + const unsigned char *pback; 3495 + uint64_t val; 3496 + unsigned int bits; 3497 + unsigned int state1, state2; 3498 + 3499 + /* SCRATCH is used temporarily by elf_zstd_read_fse. It overlaps 3500 + WEIGHTS. */ 3501 + scratch = zdebug_table; 3502 + fse_table = (struct elf_zstd_fse_entry *) (scratch + 512); 3503 + fse_table_bits = 6; 3504 + 3505 + pfse = pin; 3506 + if (!elf_zstd_read_fse (&pfse, pinend, scratch, 255, fse_table, 3507 + &fse_table_bits)) 3508 + return 0; 3509 + 3510 + if (unlikely (pin + hdr > pinend)) 3511 + { 3512 + elf_uncompress_failed (); 3513 + return 0; 3514 + } 3515 + 3516 + /* We no longer need SCRATCH. Start recording weights. We need up to 3517 + 256 bytes of weights and 64 bytes of rank counts, so it won't overlap 3518 + FSE_TABLE. */ 3519 + 3520 + pback = pin + hdr - 1; 3521 + 3522 + if (!elf_fetch_backward_init (&pback, pfse, &val, &bits)) 3523 + return 0; 3524 + 3525 + bits -= fse_table_bits; 3526 + state1 = (val >> bits) & ((1U << fse_table_bits) - 1); 3527 + bits -= fse_table_bits; 3528 + state2 = (val >> bits) & ((1U << fse_table_bits) - 1); 3529 + 3530 + /* There are two independent FSE streams, tracked by STATE1 and STATE2. 3531 + We decode them alternately. */ 3532 + 3533 + count = 0; 3534 + while (1) 3535 + { 3536 + struct elf_zstd_fse_entry *pt; 3537 + uint64_t v; 3538 + 3539 + pt = &fse_table[state1]; 3540 + 3541 + if (unlikely (pin < pinend) && bits < pt->bits) 3542 + { 3543 + if (unlikely (count >= 254)) 3544 + { 3545 + elf_uncompress_failed (); 3546 + return 0; 3547 + } 3548 + weights[count] = (unsigned char) pt->symbol; 3549 + weights[count + 1] = (unsigned char) fse_table[state2].symbol; 3550 + count += 2; 3551 + break; 3552 + } 3553 + 3554 + if (unlikely (pt->bits == 0)) 3555 + v = 0; 3556 + else 3557 + { 3558 + if (!elf_fetch_bits_backward (&pback, pfse, &val, &bits)) 3559 + return 0; 3560 + 3561 + bits -= pt->bits; 3562 + v = (val >> bits) & (((uint64_t)1 << pt->bits) - 1); 3563 + } 3564 + 3565 + state1 = pt->base + v; 3566 + 3567 + if (unlikely (count >= 255)) 3568 + { 3569 + elf_uncompress_failed (); 3570 + return 0; 3571 + } 3572 + 3573 + weights[count] = pt->symbol; 3574 + ++count; 3575 + 3576 + pt = &fse_table[state2]; 3577 + 3578 + if (unlikely (pin < pinend && bits < pt->bits)) 3579 + { 3580 + if (unlikely (count >= 254)) 3581 + { 3582 + elf_uncompress_failed (); 3583 + return 0; 3584 + } 3585 + weights[count] = (unsigned char) pt->symbol; 3586 + weights[count + 1] = (unsigned char) fse_table[state1].symbol; 3587 + count += 2; 3588 + break; 3589 + } 3590 + 3591 + if (unlikely (pt->bits == 0)) 3592 + v = 0; 3593 + else 3594 + { 3595 + if (!elf_fetch_bits_backward (&pback, pfse, &val, &bits)) 3596 + return 0; 3597 + 3598 + bits -= pt->bits; 3599 + v = (val >> bits) & (((uint64_t)1 << pt->bits) - 1); 3600 + } 3601 + 3602 + state2 = pt->base + v; 3603 + 3604 + if (unlikely (count >= 255)) 3605 + { 3606 + elf_uncompress_failed (); 3607 + return 0; 3608 + } 3609 + 3610 + weights[count] = pt->symbol; 3611 + ++count; 3612 + } 3613 + 3614 + pin += hdr; 3615 + } 3616 + else 3617 + { 3618 + /* Table is not compressed. Each weight is 4 bits. */ 3619 + 3620 + count = hdr - 127; 3621 + if (unlikely (pin + ((count + 1) / 2) >= pinend)) 3622 + { 3623 + elf_uncompress_failed (); 3624 + return 0; 3625 + } 3626 + for (i = 0; i < count; i += 2) 3627 + { 3628 + unsigned char b; 3629 + 3630 + b = *pin; 3631 + ++pin; 3632 + weights[i] = b >> 4; 3633 + weights[i + 1] = b & 0xf; 3634 + } 3635 + } 3636 + 3637 + weight_mark = (uint32_t *) (weights + 256); 3638 + memset (weight_mark, 0, 12 * sizeof (uint32_t)); 3639 + weight_mask = 0; 3640 + for (i = 0; i < count; ++i) 3641 + { 3642 + unsigned char w; 3643 + 3644 + w = weights[i]; 3645 + if (unlikely (w > 12)) 3646 + { 3647 + elf_uncompress_failed (); 3648 + return 0; 3649 + } 3650 + ++weight_mark[w]; 3651 + if (w > 0) 3652 + weight_mask += 1U << (w - 1); 3653 + } 3654 + if (unlikely (weight_mask == 0)) 3655 + { 3656 + elf_uncompress_failed (); 3657 + return 0; 3658 + } 3659 + 3660 + table_bits = 32 - __builtin_clz (weight_mask); 3661 + if (unlikely (table_bits > 11)) 3662 + { 3663 + elf_uncompress_failed (); 3664 + return 0; 3665 + } 3666 + 3667 + /* Work out the last weight value, which is omitted because the weights must 3668 + sum to a power of two. */ 3669 + { 3670 + uint32_t left; 3671 + uint32_t high_bit; 3672 + 3673 + left = ((uint32_t)1 << table_bits) - weight_mask; 3674 + if (left == 0) 3675 + { 3676 + elf_uncompress_failed (); 3677 + return 0; 3678 + } 3679 + high_bit = 31 - __builtin_clz (left); 3680 + if (((uint32_t)1 << high_bit) != left) 3681 + { 3682 + elf_uncompress_failed (); 3683 + return 0; 3684 + } 3685 + 3686 + if (unlikely (count >= 256)) 3687 + { 3688 + elf_uncompress_failed (); 3689 + return 0; 3690 + } 3691 + 3692 + weights[count] = high_bit + 1; 3693 + ++count; 3694 + ++weight_mark[high_bit + 1]; 3695 + } 3696 + 3697 + if (weight_mark[1] < 2 || (weight_mark[1] & 1) != 0) 3698 + { 3699 + elf_uncompress_failed (); 3700 + return 0; 3701 + } 3702 + 3703 + /* Change WEIGHT_MARK from a count of weights to the index of the first 3704 + symbol for that weight. We shift the indexes to also store how many we 3705 + hae seen so far, below. */ 3706 + { 3707 + uint32_t next; 3708 + 3709 + next = 0; 3710 + for (i = 0; i < table_bits; ++i) 3711 + { 3712 + uint32_t cur; 3713 + 3714 + cur = next; 3715 + next += weight_mark[i + 1] << i; 3716 + weight_mark[i + 1] = cur; 3717 + } 3718 + } 3719 + 3720 + for (i = 0; i < count; ++i) 3721 + { 3722 + unsigned char weight; 3723 + uint32_t length; 3724 + uint16_t tval; 3725 + size_t start; 3726 + uint32_t j; 3727 + 3728 + weight = weights[i]; 3729 + if (weight == 0) 3730 + continue; 3731 + 3732 + length = 1U << (weight - 1); 3733 + tval = (i << 8) | (table_bits + 1 - weight); 3734 + start = weight_mark[weight]; 3735 + for (j = 0; j < length; ++j) 3736 + table[start + j] = tval; 3737 + weight_mark[weight] += length; 3738 + } 3739 + 3740 + *ppin = pin; 3741 + *ptable_bits = (int)table_bits; 3742 + 3743 + return 1; 3744 + } 3745 + 3746 + /* Read and decompress the literals and store them ending at POUTEND. This 3747 + works because we are going to use all the literals in the output, so they 3748 + must fit into the output buffer. HUFFMAN_TABLE, and PHUFFMAN_TABLE_BITS 3749 + store the Huffman table across calls. SCRATCH is used to read a Huffman 3750 + table. Store the start of the decompressed literals in *PPLIT. Update 3751 + *PPIN. Return 1 on success, 0 on error. */ 3752 + 3753 + static int 3754 + elf_zstd_read_literals (const unsigned char **ppin, 3755 + const unsigned char *pinend, 3756 + unsigned char *pout, 3757 + unsigned char *poutend, 3758 + uint16_t *scratch, 3759 + uint16_t *huffman_table, 3760 + int *phuffman_table_bits, 3761 + unsigned char **pplit) 3762 + { 3763 + const unsigned char *pin; 3764 + unsigned char *plit; 3765 + unsigned char hdr; 3766 + uint32_t regenerated_size; 3767 + uint32_t compressed_size; 3768 + int streams; 3769 + uint32_t total_streams_size; 3770 + unsigned int huffman_table_bits; 3771 + uint64_t huffman_mask; 3772 + 3773 + pin = *ppin; 3774 + if (unlikely (pin >= pinend)) 3775 + { 3776 + elf_uncompress_failed (); 3777 + return 0; 3778 + } 3779 + hdr = *pin; 3780 + ++pin; 3781 + 3782 + if ((hdr & 3) == 0 || (hdr & 3) == 1) 3783 + { 3784 + int raw; 3785 + 3786 + /* Raw_literals_Block or RLE_Literals_Block */ 3787 + 3788 + raw = (hdr & 3) == 0; 3789 + 3790 + switch ((hdr >> 2) & 3) 3791 + { 3792 + case 0: case 2: 3793 + regenerated_size = hdr >> 3; 3794 + break; 3795 + case 1: 3796 + if (unlikely (pin >= pinend)) 3797 + { 3798 + elf_uncompress_failed (); 3799 + return 0; 3800 + } 3801 + regenerated_size = (hdr >> 4) + ((uint32_t)(*pin) << 4); 3802 + ++pin; 3803 + break; 3804 + case 3: 3805 + if (unlikely (pin + 1 >= pinend)) 3806 + { 3807 + elf_uncompress_failed (); 3808 + return 0; 3809 + } 3810 + regenerated_size = ((hdr >> 4) 3811 + + ((uint32_t)*pin << 4) 3812 + + ((uint32_t)pin[1] << 12)); 3813 + pin += 2; 3814 + break; 3815 + default: 3816 + elf_uncompress_failed (); 3817 + return 0; 3818 + } 3819 + 3820 + if (unlikely ((size_t)(poutend - pout) < regenerated_size)) 3821 + { 3822 + elf_uncompress_failed (); 3823 + return 0; 3824 + } 3825 + 3826 + plit = poutend - regenerated_size; 3827 + 3828 + if (raw) 3829 + { 3830 + if (unlikely (pin + regenerated_size >= pinend)) 3831 + { 3832 + elf_uncompress_failed (); 3833 + return 0; 3834 + } 3835 + memcpy (plit, pin, regenerated_size); 3836 + pin += regenerated_size; 3837 + } 3838 + else 3839 + { 3840 + if (pin >= pinend) 3841 + { 3842 + elf_uncompress_failed (); 3843 + return 0; 3844 + } 3845 + memset (plit, *pin, regenerated_size); 3846 + ++pin; 3847 + } 3848 + 3849 + *ppin = pin; 3850 + *pplit = plit; 3851 + 3852 + return 1; 3853 + } 3854 + 3855 + /* Compressed_Literals_Block or Treeless_Literals_Block */ 3856 + 3857 + switch ((hdr >> 2) & 3) 3858 + { 3859 + case 0: case 1: 3860 + if (unlikely (pin + 1 >= pinend)) 3861 + { 3862 + elf_uncompress_failed (); 3863 + return 0; 3864 + } 3865 + regenerated_size = (hdr >> 4) | ((uint32_t)(*pin & 0x3f) << 4); 3866 + compressed_size = (uint32_t)*pin >> 6 | ((uint32_t)pin[1] << 2); 3867 + pin += 2; 3868 + streams = ((hdr >> 2) & 3) == 0 ? 1 : 4; 3869 + break; 3870 + case 2: 3871 + if (unlikely (pin + 2 >= pinend)) 3872 + { 3873 + elf_uncompress_failed (); 3874 + return 0; 3875 + } 3876 + regenerated_size = (((uint32_t)hdr >> 4) 3877 + | ((uint32_t)*pin << 4) 3878 + | (((uint32_t)pin[1] & 3) << 12)); 3879 + compressed_size = (((uint32_t)pin[1] >> 2) 3880 + | ((uint32_t)pin[2] << 6)); 3881 + pin += 3; 3882 + streams = 4; 3883 + break; 3884 + case 3: 3885 + if (unlikely (pin + 3 >= pinend)) 3886 + { 3887 + elf_uncompress_failed (); 3888 + return 0; 3889 + } 3890 + regenerated_size = (((uint32_t)hdr >> 4) 3891 + | ((uint32_t)*pin << 4) 3892 + | (((uint32_t)pin[1] & 0x3f) << 12)); 3893 + compressed_size = (((uint32_t)pin[1] >> 6) 3894 + | ((uint32_t)pin[2] << 2) 3895 + | ((uint32_t)pin[3] << 10)); 3896 + pin += 4; 3897 + streams = 4; 3898 + break; 3899 + default: 3900 + elf_uncompress_failed (); 3901 + return 0; 3902 + } 3903 + 3904 + if (unlikely (pin + compressed_size > pinend)) 3905 + { 3906 + elf_uncompress_failed (); 3907 + return 0; 3908 + } 3909 + 3910 + pinend = pin + compressed_size; 3911 + *ppin = pinend; 3912 + 3913 + if (unlikely ((size_t)(poutend - pout) < regenerated_size)) 3914 + { 3915 + elf_uncompress_failed (); 3916 + return 0; 3917 + } 3918 + 3919 + plit = poutend - regenerated_size; 3920 + 3921 + *pplit = plit; 3922 + 3923 + total_streams_size = compressed_size; 3924 + if ((hdr & 3) == 2) 3925 + { 3926 + const unsigned char *ptable; 3927 + 3928 + /* Compressed_Literals_Block. Read Huffman tree. */ 3929 + 3930 + ptable = pin; 3931 + if (!elf_zstd_read_huff (&ptable, pinend, scratch, huffman_table, 3932 + phuffman_table_bits)) 3933 + return 0; 3934 + 3935 + if (unlikely (total_streams_size < (size_t)(ptable - pin))) 3936 + { 3937 + elf_uncompress_failed (); 3938 + return 0; 3939 + } 3940 + 3941 + total_streams_size -= ptable - pin; 3942 + pin = ptable; 3943 + } 3944 + else 3945 + { 3946 + /* Treeless_Literals_Block. Reuse previous Huffman tree. */ 3947 + if (unlikely (*phuffman_table_bits == 0)) 3948 + { 3949 + elf_uncompress_failed (); 3950 + return 0; 3951 + } 3952 + } 3953 + 3954 + /* Decompress COMPRESSED_SIZE bytes of data at PIN using the huffman table, 3955 + storing REGENERATED_SIZE bytes of decompressed data at PLIT. */ 3956 + 3957 + huffman_table_bits = (unsigned int)*phuffman_table_bits; 3958 + huffman_mask = ((uint64_t)1 << huffman_table_bits) - 1; 3959 + 3960 + if (streams == 1) 3961 + { 3962 + const unsigned char *pback; 3963 + const unsigned char *pbackend; 3964 + uint64_t val; 3965 + unsigned int bits; 3966 + uint32_t i; 3967 + 3968 + pback = pin + compressed_size - 1; 3969 + pbackend = pin; 3970 + if (!elf_fetch_backward_init (&pback, pbackend, &val, &bits)) 3971 + return 0; 3972 + 3973 + /* This is one of the inner loops of the decompression algorithm, so we 3974 + put some effort into optimization. We can't get more than 64 bytes 3975 + from a single call to elf_fetch_bits_backward, and we can't subtract 3976 + more than 11 bits at a time. */ 3977 + 3978 + if (regenerated_size >= 64) 3979 + { 3980 + unsigned char *plitstart; 3981 + unsigned char *plitstop; 3982 + 3983 + plitstart = plit; 3984 + plitstop = plit + regenerated_size - 64; 3985 + while (plit < plitstop) 3986 + { 3987 + uint16_t t; 3988 + 3989 + if (!elf_fetch_bits_backward (&pback, pbackend, &val, &bits)) 3990 + return 0; 3991 + 3992 + if (bits < 16) 3993 + break; 3994 + 3995 + while (bits >= 33) 3996 + { 3997 + t = huffman_table[(val >> (bits - huffman_table_bits)) 3998 + & huffman_mask]; 3999 + *plit = t >> 8; 4000 + ++plit; 4001 + bits -= t & 0xff; 4002 + 4003 + t = huffman_table[(val >> (bits - huffman_table_bits)) 4004 + & huffman_mask]; 4005 + *plit = t >> 8; 4006 + ++plit; 4007 + bits -= t & 0xff; 4008 + 4009 + t = huffman_table[(val >> (bits - huffman_table_bits)) 4010 + & huffman_mask]; 4011 + *plit = t >> 8; 4012 + ++plit; 4013 + bits -= t & 0xff; 4014 + } 4015 + 4016 + while (bits > 11) 4017 + { 4018 + t = huffman_table[(val >> (bits - huffman_table_bits)) 4019 + & huffman_mask]; 4020 + *plit = t >> 8; 4021 + ++plit; 4022 + bits -= t & 0xff; 4023 + } 4024 + } 4025 + 4026 + regenerated_size -= plit - plitstart; 4027 + } 4028 + 4029 + for (i = 0; i < regenerated_size; ++i) 4030 + { 4031 + uint16_t t; 4032 + 4033 + if (!elf_fetch_bits_backward (&pback, pbackend, &val, &bits)) 4034 + return 0; 4035 + 4036 + if (unlikely (bits < huffman_table_bits)) 4037 + { 4038 + t = huffman_table[(val << (huffman_table_bits - bits)) 4039 + & huffman_mask]; 4040 + if (unlikely (bits < (t & 0xff))) 4041 + { 4042 + elf_uncompress_failed (); 4043 + return 0; 4044 + } 4045 + } 4046 + else 4047 + t = huffman_table[(val >> (bits - huffman_table_bits)) 4048 + & huffman_mask]; 4049 + 4050 + *plit = t >> 8; 4051 + ++plit; 4052 + bits -= t & 0xff; 4053 + } 4054 + 4055 + return 1; 4056 + } 4057 + 4058 + { 4059 + uint32_t stream_size1, stream_size2, stream_size3, stream_size4; 4060 + uint32_t tot; 4061 + const unsigned char *pback1, *pback2, *pback3, *pback4; 4062 + const unsigned char *pbackend1, *pbackend2, *pbackend3, *pbackend4; 4063 + uint64_t val1, val2, val3, val4; 4064 + unsigned int bits1, bits2, bits3, bits4; 4065 + unsigned char *plit1, *plit2, *plit3, *plit4; 4066 + uint32_t regenerated_stream_size; 4067 + uint32_t regenerated_stream_size4; 4068 + uint16_t t1, t2, t3, t4; 4069 + uint32_t i; 4070 + uint32_t limit; 4071 + 4072 + /* Read jump table. */ 4073 + if (unlikely (pin + 5 >= pinend)) 4074 + { 4075 + elf_uncompress_failed (); 4076 + return 0; 4077 + } 4078 + stream_size1 = (uint32_t)*pin | ((uint32_t)pin[1] << 8); 4079 + pin += 2; 4080 + stream_size2 = (uint32_t)*pin | ((uint32_t)pin[1] << 8); 4081 + pin += 2; 4082 + stream_size3 = (uint32_t)*pin | ((uint32_t)pin[1] << 8); 4083 + pin += 2; 4084 + tot = stream_size1 + stream_size2 + stream_size3; 4085 + if (unlikely (tot > total_streams_size - 6)) 4086 + { 4087 + elf_uncompress_failed (); 4088 + return 0; 4089 + } 4090 + stream_size4 = total_streams_size - 6 - tot; 4091 + 4092 + pback1 = pin + stream_size1 - 1; 4093 + pbackend1 = pin; 4094 + 4095 + pback2 = pback1 + stream_size2; 4096 + pbackend2 = pback1 + 1; 4097 + 4098 + pback3 = pback2 + stream_size3; 4099 + pbackend3 = pback2 + 1; 4100 + 4101 + pback4 = pback3 + stream_size4; 4102 + pbackend4 = pback3 + 1; 4103 + 4104 + if (!elf_fetch_backward_init (&pback1, pbackend1, &val1, &bits1)) 4105 + return 0; 4106 + if (!elf_fetch_backward_init (&pback2, pbackend2, &val2, &bits2)) 4107 + return 0; 4108 + if (!elf_fetch_backward_init (&pback3, pbackend3, &val3, &bits3)) 4109 + return 0; 4110 + if (!elf_fetch_backward_init (&pback4, pbackend4, &val4, &bits4)) 4111 + return 0; 4112 + 4113 + regenerated_stream_size = (regenerated_size + 3) / 4; 4114 + 4115 + plit1 = plit; 4116 + plit2 = plit1 + regenerated_stream_size; 4117 + plit3 = plit2 + regenerated_stream_size; 4118 + plit4 = plit3 + regenerated_stream_size; 4119 + 4120 + regenerated_stream_size4 = regenerated_size - regenerated_stream_size * 3; 4121 + 4122 + /* We can't get more than 64 literal bytes from a single call to 4123 + elf_fetch_bits_backward. The fourth stream can be up to 3 bytes less, 4124 + so use as the limit. */ 4125 + 4126 + limit = regenerated_stream_size4 <= 64 ? 0 : regenerated_stream_size4 - 64; 4127 + i = 0; 4128 + while (i < limit) 4129 + { 4130 + if (!elf_fetch_bits_backward (&pback1, pbackend1, &val1, &bits1)) 4131 + return 0; 4132 + if (!elf_fetch_bits_backward (&pback2, pbackend2, &val2, &bits2)) 4133 + return 0; 4134 + if (!elf_fetch_bits_backward (&pback3, pbackend3, &val3, &bits3)) 4135 + return 0; 4136 + if (!elf_fetch_bits_backward (&pback4, pbackend4, &val4, &bits4)) 4137 + return 0; 4138 + 4139 + /* We can't subtract more than 11 bits at a time. */ 4140 + 4141 + do 4142 + { 4143 + t1 = huffman_table[(val1 >> (bits1 - huffman_table_bits)) 4144 + & huffman_mask]; 4145 + t2 = huffman_table[(val2 >> (bits2 - huffman_table_bits)) 4146 + & huffman_mask]; 4147 + t3 = huffman_table[(val3 >> (bits3 - huffman_table_bits)) 4148 + & huffman_mask]; 4149 + t4 = huffman_table[(val4 >> (bits4 - huffman_table_bits)) 4150 + & huffman_mask]; 4151 + 4152 + *plit1 = t1 >> 8; 4153 + ++plit1; 4154 + bits1 -= t1 & 0xff; 4155 + 4156 + *plit2 = t2 >> 8; 4157 + ++plit2; 4158 + bits2 -= t2 & 0xff; 4159 + 4160 + *plit3 = t3 >> 8; 4161 + ++plit3; 4162 + bits3 -= t3 & 0xff; 4163 + 4164 + *plit4 = t4 >> 8; 4165 + ++plit4; 4166 + bits4 -= t4 & 0xff; 4167 + 4168 + ++i; 4169 + } 4170 + while (bits1 > 11 && bits2 > 11 && bits3 > 11 && bits4 > 11); 4171 + } 4172 + 4173 + while (i < regenerated_stream_size) 4174 + { 4175 + int use4; 4176 + 4177 + use4 = i < regenerated_stream_size4; 4178 + 4179 + if (!elf_fetch_bits_backward (&pback1, pbackend1, &val1, &bits1)) 4180 + return 0; 4181 + if (!elf_fetch_bits_backward (&pback2, pbackend2, &val2, &bits2)) 4182 + return 0; 4183 + if (!elf_fetch_bits_backward (&pback3, pbackend3, &val3, &bits3)) 4184 + return 0; 4185 + if (use4) 4186 + { 4187 + if (!elf_fetch_bits_backward (&pback4, pbackend4, &val4, &bits4)) 4188 + return 0; 4189 + } 4190 + 4191 + if (unlikely (bits1 < huffman_table_bits)) 4192 + { 4193 + t1 = huffman_table[(val1 << (huffman_table_bits - bits1)) 4194 + & huffman_mask]; 4195 + if (unlikely (bits1 < (t1 & 0xff))) 4196 + { 4197 + elf_uncompress_failed (); 4198 + return 0; 4199 + } 4200 + } 4201 + else 4202 + t1 = huffman_table[(val1 >> (bits1 - huffman_table_bits)) 4203 + & huffman_mask]; 4204 + 4205 + if (unlikely (bits2 < huffman_table_bits)) 4206 + { 4207 + t2 = huffman_table[(val2 << (huffman_table_bits - bits2)) 4208 + & huffman_mask]; 4209 + if (unlikely (bits2 < (t2 & 0xff))) 4210 + { 4211 + elf_uncompress_failed (); 4212 + return 0; 4213 + } 4214 + } 4215 + else 4216 + t2 = huffman_table[(val2 >> (bits2 - huffman_table_bits)) 4217 + & huffman_mask]; 4218 + 4219 + if (unlikely (bits3 < huffman_table_bits)) 4220 + { 4221 + t3 = huffman_table[(val3 << (huffman_table_bits - bits3)) 4222 + & huffman_mask]; 4223 + if (unlikely (bits3 < (t3 & 0xff))) 4224 + { 4225 + elf_uncompress_failed (); 4226 + return 0; 4227 + } 4228 + } 4229 + else 4230 + t3 = huffman_table[(val3 >> (bits3 - huffman_table_bits)) 4231 + & huffman_mask]; 4232 + 4233 + if (use4) 4234 + { 4235 + if (unlikely (bits4 < huffman_table_bits)) 4236 + { 4237 + t4 = huffman_table[(val4 << (huffman_table_bits - bits4)) 4238 + & huffman_mask]; 4239 + if (unlikely (bits4 < (t4 & 0xff))) 4240 + { 4241 + elf_uncompress_failed (); 4242 + return 0; 4243 + } 4244 + } 4245 + else 4246 + t4 = huffman_table[(val4 >> (bits4 - huffman_table_bits)) 4247 + & huffman_mask]; 4248 + 4249 + *plit4 = t4 >> 8; 4250 + ++plit4; 4251 + bits4 -= t4 & 0xff; 4252 + } 4253 + 4254 + *plit1 = t1 >> 8; 4255 + ++plit1; 4256 + bits1 -= t1 & 0xff; 4257 + 4258 + *plit2 = t2 >> 8; 4259 + ++plit2; 4260 + bits2 -= t2 & 0xff; 4261 + 4262 + *plit3 = t3 >> 8; 4263 + ++plit3; 4264 + bits3 -= t3 & 0xff; 4265 + 4266 + ++i; 4267 + } 4268 + } 4269 + 4270 + return 1; 4271 + } 4272 + 4273 + /* The information used to decompress a sequence code, which can be a literal 4274 + length, an offset, or a match length. */ 4275 + 4276 + struct elf_zstd_seq_decode 4277 + { 4278 + const struct elf_zstd_fse_baseline_entry *table; 4279 + int table_bits; 4280 + }; 4281 + 4282 + /* Unpack a sequence code compression mode. */ 4283 + 4284 + static int 4285 + elf_zstd_unpack_seq_decode (int mode, 4286 + const unsigned char **ppin, 4287 + const unsigned char *pinend, 4288 + const struct elf_zstd_fse_baseline_entry *predef, 4289 + int predef_bits, 4290 + uint16_t *scratch, 4291 + int maxidx, 4292 + struct elf_zstd_fse_baseline_entry *table, 4293 + int table_bits, 4294 + int (*conv)(const struct elf_zstd_fse_entry *, 4295 + int, 4296 + struct elf_zstd_fse_baseline_entry *), 4297 + struct elf_zstd_seq_decode *decode) 4298 + { 4299 + switch (mode) 4300 + { 4301 + case 0: 4302 + decode->table = predef; 4303 + decode->table_bits = predef_bits; 4304 + break; 4305 + 4306 + case 1: 4307 + { 4308 + struct elf_zstd_fse_entry entry; 4309 + 4310 + if (unlikely (*ppin >= pinend)) 4311 + { 4312 + elf_uncompress_failed (); 4313 + return 0; 4314 + } 4315 + entry.symbol = **ppin; 4316 + ++*ppin; 4317 + entry.bits = 0; 4318 + entry.base = 0; 4319 + decode->table_bits = 0; 4320 + if (!conv (&entry, 0, table)) 4321 + return 0; 4322 + } 4323 + break; 4324 + 4325 + case 2: 4326 + { 4327 + struct elf_zstd_fse_entry *fse_table; 4328 + 4329 + /* We use the same space for the simple FSE table and the baseline 4330 + table. */ 4331 + fse_table = (struct elf_zstd_fse_entry *)table; 4332 + decode->table_bits = table_bits; 4333 + if (!elf_zstd_read_fse (ppin, pinend, scratch, maxidx, fse_table, 4334 + &decode->table_bits)) 4335 + return 0; 4336 + if (!conv (fse_table, decode->table_bits, table)) 4337 + return 0; 4338 + decode->table = table; 4339 + } 4340 + break; 4341 + 4342 + case 3: 4343 + if (unlikely (decode->table_bits == -1)) 4344 + { 4345 + elf_uncompress_failed (); 4346 + return 0; 4347 + } 4348 + break; 4349 + 4350 + default: 4351 + elf_uncompress_failed (); 4352 + return 0; 4353 + } 4354 + 4355 + return 1; 4356 + } 4357 + 4358 + /* Decompress a zstd stream from PIN/SIN to POUT/SOUT. Code based on RFC 8878. 4359 + Return 1 on success, 0 on error. */ 4360 + 4361 + static int 4362 + elf_zstd_decompress (const unsigned char *pin, size_t sin, 4363 + unsigned char *zdebug_table, unsigned char *pout, 4364 + size_t sout) 4365 + { 4366 + const unsigned char *pinend; 4367 + unsigned char *poutstart; 4368 + unsigned char *poutend; 4369 + struct elf_zstd_seq_decode literal_decode; 4370 + struct elf_zstd_fse_baseline_entry *literal_fse_table; 4371 + struct elf_zstd_seq_decode match_decode; 4372 + struct elf_zstd_fse_baseline_entry *match_fse_table; 4373 + struct elf_zstd_seq_decode offset_decode; 4374 + struct elf_zstd_fse_baseline_entry *offset_fse_table; 4375 + uint16_t *huffman_table; 4376 + int huffman_table_bits; 4377 + uint32_t repeated_offset1; 4378 + uint32_t repeated_offset2; 4379 + uint32_t repeated_offset3; 4380 + uint16_t *scratch; 4381 + unsigned char hdr; 4382 + int has_checksum; 4383 + uint64_t content_size; 4384 + int last_block; 4385 + 4386 + pinend = pin + sin; 4387 + poutstart = pout; 4388 + poutend = pout + sout; 4389 + 4390 + literal_decode.table = NULL; 4391 + literal_decode.table_bits = -1; 4392 + literal_fse_table = ((struct elf_zstd_fse_baseline_entry *) 4393 + (zdebug_table + ZSTD_TABLE_LITERAL_FSE_OFFSET)); 4394 + 4395 + match_decode.table = NULL; 4396 + match_decode.table_bits = -1; 4397 + match_fse_table = ((struct elf_zstd_fse_baseline_entry *) 4398 + (zdebug_table + ZSTD_TABLE_MATCH_FSE_OFFSET)); 4399 + 4400 + offset_decode.table = NULL; 4401 + offset_decode.table_bits = -1; 4402 + offset_fse_table = ((struct elf_zstd_fse_baseline_entry *) 4403 + (zdebug_table + ZSTD_TABLE_OFFSET_FSE_OFFSET)); 4404 + huffman_table = ((uint16_t *) 4405 + (zdebug_table + ZSTD_TABLE_HUFFMAN_OFFSET)); 4406 + huffman_table_bits = 0; 4407 + scratch = ((uint16_t *) 4408 + (zdebug_table + ZSTD_TABLE_WORK_OFFSET)); 4409 + 4410 + repeated_offset1 = 1; 4411 + repeated_offset2 = 4; 4412 + repeated_offset3 = 8; 4413 + 4414 + if (unlikely (sin < 4)) 4415 + { 4416 + elf_uncompress_failed (); 4417 + return 0; 4418 + } 4419 + 4420 + /* These values are the zstd magic number. */ 4421 + if (unlikely (pin[0] != 0x28 4422 + || pin[1] != 0xb5 4423 + || pin[2] != 0x2f 4424 + || pin[3] != 0xfd)) 4425 + { 4426 + elf_uncompress_failed (); 4427 + return 0; 4428 + } 4429 + 4430 + pin += 4; 4431 + 4432 + if (unlikely (pin >= pinend)) 4433 + { 4434 + elf_uncompress_failed (); 4435 + return 0; 4436 + } 4437 + 4438 + hdr = *pin++; 4439 + 4440 + /* We expect a single frame. */ 4441 + if (unlikely ((hdr & (1 << 5)) == 0)) 4442 + { 4443 + elf_uncompress_failed (); 4444 + return 0; 4445 + } 4446 + /* Reserved bit must be zero. */ 4447 + if (unlikely ((hdr & (1 << 3)) != 0)) 4448 + { 4449 + elf_uncompress_failed (); 4450 + return 0; 4451 + } 4452 + /* We do not expect a dictionary. */ 4453 + if (unlikely ((hdr & 3) != 0)) 4454 + { 4455 + elf_uncompress_failed (); 4456 + return 0; 4457 + } 4458 + has_checksum = (hdr & (1 << 2)) != 0; 4459 + switch (hdr >> 6) 4460 + { 4461 + case 0: 4462 + if (unlikely (pin >= pinend)) 4463 + { 4464 + elf_uncompress_failed (); 4465 + return 0; 4466 + } 4467 + content_size = (uint64_t) *pin++; 4468 + break; 4469 + case 1: 4470 + if (unlikely (pin + 1 >= pinend)) 4471 + { 4472 + elf_uncompress_failed (); 4473 + return 0; 4474 + } 4475 + content_size = (((uint64_t) pin[0]) | (((uint64_t) pin[1]) << 8)) + 256; 4476 + pin += 2; 4477 + break; 4478 + case 2: 4479 + if (unlikely (pin + 3 >= pinend)) 4480 + { 4481 + elf_uncompress_failed (); 4482 + return 0; 4483 + } 4484 + content_size = ((uint64_t) pin[0] 4485 + | (((uint64_t) pin[1]) << 8) 4486 + | (((uint64_t) pin[2]) << 16) 4487 + | (((uint64_t) pin[3]) << 24)); 4488 + pin += 4; 4489 + break; 4490 + case 3: 4491 + if (unlikely (pin + 7 >= pinend)) 4492 + { 4493 + elf_uncompress_failed (); 4494 + return 0; 4495 + } 4496 + content_size = ((uint64_t) pin[0] 4497 + | (((uint64_t) pin[1]) << 8) 4498 + | (((uint64_t) pin[2]) << 16) 4499 + | (((uint64_t) pin[3]) << 24) 4500 + | (((uint64_t) pin[4]) << 32) 4501 + | (((uint64_t) pin[5]) << 40) 4502 + | (((uint64_t) pin[6]) << 48) 4503 + | (((uint64_t) pin[7]) << 56)); 4504 + pin += 8; 4505 + break; 4506 + default: 4507 + elf_uncompress_failed (); 4508 + return 0; 4509 + } 4510 + 4511 + if (unlikely (content_size != (size_t) content_size 4512 + || (size_t) content_size != sout)) 4513 + { 4514 + elf_uncompress_failed (); 4515 + return 0; 4516 + } 4517 + 4518 + last_block = 0; 4519 + while (!last_block) 4520 + { 4521 + uint32_t block_hdr; 4522 + int block_type; 4523 + uint32_t block_size; 4524 + 4525 + if (unlikely (pin + 2 >= pinend)) 4526 + { 4527 + elf_uncompress_failed (); 4528 + return 0; 4529 + } 4530 + block_hdr = ((uint32_t) pin[0] 4531 + | (((uint32_t) pin[1]) << 8) 4532 + | (((uint32_t) pin[2]) << 16)); 4533 + pin += 3; 4534 + 4535 + last_block = block_hdr & 1; 4536 + block_type = (block_hdr >> 1) & 3; 4537 + block_size = block_hdr >> 3; 4538 + 4539 + switch (block_type) 4540 + { 4541 + case 0: 4542 + /* Raw_Block */ 4543 + if (unlikely ((size_t) block_size > (size_t) (pinend - pin))) 4544 + { 4545 + elf_uncompress_failed (); 4546 + return 0; 4547 + } 4548 + if (unlikely ((size_t) block_size > (size_t) (poutend - pout))) 4549 + { 4550 + elf_uncompress_failed (); 4551 + return 0; 4552 + } 4553 + memcpy (pout, pin, block_size); 4554 + pout += block_size; 4555 + pin += block_size; 4556 + break; 4557 + 4558 + case 1: 4559 + /* RLE_Block */ 4560 + if (unlikely (pin >= pinend)) 4561 + { 4562 + elf_uncompress_failed (); 4563 + return 0; 4564 + } 4565 + if (unlikely ((size_t) block_size > (size_t) (poutend - pout))) 4566 + { 4567 + elf_uncompress_failed (); 4568 + return 0; 4569 + } 4570 + memset (pout, *pin, block_size); 4571 + pout += block_size; 4572 + pin++; 4573 + break; 4574 + 4575 + case 2: 4576 + { 4577 + const unsigned char *pblockend; 4578 + unsigned char *plitstack; 4579 + unsigned char *plit; 4580 + uint32_t literal_count; 4581 + unsigned char seq_hdr; 4582 + size_t seq_count; 4583 + size_t seq; 4584 + const unsigned char *pback; 4585 + uint64_t val; 4586 + unsigned int bits; 4587 + unsigned int literal_state; 4588 + unsigned int offset_state; 4589 + unsigned int match_state; 4590 + 4591 + /* Compressed_Block */ 4592 + if (unlikely ((size_t) block_size > (size_t) (pinend - pin))) 4593 + { 4594 + elf_uncompress_failed (); 4595 + return 0; 4596 + } 4597 + 4598 + pblockend = pin + block_size; 4599 + 4600 + /* Read the literals into the end of the output space, and leave 4601 + PLIT pointing at them. */ 4602 + 4603 + if (!elf_zstd_read_literals (&pin, pblockend, pout, poutend, 4604 + scratch, huffman_table, 4605 + &huffman_table_bits, 4606 + &plitstack)) 4607 + return 0; 4608 + plit = plitstack; 4609 + literal_count = poutend - plit; 4610 + 4611 + seq_hdr = *pin; 4612 + pin++; 4613 + if (seq_hdr < 128) 4614 + seq_count = seq_hdr; 4615 + else if (seq_hdr < 255) 4616 + { 4617 + if (unlikely (pin >= pinend)) 4618 + { 4619 + elf_uncompress_failed (); 4620 + return 0; 4621 + } 4622 + seq_count = ((seq_hdr - 128) << 8) + *pin; 4623 + pin++; 4624 + } 4625 + else 4626 + { 4627 + if (unlikely (pin + 1 >= pinend)) 4628 + { 4629 + elf_uncompress_failed (); 4630 + return 0; 4631 + } 4632 + seq_count = *pin + (pin[1] << 8) + 0x7f00; 4633 + pin += 2; 4634 + } 4635 + 4636 + if (seq_count > 0) 4637 + { 4638 + int (*pfn)(const struct elf_zstd_fse_entry *, 4639 + int, struct elf_zstd_fse_baseline_entry *); 4640 + 4641 + if (unlikely (pin >= pinend)) 4642 + { 4643 + elf_uncompress_failed (); 4644 + return 0; 4645 + } 4646 + seq_hdr = *pin; 4647 + ++pin; 4648 + 4649 + pfn = elf_zstd_make_literal_baseline_fse; 4650 + if (!elf_zstd_unpack_seq_decode ((seq_hdr >> 6) & 3, 4651 + &pin, pinend, 4652 + &elf_zstd_lit_table[0], 6, 4653 + scratch, 35, 4654 + literal_fse_table, 9, pfn, 4655 + &literal_decode)) 4656 + return 0; 4657 + 4658 + pfn = elf_zstd_make_offset_baseline_fse; 4659 + if (!elf_zstd_unpack_seq_decode ((seq_hdr >> 4) & 3, 4660 + &pin, pinend, 4661 + &elf_zstd_offset_table[0], 5, 4662 + scratch, 31, 4663 + offset_fse_table, 8, pfn, 4664 + &offset_decode)) 4665 + return 0; 4666 + 4667 + pfn = elf_zstd_make_match_baseline_fse; 4668 + if (!elf_zstd_unpack_seq_decode ((seq_hdr >> 2) & 3, 4669 + &pin, pinend, 4670 + &elf_zstd_match_table[0], 6, 4671 + scratch, 52, 4672 + match_fse_table, 9, pfn, 4673 + &match_decode)) 4674 + return 0; 4675 + } 4676 + 4677 + pback = pblockend - 1; 4678 + if (!elf_fetch_backward_init (&pback, pin, &val, &bits)) 4679 + return 0; 4680 + 4681 + bits -= literal_decode.table_bits; 4682 + literal_state = ((val >> bits) 4683 + & ((1U << literal_decode.table_bits) - 1)); 4684 + 4685 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4686 + return 0; 4687 + bits -= offset_decode.table_bits; 4688 + offset_state = ((val >> bits) 4689 + & ((1U << offset_decode.table_bits) - 1)); 4690 + 4691 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4692 + return 0; 4693 + bits -= match_decode.table_bits; 4694 + match_state = ((val >> bits) 4695 + & ((1U << match_decode.table_bits) - 1)); 4696 + 4697 + seq = 0; 4698 + while (1) 4699 + { 4700 + const struct elf_zstd_fse_baseline_entry *pt; 4701 + uint32_t offset_basebits; 4702 + uint32_t offset_baseline; 4703 + uint32_t offset_bits; 4704 + uint32_t offset_base; 4705 + uint32_t offset; 4706 + uint32_t match_baseline; 4707 + uint32_t match_bits; 4708 + uint32_t match_base; 4709 + uint32_t match; 4710 + uint32_t literal_baseline; 4711 + uint32_t literal_bits; 4712 + uint32_t literal_base; 4713 + uint32_t literal; 4714 + uint32_t need; 4715 + uint32_t add; 4716 + 4717 + pt = &offset_decode.table[offset_state]; 4718 + offset_basebits = pt->basebits; 4719 + offset_baseline = pt->baseline; 4720 + offset_bits = pt->bits; 4721 + offset_base = pt->base; 4722 + 4723 + /* This case can be more than 16 bits, which is all that 4724 + elf_fetch_bits_backward promises. */ 4725 + need = offset_basebits; 4726 + add = 0; 4727 + if (unlikely (need > 16)) 4728 + { 4729 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4730 + return 0; 4731 + bits -= 16; 4732 + add = (val >> bits) & ((1U << 16) - 1); 4733 + need -= 16; 4734 + add <<= need; 4735 + } 4736 + if (need > 0) 4737 + { 4738 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4739 + return 0; 4740 + bits -= need; 4741 + add += (val >> bits) & ((1U << need) - 1); 4742 + } 4743 + 4744 + offset = offset_baseline + add; 4745 + 4746 + pt = &match_decode.table[match_state]; 4747 + need = pt->basebits; 4748 + match_baseline = pt->baseline; 4749 + match_bits = pt->bits; 4750 + match_base = pt->base; 4751 + 4752 + add = 0; 4753 + if (need > 0) 4754 + { 4755 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4756 + return 0; 4757 + bits -= need; 4758 + add = (val >> bits) & ((1U << need) - 1); 4759 + } 4760 + 4761 + match = match_baseline + add; 4762 + 4763 + pt = &literal_decode.table[literal_state]; 4764 + need = pt->basebits; 4765 + literal_baseline = pt->baseline; 4766 + literal_bits = pt->bits; 4767 + literal_base = pt->base; 4768 + 4769 + add = 0; 4770 + if (need > 0) 4771 + { 4772 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4773 + return 0; 4774 + bits -= need; 4775 + add = (val >> bits) & ((1U << need) - 1); 4776 + } 4777 + 4778 + literal = literal_baseline + add; 4779 + 4780 + /* See the comment in elf_zstd_make_offset_baseline_fse. */ 4781 + if (offset_basebits > 1) 4782 + { 4783 + repeated_offset3 = repeated_offset2; 4784 + repeated_offset2 = repeated_offset1; 4785 + repeated_offset1 = offset; 4786 + } 4787 + else 4788 + { 4789 + if (unlikely (literal == 0)) 4790 + ++offset; 4791 + switch (offset) 4792 + { 4793 + case 1: 4794 + offset = repeated_offset1; 4795 + break; 4796 + case 2: 4797 + offset = repeated_offset2; 4798 + repeated_offset2 = repeated_offset1; 4799 + repeated_offset1 = offset; 4800 + break; 4801 + case 3: 4802 + offset = repeated_offset3; 4803 + repeated_offset3 = repeated_offset2; 4804 + repeated_offset2 = repeated_offset1; 4805 + repeated_offset1 = offset; 4806 + break; 4807 + case 4: 4808 + offset = repeated_offset1 - 1; 4809 + repeated_offset3 = repeated_offset2; 4810 + repeated_offset2 = repeated_offset1; 4811 + repeated_offset1 = offset; 4812 + break; 4813 + } 4814 + } 4815 + 4816 + ++seq; 4817 + if (seq < seq_count) 4818 + { 4819 + uint32_t v; 4820 + 4821 + /* Update the three states. */ 4822 + 4823 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4824 + return 0; 4825 + 4826 + need = literal_bits; 4827 + bits -= need; 4828 + v = (val >> bits) & (((uint32_t)1 << need) - 1); 4829 + 4830 + literal_state = literal_base + v; 4831 + 4832 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4833 + return 0; 4834 + 4835 + need = match_bits; 4836 + bits -= need; 4837 + v = (val >> bits) & (((uint32_t)1 << need) - 1); 4838 + 4839 + match_state = match_base + v; 4840 + 4841 + if (!elf_fetch_bits_backward (&pback, pin, &val, &bits)) 4842 + return 0; 4843 + 4844 + need = offset_bits; 4845 + bits -= need; 4846 + v = (val >> bits) & (((uint32_t)1 << need) - 1); 4847 + 4848 + offset_state = offset_base + v; 4849 + } 4850 + 4851 + /* The next sequence is now in LITERAL, OFFSET, MATCH. */ 4852 + 4853 + /* Copy LITERAL bytes from the literals. */ 4854 + 4855 + if (unlikely ((size_t)(poutend - pout) < literal)) 4856 + { 4857 + elf_uncompress_failed (); 4858 + return 0; 4859 + } 4860 + 4861 + if (unlikely (literal_count < literal)) 4862 + { 4863 + elf_uncompress_failed (); 4864 + return 0; 4865 + } 4866 + 4867 + literal_count -= literal; 4868 + 4869 + /* Often LITERAL is small, so handle small cases quickly. */ 4870 + switch (literal) 4871 + { 4872 + case 8: 4873 + *pout++ = *plit++; 4874 + /* FALLTHROUGH */ 4875 + case 7: 4876 + *pout++ = *plit++; 4877 + /* FALLTHROUGH */ 4878 + case 6: 4879 + *pout++ = *plit++; 4880 + /* FALLTHROUGH */ 4881 + case 5: 4882 + *pout++ = *plit++; 4883 + /* FALLTHROUGH */ 4884 + case 4: 4885 + *pout++ = *plit++; 4886 + /* FALLTHROUGH */ 4887 + case 3: 4888 + *pout++ = *plit++; 4889 + /* FALLTHROUGH */ 4890 + case 2: 4891 + *pout++ = *plit++; 4892 + /* FALLTHROUGH */ 4893 + case 1: 4894 + *pout++ = *plit++; 4895 + break; 4896 + 4897 + case 0: 4898 + break; 4899 + 4900 + default: 4901 + if (unlikely ((size_t)(plit - pout) < literal)) 4902 + { 4903 + uint32_t move; 4904 + 4905 + move = plit - pout; 4906 + while (literal > move) 4907 + { 4908 + memcpy (pout, plit, move); 4909 + pout += move; 4910 + plit += move; 4911 + literal -= move; 4912 + } 4913 + } 4914 + 4915 + memcpy (pout, plit, literal); 4916 + pout += literal; 4917 + plit += literal; 4918 + } 4919 + 4920 + if (match > 0) 4921 + { 4922 + /* Copy MATCH bytes from the decoded output at OFFSET. */ 4923 + 4924 + if (unlikely ((size_t)(poutend - pout) < match)) 4925 + { 4926 + elf_uncompress_failed (); 4927 + return 0; 4928 + } 4929 + 4930 + if (unlikely ((size_t)(pout - poutstart) < offset)) 4931 + { 4932 + elf_uncompress_failed (); 4933 + return 0; 4934 + } 4935 + 4936 + if (offset >= match) 4937 + { 4938 + memcpy (pout, pout - offset, match); 4939 + pout += match; 4940 + } 4941 + else 4942 + { 4943 + while (match > 0) 4944 + { 4945 + uint32_t copy; 4946 + 4947 + copy = match < offset ? match : offset; 4948 + memcpy (pout, pout - offset, copy); 4949 + match -= copy; 4950 + pout += copy; 4951 + } 4952 + } 4953 + } 4954 + 4955 + if (unlikely (seq >= seq_count)) 4956 + { 4957 + /* Copy remaining literals. */ 4958 + if (literal_count > 0 && plit != pout) 4959 + { 4960 + if (unlikely ((size_t)(poutend - pout) 4961 + < literal_count)) 4962 + { 4963 + elf_uncompress_failed (); 4964 + return 0; 4965 + } 4966 + 4967 + if ((size_t)(plit - pout) < literal_count) 4968 + { 4969 + uint32_t move; 4970 + 4971 + move = plit - pout; 4972 + while (literal_count > move) 4973 + { 4974 + memcpy (pout, plit, move); 4975 + pout += move; 4976 + plit += move; 4977 + literal_count -= move; 4978 + } 4979 + } 4980 + 4981 + memcpy (pout, plit, literal_count); 4982 + } 4983 + 4984 + pout += literal_count; 4985 + 4986 + break; 4987 + } 4988 + } 4989 + 4990 + pin = pblockend; 4991 + } 4992 + break; 4993 + 4994 + case 3: 4995 + default: 4996 + elf_uncompress_failed (); 4997 + return 0; 4998 + } 4999 + } 5000 + 5001 + if (has_checksum) 5002 + { 5003 + if (unlikely (pin + 4 > pinend)) 5004 + { 5005 + elf_uncompress_failed (); 5006 + return 0; 5007 + } 5008 + 5009 + /* We don't currently verify the checksum. Currently running GNU ld with 5010 + --compress-debug-sections=zstd does not seem to generate a 5011 + checksum. */ 5012 + 5013 + pin += 4; 5014 + } 5015 + 5016 + if (pin != pinend) 5017 + { 5018 + elf_uncompress_failed (); 5019 + return 0; 5020 + } 5021 + 5022 + return 1; 5023 + } 5024 + 5025 + #define ZDEBUG_TABLE_SIZE \ 5026 + (ZLIB_TABLE_SIZE > ZSTD_TABLE_SIZE ? ZLIB_TABLE_SIZE : ZSTD_TABLE_SIZE) 5027 + 2562 5028 /* Uncompress the old compressed debug format, the one emitted by 2563 5029 --compress-debug-sections=zlib-gnu. The compressed data is in 2564 5030 COMPRESSED / COMPRESSED_SIZE, and the function writes to ··· 2628 5094 unsigned char **uncompressed, size_t *uncompressed_size) 2629 5095 { 2630 5096 const b_elf_chdr *chdr; 5097 + char *alc; 5098 + size_t alc_len; 2631 5099 unsigned char *po; 2632 5100 2633 5101 *uncompressed = NULL; ··· 2639 5107 2640 5108 chdr = (const b_elf_chdr *) compressed; 2641 5109 2642 - if (chdr->ch_type != ELFCOMPRESS_ZLIB) 2643 - { 2644 - /* Unsupported compression algorithm. */ 2645 - return 1; 2646 - } 2647 - 5110 + alc = NULL; 5111 + alc_len = 0; 2648 5112 if (*uncompressed != NULL && *uncompressed_size >= chdr->ch_size) 2649 5113 po = *uncompressed; 2650 5114 else 2651 5115 { 2652 - po = (unsigned char *) backtrace_alloc (state, chdr->ch_size, 2653 - error_callback, data); 2654 - if (po == NULL) 5116 + alc_len = chdr->ch_size; 5117 + alc = (char*)backtrace_alloc (state, alc_len, error_callback, data); 5118 + if (alc == NULL) 2655 5119 return 0; 5120 + po = (unsigned char *) alc; 2656 5121 } 2657 5122 2658 - if (!elf_zlib_inflate_and_verify (compressed + sizeof (b_elf_chdr), 2659 - compressed_size - sizeof (b_elf_chdr), 2660 - zdebug_table, po, chdr->ch_size)) 2661 - return 1; 5123 + switch (chdr->ch_type) 5124 + { 5125 + case ELFCOMPRESS_ZLIB: 5126 + if (!elf_zlib_inflate_and_verify (compressed + sizeof (b_elf_chdr), 5127 + compressed_size - sizeof (b_elf_chdr), 5128 + zdebug_table, po, chdr->ch_size)) 5129 + goto skip; 5130 + break; 5131 + 5132 + case ELFCOMPRESS_ZSTD: 5133 + if (!elf_zstd_decompress (compressed + sizeof (b_elf_chdr), 5134 + compressed_size - sizeof (b_elf_chdr), 5135 + (unsigned char *)zdebug_table, po, 5136 + chdr->ch_size)) 5137 + goto skip; 5138 + break; 5139 + 5140 + default: 5141 + /* Unsupported compression algorithm. */ 5142 + goto skip; 5143 + } 2662 5144 2663 5145 *uncompressed = po; 2664 5146 *uncompressed_size = chdr->ch_size; 2665 5147 5148 + return 1; 5149 + 5150 + skip: 5151 + if (alc != NULL && alc_len > 0) 5152 + backtrace_free (state, alc, alc_len, error_callback, data); 2666 5153 return 1; 2667 5154 } 2668 5155 ··· 2687 5174 ret = elf_uncompress_zdebug (state, compressed, compressed_size, 2688 5175 zdebug_table, error_callback, data, 2689 5176 uncompressed, uncompressed_size); 5177 + backtrace_free (state, zdebug_table, ZDEBUG_TABLE_SIZE, 5178 + error_callback, data); 5179 + return ret; 5180 + } 5181 + 5182 + /* This function is a hook for testing the zstd support. It is only used by 5183 + tests. */ 5184 + 5185 + int 5186 + backtrace_uncompress_zstd (struct backtrace_state *state, 5187 + const unsigned char *compressed, 5188 + size_t compressed_size, 5189 + backtrace_error_callback error_callback, 5190 + void *data, unsigned char *uncompressed, 5191 + size_t uncompressed_size) 5192 + { 5193 + unsigned char *zdebug_table; 5194 + int ret; 5195 + 5196 + zdebug_table = ((unsigned char *) backtrace_alloc (state, ZDEBUG_TABLE_SIZE, 5197 + error_callback, data)); 5198 + if (zdebug_table == NULL) 5199 + return 0; 5200 + ret = elf_zstd_decompress (compressed, compressed_size, 5201 + zdebug_table, uncompressed, uncompressed_size); 2690 5202 backtrace_free (state, zdebug_table, ZDEBUG_TABLE_SIZE, 2691 5203 error_callback, data); 2692 5204 return ret; ··· 4688 7200 if (zdebug_table == NULL) 4689 7201 { 4690 7202 zdebug_table = ((uint16_t *) 4691 - backtrace_alloc (state, ZDEBUG_TABLE_SIZE, 7203 + backtrace_alloc (state, ZLIB_TABLE_SIZE, 4692 7204 error_callback, data)); 4693 7205 if (zdebug_table == NULL) 4694 7206 goto fail; ··· 4714 7226 } 4715 7227 } 4716 7228 7229 + if (zdebug_table != NULL) 7230 + { 7231 + backtrace_free (state, zdebug_table, ZLIB_TABLE_SIZE, 7232 + error_callback, data); 7233 + zdebug_table = NULL; 7234 + } 7235 + 4717 7236 /* Uncompress the official ELF format 4718 - (--compress-debug-sections=zlib-gabi). */ 7237 + (--compress-debug-sections=zlib-gabi, --compress-debug-sections=zstd). */ 4719 7238 for (i = 0; i < (int) DEBUG_MAX; ++i) 4720 7239 { 4721 7240 unsigned char *uncompressed_data;
+9
src/external/tracy/libbacktrace/internal.hpp
··· 371 371 unsigned char **uncompressed, 372 372 size_t *uncompressed_size); 373 373 374 + /* A test-only hook for elf_zstd_decompress. */ 375 + 376 + extern int backtrace_uncompress_zstd (struct backtrace_state *, 377 + const unsigned char *compressed, 378 + size_t compressed_size, 379 + backtrace_error_callback, void *data, 380 + unsigned char *uncompressed, 381 + size_t uncompressed_size); 382 + 374 383 /* A test-only hook for elf_uncompress_lzma. */ 375 384 376 385 extern int backtrace_uncompress_lzma (struct backtrace_state *,
+41 -29
src/external/tracy/tracy/Tracy.hpp
··· 4 4 #include "../common/TracyColor.hpp" 5 5 #include "../common/TracySystem.hpp" 6 6 7 + #ifndef TracyFunction 8 + # define TracyFunction __FUNCTION__ 9 + #endif 10 + 11 + #ifndef TracyFile 12 + # define TracyFile __FILE__ 13 + #endif 14 + 15 + #ifndef TracyLine 16 + # define TracyLine __LINE__ 17 + #endif 18 + 7 19 #ifndef TRACY_ENABLE 8 20 9 21 #define ZoneNamed(x,y) ··· 37 49 38 50 #define FrameImage(x,y,z,w,a) 39 51 40 - #define TracyLockable( type, varname ) type varname; 41 - #define TracyLockableN( type, varname, desc ) type varname; 42 - #define TracySharedLockable( type, varname ) type varname; 43 - #define TracySharedLockableN( type, varname, desc ) type varname; 52 + #define TracyLockable( type, varname ) type varname 53 + #define TracyLockableN( type, varname, desc ) type varname 54 + #define TracySharedLockable( type, varname ) type varname 55 + #define TracySharedLockableN( type, varname, desc ) type varname 44 56 #define LockableBase( type ) type 45 57 #define SharedLockableBase( type ) type 46 - #define LockMark(x) (void)x; 47 - #define LockableName(x,y,z); 58 + #define LockMark(x) (void)x 59 + #define LockableName(x,y,z) 48 60 49 61 #define TracyPlot(x,y) 50 62 #define TracyPlotConfig(x,y,z,w,a) ··· 110 122 #include "../client/TracyScoped.hpp" 111 123 112 124 #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK 113 - # define ZoneNamed( varname, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), TRACY_CALLSTACK, active ) 114 - # define ZoneNamedN( varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), TRACY_CALLSTACK, active ) 115 - # define ZoneNamedC( varname, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), TRACY_CALLSTACK, active ) 116 - # define ZoneNamedNC( varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), TRACY_CALLSTACK, active ) 125 + # define ZoneNamed( varname, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { nullptr, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), TRACY_CALLSTACK, active ) 126 + # define ZoneNamedN( varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), TRACY_CALLSTACK, active ) 127 + # define ZoneNamedC( varname, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { nullptr, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), TRACY_CALLSTACK, active ) 128 + # define ZoneNamedNC( varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), TRACY_CALLSTACK, active ) 117 129 118 - # define ZoneTransient( varname, active ) tracy::ScopedZone varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), nullptr, 0, TRACY_CALLSTACK, active ) 119 - # define ZoneTransientN( varname, name, active ) tracy::ScopedZone varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), TRACY_CALLSTACK, active ) 130 + # define ZoneTransient( varname, active ) tracy::ScopedZone varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), nullptr, 0, TRACY_CALLSTACK, active ) 131 + # define ZoneTransientN( varname, name, active ) tracy::ScopedZone varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), TRACY_CALLSTACK, active ) 120 132 #else 121 - # define ZoneNamed( varname, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), active ) 122 - # define ZoneNamedN( varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), active ) 123 - # define ZoneNamedC( varname, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), active ) 124 - # define ZoneNamedNC( varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), active ) 133 + # define ZoneNamed( varname, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { nullptr, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), active ) 134 + # define ZoneNamedN( varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), active ) 135 + # define ZoneNamedC( varname, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { nullptr, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), active ) 136 + # define ZoneNamedNC( varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), active ) 125 137 126 - # define ZoneTransient( varname, active ) tracy::ScopedZone varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), nullptr, 0, active ) 127 - # define ZoneTransientN( varname, name, active ) tracy::ScopedZone varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), active ) 138 + # define ZoneTransient( varname, active ) tracy::ScopedZone varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), nullptr, 0, active ) 139 + # define ZoneTransientN( varname, name, active ) tracy::ScopedZone varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), active ) 128 140 #endif 129 141 130 142 #define ZoneScoped ZoneNamed( ___tracy_scoped_zone, true ) ··· 150 162 151 163 #define FrameImage( image, width, height, offset, flip ) tracy::Profiler::SendFrameImage( image, width, height, offset, flip ) 152 164 153 - #define TracyLockable( type, varname ) tracy::Lockable<type> varname { [] () -> const tracy::SourceLocationData* { static constexpr tracy::SourceLocationData srcloc { nullptr, #type " " #varname, __FILE__, __LINE__, 0 }; return &srcloc; }() } 154 - #define TracyLockableN( type, varname, desc ) tracy::Lockable<type> varname { [] () -> const tracy::SourceLocationData* { static constexpr tracy::SourceLocationData srcloc { nullptr, desc, __FILE__, __LINE__, 0 }; return &srcloc; }() } 155 - #define TracySharedLockable( type, varname ) tracy::SharedLockable<type> varname { [] () -> const tracy::SourceLocationData* { static constexpr tracy::SourceLocationData srcloc { nullptr, #type " " #varname, __FILE__, __LINE__, 0 }; return &srcloc; }() } 156 - #define TracySharedLockableN( type, varname, desc ) tracy::SharedLockable<type> varname { [] () -> const tracy::SourceLocationData* { static constexpr tracy::SourceLocationData srcloc { nullptr, desc, __FILE__, __LINE__, 0 }; return &srcloc; }() } 165 + #define TracyLockable( type, varname ) tracy::Lockable<type> varname { [] () -> const tracy::SourceLocationData* { static constexpr tracy::SourceLocationData srcloc { nullptr, #type " " #varname, TracyFile, TracyLine, 0 }; return &srcloc; }() } 166 + #define TracyLockableN( type, varname, desc ) tracy::Lockable<type> varname { [] () -> const tracy::SourceLocationData* { static constexpr tracy::SourceLocationData srcloc { nullptr, desc, TracyFile, TracyLine, 0 }; return &srcloc; }() } 167 + #define TracySharedLockable( type, varname ) tracy::SharedLockable<type> varname { [] () -> const tracy::SourceLocationData* { static constexpr tracy::SourceLocationData srcloc { nullptr, #type " " #varname, TracyFile, TracyLine, 0 }; return &srcloc; }() } 168 + #define TracySharedLockableN( type, varname, desc ) tracy::SharedLockable<type> varname { [] () -> const tracy::SourceLocationData* { static constexpr tracy::SourceLocationData srcloc { nullptr, desc, TracyFile, TracyLine, 0 }; return &srcloc; }() } 157 169 #define LockableBase( type ) tracy::Lockable<type> 158 170 #define SharedLockableBase( type ) tracy::SharedLockable<type> 159 - #define LockMark( varname ) static constexpr tracy::SourceLocationData __tracy_lock_location_##varname { nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; varname.Mark( &__tracy_lock_location_##varname ) 171 + #define LockMark( varname ) static constexpr tracy::SourceLocationData __tracy_lock_location_##varname { nullptr, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; varname.Mark( &__tracy_lock_location_##varname ) 160 172 #define LockableName( varname, txt, size ) varname.CustomName( txt, size ) 161 173 162 174 #define TracyPlot( name, val ) tracy::Profiler::PlotData( name, val ) ··· 197 209 #endif 198 210 199 211 #ifdef TRACY_HAS_CALLSTACK 200 - # define ZoneNamedS( varname, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), depth, active ) 201 - # define ZoneNamedNS( varname, name, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), depth, active ) 202 - # define ZoneNamedCS( varname, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), depth, active ) 203 - # define ZoneNamedNCS( varname, name, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,__LINE__), depth, active ) 212 + # define ZoneNamedS( varname, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { nullptr, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), depth, active ) 213 + # define ZoneNamedNS( varname, name, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), depth, active ) 214 + # define ZoneNamedCS( varname, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { nullptr, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), depth, active ) 215 + # define ZoneNamedNCS( varname, name, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::ScopedZone varname( &TracyConcat(__tracy_source_location,TracyLine), depth, active ) 204 216 205 - # define ZoneTransientS( varname, depth, active ) tracy::ScopedZone varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), nullptr, 0, depth, active ) 206 - # define ZoneTransientNS( varname, name, depth, active ) tracy::ScopedZone varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), depth, active ) 217 + # define ZoneTransientS( varname, depth, active ) tracy::ScopedZone varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), nullptr, 0, depth, active ) 218 + # define ZoneTransientNS( varname, name, depth, active ) tracy::ScopedZone varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), depth, active ) 207 219 208 220 # define ZoneScopedS( depth ) ZoneNamedS( ___tracy_scoped_zone, depth, true ) 209 221 # define ZoneScopedNS( name, depth ) ZoneNamedNS( ___tracy_scoped_zone, name, depth, true )
+30 -13
src/external/tracy/tracy/TracyC.h
··· 15 15 16 16 #define TracyCSetThreadName( name ) ___tracy_set_thread_name( name ); 17 17 18 + #ifndef TracyFunction 19 + # define TracyFunction __FUNCTION__ 20 + #endif 21 + 22 + #ifndef TracyFile 23 + # define TracyFile __FILE__ 24 + #endif 25 + 26 + #ifndef TracyLine 27 + # define TracyLine __LINE__ 28 + #endif 18 29 19 30 #ifndef TRACY_ENABLE 20 31 ··· 47 58 #define TracyCFrameImage(x,y,z,w,a) 48 59 49 60 #define TracyCPlot(x,y) 61 + #define TracyCPlotF(x,y) 62 + #define TracyCPlotI(x,y) 50 63 #define TracyCMessage(x,y) 51 64 #define TracyCMessageL(x) 52 65 #define TracyCMessageC(x,y,z) ··· 195 208 TRACY_API int ___tracy_connected(void); 196 209 197 210 #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK 198 - # define TracyCZone( ctx, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { NULL, __func__, __FILE__, (uint32_t)__LINE__, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,__LINE__), TRACY_CALLSTACK, active ); 199 - # define TracyCZoneN( ctx, name, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { name, __func__, __FILE__, (uint32_t)__LINE__, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,__LINE__), TRACY_CALLSTACK, active ); 200 - # define TracyCZoneC( ctx, color, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { NULL, __func__, __FILE__, (uint32_t)__LINE__, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,__LINE__), TRACY_CALLSTACK, active ); 201 - # define TracyCZoneNC( ctx, name, color, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { name, __func__, __FILE__, (uint32_t)__LINE__, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,__LINE__), TRACY_CALLSTACK, active ); 211 + # define TracyCZone( ctx, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { NULL, __func__, TracyFile, (uint32_t)TracyLine, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,TracyLine), TRACY_CALLSTACK, active ); 212 + # define TracyCZoneN( ctx, name, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { name, __func__, TracyFile, (uint32_t)TracyLine, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,TracyLine), TRACY_CALLSTACK, active ); 213 + # define TracyCZoneC( ctx, color, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { NULL, __func__, TracyFile, (uint32_t)TracyLine, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,TracyLine), TRACY_CALLSTACK, active ); 214 + # define TracyCZoneNC( ctx, name, color, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { name, __func__, TracyFile, (uint32_t)TracyLine, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,TracyLine), TRACY_CALLSTACK, active ); 202 215 #else 203 - # define TracyCZone( ctx, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { NULL, __func__, __FILE__, (uint32_t)__LINE__, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,__LINE__), active ); 204 - # define TracyCZoneN( ctx, name, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { name, __func__, __FILE__, (uint32_t)__LINE__, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,__LINE__), active ); 205 - # define TracyCZoneC( ctx, color, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { NULL, __func__, __FILE__, (uint32_t)__LINE__, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,__LINE__), active ); 206 - # define TracyCZoneNC( ctx, name, color, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { name, __func__, __FILE__, (uint32_t)__LINE__, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,__LINE__), active ); 216 + # define TracyCZone( ctx, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { NULL, __func__, TracyFile, (uint32_t)TracyLine, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,TracyLine), active ); 217 + # define TracyCZoneN( ctx, name, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { name, __func__, TracyFile, (uint32_t)TracyLine, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,TracyLine), active ); 218 + # define TracyCZoneC( ctx, color, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { NULL, __func__, TracyFile, (uint32_t)TracyLine, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,TracyLine), active ); 219 + # define TracyCZoneNC( ctx, name, color, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { name, __func__, TracyFile, (uint32_t)TracyLine, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,TracyLine), active ); 207 220 #endif 208 221 209 222 #define TracyCZoneEnd( ctx ) ___tracy_emit_zone_end( ctx ); ··· 274 287 275 288 276 289 TRACY_API void ___tracy_emit_plot( const char* name, double val ); 290 + TRACY_API void ___tracy_emit_plot_float( const char* name, float val ); 291 + TRACY_API void ___tracy_emit_plot_int( const char* name, int64_t val ); 277 292 TRACY_API void ___tracy_emit_message_appinfo( const char* txt, size_t size ); 278 293 279 294 #define TracyCPlot( name, val ) ___tracy_emit_plot( name, val ); 295 + #define TracyCPlotF( name, val ) ___tracy_emit_plot_float( name, val ); 296 + #define TracyCPlotI( name, val ) ___tracy_emit_plot_int( name, val ); 280 297 #define TracyCAppInfo( txt, size ) ___tracy_emit_message_appinfo( txt, size ); 281 298 282 299 283 300 #ifdef TRACY_HAS_CALLSTACK 284 - # define TracyCZoneS( ctx, depth, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { NULL, __func__, __FILE__, (uint32_t)__LINE__, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,__LINE__), depth, active ); 285 - # define TracyCZoneNS( ctx, name, depth, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { name, __func__, __FILE__, (uint32_t)__LINE__, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,__LINE__), depth, active ); 286 - # define TracyCZoneCS( ctx, color, depth, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { NULL, __func__, __FILE__, (uint32_t)__LINE__, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,__LINE__), depth, active ); 287 - # define TracyCZoneNCS( ctx, name, color, depth, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { name, __func__, __FILE__, (uint32_t)__LINE__, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,__LINE__), depth, active ); 301 + # define TracyCZoneS( ctx, depth, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { NULL, __func__, TracyFile, (uint32_t)TracyLine, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,TracyLine), depth, active ); 302 + # define TracyCZoneNS( ctx, name, depth, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { name, __func__, TracyFile, (uint32_t)TracyLine, 0 }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,TracyLine), depth, active ); 303 + # define TracyCZoneCS( ctx, color, depth, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { NULL, __func__, TracyFile, (uint32_t)TracyLine, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,TracyLine), depth, active ); 304 + # define TracyCZoneNCS( ctx, name, color, depth, active ) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,TracyLine) = { name, __func__, TracyFile, (uint32_t)TracyLine, color }; TracyCZoneCtx ctx = ___tracy_emit_zone_begin_callstack( &TracyConcat(__tracy_source_location,TracyLine), depth, active ); 288 305 289 306 # define TracyCAllocS( ptr, size, depth ) ___tracy_emit_memory_alloc_callstack( ptr, size, depth, 0 ) 290 307 # define TracyCFreeS( ptr, depth ) ___tracy_emit_memory_free_callstack( ptr, depth, 0 ) ··· 324 341 325 342 #define TracyCIsConnected ___tracy_connected() 326 343 344 + #ifdef TRACY_FIBERS 327 345 TRACY_API void ___tracy_fiber_enter( const char* fiber ); 328 346 TRACY_API void ___tracy_fiber_leave( void ); 329 347 330 - #ifdef TRACY_FIBERS 331 348 # define TracyCFiberEnter( fiber ) ___tracy_fiber_enter( fiber ); 332 349 # define TracyCFiberLeave ___tracy_fiber_leave(); 333 350 #endif
+10 -8
src/external/tracy/tracy/TracyD3D11.hpp
··· 42 42 #include "../common/TracyAlign.hpp" 43 43 #include "../common/TracyAlloc.hpp" 44 44 45 + #include <d3d11.h> 46 + 45 47 namespace tracy 46 48 { 47 49 ··· 410 412 #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK 411 413 # define TracyD3D11Zone( ctx, name ) TracyD3D11NamedZoneS( ctx, ___tracy_gpu_zone, name, TRACY_CALLSTACK, true ) 412 414 # define TracyD3D11ZoneC( ctx, name, color ) TracyD3D11NamedZoneCS( ctx, ___tracy_gpu_zone, name, color, TRACY_CALLSTACK, true ) 413 - # define TracyD3D11NamedZone( ctx, varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), TRACY_CALLSTACK, active ); 414 - # define TracyD3D11NamedZoneC( ctx, varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), TRACY_CALLSTACK, active ); 415 + # define TracyD3D11NamedZone( ctx, varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), TRACY_CALLSTACK, active ); 416 + # define TracyD3D11NamedZoneC( ctx, varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), TRACY_CALLSTACK, active ); 415 417 # define TracyD3D11ZoneTransient(ctx, varname, name, active) TracyD3D11ZoneTransientS(ctx, varname, cmdList, name, TRACY_CALLSTACK, active) 416 418 #else 417 419 # define TracyD3D11Zone( ctx, name ) TracyD3D11NamedZone( ctx, ___tracy_gpu_zone, name, true ) 418 420 # define TracyD3D11ZoneC( ctx, name, color ) TracyD3D11NamedZoneC( ctx, ___tracy_gpu_zone, name, color, true ) 419 - # define TracyD3D11NamedZone( ctx, varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), active ); 420 - # define TracyD3D11NamedZoneC( ctx, varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), active ); 421 - # define TracyD3D11ZoneTransient(ctx, varname, name, active) tracy::D3D11ZoneScope varname{ ctx, __LINE__, __FILE__, strlen(__FILE__), __FUNCTION__, strlen(__FUNCTION__), name, strlen(name), active }; 421 + # define TracyD3D11NamedZone( ctx, varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), active ); 422 + # define TracyD3D11NamedZoneC( ctx, varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), active ); 423 + # define TracyD3D11ZoneTransient(ctx, varname, name, active) tracy::D3D11ZoneScope varname{ ctx, TracyLine, TracyFile, strlen(TracyFile), TracyFunction, strlen(TracyFunction), name, strlen(name), active }; 422 424 #endif 423 425 424 426 #ifdef TRACY_HAS_CALLSTACK 425 427 # define TracyD3D11ZoneS( ctx, name, depth ) TracyD3D11NamedZoneS( ctx, ___tracy_gpu_zone, name, depth, true ) 426 428 # define TracyD3D11ZoneCS( ctx, name, color, depth ) TracyD3D11NamedZoneCS( ctx, ___tracy_gpu_zone, name, color, depth, true ) 427 - # define TracyD3D11NamedZoneS( ctx, varname, name, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), depth, active ); 428 - # define TracyD3D11NamedZoneCS( ctx, varname, name, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), depth, active ); 429 - # define TracyD3D11ZoneTransientS(ctx, varname, name, depth, active) tracy::D3D11ZoneScope varname{ ctx, __LINE__, __FILE__, strlen(__FILE__), __FUNCTION__, strlen(__FUNCTION__), name, strlen(name), depth, active }; 429 + # define TracyD3D11NamedZoneS( ctx, varname, name, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), depth, active ); 430 + # define TracyD3D11NamedZoneCS( ctx, varname, name, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::D3D11ZoneScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), depth, active ); 431 + # define TracyD3D11ZoneTransientS(ctx, varname, name, depth, active) tracy::D3D11ZoneScope varname{ ctx, TracyLine, TracyFile, strlen(TracyFile), TracyFunction, strlen(TracyFunction), name, strlen(name), depth, active }; 430 432 #else 431 433 # define TracyD3D11ZoneS( ctx, name, depth, active ) TracyD3D11Zone( ctx, name ) 432 434 # define TracyD3D11ZoneCS( ctx, name, color, depth, active ) TracyD3D11ZoneC( name, color )
+8 -8
src/external/tracy/tracy/TracyD3D12.hpp
··· 474 474 #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK 475 475 # define TracyD3D12Zone(ctx, cmdList, name) TracyD3D12NamedZoneS(ctx, ___tracy_gpu_zone, cmdList, name, TRACY_CALLSTACK, true) 476 476 # define TracyD3D12ZoneC(ctx, cmdList, name, color) TracyD3D12NamedZoneCS(ctx, ___tracy_gpu_zone, cmdList, name, color, TRACY_CALLSTACK, true) 477 - # define TracyD3D12NamedZone(ctx, varname, cmdList, name, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, __LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, __LINE__), TRACY_CALLSTACK, active }; 478 - # define TracyD3D12NamedZoneC(ctx, varname, cmdList, name, color, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, __LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, __LINE__), TRACY_CALLSTACK, active }; 477 + # define TracyD3D12NamedZone(ctx, varname, cmdList, name, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, TracyLine), TRACY_CALLSTACK, active }; 478 + # define TracyD3D12NamedZoneC(ctx, varname, cmdList, name, color, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, TracyLine), TRACY_CALLSTACK, active }; 479 479 # define TracyD3D12ZoneTransient(ctx, varname, cmdList, name, active) TracyD3D12ZoneTransientS(ctx, varname, cmdList, name, TRACY_CALLSTACK, active) 480 480 #else 481 481 # define TracyD3D12Zone(ctx, cmdList, name) TracyD3D12NamedZone(ctx, ___tracy_gpu_zone, cmdList, name, true) 482 482 # define TracyD3D12ZoneC(ctx, cmdList, name, color) TracyD3D12NamedZoneC(ctx, ___tracy_gpu_zone, cmdList, name, color, true) 483 - # define TracyD3D12NamedZone(ctx, varname, cmdList, name, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, __LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, __LINE__), active }; 484 - # define TracyD3D12NamedZoneC(ctx, varname, cmdList, name, color, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, __LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, __LINE__), active }; 485 - # define TracyD3D12ZoneTransient(ctx, varname, cmdList, name, active) tracy::D3D12ZoneScope varname{ ctx, __LINE__, __FILE__, strlen(__FILE__), __FUNCTION__, strlen(__FUNCTION__), name, strlen(name), cmdList, active }; 483 + # define TracyD3D12NamedZone(ctx, varname, cmdList, name, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, TracyLine), active }; 484 + # define TracyD3D12NamedZoneC(ctx, varname, cmdList, name, color, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, TracyLine), active }; 485 + # define TracyD3D12ZoneTransient(ctx, varname, cmdList, name, active) tracy::D3D12ZoneScope varname{ ctx, TracyLine, TracyFile, strlen(TracyFile), TracyFunction, strlen(TracyFunction), name, strlen(name), cmdList, active }; 486 486 #endif 487 487 488 488 #ifdef TRACY_HAS_CALLSTACK 489 489 # define TracyD3D12ZoneS(ctx, cmdList, name, depth) TracyD3D12NamedZoneS(ctx, ___tracy_gpu_zone, cmdList, name, depth, true) 490 490 # define TracyD3D12ZoneCS(ctx, cmdList, name, color, depth) TracyD3D12NamedZoneCS(ctx, ___tracy_gpu_zone, cmdList, name, color, depth, true) 491 - # define TracyD3D12NamedZoneS(ctx, varname, cmdList, name, depth, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, __LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, __LINE__), depth, active }; 492 - # define TracyD3D12NamedZoneCS(ctx, varname, cmdList, name, color, depth, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, __LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, __LINE__), depth, active }; 493 - # define TracyD3D12ZoneTransientS(ctx, varname, cmdList, name, depth, active) tracy::D3D12ZoneScope varname{ ctx, __LINE__, __FILE__, strlen(__FILE__), __FUNCTION__, strlen(__FUNCTION__), name, strlen(name), cmdList, depth, active }; 491 + # define TracyD3D12NamedZoneS(ctx, varname, cmdList, name, depth, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, TracyLine), depth, active }; 492 + # define TracyD3D12NamedZoneCS(ctx, varname, cmdList, name, color, depth, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location, TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::D3D12ZoneScope varname{ ctx, cmdList, &TracyConcat(__tracy_gpu_source_location, TracyLine), depth, active }; 493 + # define TracyD3D12ZoneTransientS(ctx, varname, cmdList, name, depth, active) tracy::D3D12ZoneScope varname{ ctx, TracyLine, TracyFile, strlen(TracyFile), TracyFunction, strlen(TracyFunction), name, strlen(name), cmdList, depth, active }; 494 494 #else 495 495 # define TracyD3D12ZoneS(ctx, cmdList, name, depth) TracyD3D12Zone(ctx, cmdList, name) 496 496 # define TracyD3D12ZoneCS(ctx, cmdList, name, color, depth) TracyD3D12Zone(ctx, cmdList, name, color)
+11 -11
src/external/tracy/tracy/TracyOpenCL.hpp
··· 47 47 #define TRACY_CL_TO_STRING_INDIRECT(T) #T 48 48 #define TRACY_CL_TO_STRING(T) TRACY_CL_TO_STRING_INDIRECT(T) 49 49 #define TRACY_CL_ASSERT(p) if(!(p)) { \ 50 - TracyMessageL( "TRACY_CL_ASSERT failed on " __FILE__ ":" TRACY_CL_TO_STRING(__LINE__) ); \ 50 + TracyMessageL( "TRACY_CL_ASSERT failed on " TracyFile ":" TRACY_CL_TO_STRING(TracyLine) ); \ 51 51 assert(false && "TRACY_CL_ASSERT failed"); \ 52 52 } 53 53 #define TRACY_CL_CHECK_ERROR(err) if(err != CL_SUCCESS) { \ 54 54 std::ostringstream oss; \ 55 - oss << "TRACY_CL_CHECK_ERROR failed on " << __FILE__ << ":" << __LINE__ \ 55 + oss << "TRACY_CL_CHECK_ERROR failed on " << TracyFile << ":" << TracyLine \ 56 56 << ": error code " << err; \ 57 57 auto msg = oss.str(); \ 58 58 TracyMessage(msg.data(), msg.size()); \ ··· 377 377 #define TracyCLDestroy(ctx) tracy::DestroyCLContext(ctx); 378 378 #define TracyCLContextName(context, name, size) ctx->Name(name, size); 379 379 #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK 380 - # define TracyCLNamedZone(ctx, varname, name, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), TRACY_CALLSTACK, active ); 381 - # define TracyCLNamedZoneC(ctx, varname, name, color, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), TRACY_CALLSTACK, active ); 380 + # define TracyCLNamedZone(ctx, varname, name, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), TRACY_CALLSTACK, active ); 381 + # define TracyCLNamedZoneC(ctx, varname, name, color, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), TRACY_CALLSTACK, active ); 382 382 # define TracyCLZone(ctx, name) TracyCLNamedZoneS(ctx, __tracy_gpu_zone, name, TRACY_CALLSTACK, true) 383 383 # define TracyCLZoneC(ctx, name, color) TracyCLNamedZoneCS(ctx, __tracy_gpu_zone, name, color, TRACY_CALLSTACK, true) 384 - # define TracyCLZoneTransient( ctx, varname, name, active ) tracy::OpenCLCtxScope varname( ctx, __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), TRACY_CALLSTACK, active ); 384 + # define TracyCLZoneTransient( ctx, varname, name, active ) tracy::OpenCLCtxScope varname( ctx, TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), TRACY_CALLSTACK, active ); 385 385 #else 386 - # define TracyCLNamedZone(ctx, varname, name, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__){ name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), active); 387 - # define TracyCLNamedZoneC(ctx, varname, name, color, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__){ name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), active); 386 + # define TracyCLNamedZone(ctx, varname, name, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine){ name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), active); 387 + # define TracyCLNamedZoneC(ctx, varname, name, color, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine){ name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), active); 388 388 # define TracyCLZone(ctx, name) TracyCLNamedZone(ctx, __tracy_gpu_zone, name, true) 389 389 # define TracyCLZoneC(ctx, name, color) TracyCLNamedZoneC(ctx, __tracy_gpu_zone, name, color, true ) 390 - # define TracyCLZoneTransient( ctx, varname, name, active ) tracy::OpenCLCtxScope varname( ctx, __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), active ); 390 + # define TracyCLZoneTransient( ctx, varname, name, active ) tracy::OpenCLCtxScope varname( ctx, TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), active ); 391 391 #endif 392 392 393 393 #ifdef TRACY_HAS_CALLSTACK 394 - # define TracyCLNamedZoneS(ctx, varname, name, depth, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__){ name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), depth, active); 395 - # define TracyCLNamedZoneCS(ctx, varname, name, color, depth, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__){ name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), depth, active); 394 + # define TracyCLNamedZoneS(ctx, varname, name, depth, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine){ name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), depth, active); 395 + # define TracyCLNamedZoneCS(ctx, varname, name, color, depth, active) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine){ name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::OpenCLCtxScope varname(ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), depth, active); 396 396 # define TracyCLZoneS(ctx, name, depth) TracyCLNamedZoneS(ctx, __tracy_gpu_zone, name, depth, true) 397 397 # define TracyCLZoneCS(ctx, name, color, depth) TracyCLNamedZoneCS(ctx, __tracy_gpu_zone, name, color, depth, true) 398 - # define TracyCLZoneTransientS( ctx, varname, name, depth, active ) tracy::OpenCLCtxScope varname( ctx, __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), depth, active ); 398 + # define TracyCLZoneTransientS( ctx, varname, name, depth, active ) tracy::OpenCLCtxScope varname( ctx, TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), depth, active ); 399 399 #else 400 400 # define TracyCLNamedZoneS(ctx, varname, name, depth, active) TracyCLNamedZone(ctx, varname, name, active) 401 401 # define TracyCLNamedZoneCS(ctx, varname, name, color, depth, active) TracyCLNamedZoneC(ctx, varname, name, color, active)
+9 -9
src/external/tracy/tracy/TracyOpenGL.hpp
··· 52 52 #define TracyGpuContext tracy::GetGpuCtx().ptr = (tracy::GpuCtx*)tracy::tracy_malloc( sizeof( tracy::GpuCtx ) ); new(tracy::GetGpuCtx().ptr) tracy::GpuCtx; 53 53 #define TracyGpuContextName( name, size ) tracy::GetGpuCtx().ptr->Name( name, size ); 54 54 #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK 55 - # define TracyGpuNamedZone( varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,__LINE__), TRACY_CALLSTACK, active ); 56 - # define TracyGpuNamedZoneC( varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,__LINE__), TRACY_CALLSTACK, active ); 55 + # define TracyGpuNamedZone( varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,TracyLine), TRACY_CALLSTACK, active ); 56 + # define TracyGpuNamedZoneC( varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,TracyLine), TRACY_CALLSTACK, active ); 57 57 # define TracyGpuZone( name ) TracyGpuNamedZoneS( ___tracy_gpu_zone, name, TRACY_CALLSTACK, true ) 58 58 # define TracyGpuZoneC( name, color ) TracyGpuNamedZoneCS( ___tracy_gpu_zone, name, color, TRACY_CALLSTACK, true ) 59 - # define TracyGpuZoneTransient( varname, name, active ) tracy::GpuCtxScope varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), TRACY_CALLSTACK, active ); 59 + # define TracyGpuZoneTransient( varname, name, active ) tracy::GpuCtxScope varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), TRACY_CALLSTACK, active ); 60 60 #else 61 - # define TracyGpuNamedZone( varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,__LINE__), active ); 62 - # define TracyGpuNamedZoneC( varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,__LINE__), active ); 61 + # define TracyGpuNamedZone( varname, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,TracyLine), active ); 62 + # define TracyGpuNamedZoneC( varname, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,TracyLine), active ); 63 63 # define TracyGpuZone( name ) TracyGpuNamedZone( ___tracy_gpu_zone, name, true ) 64 64 # define TracyGpuZoneC( name, color ) TracyGpuNamedZoneC( ___tracy_gpu_zone, name, color, true ) 65 - # define TracyGpuZoneTransient( varname, name, active ) tracy::GpuCtxScope varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), active ); 65 + # define TracyGpuZoneTransient( varname, name, active ) tracy::GpuCtxScope varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), active ); 66 66 #endif 67 67 #define TracyGpuCollect tracy::GetGpuCtx().ptr->Collect(); 68 68 69 69 #ifdef TRACY_HAS_CALLSTACK 70 - # define TracyGpuNamedZoneS( varname, name, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,__LINE__), depth, active ); 71 - # define TracyGpuNamedZoneCS( varname, name, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,__LINE__), depth, active ); 70 + # define TracyGpuNamedZoneS( varname, name, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,TracyLine), depth, active ); 71 + # define TracyGpuNamedZoneCS( varname, name, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::GpuCtxScope varname( &TracyConcat(__tracy_gpu_source_location,TracyLine), depth, active ); 72 72 # define TracyGpuZoneS( name, depth ) TracyGpuNamedZoneS( ___tracy_gpu_zone, name, depth, true ) 73 73 # define TracyGpuZoneCS( name, color, depth ) TracyGpuNamedZoneCS( ___tracy_gpu_zone, name, color, depth, true ) 74 - # define TracyGpuZoneTransientS( varname, name, depth, active ) tracy::GpuCtxScope varname( __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), depth, active ); 74 + # define TracyGpuZoneTransientS( varname, name, depth, active ) tracy::GpuCtxScope varname( TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), depth, active ); 75 75 #else 76 76 # define TracyGpuNamedZoneS( varname, name, depth, active ) TracyGpuNamedZone( varname, name, active ) 77 77 # define TracyGpuNamedZoneCS( varname, name, color, depth, active ) TracyGpuNamedZoneC( varname, name, color, active )
+8 -8
src/external/tracy/tracy/TracyVulkan.hpp
··· 479 479 #define TracyVkDestroy( ctx ) tracy::DestroyVkContext( ctx ); 480 480 #define TracyVkContextName( ctx, name, size ) ctx->Name( name, size ); 481 481 #if defined TRACY_HAS_CALLSTACK && defined TRACY_CALLSTACK 482 - # define TracyVkNamedZone( ctx, varname, cmdbuf, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), cmdbuf, TRACY_CALLSTACK, active ); 483 - # define TracyVkNamedZoneC( ctx, varname, cmdbuf, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), cmdbuf, TRACY_CALLSTACK, active ); 482 + # define TracyVkNamedZone( ctx, varname, cmdbuf, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), cmdbuf, TRACY_CALLSTACK, active ); 483 + # define TracyVkNamedZoneC( ctx, varname, cmdbuf, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), cmdbuf, TRACY_CALLSTACK, active ); 484 484 # define TracyVkZone( ctx, cmdbuf, name ) TracyVkNamedZoneS( ctx, ___tracy_gpu_zone, cmdbuf, name, TRACY_CALLSTACK, true ) 485 485 # define TracyVkZoneC( ctx, cmdbuf, name, color ) TracyVkNamedZoneCS( ctx, ___tracy_gpu_zone, cmdbuf, name, color, TRACY_CALLSTACK, true ) 486 486 # define TracyVkZoneTransient( ctx, varname, cmdbuf, name, active ) TracyVkZoneTransientS( ctx, varname, cmdbuf, name, TRACY_CALLSTACK, active ) 487 487 #else 488 - # define TracyVkNamedZone( ctx, varname, cmdbuf, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), cmdbuf, active ); 489 - # define TracyVkNamedZoneC( ctx, varname, cmdbuf, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), cmdbuf, active ); 488 + # define TracyVkNamedZone( ctx, varname, cmdbuf, name, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), cmdbuf, active ); 489 + # define TracyVkNamedZoneC( ctx, varname, cmdbuf, name, color, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), cmdbuf, active ); 490 490 # define TracyVkZone( ctx, cmdbuf, name ) TracyVkNamedZone( ctx, ___tracy_gpu_zone, cmdbuf, name, true ) 491 491 # define TracyVkZoneC( ctx, cmdbuf, name, color ) TracyVkNamedZoneC( ctx, ___tracy_gpu_zone, cmdbuf, name, color, true ) 492 - # define TracyVkZoneTransient( ctx, varname, cmdbuf, name, active ) tracy::VkCtxScope varname( ctx, __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), cmdbuf, active ); 492 + # define TracyVkZoneTransient( ctx, varname, cmdbuf, name, active ) tracy::VkCtxScope varname( ctx, TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), cmdbuf, active ); 493 493 #endif 494 494 #define TracyVkCollect( ctx, cmdbuf ) ctx->Collect( cmdbuf ); 495 495 496 496 #ifdef TRACY_HAS_CALLSTACK 497 - # define TracyVkNamedZoneS( ctx, varname, cmdbuf, name, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), cmdbuf, depth, active ); 498 - # define TracyVkNamedZoneCS( ctx, varname, cmdbuf, name, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,__LINE__) { name, __FUNCTION__, __FILE__, (uint32_t)__LINE__, color }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,__LINE__), cmdbuf, depth, active ); 497 + # define TracyVkNamedZoneS( ctx, varname, cmdbuf, name, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, 0 }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), cmdbuf, depth, active ); 498 + # define TracyVkNamedZoneCS( ctx, varname, cmdbuf, name, color, depth, active ) static constexpr tracy::SourceLocationData TracyConcat(__tracy_gpu_source_location,TracyLine) { name, TracyFunction, TracyFile, (uint32_t)TracyLine, color }; tracy::VkCtxScope varname( ctx, &TracyConcat(__tracy_gpu_source_location,TracyLine), cmdbuf, depth, active ); 499 499 # define TracyVkZoneS( ctx, cmdbuf, name, depth ) TracyVkNamedZoneS( ctx, ___tracy_gpu_zone, cmdbuf, name, depth, true ) 500 500 # define TracyVkZoneCS( ctx, cmdbuf, name, color, depth ) TracyVkNamedZoneCS( ctx, ___tracy_gpu_zone, cmdbuf, name, color, depth, true ) 501 - # define TracyVkZoneTransientS( ctx, varname, cmdbuf, name, depth, active ) tracy::VkCtxScope varname( ctx, __LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name, strlen( name ), cmdbuf, depth, active ); 501 + # define TracyVkZoneTransientS( ctx, varname, cmdbuf, name, depth, active ) tracy::VkCtxScope varname( ctx, TracyLine, TracyFile, strlen( TracyFile ), TracyFunction, strlen( TracyFunction ), name, strlen( name ), cmdbuf, depth, active ); 502 502 #else 503 503 # define TracyVkNamedZoneS( ctx, varname, cmdbuf, name, depth, active ) TracyVkNamedZone( ctx, varname, cmdbuf, name, active ) 504 504 # define TracyVkNamedZoneCS( ctx, varname, cmdbuf, name, color, depth, active ) TracyVkNamedZoneC( ctx, varname, cmdbuf, name, color, active )