Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 14795] ファイルの概要

このコミットは、Go言語のコンパイラ (cmd/5g) およびリンカ (cmd/5l, cmd/ld) のソースコードに対する調整を含んでいます。特に、Plan 9ネイティブツールに関連するコードのクリーンアップと、未使用変数の初期化の削除、そしてUSEDマクロの追加が主な変更点です。

コミット

commit 62dfa9c47d33368400cfa1f0b4fade7d047992ee
Author: Lucio De Re <lucio.dere@gmail.com>
Date:   Fri Jan 4 11:02:49 2013 -0500

    cmd/5g, cmd/5l, cmd/ld: Small adjustments for the Plan 9 native tools
    
    A few USED(xxx) additions and a couple of deletions of variable
    initialisations that go unused.  One questionable correction,
    mirrored in 8l/asm.c, where the result of invocation of a function
    shouldn't be used.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/6736054

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/62dfa9c47d33368400cfa1f0b4fade7d047992ee

元コミット内容

cmd/5g, cmd/5l, cmd/ld: Small adjustments for the Plan 9 native tools

A few USED(xxx) additions and a couple of deletions of variable
initialisations that go unused. One questionable correction,
mirrored in 8l/asm.c, where the result of invocation of a function
shouldn't be used.

変更の背景

このコミットは、Go言語のツールチェインにおけるコードの健全性と保守性を向上させることを目的としています。特に、Plan 9をターゲットとするコンパイラ (5g) およびリンカ (5l, ld) のコードベースにおいて、コンパイラの警告を抑制し、未使用のコードを削除することで、コードの可読性と保守性を高めています。

Go言語の初期開発において、Plan 9オペレーティングシステムは重要な役割を果たしました。Goのツールチェイン(コンパイラ、リンカ、アセンブラなど)は、Plan 9の設計思想とツールセットに強く影響を受けており、その多くはC言語で書かれ、Plan 9のツール (5g, 5l, 8g, 8l など) の命名規則を踏襲していました。このコミットは、そうした初期のC言語コードベースにおける一般的なコードクリーンアップの一環として行われたと考えられます。

具体的には、以下の問題に対処しています。

  1. 未使用変数に関するコンパイラ警告の抑制: C言語では、宣言されたが使用されていない変数があるとコンパイラが警告を発することがあります。これは、意図しないバグの可能性を示唆する場合もありますが、APIの引数など、特定の状況下では変数が「使用されている」と見なされないにもかかわらず、その存在が必要な場合があります。USEDマクロは、このような場合にコンパイラに「この変数は意図的に使用されていないわけではない」と伝えるために用いられます。
  2. 未使用の変数初期化の削除: コードベースに存在する、初期化されているがその後一切使用されない変数は、デッドコード(dead code)の一種であり、コードの肥大化や混乱を招きます。これらを削除することで、コードベースをスリム化し、理解しやすくします。
  3. 関数呼び出し結果の不適切な使用の修正: コミットメッセージにある「One questionable correction, mirrored in 8l/asm.c, where the result of invocation of a function shouldn't be used.」は、特定の関数呼び出しの戻り値が不適切に扱われていた、あるいは全く使用されるべきでなかったケースに対する修正を示唆しています。これは潜在的なバグ修正、またはコードの意図を明確にするための変更である可能性があります。

これらの変更は、Goツールチェインの安定性と品質を維持するための継続的な努力の一部です。

前提知識の解説

このコミットを理解するためには、以下の概念について知っておく必要があります。

  • Go言語のツールチェイン: Go言語は、go buildgo rungo test などのコマンドを通じて、ソースコードのコンパイル、リンク、実行、テストを行います。これらのコマンドの背後では、コンパイラ (gc、以前はアーキテクチャ固有の 5g, 6g, 8g など)、リンカ (gl、以前は 5l, 6l, 8l など)、アセンブラ (go tool asm) といった低レベルのツールが連携して動作しています。
  • Plan 9: Plan 9 from Bell Labsは、Unixの後継として設計された分散オペレーティングシステムです。Go言語の設計者の一部(Rob Pike, Ken Thompsonなど)はPlan 9の開発にも深く関わっており、Go言語の初期のツールチェインはPlan 9の設計思想やツール(特にC言語で書かれたコンパイラやリンカ)から大きな影響を受けています。5g, 5l といった命名は、Plan 9のツールがターゲットCPUのビット数(例: 5はARM、6はamd64、8はx86)とツールの種類(gはコンパイラ、lはリンカ)を組み合わせたものであることに由来します。
  • C言語におけるUSEDマクロ: C言語のプログラミングにおいて、USEDマクロ(または同様の目的を持つ__attribute__((unused))など)は、変数がコード内で明示的に使用されていないにもかかわらず、コンパイラがその変数について警告を発するのを抑制するために使用されます。これは、例えば、関数の引数が特定のビルド構成でのみ使用される場合や、デバッグ目的で変数を保持しているが、現在のコードパスでは直接参照されていない場合などに役立ちます。このマクロは通常、空の定義 (#define USED(x)) または引数をキャストするだけの定義 (#define USED(x) ((void)(x))) を持ち、コンパイラにその変数が「使用された」と認識させることで警告を回避します。
  • デッドコードとコードクリーンアップ: デッドコードとは、プログラムの実行フローにおいて決して到達しない、またはその結果がプログラムの動作に影響を与えないコードのことです。未使用変数の初期化はその一例です。デッドコードを削除することは、コードベースのサイズを減らし、可読性を向上させ、将来のメンテナンスを容易にする上で重要です。

技術的詳細

このコミットは、GoツールチェインのC言語で書かれた部分に対して、主に以下の3種類の変更を適用しています。

  1. USEDマクロの追加:

    • src/cmd/5g/ggen.ccgen_shift 関数内で、引数 bounded に対して USED(bounded); が追加されました。cgen_shift はシフト演算のコード生成に関連する関数であり、bounded 引数はシフト操作が境界チェックされるかどうかを示す可能性があります。この引数が特定の条件下でのみ使用されるか、あるいはデバッグ目的で保持されているが直接参照されていないために、コンパイラが未使用警告を発していたと考えられます。
    • src/cmd/5l/asm.casmb 関数内で、変数 resoff に対して USED(resoff); が追加されました。asmb はアセンブリコードの生成に関連する関数であり、resoff は結果のオフセットを示す変数である可能性があります。これも同様に、コンパイラ警告を抑制するための措置です。
    • src/cmd/ld/pe.caddexcept 関数内で、引数 text に対して USED(text); が追加されました。addexcept はPE (Portable Executable) フォーマットの例外処理に関連する関数であり、text 引数はテキストセクションのヘッダを指す可能性があります。この引数も、特定の条件下でのみ使用されるか、あるいはコンパイラが未使用と判断する状況にあったため、USEDマクロが適用されました。
  2. 未使用変数初期化の削除:

    • src/cmd/5g/reg.cregopt 関数内で、r1 = R; という行が削除されました。regopt はレジスタ最適化に関連する関数です。r1 という変数が初期化されているにもかかわらず、その後のコードで全く使用されていなかったため、この初期化が冗長であると判断され削除されました。これはデッドコードの削除の一例です。
  3. 関数呼び出し結果の不適切な使用の修正(示唆のみ):

    • コミットメッセージには「One questionable correction, mirrored in 8l/asm.c, where the result of invocation of a function shouldn't be used.」とありますが、提供された差分には 8l/asm.c の変更は含まれていません。しかし、この記述は、特定の関数が値を返すにもかかわらず、その戻り値が無視されるべきであったり、誤って使用されていたりするケースがあったことを示唆しています。これは、コードの意図を明確にし、潜在的な副作用や誤解を避けるための重要な修正です。r1 = R; の削除がこの「questionable correction」の一部である可能性も考えられます。もしRが関数呼び出しであり、その戻り値がr1に代入されていたが、r1がその後使用されていなかった場合、この削除はまさにその修正に該当します。

これらの変更は、GoツールチェインのC言語部分のコード品質を向上させ、コンパイラ警告を減らし、よりクリーンで保守しやすいコードベースを維持するためのものです。

コアとなるコードの変更箇所

このコミットにおけるコアとなるコードの変更箇所は以下の通りです。

  • src/cmd/5g/ggen.c:

    --- a/src/cmd/5g/ggen.c
    +++ b/src/cmd/5g/ggen.c
    @@ -543,6 +543,7 @@ cgen_shift(int op, int bounded, Node *nl, Node *nr, Node *res)
     	Type *tr;
     	uvlong sc;
     
    +	USED(bounded);
     	if(nl->type->width > 4)
     		fatal("cgen_shift %T", nl->type);
    
  • src/cmd/5g/reg.c:

    --- a/src/cmd/5g/reg.c
    +++ b/src/cmd/5g/reg.c
    @@ -207,7 +207,6 @@ regopt(Prog *firstp)
     		return;
     	}
     
    -	r1 = R;
     	firstr = R;
     	lastr = R;
    
  • src/cmd/5l/asm.c:

    --- a/src/cmd/5l/asm.c
    +++ b/src/cmd/5l/asm.c
    @@ -913,6 +913,7 @@ asmb(void)
     			}
     			phsh(pnote, sh);
     		}
    +		USED(resoff);
     
     		elfphload(&segtext);
     		elfphload(&segdata);
    
  • src/cmd/ld/pe.c:

    --- a/src/cmd/ld/pe.c
    +++ b/src/cmd/ld/pe.c
    @@ -536,6 +536,7 @@ addexcept(IMAGE_SECTION_HEADER *text)
     	uvlong n;
     	Sym *sym;
     
    +	USED(text);
     	if(thechar != '6')
     		return;
    

コアとなるコードの解説

上記の変更は、GoツールチェインのC言語ソースコードにおける特定のパターンを修正しています。

  1. USED(bounded); の追加 (src/cmd/5g/ggen.c):

    • cgen_shift 関数は、Goのコードがシフト演算を行う際に、アセンブリコードを生成する役割を担っています。bounded 引数は、シフト操作が境界チェックされるべきかどうかを示すブール値(またはそれに準ずる値)であると推測されます。この引数が、特定のコンパイルオプションや最適化レベルにおいて直接使用されない場合、Cコンパイラは「未使用の引数」として警告を発する可能性があります。USED(bounded); を追加することで、コンパイラに対してこの引数が意図的に存在し、将来的に使用される可能性や、特定のデバッグ/トレース目的で保持されていることを明示し、警告を抑制します。
  2. r1 = R; の削除 (src/cmd/5g/reg.c):

    • regopt 関数は、コンパイラのレジスタ最適化パスの一部です。この関数内で r1 = R; という行が削除されました。これは、変数 r1R の値で初期化されているにもかかわらず、その後のコードで r1 が全く参照されていない、つまりデッドコードであったことを意味します。このような冗長な初期化を削除することで、コードの無駄をなくし、より効率的で理解しやすいコードベースを維持します。
  3. USED(resoff); の追加 (src/cmd/5l/asm.c):

    • asmb 関数は、リンカ (5l) のアセンブリコード生成部分に関連しています。resoff は、結果のオフセットを示す変数であると推測されます。ggen.cbounded と同様に、resoff が特定の条件下で未使用と見なされる場合に、コンパイラ警告を抑制するために USED(resoff); が追加されました。
  4. USED(text); の追加 (src/cmd/ld/pe.c):

    • addexcept 関数は、WindowsのPE (Portable Executable) フォーマットにおける例外処理情報の追加に関連しています。text 引数は、テキストセクションのヘッダ情報を含む構造体へのポインタであると推測されます。この引数も、特定の状況下で直接使用されないためにコンパイラ警告が発生していた可能性があり、USED(text); を追加することでその警告を抑制しています。

これらの変更は、GoツールチェインのC言語部分のコード品質を向上させ、コンパイラ警告を減らし、よりクリーンで保守しやすいコードベースを維持するための、一般的なコードクリーンアップとベストプラクティスの適用です。

関連リンク

  • Go言語の公式リポジトリ: https://github.com/golang/go
  • Go言語の初期のツールチェインに関する議論(Plan 9の影響など): Goの歴史や設計に関するドキュメントやブログ記事を参照すると良いでしょう。

参考にした情報源リンク

  • Go言語のソースコード (特に src/cmd/ ディレクトリ以下のC言語ファイル)
  • Plan 9 from Bell Labsのドキュメント
  • C言語のコンパイラ警告と__attribute__((unused))に関する一般的な情報源 (例: GCCのドキュメント)
  • Go言語のコミット履歴とコードレビューシステム (Gerrit) の情報 (例: https://golang.org/cl/6736054)