From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x136.google.com (mail-lf1-x136.google.com [IPv6:2a00:1450:4864:20::136]) by sourceware.org (Postfix) with ESMTPS id BE9C1386102D for ; Wed, 3 Mar 2021 17:06:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org BE9C1386102D Received: by mail-lf1-x136.google.com with SMTP id u4so38281635lfs.0 for ; Wed, 03 Mar 2021 09:06:02 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=YJKOu69uPyJlh0oTwqDFk50ErUrA8MgB++pRufgD3j0=; b=V0OVBBmA4wI49C1RwrqMKHyez03rNTDnZjDq0Mq5fQFDkVMzkh7Q9kA8iByO6w6S9p qgBI0Q1SWj9h/DQDKfCEcnHG1MCfoqqrPlnzH4+rm6jCPSLLP+KfjuDO+1e8Hcp4YmZh jnZPthY2ZlCGx4szBe2zGmgJeAFpCozH4ht4hcXv4om+A1nwQvlFlpspjBIG+nJvquL/ oR/Qt9H7PpCDg9o1bErhSmmGoYSKcryi6p/q/Ft/Vt6xlfKCeR2LqUgUCrOWlgnjBkwc SK46TKuc04OyH73CXsO+eEKGta2e0J8kEAI/K3MsIwN3OcblrfTtdDtem1PQZvqBbVAI ZcHg== X-Gm-Message-State: AOAM533cH1AbIFhWi62mRXTzAhal7bBTBIxUMYRjMAX74EFzdxGRaRcX ftzIYUPnVCSqXqDCfTJUY1ylx0RoG9nyZMNo67KGKCJfq28UpA== X-Google-Smtp-Source: ABdhPJymgc6q6xXOUSLuObrfe8OAy67aVV2AkvWR3paoP3nur+6DqsoHhm0YgrDX1sH+A8T0BdXeJ5R98wMLCtUPIjA= X-Received: by 2002:ac2:538e:: with SMTP id g14mr6980595lfh.543.1614791160531; Wed, 03 Mar 2021 09:06:00 -0800 (PST) MIME-Version: 1.0 From: Evan Bowman Date: Wed, 3 Mar 2021 12:05:49 -0500 Message-ID: Subject: Question about selectors in the Objective-C ABI To: gcc-help@gcc.gnu.org X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, HTML_MESSAGE, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: gcc-help@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-help mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Mar 2021 17:06:05 -0000 Hello, Yesterday, I was playing around with objective-c and GCC, and I have a question about module loading and selectors. Given this minimal sample code: ``` #import "Object.h" #include @interface HelloWorld:Object { } +(void) hello: (const char*) param; +(void) world: (const char*) param; @end @implementation HelloWorld +(void) hello: (const char*) param { printf("hello %s\n", param); } +(void) world: (const char*) param { printf("world %s\n", param); } @end int main() { [HelloWorld hello:"some text"]; } ``` I am able to get the code to compile and link with my own implementations of the objective-c runtime ABI functions, but I'm confused about how to determine the string name of a selector attached to a method definition. For example, I have this C code, which I run upon sending the hello: message to class HelloWorld, in the above example: void debug_walk_class(struct objc_class_gsv1* class, int depth) { printf("name: %s, info: %zu, inst_size: %zu, abi: %zu\n", class->name, class->info, class->instance_size, class->abi_version); if (class->methods) { struct objc_method_list_gcc* methods = class->methods; for (int i = 0; i < methods->count; ++i) { struct objc_method_gcc* method = &methods->methods[i]; printf("method: %s %zu\n", method->types ? method->types : "no types", method->selector->index); } } puts(""); if (class->isa && depth < 2) { debug_walk_class((struct objc_class_gsv1*)class->isa, depth + 1); } } id objc_msg_lookup(id receiver, SEL selector) { debug_walk_class((struct objc_class_gsv1*)receiver, 0); } The output, when walking the class tree, looks like this: name: (null), info: 0, inst_size: 94483748880412, abi: 1 name: HelloWorld, info: 1, inst_size: 8, abi: 0 name: HelloWorld, info: 2, inst_size: 104, abi: 0 method: v24@0:8r*16 5692614131986886519 method: v24@0:8r*16 8574917940748248424 So, I see the two methods in the metaclass, but when I try to print the selector->name string rather than selector->index, the code segfaults, so I guess the selector in this case holds an index rather than a string? Does anyone know how to determine the string name of the selector attached to an objc_method_gcc struct? If not, what does the index represent? The selector passed to objc_msg_lookup, on the other hand, does seem to be a string, I can print it just fine.