[インデックス 11083] ファイルの概要
このコミットは、Go言語のランタイムがmacOS (Darwin) 環境と連携するために使用するC言語ヘッダファイル defs_darwin_386.h
および defs_darwin_amd64.h
を更新するものです。これらのヘッダファイルは cgo
ツールによって自動生成されており、macOSのバージョンアップ(Lion 10.7.2およびSnow Leopard 10.6.8)に伴うOS内部のデータ構造や定数の変更に適応するために再生成されました。具体的には、cgo
コマンドの引数変更、Machメッセージング定数 MACH_SEND_CANCEL
の削除、そして例外状態を表現する ExceptionState
構造体の変更が含まれます。
コミット
commit bc1f4c18230119db04139ea3ac74457a6df6ae48
Author: Dave Cheney <dave@cheney.net>
Date: Tue Jan 10 09:48:10 2012 -0800
runtime: regenerate defs_darwin_{386,amd64}.h
Regenerated under Lion 10.7.2 amd64.
Also tested on Snow Leopart 10.6.8 386.
R=golang-dev, dsymonds, minux.ma
CC=golang-dev
https://golang.org/cl/5533058
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/bc1f4c18230119db04139ea3ac74457a6df6ae48
元コミット内容
runtime: regenerate defs_darwin_{386,amd64}.h
Regenerated under Lion 10.7.2 amd64.
Also tested on Snow Leopart 10.6.8 386.
R=golang-dev, dsymonds, minux.ma
CC=golang-dev
https://golang.org/cl/5533058
変更の背景
Go言語のランタイムは、オペレーティングシステム(OS)固有のシステムコールやデータ構造と密接に連携して動作します。特に、macOS (Darwin) のようなUNIX系OSでは、低レベルなシステム機能にアクセスするためにC言語の定義や構造体を利用することが不可欠です。これらのC言語の定義は、Goのcgo
ツールを使用してGoのソースファイルから自動生成されることが一般的です。
このコミットの主な背景は、macOSのバージョンアップ(具体的にはLion 10.7.2およびSnow Leopard 10.6.8)に伴う、OS内部のAPIやデータ構造の変更に適応することです。OSのアップデートにより、Goランタイムが依存するC言語の構造体や定数の定義が変更されることがあり、これに合わせてGoランタイム側の定義も更新する必要があります。
具体的には、以下の点が変更の動機となっています。
- OS APIの変更への対応: macOSのバージョンが上がるにつれて、Machメッセージングシステムや例外処理メカニズムなど、Goランタイムが利用する低レベルなOS APIの定義が変更されることがあります。これに対応するため、関連するCヘッダファイルを最新の状態に保つ必要があります。
cgo
生成プロセスの明確化:src/pkg/runtime/defs_darwin.go
内のcgo
コマンドのコメントが、より具体的な入力ファイル(defs.go
からdefs_darwin.go
へ)を参照するように変更されました。これは、Darwin固有の定義を生成する際に、より適切なソースファイルを使用することを明確にし、ビルドプロセスの正確性と保守性を向上させる目的があります。- 不要な定数の削除: Machメッセージングシステムにおける
MACH_SEND_CANCEL
定数が削除されました。これは、OSのAPI変更によりこの定数が非推奨になったか、あるいはその機能が別の方法で提供されるようになったためと考えられます。Goランタイムが最新のOS APIに準拠するために、不要な定義を削除する必要があります。 cgo
生成コードの命名規則の変更: 構造体のアライメントのためにcgo
が挿入するパディングバイトのフィールド名がPad_godefs_0
からPad_cgo_0
に変更されました。これは機能的な変更ではなく、cgo
ツールの内部的な命名規則の改善によるものです。
これらの変更は、GoプログラムがmacOS上で安定して動作し、OSの最新の機能や挙動に正しく対応するために不可欠なメンテナンス作業の一環です。
前提知識の解説
このコミットの変更内容を理解するためには、以下の技術的な概念を把握しておく必要があります。
-
Go言語のランタイム (runtime): Go言語のプログラムは、Goランタイムと呼ばれる低レベルなコンポーネント上で動作します。ランタイムは、ガベージコレクション、ゴルーチンのスケジューリング、メモリ管理、そしてOSとのインターフェース(システムコールなど)といった、プログラムの実行に必要な基盤機能を提供します。OS固有の機能にアクセスするため、GoランタイムにはOSごとに異なる実装部分が存在します。
-
cgo:
cgo
は、Go言語のコードからC言語の関数を呼び出したり、逆にC言語のコードからGo言語の関数を呼び出したりするためのGoの機能です。GoとCの間のデータ型の変換、Cのヘッダファイルの取り込み、Cのライブラリへのリンクなどを担当します。GoランタイムがOSのC言語APIと連携する際には、cgo
が重要な役割を果たします。 -
cgo -cdefs
:cgo
ツールの一つのサブコマンドで、Goのソースファイル(特にimport "C"
を含むもの)からC言語のヘッダファイル(.h
ファイル)を生成するために使用されます。このコマンドは、Goの型定義や定数をC言語側から参照できるように、対応するCの構造体や#define
定数を生成します。GoランタイムがOSのC言語APIと連携する際に、OSのデータ構造をGo側で表現するために、この機能が利用されます。 -
MachカーネルとMachメッセージング: Darwin(macOSの基盤となるカーネル)は、Machマイクロカーネルをベースにしています。Machカーネルは、プロセス間通信(IPC)の主要なメカニズムとして「Machメッセージングシステム」を使用します。これは、Machポートと呼ばれるカーネル管理のメッセージキューを介して、異なるタスク(プロセス)がメッセージを送受信することで通信を行う仕組みです。
-
MACH_SEND_CANCEL
: Machメッセージングシステムにおけるmach_msg
関数のオプションの一つでした。これは、ポートが破棄された場合に通知を受け取るMACH_RCV_NOTIFY
と組み合わせて使用され、送信操作によって宛先ポートの権利が送信者から削除された場合、関連するデッドネームリクエストをサイレントにキャンセルし、不要なポート削除通知の生成を防ぐ目的がありました。この定数が削除されたということは、macOSのAPI変更によりこの機能が不要になったか、あるいは別の方法で処理されるようになったことを示唆しています。 -
ExceptionState
: オペレーティングシステムが例外(例えば、セグメンテーション違反、不正な命令、システムコールエラーなど)を処理する際に、CPUの状態(レジスタの値、プログラムカウンタなど)を保存するための構造体です。GoランタイムがシグナルハンドリングなどでOSの例外情報を扱う際に、この構造体を通じてOSから例外発生時のCPUの状態を取得し、クラッシュレポートの生成やデバッグに利用します。
技術的詳細
このコミットにおける技術的な変更点は、主に以下の3つのファイルにわたります。
-
src/pkg/runtime/defs_darwin.go
の変更:cgo
コマンドのコメント修正: 以前は、cgo
コマンドのコメントがGOARCH=amd64 cgo -cdefs defs.go >amd64/defs.h
のように、汎用的なdefs.go
を参照していました。これが、GOARCH=amd64 cgo -cdefs defs_darwin.go >defs_darwin_amd64.h
のように、より具体的なdefs_darwin.go
を参照するように修正されました。これは、Darwin固有の定義を生成する際に、より適切な入力ファイルを使用することを明確にし、ビルドプロセスの正確性と保守性を向上させるための変更です。MACH_SEND_CANCEL
定数の削除:MACH_SEND_CANCEL
というMachメッセージング関連の定数の定義が削除されました。これは、macOSのMachメッセージングAPIの進化に伴うもので、この定数がもはや関連性がなくなったか、あるいはその機能が別の方法で扱われるようになったことを示唆しています。Goランタイムが最新のOS APIに準拠するための変更です。
-
src/pkg/runtime/defs_darwin_386.h
およびsrc/pkg/runtime/defs_darwin_amd64.h
の変更: これらのファイルは、src/pkg/runtime/defs_darwin.go
をcgo -cdefs
で処理して再生成された結果です。- ヘッダコメントの更新:
ファイルの先頭にある生成元を示すコメントが、
// cgo -cdefs defs.go
から// cgo -cdefs defs_darwin.go
に変更されました。これは、生成元のGoファイルが変更されたことを反映しています。 MACH_SEND_CANCEL
定数の削除:defs_darwin.go
での変更と同期して、これらのヘッダファイルからもMACH_SEND_CANCEL
定数の定義が削除されました。- パディングフィールド名の変更:
FPControl
、FPStatus
、StackT
、Timeval
、Mcontext64
などの構造体内で、cgo
ツールが構造体のアライメントのために挿入するパディングバイトを示すフィールド名がPad_godefs_0
からPad_cgo_0
に変更されました。これは機能的な変更ではなく、cgo
ツールが生成するパディングフィールドの命名規則が内部的に変更されたことを示唆しています。 ExceptionState64
およびExceptionState32
構造体の変更: これは最も重要な変更点の一つです。trapno
フィールドの型がuint32
からuint16
に変更されました。- 新たに
uint16 cpu;
フィールドが追加されました。 この変更は、macOSの例外処理メカニズムにおけるCPU状態の表現方法が変更されたことを直接反映しています。trapno
がより小さい型になったことと、cpu
フィールドが追加されたことは、OSが提供する例外情報の詳細度や構造が更新されたことを示しています。Goランタイムは、これらの変更に合わせて、OSから受け取る例外情報を正しく解釈し、クラッシュレポートやデバッグ情報に活用する必要があります。
- ヘッダコメントの更新:
ファイルの先頭にある生成元を示すコメントが、
これらの変更は、GoランタイムがmacOSの特定のバージョン(Lion 10.7.2およびSnow Leopard 10.6.8)で正しく動作し、OSの最新のAPIと互換性を保つために不可欠なものです。
コアとなるコードの変更箇所
src/pkg/runtime/defs_darwin.go
--- a/src/pkg/runtime/defs_darwin.go
+++ b/src/pkg/runtime/defs_darwin.go
@@ -7,8 +7,8 @@
/*
Input to cgo.
-GOARCH=amd64 cgo -cdefs defs.go >amd64/defs.h
-GOARCH=386 cgo -cdefs defs.go >386/defs.h
+GOARCH=amd64 cgo -cdefs defs_darwin.go >defs_darwin_amd64.h
+GOARCH=386 cgo -cdefs defs_darwin.go >defs_darwin_386.h
*/
package runtime
@@ -55,7 +55,6 @@ const (
MACH_SEND_TIMEOUT = C.MACH_SEND_TIMEOUT
MACH_SEND_INTERRUPT = C.MACH_SEND_INTERRUPT
- MACH_SEND_CANCEL = C.MACH_SEND_CANCEL
MACH_SEND_ALWAYS = C.MACH_SEND_ALWAYS
MACH_SEND_TRAILER = C.MACH_SEND_TRAILER
MACH_RCV_TIMEOUT = C.MACH_RCV_TIMEOUT
src/pkg/runtime/defs_darwin_386.h
--- a/src/pkg/runtime/defs_darwin_386.h
+++ b/src/pkg/runtime/defs_darwin_386.h
@@ -1,5 +1,5 @@
// Created by cgo -cdefs - DO NOT EDIT
-// cgo -cdefs defs.go
+// cgo -cdefs defs_darwin.go
enum {
@@ -33,7 +33,6 @@ enum {
MACH_SEND_TIMEOUT = 0x10,\
MACH_SEND_INTERRUPT = 0x40,\
- MACH_SEND_CANCEL = 0x80,\
MACH_SEND_ALWAYS = 0x10000,\
MACH_SEND_TRAILER = 0x20000,\
MACH_RCV_TIMEOUT = 0x100,\
@@ -197,10 +196,10 @@ struct Itimerval {
};
struct FPControl {
-\tbyte\tPad_godefs_0[2];
+\tbyte\tPad_cgo_0[2];
};
struct FPStatus {
-\tbyte\tPad_godefs_0[2];
+\tbyte\tPad_cgo_0[2];
};
struct RegMMST {
\tint8\tmmst_reg[10];
@@ -276,7 +275,8 @@ struct FloatState64 {
\tint32\tfpu_reserved1;\
};
struct ExceptionState64 {
-\tuint32\ttrapno;\
+\tuint16\ttrapno;\
+\tuint16\tcpu;\
\tuint32\terr;\
\tuint64\tfaultvaddr;\
};
@@ -339,7 +339,8 @@ struct FloatState32 {
\tint32\tfpu_reserved1;\
};
struct ExceptionState32 {
-\tuint32\ttrapno;\
+\tuint16\ttrapno;\
+\tuint16\tcpu;\
\tuint32\terr;\
\tuint32\tfaultvaddr;\
};
src/pkg/runtime/defs_darwin_amd64.h
--- a/src/pkg/runtime/defs_darwin_amd64.h
+++ b/src/pkg/runtime/defs_darwin_amd64.h
@@ -1,5 +1,5 @@
// Created by cgo -cdefs - DO NOT EDIT
-// cgo -cdefs defs.go
+// cgo -cdefs defs_darwin.go
enum {
@@ -33,7 +33,6 @@ enum {
MACH_SEND_TIMEOUT = 0x10,\
MACH_SEND_INTERRUPT = 0x40,\
- MACH_SEND_CANCEL = 0x80,\
MACH_SEND_ALWAYS = 0x10000,\
MACH_SEND_TRAILER = 0x20000,\
MACH_RCV_TIMEOUT = 0x100,\
@@ -164,7 +163,7 @@ struct StackT {\
\tbyte\t*ss_sp;\
\tuint64\tss_size;\
\tint32\tss_flags;\
-\tbyte\tPad_godefs_0[4];
+\tbyte\tPad_cgo_0[4];
};
typedef\tbyte\tSighandler[8];
@@ -191,7 +190,7 @@ struct Siginfo {\
struct Timeval {\
\tint64\ttv_sec;\
\tint32\ttv_usec;\
-\tbyte\tPad_godefs_0[4];
+\tbyte\tPad_cgo_0[4];
};
struct Itimerval {\
\tTimeval\tit_interval;\
@@ -199,10 +198,10 @@ struct Itimerval {\
};
struct FPControl {\
-\tbyte\tPad_godefs_0[2];
+\tbyte\tPad_cgo_0[2];
};
struct FPStatus {\
-\tbyte\tPad_godefs_0[2];
+\tbyte\tPad_cgo_0[2];
};
struct RegMMST {\
\tint8\tmmst_reg[10];
@@ -278,7 +277,8 @@ struct FloatState64 {\
\tint32\tfpu_reserved1;\
};
struct ExceptionState64 {
-\tuint32\ttrapno;\
+\tuint16\ttrapno;\
+\tuint16\tcpu;\
\tuint32\terr;\
\tuint64\tfaultvaddr;\
};
@@ -286,7 +286,7 @@ struct Mcontext64 {\
\tExceptionState64\tes;\
\tRegs64\tss;\
\tFloatState64\tfs;\
-\tbyte\tPad_godefs_0[4];
+\tbyte\tPad_cgo_0[4];
};
struct Regs32 {\
@@ -342,7 +342,8 @@ struct FloatState32 {\
\tint32\tfpu_reserved1;\
};
struct ExceptionState32 {
-\tuint32\ttrapno;\
+\tuint16\ttrapno;\
+\tuint16\tcpu;\
\tuint32\terr;\
\tuint32\tfaultvaddr;\
};
コアとなるコードの解説
-
defs_darwin.go
におけるcgo
コマンドの変更: この変更は、生成されるCヘッダファイルがdefs_darwin.go
というDarwin固有の定義ファイルから派生していることを明確にするための修正です。以前は汎用的なdefs.go
を参照していましたが、より具体的なファイル名を指定することで、ビルドプロセスの正確性と保守性が向上します。これは、GoのビルドシステムがどのGoソースファイルからC定義を生成すべきかをより正確に把握できるようにするための調整です。 -
MACH_SEND_CANCEL
の削除:MACH_SEND_CANCEL
定数の削除は、macOSのMachメッセージングAPIの進化に伴うものです。この定数がもはや関連性がなくなったか、あるいはその機能が別の方法で扱われるようになったことを示唆しています。Goランタイムは、OSの最新のAPIに準拠するために、不要になった定義を削除し、コードベースをクリーンに保つ必要があります。これにより、将来的な互換性の問題を防ぎ、ランタイムの効率性を維持します。 -
パディングフィールド名の変更 (
Pad_godefs_0
からPad_cgo_0
へ):FPControl
、FPStatus
、StackT
、Timeval
、Mcontext64
などの構造体内で、cgo
ツールが構造体のアライメントのために挿入するパディングフィールドの命名規則が内部的に変更されました。Pad_godefs_0
という名前は、godefs
という古いツールに関連していた可能性がありますが、cgo
が直接生成するようになったため、より一般的なPad_cgo_0
という名前に変更されたと考えられます。これは機能的な影響はなく、生成されたCヘッダファイルの整合性を保つためのものです。 -
ExceptionState64
およびExceptionState32
構造体の変更: この変更は、macOSが例外発生時に提供するCPU状態情報の構造が変更されたことを直接反映しています。trapno
フィールドの型がuint32
からuint16
に縮小されました。これは、OSが例外の種類(トラップ番号)をよりコンパクトに表現するようになったことを示唆しています。- 新たに
uint16 cpu;
フィールドが追加されました。これは、例外が発生したCPUコアの情報を明示的に提供するようになったことを意味します。 Goランタイムは、これらの変更を認識し、OSからの例外情報を正しく解析して、クラッシュレポートやデバッグ情報に活用する必要があります。例えば、Goプログラムがクラッシュした場合、ランタイムはこれらのExceptionState
構造体からCPUの状態を読み取り、スタックトレースを生成したり、デバッグツールに情報を提供したりします。この変更は、GoプログラムがmacOS上で安定して動作し、正確なエラーハンドリングを行う上で重要な更新です。
これらの変更は全体として、GoランタイムがmacOSの進化する環境に継続的に適応し、安定性と互換性を維持するための重要なステップを示しています。
関連リンク
- Gerrit Change-ID: https://golang.org/cl/5533058
参考にした情報源リンク
- Go言語公式ドキュメント (cgo, runtimeパッケージに関する情報)
- MachカーネルおよびMachメッセージングに関するドキュメント (例: GNU Mach Documentation, Apple Developer Documentation)
- Go言語のソースコードリポジトリ (特に
src/pkg/runtime
ディレクトリ) - Stack OverflowやGoコミュニティの議論 (cgoの動作やOS固有のランタイム実装に関するもの)
- 本解説生成時に実行したWeb検索の結果