gccのソースはどこ(その2)

前回gccのソースが見つかりませんでしたが、探し方が悪かったです。
もちろん、ネットを探せばすぐ見つかると思いますが、コマンドの達人を目指すため敢えて、コマンドだけで探したいです。

今回はapt-cacheで探してみます。

takk@deb9:~$ apt-cache search gcc | head
gcc-6-hppa64-linux-gnu - GNU C compiler (cross compiler for hppa64)
gcc-6-locales - GCC, the GNU compiler collection (native language support files)
gcc-6-multilib - GNU C compiler (multilib support)
gcc-6-source - Source of the GNU Compiler Collection
gcc-6-test-results - Test results for the GCC test suite
gccgo-6-multilib - GNU Go compiler (multilib support)
gcj-6 - GCJ byte code and native compiler for Java(TM)
gcj-6-jdk - GCJ and Classpath development tools for Java(TM)
gdc-6-multilib - GNU D compiler (version 2, multilib support)
gfortran-6-multilib - GNU Fortran compiler (multilib support)
takk@deb9:~$

gcc-6-sourceってのが怪しいです。落としてきましょう。

takk@deb9:~/gcc$ apt-get source gcc-6-source
パッケージリストを読み込んでいます... 完了
'gcc-6-source' の代わりに 'gcc-6' をソースパッケージとして選出しています
注意: 'gcc-6' パッケージは以下の場所の 'Svn' バージョン制御システムで保守されています:
svn://anonscm.debian.org/gcccvs/branches/sid/gcc-6
83.7 MB のソースアーカイブを取得する必要があります。
取得:1 http://security.debian.org/debian-security stretch/updates/main gcc-6 6.3.0-18+deb9u1 (dsc) [27.1 kB]
取得:2 http://security.debian.org/debian-security stretch/updates/main gcc-6 6.3.0-18+deb9u1 (tar) [81.6 MB]
19% [2 gcc-6 13.1 MB/81.6 MB 16%] 

おっと、なんかサイズが大きそうです。期待できます。

ディレクトリはgccのバージョンがついているので、たぶん当たりです。すぐ見つかりましたね。

takk@deb9:~/gcc$ ls
gcc-6-6.3.0                    gcc-6_6.3.0-18+deb9u1.dsc
gcc-6_6.3.0-18+deb9u1.diff.gz  gcc-6_6.3.0.orig.tar.gz
takk@deb9:~/gcc$

さらにcd。

takk@deb9:~/gcc$ cd gcc-6-6.3.0/
takk@deb9:~/gcc/gcc-6-6.3.0$ ls
debian  gcc-6.3.0-dfsg.tar.xz  gdc-20161222.tar.xz
takk@deb9:~/gcc/gcc-6-6.3.0$

cソースを探してみます。

takk@deb9:~/gcc/gcc-6-6.3.0$ find -name *.c
takk@deb9:~/gcc/gcc-6-6.3.0$

見つかりませんでした。圧縮されている他のファイルっぽいですね。
解凍します。

takk@deb9:~/gcc/gcc-6-6.3.0$ tar xJf gcc-6.3.0-dfsg.tar.xz
takk@deb9:~/gcc/gcc-6-6.3.0$ ls
debian  gcc-6.3.0  gcc-6.3.0-dfsg.tar.xz  gdc-20161222.tar.xz
takk@deb9:~/gcc/gcc-6-6.3.0$ cd gcc-6.3.0/
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

lsを見ると、gccで間違いないさそうです。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ ls
ABOUT-NLS           config        libcc1           libtool.m4
COPYING             config-ml.in  libcilkrts       libvtv
COPYING.LIB         config.guess  libcpp           ltgcc.m4
COPYING.RUNTIME     config.rpath  libdecnumber     ltmain.sh
COPYING3            config.sub    libffi           lto-plugin
COPYING3.LIB        configure     libgcc           ltoptions.m4
ChangeLog           configure.ac  libgfortran      ltsugar.m4
ChangeLog.jit       contrib       libgo            ltversion.m4
ChangeLog.tree-ssa  depcomp       libgomp          lt~obsolete.m4
INSTALL             fixincludes   libiberty        maintainer-scripts
LAST_UPDATED        gcc           libitm           missing
MAINTAINERS         gnattools     libjava          mkdep
MD5SUMS             gotools       libmpx           mkinstalldirs
Makefile.def        include       libobjc          move-if-change
Makefile.in         install-sh    liboffloadmic    symlink-tree
Makefile.tpl        intl          libquadmath      ylwrap
NEWS                libada        libsanitizer     zlib
README              libasan       libssp
boehm-gc            libatomic     libstdc++-v3
compile             libbacktrace  libtool-ldflags
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

最初に見るソースはどこがいいでしょうか。main.cソースとかあるでしょうか。
探してみます。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ find -name main.c
./libgfortran/runtime/main.c
./gcc/main.c
./gcc/testsuite/gcc.c-torture/execute/builtins/lib/main.c
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

ありました。直観ですが、mainから見れば、きっと読みやすいに違いありません。
行数を確認。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ wc -l gcc/main.c
40 gcc/main.c
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

大した処理はなさそうです。コマンド解析とかでしょうか。
行数が少ないので全文見てみます。

takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$ cat -n !$
cat -n gcc/main.c
     1  /* main.c: defines main() for cc1, cc1plus, etc.
     2     Copyright (C) 2007-2016 Free Software Foundation, Inc.
     3
     4  This file is part of GCC.
     5
     6  GCC is free software; you can redistribute it and/or modify it under
     7  the terms of the GNU General Public License as published by the Free
     8  Software Foundation; either version 3, or (at your option) any later
     9  version.
    10
    11  GCC is distributed in the hope that it will be useful, but WITHOUT ANY
    12  WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  for more details.
    15
    16  You should have received a copy of the GNU General Public License
    17  along with GCC; see the file COPYING3.  If not see
    18  <http://www.gnu.org/licenses/>.  */
    19
    20  #include "config.h"
    21  #include "system.h"
    22  #include "coretypes.h"
    23  #include "tm.h"
    24  #include "diagnostic-core.h"
    25  #include "toplev.h"
    26
    27  int main (int argc, char **argv);
    28
    29  /* We define main() to call toplev::main(), which is defined in toplev.c.
    30     We do this in a separate file in order to allow the language front-end
    31     to define a different main(), if it so desires.  */
    32
    33  int
    34  main (int argc, char **argv)
    35  {
    36    toplev toplev (NULL, /* external_timer */
    37                   true /* init_signals */);
    38
    39    return toplev.main (argc, argv);
    40  }
takk@deb9:~/gcc/gcc-6-6.3.0/gcc-6.3.0$

コマンド解析もしてませんでした。関数呼び出ししてるだけでしたね。

つづく

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA