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

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

このコミットは、Go言語のツールチェインの一部であるliblink(リンカ)内のasm5.cファイルにおける、Plan 9環境でのコンパイル時の警告を修正するものです。具体的には、宣言されたものの使用されていない変数mcに関する警告を解消しています。

コミット

commit 90c146f3906c2d9f8804b414ed5db5c24b8b130d
Author: David du Colombier <0intro@gmail.com>
Date:   Fri Jul 11 22:24:45 2014 +0200

    liblink: fix warnings on Plan 9
    
    warning: /usr/go/src/liblink/asm5.c:720 set and not used: m
    warning: /usr/go/src/liblink/asm5.c:807 set and not used: c
    
    LGTM=minux
    R=minux
    CC=golang-codereviews
    https://golang.org/cl/108570043

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

https://github.com/golang/go/commit/90c146f3906c2d9f8804b414ed5db5c24b8b130d

元コミット内容

liblink: fix warnings on Plan 9

warning: /usr/go/src/liblink/asm5.c:720 set and not used: m
warning: /usr/go/src/liblink/asm5.c:807 set and not used: c

LGTM=minux
R=minux
CC=golang-codereviews
https://golang.org/cl/108570043

変更の背景

このコミットは、Go言語のリンカ(liblink)のソースコードasm5.cをPlan 9オペレーティングシステム上でコンパイルする際に発生していた警告を修正するために行われました。具体的には、変数mcがコード内で値が設定されているにもかかわらず、その後使用されていないというコンパイラ警告が出ていました。このような「設定されたが使用されていない」変数に関する警告は、コードの品質を低下させ、潜在的なバグを示唆する可能性があるため、Goプロジェクトではこれらの警告を解消することが推奨されています。

Go言語は、その設計者の多くがPlan 9の開発に深く関わっていたこともあり、Plan 9との歴史的・技術的なつながりが強いです。GoのツールチェインもPlan 9のツールチェインから派生しており、Plan 9上でのGoの動作もサポートされていました。そのため、Plan 9環境でのコンパイルエラーや警告の修正は、Goのクロスプラットフォーム対応とコードベースの健全性を維持する上で重要でした。

前提知識の解説

  • Go言語のツールチェイン: Go言語は、ソースコードをコンパイルして実行可能ファイルを生成するための一連のツール(コンパイラ、リンカ、アセンブラなど)を提供します。
  • liblink: Go言語のリンカのライブラリ部分を指します。リンカは、コンパイラによって生成されたオブジェクトファイルやライブラリを結合し、最終的な実行可能ファイルを生成する役割を担います。
  • asm5.c: Go 1.5より前のGoツールチェインにおいて、cmd/link(リンカ)の一部として存在していたC言語のソースファイルです。ファイル名の「5」は、初期のGo開発におけるPlan 9の5アーキテクチャ(amd64の基礎となった)に関連しており、このファイルがそのアーキテクチャ向けのアセンブリ関連のリンキング処理を扱っていたことを示唆しています。Go 1.5以降、GoツールチェインはGo自身で記述される(セルフホスティング)ようになり、asm5.cのようなC言語のファイルはGoの配布物からは削除されました。
  • Plan 9 from Bell Labs: ベル研究所で開発された分散オペレーティングシステムです。Go言語の設計者であるロブ・パイクやケン・トンプソンなどがPlan 9の開発にも深く関わっており、Go言語の設計思想やツールチェインにはPlan 9の影響が色濃く反映されています。
  • コンパイラ警告 (Warning): プログラムのコンパイル時にコンパイラが発するメッセージで、プログラムの動作には直接影響しないものの、潜在的な問題や非効率なコード、またはプログラマの意図しない挙動を示唆するものです。今回のケースでは「設定されたが使用されていない変数」に関する警告です。

技術的詳細

