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

[インデックス 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ランタイム側の定義も更新する必要があります。

具体的には、以下の点が変更の動機となっています。

  1. OS APIの変更への対応: macOSのバージョンが上がるにつれて、Machメッセージングシステムや例外処理メカニズムなど、Goランタイムが利用する低レベルなOS APIの定義が変更されることがあります。これに対応するため、関連するCヘッダファイルを最新の状態に保つ必要があります。
  2. cgo生成プロセスの明確化: src/pkg/runtime/defs_darwin.go内のcgoコマンドのコメントが、より具体的な入力ファイル(defs.goからdefs_darwin.goへ)を参照するように変更されました。これは、Darwin固有の定義を生成する際に、より適切なソースファイルを使用することを明確にし、ビルドプロセスの正確性と保守性を向上させる目的があります。
  3. 不要な定数の削除: MachメッセージングシステムにおけるMACH_SEND_CANCEL定数が削除されました。これは、OSのAPI変更によりこの定数が非推奨になったか、あるいはその機能が別の方法で提供されるようになったためと考えられます。Goランタイムが最新のOS APIに準拠するために、不要な定義を削除する必要があります。
  4. 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つのファイルにわたります。

  1. 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に準拠するための変更です。
  2. src/pkg/runtime/defs_darwin_386.hおよびsrc/pkg/runtime/defs_darwin_amd64.hの変更: これらのファイルは、src/pkg/runtime/defs_darwin.gocgo -cdefsで処理して再生成された結果です。

    • ヘッダコメントの更新: ファイルの先頭にある生成元を示すコメントが、// cgo -cdefs defs.goから// cgo -cdefs defs_darwin.goに変更されました。これは、生成元のGoファイルが変更されたことを反映しています。
    • MACH_SEND_CANCEL定数の削除: defs_darwin.goでの変更と同期して、これらのヘッダファイルからもMACH_SEND_CANCEL定数の定義が削除されました。
    • パディングフィールド名の変更: FPControlFPStatusStackTTimevalMcontext64などの構造体内で、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へ): FPControlFPStatusStackTTimevalMcontext64などの構造体内で、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の進化する環境に継続的に適応し、安定性と互換性を維持するための重要なステップを示しています。

関連リンク

参考にした情報源リンク

  • Go言語公式ドキュメント (cgo, runtimeパッケージに関する情報)
  • MachカーネルおよびMachメッセージングに関するドキュメント (例: GNU Mach Documentation, Apple Developer Documentation)
  • Go言語のソースコードリポジトリ (特にsrc/pkg/runtimeディレクトリ)
  • Stack OverflowやGoコミュニティの議論 (cgoの動作やOS固有のランタイム実装に関するもの)
  • 本解説生成時に実行したWeb検索の結果