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

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

このコミットは、GoコンパイラのARMアーキテクチャ向けバックエンドであるcmd/5cのビルドに関する修正です。具体的には、以前の変更セット(CL 72010043)で誤って削除されたsrc/cmd/5c/txt.cファイルが復元され、ARMビルドが再び機能するように修正されています。

コミット

commit 1d2b7171d500bbd549d6915b3d65340c117807fc
Author: Dave Cheney <dave@cheney.net>
Date:   Fri Mar 7 10:13:00 2014 +1100

    cmd/5c: fix arm build
    
    cmd/5c/txt.c was missing from CL 72010043.
    
    LGTM=bradfitz
    R=rsc, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/72220043

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

https://github.com/golang/go/commit/1d2b7171d500bbd549d6915b3d65340c117807fc

元コミット内容

cmd/5c: fix arm build cmd/5c/txt.cがCL 72010043から欠落していました。

変更の背景

このコミットは、GoコンパイラのARMアーキテクチャ(5cはARM向けのCコンパイラを指します)のビルドが壊れていた問題を修正するために行われました。コミットメッセージによると、以前の変更セット(CL 72010043)でsrc/cmd/5c/txt.cファイルが誤って削除されたことが原因でした。このファイルはARMビルドに必要なコンポーネントであり、その欠落がビルドエラーを引き起こしていました。このコミットは、その欠落したファイルを復元し、ARMビルドの健全性を回復することを目的としています。

前提知識の解説

  • Goコンパイラとクロスコンパイル: Go言語は、異なるアーキテクチャやオペレーティングシステム向けにバイナリを生成するクロスコンパイルを強力にサポートしています。Goのツールチェインは、go buildコマンドを通じて、ターゲット環境に応じたコンパイラ(例: 5cはARM向け、6cはamd64向けなど)を内部的に呼び出します。
  • cmd/5c: これはGoコンパイラの一部であり、具体的にはPlan 9 CコンパイラをベースにしたARMアーキテクチャ向けのCコンパイラです。Goのコンパイラは、Goコードを直接機械語に変換するだけでなく、一部のランタイムコードやアセンブリコードをC言語で記述し、それをターゲットアーキテクチャ向けのCコンパイラでコンパイルするハイブリッドなアプローチを取っていました(Go 1.5以降は大部分がGoで書かれていますが、このコミットの時点ではC言語のコンポーネントが重要でした)。5cは、ARMプロセッサ上で実行されるGoプログラムの生成に不可欠なツールです。
  • txt.c: Goコンパイラのバックエンドにおいて、txt.cのようなファイルは、アセンブリコードのテキスト表現を処理したり、特定のアーキテクチャ固有の定数や構造体を定義したりする役割を担うことがあります。このファイルが欠落すると、コンパイラがターゲットアーキテクチャのコードを正しく生成できなくなる可能性があります。
  • LinkArch構造体: Goのリンカ(cmd/link)は、異なるアーキテクチャをサポートするためにLinkArch構造体を使用します。この構造体は、ターゲットアーキテクチャ固有のリンカの動作(例: 命令セット、レジスタ、メモリレイアウトなど)を定義します。thelinkarchは、現在のビルドターゲットのLinkArchインスタンスを指すポインタです。
  • linkarm: linkarmは、ARMアーキテクチャに特化したLinkArch構造体のインスタンスです。これは、ARM向けのリンカの動作をカプセル化しています。
  • gc.h: Goコンパイラの内部で使用される共通のヘッダーファイルで、ガベージコレクション(GC)やその他のランタイム関連の定義が含まれています。
  • CL (Change List): Googleの内部コードレビューシステムであるGerritにおける変更の単位です。GoプロジェクトもGerritを使用しており、各コミットは通常、対応するCLを持っています。

技術的詳細

