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

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

このコミットは、GoランタイムのWindows固有の定義ファイルである defs_windows_386.h および defs_windows_amd64.h を更新するものです。これらのファイルは、cmd/cgo ツールによって再生成されました。

コミット

commit 9bc0eaf60e7d04d5c3fd24ad7e89fdae6615be82
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Tue Jun 4 12:50:40 2013 +1000

    runtime: update defs_windows_*.h files
    
    New version of cmd/cgo from
    https://golang.org/cl/9574043/
    is used to regenerate these.
    
    R=golang-dev, iant
    CC=golang-dev
    https://golang.org/cl/9679046

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

https://github.com/golang/go/commit/9bc0eaf60e7d04d5c3fd24ad7e89fdae6615be82

元コミット内容

runtime: update defs_windows_*.h files

New version of cmd/cgo from
https://golang.org/cl/9574043/
is used to regenerate these.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/9679046

変更の背景

このコミットの背景には、Goの cmd/cgo ツールがWindows向けのC定義ファイル(defs_windows_*.h)を生成する際に抱えていた問題があります。以前の cgo ツールは、FloatingSaveAreaM128a といった特定の構造体を空の状態で生成していました。これらの構造体は、他の構造体の中に埋め込まれるアーキテクチャ固有のものでした。

問題は、Goツールチェーン内でCコードをコンパイルするために使用される 8c コンパイラが、空の構造体を許可していなかった点にありました。これにより、cgo が生成したこれらの定義ファイルを使用すると、コンパイルエラーが発生していました。

