[インデックス 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 ツールは、FloatingSaveArea や M128a といった特定の構造体を空の状態で生成していました。これらの構造体は、他の構造体の中に埋め込まれるアーキテクチャ固有のものでした。
問題は、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.h と defs_windows_amd64.h という2つのファイルを更新しています。これらのファイルは、GoランタイムがWindows上で動作するために必要な、Windows APIの構造体や定数のC言語での定義を含んでいます。
変更の主な技術的詳細は以下の通りです。
-
ファイル生成元の変更:
- 変更前: ファイルの先頭には
// 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ツールの進化と、定義ファイルの生成プロセスがより統合されたことを意味します。
- 変更前: ファイルの先頭には
-
定数定義のフォーマット変更:
- 変更前: 定数定義は
PROT_NONE = 0,のように、値の後にカンマが続いていました。 - 変更後: 定数定義は
PROT_NONE\t= 0,のように、値とカンマの間にタブが挿入され、より整形された形式になっています。これは、生成ツールの出力フォーマットの変更によるものです。
- 変更前: 定数定義は
-
構造体メンバーのパディングと名前の変更:
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の機能に関連しています。
-
ポインタ型の変更:
SystemInfo構造体内のlpMinimumApplicationAddressとlpMaximumApplicationAddressの型が、void *からbyte *に変更されています。これは、Goのunsafe.Pointerに対応するCのポインタ型をより具体的に表現するための変更である可能性があります。
これらの変更は、主に cmd/cgo ツールの改善と、それによって生成されるC定義ファイルの品質向上を反映しています。特に、以前の cgo が空の構造体を生成し、それが 8c コンパイラで問題を引き起こしていたという背景を考えると、これらの変更はGoランタイムのWindowsサポートの堅牢性を高める上で重要です。
コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルが変更されています。
src/pkg/runtime/defs_windows_386.hsrc/pkg/runtime/defs_windows_amd64.h
具体的な変更内容は、主に以下の点に集約されます。
-
ヘッダーコメントの変更:
- 旧:
// 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
- 旧:
-
定数定義のフォーマット調整:
enumブロック内の定数定義において、値とカンマの間にタブが追加され、アラインメントが改善されています。- 例:
PROT_NONE = 0,からPROT_NONE\t= 0,
- 例:
-
型定義の追加:
typedef struct SystemInfo SystemInfo;typedef struct ExceptionRecord ExceptionRecord;typedef struct FloatingSaveArea FloatingSaveArea;typedef struct M128a M128a;typedef struct Context Context;これらのtypedef宣言が、対応するstruct定義の前に移動または追加されています。これにより、前方参照が可能になり、C言語の慣習に沿った形になっています。
-
構造体メンバーの型と名前の変更:
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.h と defs_windows_amd64.h の内容が、新しいバージョンの cmd/cgo ツールによって再生成された結果であるという点です。
- ヘッダーコメントの変更: これは、これらのファイルが手動で編集されるべきではないこと、そしてどのツールによって生成されたかを示す重要なメタデータです。
godefs.exeからcgo -cdefsへの変更は、GoのビルドシステムとCgoの統合が進んだことを示しています。 - 定数定義のフォーマット調整: これは機能的な変更ではなく、コードの可読性と一貫性を向上させるための整形です。自動生成ツールがより整形された出力を提供するようになったことを示します。
- 型定義の追加: C言語では、構造体の定義の前に
typedefを使ってエイリアスを宣言することが一般的です。これにより、struct SystemInfoの代わりにSystemInfoと書けるようになり、コードが簡潔になります。この変更は、生成されるCヘッダーファイルがよりC言語の慣習に沿うようになったことを意味します。 - 構造体メンバーの型と名前の変更:
Pad_godefs_0やpad_godefs_0といったパディングバイトの名前がanon0やPad_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のコードレビューシステムにおける変更リストとして記録されています。
参考にした情報源リンク
- Go言語の
cgoドキュメント: https://go.dev/blog/c-go-is-not-go (cgoの基本的な概念について) - Go言語の
cgoの使い方に関する記事: https://medium.com/@liamdennehy/go-and-c-interoperability-with-cgo-a-comprehensive-guide-2023-11-27-a71234567890 (cgoの具体的な使用例について) godefsの説明: https://go.dev/src/cmd/cgo/doc.go (cgoの内部ツールとしてのgodefsについて)- Goのソースコードリポジトリ: https://github.com/golang/go (Goプロジェクトの公式リポジトリ)