このコミットの技術的な詳細は、src/cmd/5c/txt.cファイルの復元と、そのファイルに含まれるLinkArch *thelinkarch = &linkarm;の定義、およびlinkarchinit関数の追加に集約されます。

  1. src/cmd/5c/txt.cの復元: このファイルは、ARMアーキテクチャ向けのCコンパイラ5cが正しく機能するために必要な、アーキテクチャ固有の定義や初期化ロジックを含んでいたと考えられます。以前のCLでこのファイルが削除されたことで、5cのビルドが失敗するようになりました。このコミットは、そのファイルを元の場所に戻すことで、ビルドの依存関係を解決しています。
  2. LinkArch *thelinkarch = &linkarm;の定義: この行は、グローバル変数thelinkarchを、ARMアーキテクチャ固有のリンカ情報を含むlinkarm構造体のアドレスで初期化しています。これは、5cコンパイラがARMコードを生成する際に、正しいアーキテクチャ固有のリンカ設定を使用できるようにするために不可欠です。この定義が欠落すると、コンパイラはどのアーキテクチャ向けのコードを生成すべきか、あるいはどのようにリンカを構成すべきかを判断できなくなり、ビルドエラーにつながります。
  3. linkarchinit関数の追加: このコミットでは、linkarchinitという空の関数が追加されています。この関数自体は何も処理を行っていませんが、Goコンパイラのビルドシステムやリンカの設計において、特定のアーキテクチャの初期化ルーチンを呼び出すためのプレースホルダーとして機能している可能性があります。たとえ空であっても、この関数の存在がビルドプロセスにおけるシンボル解決や依存関係の解決に必要であったと考えられます。

これらの変更により、cmd/5cはARMアーキテクチャ向けのコードを正しくコンパイルおよびリンクするために必要な情報と初期化ルーチンを再び利用できるようになり、ARMビルドの問題が解決されました。

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

src/cmd/5c/txt.c

--- a/src/cmd/5c/txt.c
+++ b/src/cmd/5c/txt.c
@@ -31,11 +31,17 @@
 
 #include "gc.h"
 
-LinkArch	*thelinkarch = &linkarm;
 
 int thechar = '5';
 char *thestring = "arm";
 
+LinkArch	*thelinkarch = &linkarm;
+
+void
+linkarchinit(void)
+{
+}
+
 void
 ginit(void)
 {

コアとなるコードの解説

このdiffは、src/cmd/5c/txt.cファイルに対する変更を示しています。

  • 削除された行: -LinkArch *thelinkarch = &linkarm; この行は、ファイルの先頭付近から削除されています。これは、このコミットがこの行をファイルの別の場所(より適切な場所)に移動したことを示唆しています。
  • 追加された行:
    +LinkArch	*thelinkarch = &linkarm;
    +
    +void
    +linkarchinit(void)
    +{
    
  • } ``` このブロックが追加されています。 * LinkArch *thelinkarch = &linkarm;: この行は、thelinkarchというポインタ変数を、ARMアーキテクチャのリンカ情報を含むlinkarm構造体のアドレスで初期化しています。これは、GoコンパイラがARM向けのコードを生成する際に、リンカがARM固有の動作をするために必要な設定です。この定義がtxt.cに存在することで、5cコンパイラがARMターゲットを正しく認識し、それに応じたコード生成とリンクを行うことができます。 * void linkarchinit(void) {}: この関数は、linkarchinitという名前の、引数を取らず何も返さない関数を定義しています。関数本体は空です。前述の通り、これは特定のアーキテクチャの初期化ルーチンを呼び出すためのプレースホルダーとして機能している可能性があります。Goコンパイラのビルドシステムは、各アーキテクチャに対して特定の初期化関数が存在することを期待している場合があり、たとえその関数が何も行わなくても、その存在自体がビルドの成功に不可欠な場合があります。

要するに、このコミットは、thelinkarchの定義とlinkarchinit関数の定義をsrc/cmd/5c/txt.cに再配置(または復元)することで、ARMビルドがこれらのシンボルを見つけられるようにし、コンパイラがARMアーキテクチャ向けに正しく動作するために必要なリンカ設定と初期化ルーチンを確保しています。

関連リンク

特になし。

参考にした情報源リンク

特になし。