このコミットは、src/liblink/asm5.cファイル内の特定のコードブロックにおいて、変数mcが宣言され、値が代入されているにもかかわらず、その後のコードパスで実際に使用されていないという問題を解決しています。

Goのリンカは、異なるアーキテクチャ(例えば、Plan 9やNative Client (NaCl))向けにコードを生成する際に、条件分岐を用いて異なる処理パスを実行します。このコミットの変更箇所は、主にspan5関数と、その中のアセンブリコード生成ロジックに関連しています。

元のコードでは、mcという変数が特定の条件下で値を代入されていましたが、その後のロジックでこれらの変数が参照されることなく、スコープを抜けていました。これは、コードの変更やリファクタリングの過程で、変数の使用目的が変わったり、不要になったりしたにもかかわらず、代入部分が残ってしまった場合に発生しがちです。

この修正は、これらの未使用の代入を削除することで、コンパイラ警告を解消し、コードのクリーンさを保つことを目的としています。特に、m = o->size; の行がif(ctxt->headtype != Hnacl)ブロックの外にあったり、c = p->pc; の行がasmoutnaclの呼び出し後に無条件に実行されていたりする部分が問題でした。修正後は、これらの代入が不要な場合に実行されないように、または完全に削除されるように変更されています。

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

--- a/src/liblink/asm5.c
+++ b/src/liblink/asm5.c
@@ -717,7 +717,6 @@ span5(Link *ctxt, LSym *cursym)
 		ctxt->curp = p;
 		p->pc = c;
 		o = oplook(ctxt, p);
-\t\tm = o->size;
 		if(ctxt->headtype != Hnacl) {
 			m = o->size;
 		} else {
@@ -800,12 +799,10 @@ span5(Link *ctxt, LSym *cursym)
 			}
  */
 		opc = p->pc;
-\t\t\tif(ctxt->headtype != Hnacl) {
+\t\t\tif(ctxt->headtype != Hnacl)
 			m = o->size;
-\t\t\t} else {
+\t\t\telse
 			m = asmoutnacl(ctxt, c, p, o, nil);
-\t\t\tc = p->pc; // asmoutnacl might change pc for alignment
-\t\t\t}\n
 		if(p->pc != opc) {
 			bflag = 1;
 			//print("%P pc changed %d to %d in iter. %d\n", p, opc, (int32)p->pc, times);

コアとなるコードの解説

このコミットの主要な変更は、src/liblink/asm5.cファイル内のspan5関数に集中しています。

  1. 717行目付近の変更:

    • - m = o->size; の行が削除されています。
    • この行は、if(ctxt->headtype != Hnacl)ブロックの直前にあり、mo->sizeを無条件に代入していました。しかし、その直後のifブロック内でもm = o->size;またはm = asmoutnacl(...)が実行されるため、この行は冗長であり、特定の条件下ではmが二重に設定されるか、または設定された値がすぐに上書きされて未使用になる可能性がありました。この削除により、mの初期化がif/elseブロック内で適切に行われるようになり、警告が解消されます。
  2. 800行目付近の変更:

    • if(ctxt->headtype != Hnacl) { m = o->size; } else { m = asmoutnacl(ctxt, c, p, o, nil); c = p->pc; } というブロックが、より簡潔な形式に変更されています。
    • 元のコードでは、elseブロック内でc = p->pc;という代入が行われていましたが、このcがその後使用されていませんでした。
    • 変更後:
      if(ctxt->headtype != Hnacl)
          m = o->size;
      else
          m = asmoutnacl(ctxt, c, p, o, nil);
      
      これにより、c = p->pc;の行が完全に削除され、変数cが設定されたが使用されていないという警告が解消されます。また、if/elseのブロック構造がよりシンプルになり、コードの可読性も向上しています。

これらの変更は、コードのロジック自体には影響を与えず、コンパイラ警告を解消し、コードベースの健全性を向上させるためのクリーンアップ作業です。

関連リンク

参考にした情報源リンク