unsigned char * codeSnippet( unsigned char * code, sal_Int32 functionIndex, sal_Int32 vtableOffset, bool simpleRetType) { sal_uInt32 index = functionIndex; if (!simpleRetType) { index |= 0x80000000; } unsigned int * p = reinterpret_cast< unsigned int * >(code); OSL_ASSERT(sizeof (unsigned int) == 4); // st %o0, [%sp+68]: *p++ = 0xD023A044; // st %o1, [%sp+72]: *p++ = 0xD223A048; // st %o2, [%sp+76]: *p++ = 0xD423A04C; // st %o3, [%sp+80]: *p++ = 0xD623A050; // st %o4, [%sp+84]: *p++ = 0xD823A054; // st %o5, [%sp+88]: *p++ = 0xDA23A058; // sethi %hi(index), %o0: *p++ = 0x11000000 | (index >> 10); // or %o0, %lo(index), %o0: *p++ = 0x90122000 | (index & 0x3FF); // sethi %hi(vtableOffset), %o2: *p++ = 0x15000000 | (vtableOffset >> 10); // or %o2, %lo(vtableOffset), %o2: *p++ = 0x9412A000 | (vtableOffset & 0x3FF); // sethi %hi(cpp_vtable_call), %o3: *p++ = 0x17000000 | (reinterpret_cast< unsigned int >(cpp_vtable_call) >> 10); // or %o3, %lo(cpp_vtable_call), %o3: *p++ = 0x9612E000 | (reinterpret_cast< unsigned int >(cpp_vtable_call) & 0x3FF); // jmpl %o3, %g0: *p++ = 0x81C2C000; // mov %sp, %o1: *p++ = 0x9210000E; OSL_ASSERT( reinterpret_cast< unsigned char * >(p) - code <= codeSnippetSize); return code + codeSnippetSize; }