From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from forward100p.mail.yandex.net (forward100p.mail.yandex.net [IPv6:2a02:6b8:0:1472:2741:0:8b7:100]) by sourceware.org (Postfix) with ESMTPS id 93D07385802A for ; Wed, 3 Mar 2021 22:45:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 93D07385802A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=yandex.ru Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=hi-angel@yandex.ru Received: from forward101q.mail.yandex.net (forward101q.mail.yandex.net [IPv6:2a02:6b8:c0e:4b:0:640:4012:bb98]) by forward100p.mail.yandex.net (Yandex) with ESMTP id 5B24C5980169; Thu, 4 Mar 2021 01:45:08 +0300 (MSK) Received: from vla1-e8d3e6f22b4d.qloud-c.yandex.net (vla1-e8d3e6f22b4d.qloud-c.yandex.net [IPv6:2a02:6b8:c0d:3603:0:640:e8d3:e6f2]) by forward101q.mail.yandex.net (Yandex) with ESMTP id 50B74CF40021; Thu, 4 Mar 2021 01:45:08 +0300 (MSK) Received: from vla5-8422ddc3185d.qloud-c.yandex.net (vla5-8422ddc3185d.qloud-c.yandex.net [2a02:6b8:c18:3495:0:640:8422:ddc3]) by vla1-e8d3e6f22b4d.qloud-c.yandex.net (mxback/Yandex) with ESMTP id r99JlHJwsv-j8IqC3OZ; Thu, 04 Mar 2021 01:45:08 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1614811508; bh=VpgbZ3KcT/mq3IMlhAiAm2Wf6ssuI6+KXHp3XEYMJn4=; h=In-Reply-To:Cc:To:From:Subject:Message-ID:References:Date; b=gQ94gIQ07tET0js0gG/z3qAi2uy0r0/23Tl3Ut8RMJcUMWrUS1ZYGi454BgZqMNA8 H4QyrvRLx7FrsoalAM3mshlPWsgSkpH3zOXp5fqEenjLPhXfOqOugQkKV5ocpl6cFz kd7gsiC9Q/XpA2IWbQbA2gMWxhIipp0qwh2e8ZFc= Authentication-Results: vla1-e8d3e6f22b4d.qloud-c.yandex.net; dkim=pass header.i=@yandex.ru Received: by vla5-8422ddc3185d.qloud-c.yandex.net (smtp/Yandex) with ESMTPSA id LDo5IJ3KCU-j7nq2ZbT; Thu, 04 Mar 2021 01:45:07 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) Message-ID: <56fda69d99a5bdb4e7aed891a4af0e0a6112f16e.camel@yandex.ru> Subject: Re: How to look up where a structure is defined? From: Konstantin Kharlamov To: Peng Yu Cc: libc-help Date: Thu, 04 Mar 2021 01:45:07 +0300 In-Reply-To: References: <9f1dbafc6d1184d9ca07bdea98f696e0ca65b9e2.camel@yandex.ru> <998ef50db5faec782f174bd05394155a54830e11.camel@yandex.ru> <61f99c80b25f584bdcf0f03c271fd005a09757c4.camel@yandex.ru> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, 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 X-BeenThere: libc-help@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-help mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Mar 2021 22:45:13 -0000 On Wed, 2021-03-03 at 16:24 -0600, Peng Yu wrote: > On Wed, Mar 3, 2021 at 2:23 PM Konstantin Kharlamov > wrote: > > > > On Wed, 2021-03-03 at 23:09 +0300, Konstantin Kharlamov wrote: > > > On Wed, 2021-03-03 at 13:51 -0600, Peng Yu wrote: > > > > This seems to be a complicated solution. I just want to get a database > > > > (a TSV file should be fine) of types and the header they appear. I > > > > don't want to build the project just to get this info. > > > > > > I see, well, the Universal Ctags I mentioned should work for you. It > > > doesn't > > > require building the project: you just run `ctags -R` or `ctags -Re` > > > (first > > > for > > > vim-style tags file, second one for emacs-style) over the repository, and > > > you > > > get a `tags` or `TAGS` file with a list of definitions. > > > > > > Possible drawbacks on ctags I mentioned in the other email. Basically it's > > > that > > > it doesn't take context into consideration. > > > > > > Regarding usage: the tags file it generates, although can be read for > > > human, > > > supposed to be read by text editors/IDEs. Since you mention a CSV file, I > > > assume > > > you might want something human-readable. Please see option --output- > > > format= in > > > `man ctags` for details: I think you might want the `xref` format. (I > > > never > > > tried it myself, just reading the man it seems like it what you're after). > > > > Although, I wouldn't hold my breath that reading a resulting xref file would > > be easy The reason being is that I expect a tags file created from glibc > > repo to be some hundreds of megabytes. For reference, a TAGS file I > > generated long ago for libreoffice project is sized at 183M. > > > > So yeah, you will probably want to use the file from an IDE or text editor, > > rather than reading it manually. > > ctags can partially solve the problem. The declaration and definition > of a struct are all in the header. So finding the definition is OK. > But it can not return function declaration. Is there a way to show > function declaration as well? (For example, ./socket/sys/socket.h for > setsockopt().) > > $ grep '^icmphdr\>' tags > icmphdr sysdeps/gnu/netinet/ip_icmp.h /^struct icmphdr$/;" s > $ grep ^setsockopt tags > setsockopt sysdeps/unix/sysv/linux/setsockopt.c /^setsockopt (int fd, > int level, int optname, const void *optval, socklen_t len)$/;" f > > ./socket/sys/socket.h > 215:extern int setsockopt (int __fd, int __level, int __optname, But, in the grep output you show you have both the declaration and the definition of setsockopt, no? In particular, you have the declaration from `socket.h` file. I think you're confused because your editor/IDE navigates by default to the first match in the tags file, which probably happened to be the definition. I know vim does that in particular. What to do here is depends on the editor/IDE you're using. For vim specifically there is some command to go to the next tag (I think it's `:tn`). In Emacs it is implemented in a better way: it shows you a list of all matches when there's more than one, and you get to chose which one you want. Idk, perhaps there's a plugin that implements similar behavior for vim…? Anyway, point being is that the answer depends on what you're using with the tags file. On a side note, you do need to figure it out for your editor/IDE, because, for example, with struct fields you might get tons of matches, depending on circumstances. Remember, tags does not include context. So if project has multiple structs with a field `int foo;`, all of them will match when you'll try navigate to `foo` by using tags.