; assembly | /* r2dec pseudo code output */ | /* balm_collector.t/none @ 0x40b470 */ | #include | ; (fcn) method.int_BloombergLP::bslmt::ThreadGroup::addThread_bsl.function_void_______bsl::function_void_____const__BloombergLP::bslmt::ThreadAttributes_const_ () | int64_t method_int_BloombergLP::bslmt::ThreadGroup::addThread_bsl_function_void_bsl::function_void_const_BloombergLP::bslmt::ThreadAttributes_const_ (uint32_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_8h; | int64_t var_10h; | int64_t var_18h; | int64_t var_28h; | uint32_t var_30h; | int64_t var_38h; | int64_t var_40h; | int64_t var_48h; | int64_t var_60h; | uint32_t var_68h; | int64_t var_70h; | int64_t var_80h; | int64_t var_88h; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* int BloombergLP::bslmt::ThreadGroup::addThread >(bsl::function const&, BloombergLP::bslmt::ThreadAttributes const&) */ 0x0040b470 push rbp | 0x0040b471 push r14 | 0x0040b473 push rbx | 0x0040b474 sub rsp, 0x90 | 0x0040b47b mov rbx, rdx | rbx = rdx; 0x0040b47e mov rbp, rsi | 0x0040b481 mov r14, rdi | r14 = rdi; 0x0040b484 cmp dword [rdx], 0 | | if (*(rdx) != 0) { 0x0040b487 je 0x40b4c4 | 0x0040b489 lea rdi, [rsp + 0x30] | 0x0040b48e mov rsi, rbx | 0x0040b491 xor edx, edx | 0x0040b493 call 0x40ec90 | BloombergLP::bslmt::ThreadAttributes::ThreadAttributes(BloombergLP::bslmt::ThreadAttributesconst&,BloombergLP::bslma::Allocator*) (rsp + 0x30, rbx, 0); 0x0040b498 mov dword [rsp + 0x30], 0 | *((rsp + 0x30)) = 0; 0x0040b4a0 mov rcx, qword [r14 + 0x20] | rcx = *((r14 + 0x20)); 0x0040b4a4 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0040b4a7 movaps xmmword [rsp + 0x10], xmm0 | *((rsp + 0x10)) = xmm0; 0x0040b4ac movaps xmmword [rsp], xmm0 | *(rsp) = xmm0; 0x0040b4b0 mov rax, qword [rsp + 0x60] | rax = *((rsp + 0x60)); 0x0040b4b5 cmp qword [rsp + 0x68], 0x17 | | if (*((rsp + 0x68)) != 0x17) { 0x0040b4bb je 0x40b4e6 | 0x0040b4bd mov rdx, qword [rsp + 0x48] | rdx = *((rsp + 0x48)); 0x0040b4c2 jmp 0x40b4eb | | } else { 0x0040b4c4 mov rcx, qword [r14 + 0x20] | rcx = *((r14 + 0x20)); 0x0040b4c8 xorps xmm0, xmm0 | __asm ("xorps xmm0, xmm0"); 0x0040b4cb movaps xmmword [rsp + 0x40], xmm0 | *((rsp + 0x40)) = xmm0; 0x0040b4d0 movaps xmmword [rsp + 0x30], xmm0 | *((rsp + 0x30)) = xmm0; 0x0040b4d5 mov rax, qword [rbx + 0x30] | rax = *((rbx + 0x30)); 0x0040b4d9 cmp qword [rbx + 0x38], 0x17 | | if (*((rbx + 0x38)) == 0x17) { 0x0040b4de je 0x40b55b | goto label_0; | } 0x0040b4e0 mov rdx, qword [rbx + 0x18] | rdx = *((rbx + 0x18)); 0x0040b4e4 jmp 0x40b55f | goto label_1; | } 0x0040b4e6 lea rdx, [rsp + 0x48] | rdx = rsp + 0x48; | } 0x0040b4eb mov qword [rsp + 0x80], rdx | *((rsp + 0x80)) = rdx; 0x0040b4f3 mov qword [rsp + 0x88], rax | *((rsp + 0x88)) = rax; 0x0040b4fb mov rdi, rsp | 0x0040b4fe lea rdx, [rsp + 0x80] | 0x0040b506 mov rsi, rbp | 0x0040b509 call 0x40bbe0 | voidBloombergLP::bslmt::EntryPointFunctorAdapterUtil::allocateAdapter>(BloombergLP::bslma::ManagedPtr>>*,bsl::functionconst&,BloombergLP::bslstl::StringRefImpconst&,BloombergLP::bslma::Allocator*) (rsp, rbp, rsp + 0x80, rcx); 0x0040b50e mov rcx, qword [rsp] | 0x0040b512 lea rdi, [rsp + 0x28] | 0x0040b517 lea rsi, [rsp + 0x30] | 0x0040b51c mov edx, 0x40e980 | 0x0040b521 call 0x40f0c0 | eax = BloombergLP::bslmt::ThreadUtilImpl::create(unsigned long*,BloombergLP::bslmt::ThreadAttributesconst&,void*(*)(void*),void*) (rsp + 0x28, rsp + 0x30, sym.bslmt_EntryPointFunctorAdapter_invoker, *(rsp)); 0x0040b526 mov ebp, eax | 0x0040b528 test eax, eax | | if (eax != 0) { 0x0040b52a je 0x40b541 | 0x0040b52c cmp qword [rsp], 0 | | if (*(rsp) == 0) { 0x0040b531 je 0x40b541 | goto label_2; | } 0x0040b533 mov rdi, qword [rsp + 8] | rdi = *((rsp + 8)); 0x0040b538 mov rsi, qword [rsp + 0x10] | rsi = *((rsp + 0x10)); 0x0040b53d call qword [rsp + 0x18] | uint64_t (*rsp + 0x18)() (); | } | label_2: 0x0040b541 cmp qword [rsp + 0x68], 0x17 | | if (*((rsp + 0x68)) != 0x17) { 0x0040b547 je 0x40b5ab | 0x0040b549 mov rsi, qword [rsp + 0x48] | rsi = *((rsp + 0x48)); 0x0040b54e mov rdi, qword [rsp + 0x70] | rdi = *((rsp + 0x70)); 0x0040b553 mov rax, qword [rdi] | rax = *(rdi); 0x0040b556 call qword [rax + 0x18] | rax = uint64_t (*rax + 0x18)() (); 0x0040b559 jmp 0x40b5ab | goto label_3; | label_0: 0x0040b55b lea rdx, [rbx + 0x18] | rdx = rbx + 0x18; | label_1: 0x0040b55f mov qword [rsp], rdx | *(rsp) = rdx; 0x0040b563 mov qword [rsp + 8], rax | *((rsp + 8)) = rax; 0x0040b568 lea rdi, [rsp + 0x30] | 0x0040b56d mov rdx, rsp | 0x0040b570 mov rsi, rbp | 0x0040b573 call 0x40bbe0 | voidBloombergLP::bslmt::EntryPointFunctorAdapterUtil::allocateAdapter>(BloombergLP::bslma::ManagedPtr>>*,bsl::functionconst&,BloombergLP::bslstl::StringRefImpconst&,BloombergLP::bslma::Allocator*) (rsp + 0x30, rbp, rsp, rcx); 0x0040b578 mov rcx, qword [rsp + 0x30] | 0x0040b57d lea rdi, [rsp + 0x28] | 0x0040b582 mov edx, 0x40e980 | 0x0040b587 mov rsi, rbx | 0x0040b58a call 0x40f0c0 | eax = BloombergLP::bslmt::ThreadUtilImpl::create(unsigned long*,BloombergLP::bslmt::ThreadAttributesconst&,void*(*)(void*),void*) (rsp + 0x28, rbx, sym.bslmt_EntryPointFunctorAdapter_invoker, *((rsp + 0x30))); 0x0040b58f mov ebp, eax | 0x0040b591 test eax, eax | | if (eax == 0) { 0x0040b593 je 0x40b5ab | goto label_3; | } 0x0040b595 cmp qword [rsp + 0x30], 0 | | if (*((rsp + 0x30)) == 0) { 0x0040b59b je 0x40b5ab | goto label_3; | } 0x0040b59d mov rdi, qword [rsp + 0x38] | rdi = *((rsp + 0x38)); 0x0040b5a2 mov rsi, qword [rsp + 0x40] | rsi = *((rsp + 0x40)); 0x0040b5a7 call qword [rsp + 0x48] | uint64_t (*rsp + 0x48)() (); | } | label_3: 0x0040b5ab test ebp, ebp | | if (ebp == 0) { 0x0040b5ad jne 0x40b5bc | 0x0040b5af lea rsi, [rsp + 0x28] | 0x0040b5b4 mov rdi, r14 | 0x0040b5b7 call 0x40efd0 | BloombergLP::bslmt::ThreadGroup::addThread(unsigned longconst&) (r14, rsp + 0x28); | } 0x0040b5bc mov eax, ebp | eax = ebp; 0x0040b5be add rsp, 0x90 | 0x0040b5c5 pop rbx | 0x0040b5c6 pop r14 | 0x0040b5c8 pop rbp | 0x0040b5c9 ret | return rax; | }