1// TODO These arrays should be generated automatically or have instructions for re-creation. 2static constexpr uint8_t expected_asm_kThumb2[] = { 3 0x2D, 0xE9, 0xE0, 0x4D, 0x2D, 0xED, 0x10, 0x8A, 0x89, 0xB0, 0x00, 0x90, 4 0x21, 0x91, 0x8D, 0xED, 0x22, 0x0A, 0x23, 0x92, 0x24, 0x93, 0x88, 0xB0, 5 0x08, 0xB0, 0x09, 0xB0, 0xBD, 0xEC, 0x10, 0x8A, 0xBD, 0xE8, 0xE0, 0x4D, 6 0xD9, 0xF8, 0x30, 0x80, 0x70, 0x47, 7}; 8static constexpr uint8_t expected_cfi_kThumb2[] = { 9 0x44, 0x0E, 0x1C, 0x85, 0x07, 0x86, 0x06, 0x87, 0x05, 0x88, 0x04, 0x8A, 10 0x03, 0x8B, 0x02, 0x8E, 0x01, 0x44, 0x0E, 0x5C, 0x05, 0x50, 0x17, 0x05, 11 0x51, 0x16, 0x05, 0x52, 0x15, 0x05, 0x53, 0x14, 0x05, 0x54, 0x13, 0x05, 12 0x55, 0x12, 0x05, 0x56, 0x11, 0x05, 0x57, 0x10, 0x05, 0x58, 0x0F, 0x05, 13 0x59, 0x0E, 0x05, 0x5A, 0x0D, 0x05, 0x5B, 0x0C, 0x05, 0x5C, 0x0B, 0x05, 14 0x5D, 0x0A, 0x05, 0x5E, 0x09, 0x05, 0x5F, 0x08, 0x42, 0x0E, 0x80, 0x01, 15 0x4E, 0x0E, 0xA0, 0x01, 0x42, 0x0E, 0x80, 0x01, 0x0A, 0x42, 0x0E, 0x5C, 16 0x44, 0x0E, 0x1C, 0x06, 0x50, 0x06, 0x51, 0x06, 0x52, 0x06, 0x53, 0x06, 17 0x54, 0x06, 0x55, 0x06, 0x56, 0x06, 0x57, 0x06, 0x58, 0x06, 0x59, 0x06, 18 0x5A, 0x06, 0x5B, 0x06, 0x5C, 0x06, 0x5D, 0x06, 0x5E, 0x06, 0x5F, 0x4A, 19 0x0B, 0x0E, 0x80, 0x01, 20}; 21// 0x00000000: push {r5,r6,r7,r8,r10,r11,lr} 22// 0x00000004: .cfi_def_cfa_offset: 28 23// 0x00000004: .cfi_offset: r5 at cfa-28 24// 0x00000004: .cfi_offset: r6 at cfa-24 25// 0x00000004: .cfi_offset: r7 at cfa-20 26// 0x00000004: .cfi_offset: r8 at cfa-16 27// 0x00000004: .cfi_offset: r10 at cfa-12 28// 0x00000004: .cfi_offset: r11 at cfa-8 29// 0x00000004: .cfi_offset: r14 at cfa-4 30// 0x00000004: vpush {s16-s31} 31// 0x00000008: .cfi_def_cfa_offset: 92 32// 0x00000008: .cfi_offset_extended: r80 at cfa-92 33// 0x00000008: .cfi_offset_extended: r81 at cfa-88 34// 0x00000008: .cfi_offset_extended: r82 at cfa-84 35// 0x00000008: .cfi_offset_extended: r83 at cfa-80 36// 0x00000008: .cfi_offset_extended: r84 at cfa-76 37// 0x00000008: .cfi_offset_extended: r85 at cfa-72 38// 0x00000008: .cfi_offset_extended: r86 at cfa-68 39// 0x00000008: .cfi_offset_extended: r87 at cfa-64 40// 0x00000008: .cfi_offset_extended: r88 at cfa-60 41// 0x00000008: .cfi_offset_extended: r89 at cfa-56 42// 0x00000008: .cfi_offset_extended: r90 at cfa-52 43// 0x00000008: .cfi_offset_extended: r91 at cfa-48 44// 0x00000008: .cfi_offset_extended: r92 at cfa-44 45// 0x00000008: .cfi_offset_extended: r93 at cfa-40 46// 0x00000008: .cfi_offset_extended: r94 at cfa-36 47// 0x00000008: .cfi_offset_extended: r95 at cfa-32 48// 0x00000008: sub sp, #36 49// 0x0000000a: .cfi_def_cfa_offset: 128 50// 0x0000000a: str r0, [sp] 51// 0x0000000c: str r1, [sp, #132] 52// 0x0000000e: vstr s0, [sp, #136] 53// 0x00000012: str r2, [sp, #140] 54// 0x00000014: str r3, [sp, #144] 55// 0x00000016: sub sp, #32 56// 0x00000018: .cfi_def_cfa_offset: 160 57// 0x00000018: add sp, #32 58// 0x0000001a: .cfi_def_cfa_offset: 128 59// 0x0000001a: .cfi_remember_state 60// 0x0000001a: add sp, #36 61// 0x0000001c: .cfi_def_cfa_offset: 92 62// 0x0000001c: vpop {s16-s31} 63// 0x00000020: .cfi_def_cfa_offset: 28 64// 0x00000020: .cfi_restore_extended: r80 65// 0x00000020: .cfi_restore_extended: r81 66// 0x00000020: .cfi_restore_extended: r82 67// 0x00000020: .cfi_restore_extended: r83 68// 0x00000020: .cfi_restore_extended: r84 69// 0x00000020: .cfi_restore_extended: r85 70// 0x00000020: .cfi_restore_extended: r86 71// 0x00000020: .cfi_restore_extended: r87 72// 0x00000020: .cfi_restore_extended: r88 73// 0x00000020: .cfi_restore_extended: r89 74// 0x00000020: .cfi_restore_extended: r90 75// 0x00000020: .cfi_restore_extended: r91 76// 0x00000020: .cfi_restore_extended: r92 77// 0x00000020: .cfi_restore_extended: r93 78// 0x00000020: .cfi_restore_extended: r94 79// 0x00000020: .cfi_restore_extended: r95 80// 0x00000020: pop {r5,r6,r7,r8,r10,r11,lr} 81// 0x00000024: ldr r8, [tr, #48] ; is_gc_marking 82// 0x00000028: bx lr 83// 0x0000002a: .cfi_restore_state 84// 0x0000002a: .cfi_def_cfa_offset: 128 85 86static constexpr uint8_t expected_asm_kArm64[] = { 87 0xFF, 0x03, 0x03, 0xD1, 0xF3, 0x53, 0x06, 0xA9, 0xF5, 0x5B, 0x07, 0xA9, 88 0xF7, 0x63, 0x08, 0xA9, 0xF9, 0x6B, 0x09, 0xA9, 0xFB, 0x73, 0x0A, 0xA9, 89 0xFD, 0x7B, 0x0B, 0xA9, 0xE8, 0x27, 0x02, 0x6D, 0xEA, 0x2F, 0x03, 0x6D, 90 0xEC, 0x37, 0x04, 0x6D, 0xEE, 0x3F, 0x05, 0x6D, 0xE0, 0x03, 0x00, 0xF9, 91 0xE1, 0xCB, 0x00, 0xB9, 0xE0, 0xCF, 0x00, 0xBD, 0xE2, 0xD3, 0x00, 0xB9, 92 0xE3, 0xD7, 0x00, 0xB9, 0xFF, 0x83, 0x00, 0xD1, 0xFF, 0x83, 0x00, 0x91, 93 0xF3, 0x53, 0x46, 0xA9, 0xF5, 0x5B, 0x47, 0xA9, 0xF7, 0x63, 0x48, 0xA9, 94 0xF9, 0x6B, 0x49, 0xA9, 0xFB, 0x73, 0x4A, 0xA9, 0xFD, 0x7B, 0x4B, 0xA9, 95 0xE8, 0x27, 0x42, 0x6D, 0xEA, 0x2F, 0x43, 0x6D, 0xEC, 0x37, 0x44, 0x6D, 96 0xEE, 0x3F, 0x45, 0x6D, 0x74, 0x32, 0x40, 0xB9, 0xFF, 0x03, 0x03, 0x91, 97 0xC0, 0x03, 0x5F, 0xD6, 98}; 99static constexpr uint8_t expected_cfi_kArm64[] = { 100 0x44, 0x0E, 0xC0, 0x01, 0x44, 0x93, 0x18, 0x94, 0x16, 0x44, 0x95, 0x14, 101 0x96, 0x12, 0x44, 0x97, 0x10, 0x98, 0x0E, 0x44, 0x99, 0x0C, 0x9A, 0x0A, 102 0x44, 0x9B, 0x08, 0x9C, 0x06, 0x44, 0x9D, 0x04, 0x9E, 0x02, 0x44, 0x05, 103 0x48, 0x28, 0x05, 0x49, 0x26, 0x44, 0x05, 0x4A, 0x24, 0x05, 0x4B, 0x22, 104 0x44, 0x05, 0x4C, 0x20, 0x05, 0x4D, 0x1E, 0x44, 0x05, 0x4E, 0x1C, 0x05, 105 0x4F, 0x1A, 0x58, 0x0E, 0xE0, 0x01, 0x44, 0x0E, 0xC0, 0x01, 0x0A, 0x44, 106 0xD3, 0xD4, 0x44, 0xD5, 0xD6, 0x44, 0xD7, 0xD8, 0x44, 0xD9, 0xDA, 0x44, 107 0xDB, 0xDC, 0x44, 0xDD, 0xDE, 0x44, 0x06, 0x48, 0x06, 0x49, 0x44, 0x06, 108 0x4A, 0x06, 0x4B, 0x44, 0x06, 0x4C, 0x06, 0x4D, 0x44, 0x06, 0x4E, 0x06, 109 0x4F, 0x48, 0x0E, 0x00, 0x44, 0x0B, 0x0E, 0xC0, 0x01, 110}; 111// 0x00000000: sub sp, sp, #0xc0 (192) 112// 0x00000004: .cfi_def_cfa_offset: 192 113// 0x00000004: stp tr, x20, [sp, #96] 114// 0x00000008: .cfi_offset: r19 at cfa-96 115// 0x00000008: .cfi_offset: r20 at cfa-88 116// 0x00000008: stp x21, x22, [sp, #112] 117// 0x0000000c: .cfi_offset: r21 at cfa-80 118// 0x0000000c: .cfi_offset: r22 at cfa-72 119// 0x0000000c: stp x23, x24, [sp, #128] 120// 0x00000010: .cfi_offset: r23 at cfa-64 121// 0x00000010: .cfi_offset: r24 at cfa-56 122// 0x00000010: stp x25, x26, [sp, #144] 123// 0x00000014: .cfi_offset: r25 at cfa-48 124// 0x00000014: .cfi_offset: r26 at cfa-40 125// 0x00000014: stp x27, x28, [sp, #160] 126// 0x00000018: .cfi_offset: r27 at cfa-32 127// 0x00000018: .cfi_offset: r28 at cfa-24 128// 0x00000018: stp x29, lr, [sp, #176] 129// 0x0000001c: .cfi_offset: r29 at cfa-16 130// 0x0000001c: .cfi_offset: r30 at cfa-8 131// 0x0000001c: stp d8, d9, [sp, #32] 132// 0x00000020: .cfi_offset_extended: r72 at cfa-160 133// 0x00000020: .cfi_offset_extended: r73 at cfa-152 134// 0x00000020: stp d10, d11, [sp, #48] 135// 0x00000024: .cfi_offset_extended: r74 at cfa-144 136// 0x00000024: .cfi_offset_extended: r75 at cfa-136 137// 0x00000024: stp d12, d13, [sp, #64] 138// 0x00000028: .cfi_offset_extended: r76 at cfa-128 139// 0x00000028: .cfi_offset_extended: r77 at cfa-120 140// 0x00000028: stp d14, d15, [sp, #80] 141// 0x0000002c: .cfi_offset_extended: r78 at cfa-112 142// 0x0000002c: .cfi_offset_extended: r79 at cfa-104 143// 0x0000002c: str x0, [sp] 144// 0x00000030: str w1, [sp, #200] 145// 0x00000034: str s0, [sp, #204] 146// 0x00000038: str w2, [sp, #208] 147// 0x0000003c: str w3, [sp, #212] 148// 0x00000040: sub sp, sp, #0x20 (32) 149// 0x00000044: .cfi_def_cfa_offset: 224 150// 0x00000044: add sp, sp, #0x20 (32) 151// 0x00000048: .cfi_def_cfa_offset: 192 152// 0x00000048: .cfi_remember_state 153// 0x00000048: ldp tr, x20, [sp, #96] 154// 0x0000004c: .cfi_restore: r19 155// 0x0000004c: .cfi_restore: r20 156// 0x0000004c: ldp x21, x22, [sp, #112] 157// 0x00000050: .cfi_restore: r21 158// 0x00000050: .cfi_restore: r22 159// 0x00000050: ldp x23, x24, [sp, #128] 160// 0x00000054: .cfi_restore: r23 161// 0x00000054: .cfi_restore: r24 162// 0x00000054: ldp x25, x26, [sp, #144] 163// 0x00000058: .cfi_restore: r25 164// 0x00000058: .cfi_restore: r26 165// 0x00000058: ldp x27, x28, [sp, #160] 166// 0x0000005c: .cfi_restore: r27 167// 0x0000005c: .cfi_restore: r28 168// 0x0000005c: ldp x29, lr, [sp, #176] 169// 0x00000060: .cfi_restore: r29 170// 0x00000060: .cfi_restore: r30 171// 0x00000060: ldp d8, d9, [sp, #32] 172// 0x00000064: .cfi_restore_extended: r72 173// 0x00000064: .cfi_restore_extended: r73 174// 0x00000064: ldp d10, d11, [sp, #48] 175// 0x00000068: .cfi_restore_extended: r74 176// 0x00000068: .cfi_restore_extended: r75 177// 0x00000068: ldp d12, d13, [sp, #64] 178// 0x0000006c: .cfi_restore_extended: r76 179// 0x0000006c: .cfi_restore_extended: r77 180// 0x0000006c: ldp d14, d15, [sp, #80] 181// 0x00000070: .cfi_restore_extended: r78 182// 0x00000070: .cfi_restore_extended: r79 183// 0x00000070: ldr w20, [tr, #50] ; is_gc_marking 184// 0x00000074: add sp, sp, #0xc0 (192) 185// 0x00000078: .cfi_def_cfa_offset: 0 186// 0x00000078: ret 187// 0x0000007c: .cfi_restore_state 188// 0x0000007c: .cfi_def_cfa_offset: 192 189 190static constexpr uint8_t expected_asm_kX86[] = { 191 0x57, 0x56, 0x55, 0x83, 0xC4, 0xE4, 0x50, 0x89, 0x4C, 0x24, 0x34, 0xF3, 192 0x0F, 0x11, 0x44, 0x24, 0x38, 0x89, 0x54, 0x24, 0x3C, 0x89, 0x5C, 0x24, 193 0x40, 0x83, 0xC4, 0xE0, 0x83, 0xC4, 0x20, 0x83, 0xC4, 0x20, 0x5D, 0x5E, 194 0x5F, 0xC3, 195}; 196static constexpr uint8_t expected_cfi_kX86[] = { 197 0x41, 0x0E, 0x08, 0x87, 0x02, 0x41, 0x0E, 0x0C, 0x86, 0x03, 0x41, 0x0E, 198 0x10, 0x85, 0x04, 0x43, 0x0E, 0x2C, 0x41, 0x0E, 0x30, 0x55, 0x0E, 0x50, 199 0x43, 0x0E, 0x30, 0x0A, 0x43, 0x0E, 0x10, 0x41, 0x0E, 0x0C, 0xC5, 0x41, 200 0x0E, 0x08, 0xC6, 0x41, 0x0E, 0x04, 0xC7, 0x41, 0x0B, 0x0E, 0x30, 201}; 202// 0x00000000: push edi 203// 0x00000001: .cfi_def_cfa_offset: 8 204// 0x00000001: .cfi_offset: r7 at cfa-8 205// 0x00000001: push esi 206// 0x00000002: .cfi_def_cfa_offset: 12 207// 0x00000002: .cfi_offset: r6 at cfa-12 208// 0x00000002: push ebp 209// 0x00000003: .cfi_def_cfa_offset: 16 210// 0x00000003: .cfi_offset: r5 at cfa-16 211// 0x00000003: add esp, -28 212// 0x00000006: .cfi_def_cfa_offset: 44 213// 0x00000006: push eax 214// 0x00000007: .cfi_def_cfa_offset: 48 215// 0x00000007: mov [esp + 52], ecx 216// 0x0000000b: movss [esp + 56], xmm0 217// 0x00000011: mov [esp + 60], edx 218// 0x00000015: mov [esp + 64], ebx 219// 0x00000019: add esp, -32 220// 0x0000001c: .cfi_def_cfa_offset: 80 221// 0x0000001c: add esp, 32 222// 0x0000001f: .cfi_def_cfa_offset: 48 223// 0x0000001f: .cfi_remember_state 224// 0x0000001f: add esp, 32 225// 0x00000022: .cfi_def_cfa_offset: 16 226// 0x00000022: pop ebp 227// 0x00000023: .cfi_def_cfa_offset: 12 228// 0x00000023: .cfi_restore: r5 229// 0x00000023: pop esi 230// 0x00000024: .cfi_def_cfa_offset: 8 231// 0x00000024: .cfi_restore: r6 232// 0x00000024: pop edi 233// 0x00000025: .cfi_def_cfa_offset: 4 234// 0x00000025: .cfi_restore: r7 235// 0x00000025: ret 236// 0x00000026: .cfi_restore_state 237// 0x00000026: .cfi_def_cfa_offset: 48 238 239static constexpr uint8_t expected_asm_kX86_64[] = { 240 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, 0x55, 0x53, 0x48, 0x83, 241 0xEC, 0x48, 0xF2, 0x44, 0x0F, 0x11, 0x7C, 0x24, 0x40, 0xF2, 0x44, 0x0F, 242 0x11, 0x74, 0x24, 0x38, 0xF2, 0x44, 0x0F, 0x11, 0x6C, 0x24, 0x30, 0xF2, 243 0x44, 0x0F, 0x11, 0x64, 0x24, 0x28, 0x48, 0x89, 0x3C, 0x24, 0x89, 0xB4, 244 0x24, 0x88, 0x00, 0x00, 0x00, 0xF3, 0x0F, 0x11, 0x84, 0x24, 0x8C, 0x00, 245 0x00, 0x00, 0x89, 0x94, 0x24, 0x90, 0x00, 0x00, 0x00, 0x89, 0x8C, 0x24, 246 0x94, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0xE0, 0x48, 0x83, 0xC4, 0x20, 247 0xF2, 0x44, 0x0F, 0x10, 0x64, 0x24, 0x28, 0xF2, 0x44, 0x0F, 0x10, 0x6C, 248 0x24, 0x30, 0xF2, 0x44, 0x0F, 0x10, 0x74, 0x24, 0x38, 0xF2, 0x44, 0x0F, 249 0x10, 0x7C, 0x24, 0x40, 0x48, 0x83, 0xC4, 0x48, 0x5B, 0x5D, 0x41, 0x5C, 250 0x41, 0x5D, 0x41, 0x5E, 0x41, 0x5F, 0xC3, 251}; 252static constexpr uint8_t expected_cfi_kX86_64[] = { 253 0x42, 0x0E, 0x10, 0x8F, 0x04, 0x42, 0x0E, 0x18, 0x8E, 0x06, 0x42, 0x0E, 254 0x20, 0x8D, 0x08, 0x42, 0x0E, 0x28, 0x8C, 0x0A, 0x41, 0x0E, 0x30, 0x86, 255 0x0C, 0x41, 0x0E, 0x38, 0x83, 0x0E, 0x44, 0x0E, 0x80, 0x01, 0x47, 0xA0, 256 0x10, 0x47, 0x9F, 0x12, 0x47, 0x9E, 0x14, 0x47, 0x9D, 0x16, 0x66, 0x0E, 257 0xA0, 0x01, 0x44, 0x0E, 0x80, 0x01, 0x0A, 0x47, 0xDD, 0x47, 0xDE, 0x47, 258 0xDF, 0x47, 0xE0, 0x44, 0x0E, 0x38, 0x41, 0x0E, 0x30, 0xC3, 0x41, 0x0E, 259 0x28, 0xC6, 0x42, 0x0E, 0x20, 0xCC, 0x42, 0x0E, 0x18, 0xCD, 0x42, 0x0E, 260 0x10, 0xCE, 0x42, 0x0E, 0x08, 0xCF, 0x41, 0x0B, 0x0E, 0x80, 0x01, 261}; 262// 0x00000000: push r15 263// 0x00000002: .cfi_def_cfa_offset: 16 264// 0x00000002: .cfi_offset: r15 at cfa-16 265// 0x00000002: push r14 266// 0x00000004: .cfi_def_cfa_offset: 24 267// 0x00000004: .cfi_offset: r14 at cfa-24 268// 0x00000004: push r13 269// 0x00000006: .cfi_def_cfa_offset: 32 270// 0x00000006: .cfi_offset: r13 at cfa-32 271// 0x00000006: push r12 272// 0x00000008: .cfi_def_cfa_offset: 40 273// 0x00000008: .cfi_offset: r12 at cfa-40 274// 0x00000008: push rbp 275// 0x00000009: .cfi_def_cfa_offset: 48 276// 0x00000009: .cfi_offset: r6 at cfa-48 277// 0x00000009: push rbx 278// 0x0000000a: .cfi_def_cfa_offset: 56 279// 0x0000000a: .cfi_offset: r3 at cfa-56 280// 0x0000000a: subq rsp, 72 281// 0x0000000e: .cfi_def_cfa_offset: 128 282// 0x0000000e: movsd [rsp + 64], xmm15 283// 0x00000015: .cfi_offset: r32 at cfa-64 284// 0x00000015: movsd [rsp + 56], xmm14 285// 0x0000001c: .cfi_offset: r31 at cfa-72 286// 0x0000001c: movsd [rsp + 48], xmm13 287// 0x00000023: .cfi_offset: r30 at cfa-80 288// 0x00000023: movsd [rsp + 40], xmm12 289// 0x0000002a: .cfi_offset: r29 at cfa-88 290// 0x0000002a: movq [rsp], rdi 291// 0x0000002e: mov [rsp + 136], esi 292// 0x00000035: movss [rsp + 140], xmm0 293// 0x0000003e: mov [rsp + 144], edx 294// 0x00000045: mov [rsp + 148], ecx 295// 0x0000004c: addq rsp, -32 296// 0x00000050: .cfi_def_cfa_offset: 160 297// 0x00000050: addq rsp, 32 298// 0x00000054: .cfi_def_cfa_offset: 128 299// 0x00000054: .cfi_remember_state 300// 0x00000054: movsd xmm12, [rsp + 40] 301// 0x0000005b: .cfi_restore: r29 302// 0x0000005b: movsd xmm13, [rsp + 48] 303// 0x00000062: .cfi_restore: r30 304// 0x00000062: movsd xmm14, [rsp + 56] 305// 0x00000069: .cfi_restore: r31 306// 0x00000069: movsd xmm15, [rsp + 64] 307// 0x00000070: .cfi_restore: r32 308// 0x00000070: addq rsp, 72 309// 0x00000074: .cfi_def_cfa_offset: 56 310// 0x00000074: pop rbx 311// 0x00000075: .cfi_def_cfa_offset: 48 312// 0x00000075: .cfi_restore: r3 313// 0x00000075: pop rbp 314// 0x00000076: .cfi_def_cfa_offset: 40 315// 0x00000076: .cfi_restore: r6 316// 0x00000076: pop r12 317// 0x00000078: .cfi_def_cfa_offset: 32 318// 0x00000078: .cfi_restore: r12 319// 0x00000078: pop r13 320// 0x0000007a: .cfi_def_cfa_offset: 24 321// 0x0000007a: .cfi_restore: r13 322// 0x0000007a: pop r14 323// 0x0000007c: .cfi_def_cfa_offset: 16 324// 0x0000007c: .cfi_restore: r14 325// 0x0000007c: pop r15 326// 0x0000007e: .cfi_def_cfa_offset: 8 327// 0x0000007e: .cfi_restore: r15 328// 0x0000007e: ret 329// 0x0000007f: .cfi_restore_state 330// 0x0000007f: .cfi_def_cfa_offset: 128 331 332