Index: src/runtime/lookup-asm/lookup-asm-arm-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-arm-elf.S +++ src/runtime/lookup-asm/lookup-asm-arm-elf.S @@ -28,10 +28,13 @@ .macro generate_lookup name not_found \name: cmp r0, #0 beq ret_nil + tst r0, #1 + bne .Ltagged_pointer_\name + ldr r2, [r0, #0] ldr r2, [r2, #32] .Lmain_\name: #ifndef OF_BIG_ENDIAN @@ -57,12 +60,30 @@ cmp r2, #0 beq \not_found(PLT) mov r0, r2 bx lr + +.Ltagged_pointer_\name: + ldr r3, .Lgot$indirect_.Ltagged_pointer_\name + ldr r2, .Lgot$indirect_.Ltagged_pointer_\name+4 + add r3, pc, r3 + + and r0, r0, #0xE + lsl r0, r0, #1 + + ldr r2, [r3, r2] + ldr r2, [r2, r0] + ldr r2, [r2, #32] + + b .Lmain_\name .type \name, %function .size \name, .-\name + +.Lgot$indirect_.Ltagged_pointer_\name: + .long _GLOBAL_OFFSET_TABLE_-(.Ltagged_pointer_\name+16) + .long objc_tagged_pointer_classes(GOT) .endm .macro generate_lookup_super name lookup \name: mov r2, r0