この問題を解決するため、cmd/cgo ツール自体が修正されました(関連する変更リスト: https://golang.org/cl/9574043/)。この修正により、cgo は空の構造体を生成しないようになりました。

本コミット(CL 9679046)は、この修正された cmd/cgo ツールを使用して、既存の defs_windows_*.h ファイルを再生成し、GoランタイムがWindows上で正しくコンパイルされるようにするためのものです。これは、cgo ツールの改善に伴うメンテナンス更新であり、WindowsターゲットのGoプログラムの互換性と正確性を確保することを目的としています。

前提知識の解説

  • Goランタイム (Go Runtime): Goプログラムが実行される際に、メモリ管理(ガベージコレクション)、スケジューリング、システムコールインターフェースなどを提供する低レベルのコンポーネントです。オペレーティングシステムやハードウェアと直接対話する部分が多く含まれます。
  • cgo: Go言語のツールの一つで、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするための橋渡しをします。これにより、既存のCライブラリをGoから利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。
  • cmd/cgo: cgo ツールの実行ファイルです。Goのソースコード内のCコードブロックを処理し、GoとCの間の相互運用に必要なグルーコード(接着コード)を生成します。
  • godefs: go tool cgo コマンドのフラグの一つで、Cの型定義からGoの型定義を生成するために使用されます。特に、Goが新しいオペレーティングシステムやアーキテクチャに移植される際に、システムコール(syscall パッケージ)のGo定義を生成するのに役立ちます。これにより、GoコードがCのデータ構造と安全に相互作用し、メモリ互換性を維持できます。
  • cgo -cdefs: cgo ツールがC定義(通常はヘッダーファイル)を生成する際のモードを指します。Goの関数をCから呼び出せるようにする //export ディレクティブを持つGoパッケージをCアーカイブ (-buildmode=c-archive) やC共有ライブラリ (-buildmode=c-shared) としてビルドする際に、go build コマンドによって自動的に go tool cgo が呼び出され、Cヘッダーファイルが生成されます。このヘッダーファイルには、エクスポートされたGo関数の宣言が含まれ、CコードがそれをインクルードしてGo関数を呼び出すことができます。
  • defs_windows_386.h / defs_windows_amd64.h: これらはGoランタイムの一部であり、Windowsオペレーティングシステムにおける32ビット (i386) および64ビット (amd64) アーキテクチャ固有のC言語の定義(構造体、定数など)を含むヘッダーファイルです。GoランタイムがWindows APIやシステム構造と正しく連携するために必要です。
  • 8c コンパイラ: Goの初期のコンパイラツールチェーンの一部で、C言語のコードをコンパイルするために使用されていました。Goのビルドプロセスにおいて、cgo が生成したCコードを処理する役割を担っていました。

技術的詳細

このコミットは、defs_windows_386.hdefs_windows_amd64.h という2つのファイルを更新しています。これらのファイルは、GoランタイムがWindows上で動作するために必要な、Windows APIの構造体や定数のC言語での定義を含んでいます。

変更の主な技術的詳細は以下の通りです。

  1. ファイル生成元の変更:

    • 変更前: ファイルの先頭には // c:\Users\Hector\Code\go\bin\godefs.exe defs.c// c:\go\bin\godefs.exe -f -m64 defs.c のようなコメントがあり、godefs.exe ツールによって生成されたことを示していました。
    • 変更後: コメントが // Created by cgo -cdefs - DO NOT EDIT および // cgo -cdefs defs_windows.go に変更されています。これは、これらのファイルが godefs ではなく、より新しい cgo -cdefs コマンドによって生成されるようになったことを示唆しています。これは、cgo ツールの進化と、定義ファイルの生成プロセスがより統合されたことを意味します。
  2. 定数定義のフォーマット変更:

    • 変更前: 定数定義は PROT_NONE = 0, のように、値の後にカンマが続いていました。
    • 変更後: 定数定義は PROT_NONE\t= 0, のように、値とカンマの間にタブが挿入され、より整形された形式になっています。これは、生成ツールの出力フォーマットの変更によるものです。
  3. 構造体メンバーのパディングと名前の変更:

    • SystemInfo 構造体において、defs_windows_386.h では byte Pad_godefs_0[4];byte anon0[4]; に変更されています。
    • ExceptionRecord 構造体において、defs_windows_amd64.h では byte pad_godefs_0[4];byte Pad_cgo_0[4]; に変更されています。
    • これらの変更は、cgo ツールが構造体のパディングバイトを生成する際の命名規則や内部処理の変更を反映していると考えられます。これは、Goの構造体とCの構造体のメモリレイアウトを正確に一致させるための cgo の機能に関連しています。
  4. ポインタ型の変更:

    • SystemInfo 構造体内の lpMinimumApplicationAddresslpMaximumApplicationAddress の型が、void * から byte * に変更されています。これは、Goの unsafe.Pointer に対応するCのポインタ型をより具体的に表現するための変更である可能性があります。

これらの変更は、主に cmd/cgo ツールの改善と、それによって生成されるC定義ファイルの品質向上を反映しています。特に、以前の cgo が空の構造体を生成し、それが 8c コンパイラで問題を引き起こしていたという背景を考えると、これらの変更はGoランタイムのWindowsサポートの堅牢性を高める上で重要です。

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

このコミットでは、以下の2つのファイルが変更されています。

  • src/pkg/runtime/defs_windows_386.h
  • src/pkg/runtime/defs_windows_amd64.h

具体的な変更内容は、主に以下の点に集約されます。

  1. ヘッダーコメントの変更:

    • 旧: // c:\Users\Hector\Code\go\bin\godefs.exe defs.c または // c:\go\bin\godefs.exe -f -m64 defs.c
    • 新: // Created by cgo -cdefs - DO NOT EDIT および // cgo -cdefs defs_windows.go
  2. 定数定義のフォーマット調整:

    • enum ブロック内の定数定義において、値とカンマの間にタブが追加され、アラインメントが改善されています。
      • 例: PROT_NONE = 0, から PROT_NONE\t= 0,
  3. 型定義の追加:

    • typedef struct SystemInfo SystemInfo;
    • typedef struct ExceptionRecord ExceptionRecord;
    • typedef struct FloatingSaveArea FloatingSaveArea;
    • typedef struct M128a M128a;
    • typedef struct Context Context; これらの typedef 宣言が、対応する struct 定義の前に移動または追加されています。これにより、前方参照が可能になり、C言語の慣習に沿った形になっています。
  4. 構造体メンバーの型と名前の変更:

    • SystemInfo 構造体:
      • byte Pad_godefs_0[4];byte anon0[4]; に変更。
      • void *lpMinimumApplicationAddress;byte *lpMinimumApplicationAddress; に変更。
      • void *lpMaximumApplicationAddress;byte *lpMaximumApplicationAddress; に変更。
    • ExceptionRecord 構造体 (amd64版):
      • byte pad_godefs_0[4];byte Pad_cgo_0[4]; に変更。
    • Context 構造体 (amd64版):
      • byte Pad_godefs_0[512];byte anon0[512]; に変更。

これらの変更は、主に cgo ツールの出力形式の変更と、GoとCの間の型マッピングの精度向上によるものです。

コアとなるコードの解説

このコミットのコアとなる変更は、defs_windows_386.hdefs_windows_amd64.h の内容が、新しいバージョンの cmd/cgo ツールによって再生成された結果であるという点です。

  • ヘッダーコメントの変更: これは、これらのファイルが手動で編集されるべきではないこと、そしてどのツールによって生成されたかを示す重要なメタデータです。godefs.exe から cgo -cdefs への変更は、GoのビルドシステムとCgoの統合が進んだことを示しています。
  • 定数定義のフォーマット調整: これは機能的な変更ではなく、コードの可読性と一貫性を向上させるための整形です。自動生成ツールがより整形された出力を提供するようになったことを示します。
  • 型定義の追加: C言語では、構造体の定義の前に typedef を使ってエイリアスを宣言することが一般的です。これにより、struct SystemInfo の代わりに SystemInfo と書けるようになり、コードが簡潔になります。この変更は、生成されるCヘッダーファイルがよりC言語の慣習に沿うようになったことを意味します。
  • 構造体メンバーの型と名前の変更:
    • Pad_godefs_0pad_godefs_0 といったパディングバイトの名前が anon0Pad_cgo_0 に変更されたのは、cgo ツールがパディングバイトを生成する際の内部ロジックや命名規則が更新されたためです。これらのパディングバイトは、Cの構造体とGoの構造体のメモリレイアウトを正確に一致させるために重要です。
    • void * から byte * へのポインタ型の変更は、Goの unsafe.Pointer がCの void * に対応しますが、特定のコンテキストではより具体的な byte * を使用することで、型安全性を高めたり、特定の操作(例えばバイト単位のポインタ演算)をより明確に表現したりする意図があるかもしれません。これは、GoのランタイムがWindowsの低レベルAPIとやり取りする際に、より厳密な型定義を求めるようになったことを示唆しています。

全体として、このコミットはGoランタイムのWindowsサポートにおける基盤的な部分の更新であり、cgo ツールの改善によって、より正確で堅牢なC定義ファイルが生成されるようになったことを示しています。これにより、GoプログラムがWindows環境でより安定して動作することが期待されます。

関連リンク

  • 元の cmd/cgo の修正: https://golang.org/cl/9574043/
    • この変更リストは、cmd/cgo が空の構造体を生成する問題を修正したものです。本コミットの直接的な前提となる変更です。
  • 本コミットの変更リスト: https://golang.org/cl/9679046
    • このコミット自体がGoのコードレビューシステムにおける変更リストとして記録されています。

参考にした情報源リンク