Index: src/runtime/lookup-asm/lookup-asm-x86_64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-x86_64-elf.S +++ src/runtime/lookup-asm/lookup-asm-x86_64-elf.S @@ -30,10 +30,13 @@ .macro generate_lookup name not_found \name: test rdi, rdi jz short ret_nil + bt edi, 0 + jc short .Ltagged_pointer_\name + mov r8, [rdi] mov r8, [r8+64] .Lmain_\name: mov rax, [rsi] @@ -49,10 +52,20 @@ test rax, rax jz short \not_found@PLT ret + +.Ltagged_pointer_\name: + movzx r8, dil + shr r8, 1 + + mov rax, [rip+objc_tagged_pointer_classes@GOTPCREL] + mov r8, [rax+r8*8] + mov r8, [r8+64] + + jmp short .Lmain_\name .type \name, %function .size \name, .-\name .endm .macro generate_lookup_super name lookup Index: src/runtime/tagged-pointer.m ================================================================== --- src/runtime/tagged-pointer.m +++ src/runtime/tagged-pointer.m @@ -19,11 +19,11 @@ #import "private.h" #define NUM_TAGGED_POINTER_CLASSES 0x7F -static Class taggedPointerClasses[NUM_TAGGED_POINTER_CLASSES]; +Class objc_tagged_pointer_classes[NUM_TAGGED_POINTER_CLASSES]; static uint_fast8_t taggedPointerClassesCount; int_fast8_t objc_registerTaggedPointerClass(Class class) { @@ -35,11 +35,11 @@ objc_global_mutex_unlock(); return -1; } i = taggedPointerClassesCount++; - taggedPointerClasses[i] = class; + objc_tagged_pointer_classes[i] = class; objc_global_mutex_unlock(); return i; } @@ -53,11 +53,11 @@ pointer >>= 1; if (pointer >= NUM_TAGGED_POINTER_CLASSES) return Nil; - return taggedPointerClasses[pointer]; + return objc_tagged_pointer_classes[pointer]; } uintptr_t object_getTaggedPointerValue(id object) {