@@ -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,35 @@ cmp r2, #0 beq \not_found(PLT) mov r0, r2 bx lr + +.Ltagged_pointer_\name: + ldr r2, .Lgot$indirect_.Ltagged_pointer_\name + add r2, pc, r2 + + ldr r3, .Lgot$indirect_.Ltagged_pointer_\name+4 + ldr r3, [r2, r3] + ldr r3, [r3] + eor r0, r0, r3 + and r0, r0, #0xE + lsl r0, r0, #1 + + ldr r3, .Lgot$indirect_.Ltagged_pointer_\name+8 + ldr r3, [r2, r3] + ldr r2, [r3, 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+12) + .long objc_tagged_pointer_secret(GOT) + .long objc_tagged_pointer_classes(GOT) .endm .macro generate_lookup_super name lookup \name: mov r2, r0