(57)【要約】【課題】本発明の一実施形態においては、コード（例えば、コンパイラ、ツール）は、第１エンディアンフォーマット（例えば、ビッグエンディアン）でポインタ値を有する第１コード部分が第２エンディアンフォーマット（例えば、リトルエンディアン）を有するプラットホームで適切に初期化され、実行される情報を生成することが可能である。【解決手段】  また、本発明の種々の実施形態においては、特定のバイト順序がボイドポインタを介して除去される場合に、コード（例えば、ソースコード）の問題領域を識別することが可能である。【選択図】図１
2011129132.tif 000002
【特許請求の範囲】
【請求項１】
グローバル変数の第１例及び第２例をそれぞれ規定する第１ソースコード及び第２ソースコードを受信する段階であって、各々の例は第１エンディアンフォーマットを有し、何れの例も、コンパイル時間に十分に初期化されない、段階；
前記第１例及び前記第２例を第２エンディアンフォーマットにそれぞれ変換するバイトスワップ命令に対して第１参照及び第２参照を生成する段階；
プロセッサを用いて、コンパイル時間の後に、バイトスワップされた前記第１例に基づいて、前記第２例のバイトスワップを抑制するシャドー変数を生成する段階；並びに
プロセッサに結合されたメモリに前記シャドー変数を記憶する段階；
を有する方法。
【請求項２】
請求項１に記載の方法であって、前記第１例及び前記第２例は、コンパイル時間に、前記第１エンディアンフォーマットを有するポインタである前記グローバル変数に基づいて、十分に初期化されない、方法。
【請求項３】
請求項２に記載の方法であって、前記シャドー変数は、前記第１例がバイトスワップされたかどうかを示す、方法。
【請求項４】
請求項２に記載の方法であって、前記シャドー変数は、弱く規定された変数から強く規定された変数に変換された前記シャドー変数に基づいて、前記第２例の前記バイトスワップを抑制する、方法。
【請求項５】
請求項２に記載の方法であって、第１エンディアンフォーマット及び第２エンディアンフォーマットの両方を有するコンパイルされたコードを生成する段階を有する、方法。
【請求項６】
請求項２に記載の方法であって、ランタイムにおいて、ガード変数の初期化後に決定される前記ガード変数を生成する段階であって、前記ガード変数はバイト変換され、前記ガード変数は、既知のリンク時定数により初期化されるようになっている、方法。
【請求項７】
請求項２に記載の方法であって、前記第１例及び前記第２例は、コンパイル時間の後、各々が前記第１エンディアンフォーマットを有する第１リンク時定数及び第２リンク時定数のそれぞれに基づいて、初期化される、方法。
【請求項８】
請求項１に記載の方法であって：
ボイドポインタを有する第３ソースコード部分を受信する段階；
前記ボイドポインタを介してバイト順序を追跡する段階；及び
前記ボイドポインタに基づいて生じるバイト順序ミスマッチを決定する段階；
を有する方法。
【請求項９】
請求項１に記載の方法であって：
ボイドポインタを有する第３ソースコード部分を受信する段階；
前記ボイドポインタを介してデータサイズを追跡する段階；及び
前記ボイドポインタに基づいて生じるデータサイズミスマッチを決定する段階；
を有する方法。
【請求項１０】
プロセッサに基づくシステムが：
グローバル変数の第１例及び第２例をそれぞれ規定する第１ソースコード及び第２ソースコードを受信し；
コンパイル後に、エンディアン変換された前記第１例に基づいて、前記第２例のエンディアン変換を抑制する第１変数を生成する；
ことを可能にする命令を記憶する媒体を有する物品であって、
前記グローバル変数の各々の例は第１エンディアンフォーマットを有し、何れの例も、コンパイル時間に正確に初期化されない；
物品。
【請求項１１】
請求項１０に記載の物品であって、前記グローバル変数はポインタである、物品。
【請求項１２】
請求項１１に記載の物品であって、コンパイラから生成される情報に基づいて、前記システムが前記第１変数を再配置することを可能にする命令を更に記憶する、物品であり、前記第１変数は、前記再配置に基づいて前記第２例の前記エンディアン変換を抑制する、物品。
【請求項１３】
請求項１１に記載の物品であって、前記第１例は、第２グローバル変数のアドレスに基づく、物品。
【請求項１４】
請求項１１に記載の物品であって、前記第１コード部分及び前記第２コード部分は動的にリンクされる、物品。
【請求項１５】
請求項１０に記載の物品であって：
ボイドポインタを有する第３コード部分を受信し；
前記ボイドポインタを介してバイト順序を追跡し；そして
前記ボイドポインタに基づいて生じるバイト順序ミスマッチを決定する；
物品。
【請求項１６】
（１）メモリを用いて、グローバル変数の第１例及び第２例をそれぞれ規定する第１ソースコード部分及び第２ソースコード部分を受信し、（２）コンパイル時間後に、バイトスワップされた前記第１例に基づいて、前記第２例のバイトスワップを抑制する第１変数を生成するように、メモリに結合されたプロセッサであって、前記グローバル変数の各々の例は第１エンディアンフォーマットを有し、前記第１例及び前記第２例はコンパイル時間に十分に初期化されない、プロセッサ；
を有する装置。
【請求項１７】
請求項１６に記載の装置であって、前記グローバル変数はポインタである、装置。
【請求項１８】
請求項１７に記載の装置であって、前記第１変数は、弱く規定された変数から強く規定された変数に変換された前記第１変数に基づいて、前記第２例の前記バイトスワップを抑制する、装置。
【請求項１９】
請求項１７に記載の装置であって、前記第１コード部分及び前記第２コード部分は動的にリンクされる、装置。
【請求項２０】
請求項１５に記載の装置であって、前記プロセッサは：
ボイドポインタを有する第３コード部分を受信し；
前記ボイドポインタを介してバイト順序を追跡し；そして
前記ボイドポインタに基づいて生じるバイト順序ミスマッチを決定する；
装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の一実施形態においては、コード（例えぱ、コンパイラ、ツール）が、第１エンディアンフォーマット（例えば、ビッグエンディアン）にポインタ値を有するコード部分が、第２エンディアンフォーマット（例えば、リトルエンディアン）を有するプラットホームで適切に初期化されて、実行されることが可能である。
【背景技術】
【０００２】
バイトエンディアネスはデータ記憶及び検索の属性である。ビッグエンディアンデータ又は変数は、リトルエンディアンデータ又は変数とは逆のバイト順序でメモリに記憶されることが可能である。リトルエンディアンデータは、最下位メモリバイトアドレスにおける最下位バイトと共に記憶されることが可能である一方、ビッグエンディアンデータは、最下位メモリバイトアドレスにおける最上位バイトと共に記憶されることが可能である。同じ値を有するビッグエンディアン変数及びリトルエンディアン変数は、ＣＰＵレジスタにおいては同じであることが可能であるが、メモリにおいては異なる順序を有することが可能である。
【０００３】
１バイトエンディアネス規約を用いて書き込まれるソースコードは、一部のデータのメモリにおける記憶のされ方について異なる順序を認識することなく、他のエンディアネス規約を用いるプラットホームにおいて実行されないことが可能である。としては、次のＣコードがある。
【０００４】
【数１】
2011129132.tif 000003
“ｃ”は、コードがコンパイルされ、ビッグエンディアンアーキテクチャにおいて実行される場合には、０ｘ１２であり、コードがコンパイルされて、リトルエンディアンアーキテクチャにおいて実行される場合には、０ｘ７８である。従って、一のエンディアネス規約で書き込まれたコードを他のエンディアネス規約のコンピュータシステムプラットホームにおいて実行することは、エンディアン変換を必要とする。これは、例えば、ソースコードが複数の集合体を有する、又は第１ポインタ（複数バイトを有するデータを示す）を第２ポインタ（１バイトを有するデータを示す）にキャスティングするとき、困難であり得る。ポインタは、一部のバイエンディアン規約がボイドポインタ等のポインタを介してバイトオーダーを追跡しないために、複数の難易度を生成することが可能であり、それらのポインタを介して可能性の高いバイトオーダーの変化については診断しない。従って、ポインタ等は、予想しなかったバイト順序の不適合性に繋がり得る。
【０００５】
本発明の実施形態の特徴及び有利点については、同時提出の特許請求の範囲、１つ又はそれ以上の例示としての実施形態についての以下の詳細説明、及び対応する図から明らかになる。
【発明の概要】
【課題を解決するための手段】
【０００６】
以下の詳細説明においては、多くの特定の詳細について記載している。しかしながら、本発明の実施形態は、それらの特定の詳細なしで実行可能であることが理解できる。従来の回路、構造及び技術については、本明細書の理解を曖昧にしないように、詳細には示していない。実施形態を示す、“一実施形態”、“実施形態”、“例示としての実施形態”、“種々の実施形態”等の言及は、特定の特徴、構造又は特性を有することが可能であるが、全ての実施形態は必ずしも、特定の特徴、構造又は特性を含まない。更に、一部の実施形態は、他の実施形態について記載されている特徴の一部又は全てを有すること、若しくは特徴を何ら有しないことが可能である。また、本明細書で用いているように、“第１”、“第２”、“第３”等は一般のオブジェクトを表現し、同じオブジェクトの異なる事例に言及していることを表す。オブジェクトをそのような意味を表わすように意図されていないそのような形容詞は、時間的に、空間的に、ランク付けされて、又は他の何れかの様式で、所定の系列にある。また、明確化のために、本明細書で説明する複数の例示としての実施形態は、ソースコードにコンパイラ（例えば、Ｃ／Ｃ十十コンパイラ）及びそのアプリケーションを適用しているが、本発明の実施形態は必ずしも、それらに限定されるものではない。例えば、実施形態は、分析コード、例えば、コンパイラに含まれる分析ツールを有する一方、他の実施形態は、コードの他の形式に含まれる分析コードを有することが可能である。
【０００７】
本発明の一実施形態においては、コード（例えぱ、コンパイラ、ツール）が、第１エンディアンフォーマット（例えば、ビッグエンディアン）にポインタ値を有するコード部分が、第２エンディアンフォーマット（例えば、リトルエンディアン）を有するプラットホームで適切に初期化されて、実行されることが可能である。
【図面の簡単な説明】
【０００８】
【図１】本発明の実施形態における方法についての、擬似コードを有するブロック図である。
【図２】本発明の実施形態における方法についての、擬似コードを有するブロック図である。
【図３】本発明の実施形態における方法のブロック図である。
【図４】本発明の実施形態で用いるシステムブロック図である。
【発明を実施するための形態】
【０００９】
図１は、ソースコード１１０と、実行可能コード１５０の視覚的表現を有する。コード１１０は“重複問題”に影響され易い。特に、コード１１０はコード部分１１１、１１２を有する。各々の部分は、グローバル変数“ｇ”の例を有する。グローバル変数“ｇ”は、従来のコンパイラにより２回、即ち、一回は、コード部分１１１（int*_attribute_((bigendian))g=&i1）において、そして一回は、コード部分１１２（int*_attribute_((bigendian))g=&i2）において、初期化されることが可能である。初期化は、例えば、プログラムにおける変数／データに初期値を割り当てることにより変数を規定する処理を有する。コード部分１１１、１１２は、ビッグエンディアン属性を有するが、異なるアドレスをそれぞれ示すポインタ（int*_attribute_((bigendian))g=&i1）及び（int*_attribute_((bigendian))g=&i2）を有する。各々のアドレスはビッグエンディアン属性を有する。それらのアドレスは、異なる２つのオブジェクト（int*_attribute_((bigendian))i1=1;）及び（int*_attribute_((bigendian))i2=2;）に関連付けられる。コンパイラ（例えば、バイエンディアンコンパイラ）は、ビッグエンディアンフォーマット又は規約からリトルエンディアンフォーマットを有するプラットホームのために適切であるコード（例えば、実行可能コード）にソースコード１１０を変換するように試みることが可能である。そのようにするように、コンパイラは、例えば、両方の部分１１１及び１１２においてビッグエンディアングローバル変数“ｇ”に関してバイトスワップを実行することが可能である．これは、“ｇ”が第１エンディアン変換中にビッグエンディアンからリトルエンディアンに変換されるために、“重複問題”に繋がる可能性があり、その場合、“ｇ”は、第２変換においてリトルエンディアンからビッグエンディアンに変換される。従って、その重複問題は、“ｇ”が２回変換され、それにより、ピッグエンディアンからリトルエンディアンへの必要な変換を反転させる。
【００１０】
コード１１０がどのように重複問題に繋がる可能性があるかについて、以下により具体的に説明する。両方のソースファイル１１１、１１２はグローバルビッグエンディアン変数“ｇ”を規定する。従来のコンパイラは、リンク時間まで又はリンク時間後（即ち、コンパイル時間後）にリンク時定数（例えば、ｉ１又はｉ２）のアドレスが認識されていないとしても、異なるリンク時定数に基づいて、グローバルビッグエンディアン変数“ｇ”を初期化することが可能である。コンパイラは、“ｇ”のどの特定の値がリンクエディタ又はシステムローダーにより取り込まれるか認識していない可能性がある。従って、各々の部分１１１、１１２について、コンパイラは、コンパイル時間後まで、十分に初期化（即ち、正確に初期化）されないポインタ変数である。後に、リンクエディタは、“ｇ”の１つの例に適用される２つのスワップ動作を生成する。
【００１１】
本発明の一実施形態は、次のように重複問題を解決する。
【００１２】
【数２】
2011129132.tif 000004
一般に、本発明の実施形態がグローバル変数“ｇ”を保証するように”上記の疑似コードは、“シャドー変数”を用いることと、続く“ｇ”を変換する試みが抑制されることを例示している。最初の“ｇ”の変換時に、変数“ｇ＿ｓｈａｄｏｗ”は“ＦＡＬＳＥ”から“ＴＲＵＥ”に変えられる。その後、変換機能（例えば、バイトスワップ機能）は、“ｇ−ｓｈａｄｏｗ”が“ＦＡＬＳＥ”に設定されるときに条件付けされるために、抑制される。従って、本発明の一実施形態においては、非本来バイト順序のリンク時定数で初期化された各々のグローバル変数について、コンパイラは、あるアプリケーションにおいて、変数（例えば、不可視的な“シャドー変数”）を生成することが可能である。シャドー変数は、シャドー変数がアプリケーション変数を妨げないように、特定のシャドーセクション内に割り当てられる。例えば、シャドー変数の参照はオリジナル変数に対する参照と共に位置付けられることが可能である。最初に、一部の又は全てのシャドー変数が、対応する実際のアプリケーション変数が未だに交換スワップされていないことを意味する“ＦＡＬＳＥ”値により初期化されることが可能である。後に、データ初期化処理中、バイトスワップ動作が最初に対応するオリジナル変数に適用されるときに、“ＴＲＵＥ”値は各々のシャドー変数に位置付けられることが可能である。一旦、シャドー変数が“ＴＲＵＥ”値に等しくなると、オリジナル変数についての全ての連続的なスワップ動作は抑制されることが可能である。従って、本発明の一実施形態においては、シャドー変数は、グローバル変数がバイトスワップされたか否かを示すグローバル変数状態を“シャドーイング”し、グローバル変数が一回だけバイトスワップされることを保証するように支援する。
【００１３】
図１を再び参照するに、コード１５０は、本発明の実施形態を用いて、ソースコード１１０から生成されるコンパイル済みコードの視覚的表現である。グローバル変数“ｇ”については、コード（例えば、コンパイラ）は、両方のコード部分１５１及び１５２においてシャドー変数“ｇ−ｓｈａｄｏｗ”を生成することが可能であり、それは、それらの部
分の両方が“ｇ”（即ち、コード部分１１１、１１２）を有するソースコードの部分と関連しているからである。“ｇ−ｓｈａｄｏｗ”変数は、“．ｉｎｉｔｄａｔａ−ｓｈａｄｏｗ”セクションから割り当てられる。“ｇ−ｓｈａｄｏｗ”変数の初期値は“ＦＡＬＳＥ”値である。リンカー等のコードを用いる場合、“ｇ”に対する記号参照は、“ｇ”の弱い例（ブロック１７０を参照されたい）から“ｇ”の強い例（ブロックエ６０を参照されたい）に矢印１５４、１５５、１５７、１５９を介して変換（例えば、再配置）されることが可能である。“弱い”指定は、プログラムが、例えば、プログラム実行中に変数の位置を変えるようにすることを可能にする。それとは対照的に、“強い”指定は、プログラムがプログラム実行中に変数の位置を変えるようにしない。変数の強い規定は、弱い変数により規定される位置を変化させ得るが、その逆は成立しない。
【００１４】
“ｇ”に関する上記の同じ理由で、“ｇ−ｓｈａｄｏｗ”（ブロック１７５）に対する弱い記号参照はまた、矢印１５６、１５８を介してｇ−ｓｈａｄｏｗ”の１つの強い例に再配置されることが可能である。この再配置は、ブロック１５０において再配置方向を与える矢印と一致するコンパイラにより与えられる再配置情報に基づくことが可能である。“ｇ”及び“ｇ−ｓｈａｄｏｗ”に対する再配置参照を有するコードバージョンは図１に示されていないが、図２に関連して適用されている。後に、コンパイル後データ初期化処理において、第１バイトスワップ動作が“ｇ”（矢印１５５と一致する再配置情報を介して再配置された）について適用されることが可能であり、“ｇ＿ｓｈａｄｏｗ”（矢印１５６と一致する再配置情報を介して再配置された）に“ＴＲＵＥ”を置くことが可能である。その場合、その処理が“ｇ”（矢印１５９と一致する再配置情報を介して再配置された）についての第２バイトスワップ動作と遭遇するとき、“ｇ−ｓｈａｄｏｗ”は既に“ＴＲＵＥ”値（矢印１５８と一致する再配置情報を介して再配置された）を有し、スワップ動作は、従って、実行されない。故に、実施形態においては、“ｇ”は一回だけスワップされ、正確な値を維持する。
【００１５】
図２は、本発明の実施形態を有する。方法２００は、図１の部分１１０に類似するソースコード部分２０５を有する。ブロック２１０において、アプリケーションがコンパイルされる。コンパイラは、バイエンディアン機能が可能であるとき、初期化データを生成することが可能である。コンパイラにより提供される初期化データ又は情報は、シャドー変数と、スワップｇ参照と、シャドー変数及びスワップｇ参照に関連する再配置情報とを有することが可能である。コンパイラは、ブロック２１５に示されているように、この初期化データを、“．ｉｎｉｔｄａｔａ”及び“．ｉｎｉｔｄａｔａ−ｓｈａｄｏｗ”と命名された特定の実行フォーマット及びリンキングフォーマット（ＥＬＦ）に位置付けることが可能である。ブロック２１５は、図１の部分１５１に類似している。コンパイラのオプションに依存して、この．ｉｎｉｔｄａｔａセクションは、ロード可能セグメント又はコメントセグメントに位置付けられることが可能である。
【００１６】
ブロック２２０においては、図１の部分１５２等の他のオブジェクトファイルは、より多くの．ｉｎｉｔｄａｔａセクションを生成するように、ブロック２１５と同様に処理される。次いで、ブロック２２５においては、リンカーは、複数の．ｉｎｉｔｄａｔａセクションを組み合わせ、図１において矢印で示されているようにｇスワップ変数及びシャドー変数を（コンパイラにより提供される再配置情報に基づいて）再配置することが可能である。それらの．ｉｎｉｔｄａｔａセクションは種々のオブジェクトファイルからもたらされ、リンクされたバイナリにおいてそれらの．ｉｎｉｔｄａｔａセクションを位置付けることが可能である。
【００１７】
ブロック２３０においては、コードは、本発明の一実施形態において、コンパイラに含まれることが可能であるポストリンクツールを用いて後処理される。他の実施形態においては、ボストリンクツールはコンパイラから分離される。ボストリンクツールは、実行可能画像の．ｉｎｉｔｄａｔａセクションを読み出し、リンキング中に正確に演算されなかった値を有するデータ（例えば、“ｇ”変数等のグローバル変数アドレス）についての初期化を実行することが可能である。未解決の参照が残されることが可能であるため、ツールは、それと関連付けて、図１に関連して説明されている再配置のような再配置を有しないかどうかを調べることが可能である。その場合、正確な値は、ランタイム中にのみ検出されることが可能であり、スワップは、ブロック２４５（下記を参照されたい）に代えて、ここで実行されることが可能である。また、アドレスが示すデータは、コンパイラにより提供される初期化情報に基づいてブロックにおいて示されるようにバイトスワップされることが可能である。ブロック２３５において、一部のバイトスワップがここで生じ（例えば、長くスワップされ（＆ｉ１））、ブロック２１５からの一部のエンティティ（例えば、ｇエンティティ）が取り除かれる。１つのｓｅｃｔｉｏｎ−．ｉｎｉｔｄａｔａセクションが、予め存在した再配置のために存在する。
【００１８】
ブロック２４０及び２１５において、動的ランタイム初期化が生じることが可能である。ブロック２３０における構築から残された、実行されていないバイトスワップが存在する（動的にリンクされたアプリケーションと共に存在することが可能であるように）場合、それらはブロック２４５において実行されることが可能であり、そのブロック２４５において、それらは、例えば、実行可能なものと静的にリンクされたランタイム初期化ルーチン（例えば、コンパイラにより提供される）により、又は、アプリケーションがユーザコードを入力する前に、修正されたオペレーションシステム（ＯＳ）ローダーにより行われる。ランタイム初期化の場合、ＯＳによりロードされるように読み出し一書き込み（Ｒ／Ｗ）セクションにデータが位置付けられることが必要である。それらのバイトスワップは、コンパイラにより提供される初期化情報のために有効である。
【００１９】
ブロック２５０において、確認が行われる。例えば、アプリケーション開始時に、残された解決されていない．ｉｎｉｔｄａｔａ記録が存在しないことを保証するように、調査が実行されることが可能である。そのようにすることは、初期化されたデータ内で失われたエンディアネス（ｅｎｄｉａｎｅｓｓ）のためにプログラム異常を防ぐことが可能である。コンパイラは、初期化が適切に実行されることを保証することのランタイム調査を行うことが可能である。そのようなランタイム調査の例のために、コンパイラは、各々のコンパイルユニットのためのビッグエンディアン“ガード”変数を生成することが可能である。“ガード変数”は、既知のリンク時定数値と、この値がスワップされたかどうかを調べるランタイムとにより初期化されることが可能である。そのようなスワップが生じなかった場合、アプリケーションは、エラー条件により終了することが可能である。また、アプリケーションは、ブロック２５５において進めることが可能である。
【００２０】
従って、本発明の種々の実施形態は、コンパイル時間において充分に解決されることのないデータ初期化についての解決方法に関係する。例えば、グローバル変数（例えば、図１における“ｇ”）は、他のグローバル変数のアドレスを維持することが可能である。その場合、グローバル変数に割り当てられる正確な値は、リンキング段階まで、認識されないことが可能である。コンパイル時間に充分に解決されないデータ初期化の他の例は、動的にリンクされないアプリケーションであって、最終値がランタイムにおける動的リンキング段階の後のみに認識される、アプリケーションであることが可能である。実際の初期化値が、逆バイト順序を有するようになっている場合、動的リンキングに後続し、プログラムの実行に先行するある段階においてスワップされる必要がある。コンパイル時間に充分に解決されないデータ初期化の他の例は、弱い変数の規定を可能にする、通常用いられるアプリケーションバイナリインタフェース（ＡＢＩ）に関係する。そのような弱い規定は、二回以上変数を宣言し、リンカー又はローダーがオブジェクトのどの例が実際にとられるかを判定するようにする。
【００２１】
本発明の種々の実施形態は、標準的なＥＬＦファイルフォーマットに基づくツールであり、そのフォーマットを用いることが可能である。これは、ユーザが、本発明の実施形態によりリンカー及びオペレーションシステム（ＯＳ）ローダーのような変更されていないＥＬＦに基づくツールを用いることを可能にする。
【００２２】
従って、本発明の一実施形態においては、リトルエンディアンプラットホームにおいて実行されるビッグエンディアンコードを移植すること（又は、その逆）を所望するプログラマが、単一のネイティブエンディアンモードで完全に実行するように彼又は彼女のアプリケーションを再書き込みする必要はない。それに代えて、ソースコードの複数の部分は、ビッグエンディアンフォーマットがネットワークパケツトとインタラクトする必要がある構成要素のような特定のエンディアンフォーマットにより指定されることが可能である。本発明の実施形態は、その場合、後の時間に複数のコード部分の適切な初期化を可能にするデータを提供することが可能である。それらのコード部分は、第２エンディアンフォーマット（例えば、リトルエンディアン）を有するプラットホームにおいて後に実行される必要がある第１エンディアンフォーマット（例えば、ビッグエンディアン）においてポインタ値を有することが可能である。本発明の種々の実施形態は、ポインタオブジェクトを有する静的に初期化されるオブジェクトのエンディネスの自動調節を与える。一部の実施形態は、複数の割り当てられたオブジェクトによりもたらされるアドレスの曖昧さを解決することができる。また、一部の実施形態においては、例えば、アプリケーション開始において失われたエンディネスの正確さのランタイム検出を与える。一部の実施形態においては、非コンパイル時定数ビッグエンディアンポインタ値を表現するように特定のコンパイラにより生成された情報を用いる。種々の実施形態において、リンク処理が終了した後に、エンディネスを補正するようにポストプロセスツールを用いる。更なる実施形態においては、動的にリンクされたアプリケーションの場合にエンディネスを補正する特定のアプリケーション開始コードを用いる。
【００２３】
図３は、例えば、分析コード（例えば、バイエンディアンコンパイラ）によりもたらされる困難さに対処することが可能である、本発明の実施形態における方法のブロック図である。そのような１つの困難さは、既知の種類を有する値を示すポインタを有することが可能である。ボイドポインタは、未知の種類を有する値を示すポインタを有することが可能である。他の困難さは、ポインタへの又はポインタからのポインタのキャスティングを介してバイト順序変化が失われた状態を有することが可能である。“キャスト”は、整数から浮動小数点への変換のような、一の種類から他の種類へのプログラマにより指定されたデータ変換を有することが可能である。それらの例の困難さの結果として、一部のコンパイラは、ボイドポインタを介して生じる、潜在的なバイト順序の変化を識別する診断（例えば、診断報告、プロンプト、メッセージ、情報）を行うことができない。それらの困難さは、ランタイム問題に繋がる。それらの問題に対処するように、本発明の種々の実施形態は、例えば、特定のバイト順序がボイドポインタを介して除去されない、コードの問題領域を識別するように支援する。特に、本発明の実施形態は、ユーザがコード変更を介して変換に対処することができるように、実際に特定のボイドをバイト順序領域と関連付けて、ボイドポインタを介して潜在的な問題のキャストに対してユーザに響告することが可能である。
【００２４】
図３のブロック３０５においては、プログラマは、リトルエンディアン又はビッグエンディアンとしてコードの領域（例えば、データ構造）をマーキングするようにコード（例えば、ツール、コンパイラ）を用いることが可能である。ここで説明するように、一部の領域は、例えば、ネットワークパケツト等と共に用いるために、ビッグエンディアンとして指定されることが可能である。コンパイラはまた、ボイドポインタが存在することを識別することが可能である。ブロック３１０においては、エンディアンフォーマットが識別されることが可能である。ブロック３１５においては、ボイドポインタが、マーキングされたビッグエンディアンであったコードセクションに位置付けられる場合、コンパイラは、“ビッグエンディアンボイド”を内部で生成することが可能である。ブロック３２０においては、ボイドポインタがリトルエンディアンが指定されたコード部分に位置付けられている場合に、コンパイラは“リトルエンディアンボイド”を生成することが可能である。標準的なボイドタイプは何れかの言語タイプとマッチングすることが可能である一方、バイト順序が特定のボイド（例えば、“ビッグエンディアンボイド又はリトルエンディアンボイド”は、例えば、同じバイト順序を有するデータ（例えば、非集合データ）及び同じデフォルトバイト順序との関連において宣言された（即ち、定義された）データ（例えば、集合データ）のみをマッチングさせることが可能である。従って、ブロック３２５においては、ミスマッチの存在が決定される。ブロック３３０においては、ミスマッチが存在しない場合、そのマッチングが許容されることが可能である。しかしながら、ブロック３３５においては、ミスマッチが存在するとき、コンパイラは、そのミスマッチを報告する診断を発することが可能である（その診断が無効でない場合）。例えば、標準的なボイドポインタが、ビッグエンディアン値からリトルエンディアン値を指す場合、ボイドポインタは、未知のタイプを有する値（従って、また、未決定の長さ特徴及び未決定のデリフェレンス特徴）を指すポインタであるため、通常、問題は生じない。しかしながら、そのように試みられる、“ビッグエンディアンボイド”とのマッチングについては、診断（ブロック３４０）において言及され、彼又は彼女がブロック３４５においてその問題に対処することが可能であるプログラマの注意に持ち込まれることが可能である。
【００２５】
ビッグエンディアンボイド等のボイドタイプ名の使用は、コード領域に暗示的に又は明示的に割り当てられたデフォルトバイト順序のバイト順序属性を有する。タイプデフ（ｔｙｐｅｄｅｆ）が、それぞれのデフォルトバイト順序のタイプデフに基づいてビッグエンディアンボイド及びリトルエンディアンボイドについてのボイド名タイプを生成するように用いられることが可能である。
【００２６】
本発明の一部の実施形態は、異なるタイプのボイドポインタに関係する。特に、バイト順序が中立であるようにソース変換を支援するように、複数のボイドタイプのファミリが生成されることが可能であり、そのファミリについては、データのサイズは、例えば、“ボイド３２”又は“ボイド６４”等のボイド名に添付されるデータのビットサイズにより占められる。方法３００に関して説明された方法と類似する様式で、それらのタイプは同じビットサイズのタイプとマッチングする。ソースコードは、それらの名前を用いるように変更されることが可能であり、その場合、コンパイラは、サイズ制限を実行する。
【００２７】
従って、本発明の一部の実施形態においては、コンパイラがポインタ変換を実行するとき、複数の状況の何れかが生じたときを判定して、診断を発することが可能である。例えば、異なるバイトの順序付けられたタイプからボイドポインタに暗示的に又は明示的に変換される（例えば、ビッグエンディアン値のからリトルエンディアン値にボイドポインタを介して変換される）ときに、診断が行われることが可能である。“明示的な”変換は、例えば、プログラマが次のようなキャスト表現を書き込んだ場合に、行われる。
【００２８】
【数３】
2011129132.tif 000005
“暗示的な”変換は類似しているが、次のようにキャスト表現を有しないことが可能である。
【００２９】
【数４】
2011129132.tif 000006
従って、診断（例えば、報告）は、複数の状況で生成されることが可能である。例えば、報告は、（ｉ）ボイドポインタが異なるバイトで順序付けされたタイプに明示的に又は暗示的に変換されるときに、（ｉｉ）異なるバイトで順序付けされたタイプからボイドポインタに明示的に又は暗示的に変換されるときに、（ｉｉｉ）ボイドポインタから異なるバイト順序を有する他のボイドポインタに暗示的に変換されるときに、及び（ｉｖ）下線を引いたタイプが異なるサイズを有する場合に、ボイドサイズポインタに又はボイドサイズポインタから明示的に又は暗示的に変換される（例えば、３２ビットから６４ビット値にボイドポインタを介して変換される）ときに、発せられる。
【００３０】
実施形態においては、複数の異なるシステムタイプで実行されることが可能である。ここで、図４を参照するに、本発明の実施形態に従ったシステムのブロック図を示している。マルチプロセッサシステム５００は、ポイントツーポイント相互接続システムであり、ポイントツーポイント相互接続５５０を介して結合された第１プロセッサ５７０及び第２プロセッサ５８０を有する。プロセッサ５７０及び５８０の各々は、第１プロセッサコア及び第２プロセッサコア（即ち、プロセッサコア５７４ａ及び５７４ｂ並びにプロセッサコア５８４ａ及び５８４ｂ）を有するマルチコアプロセッサであることが可能であるが、潜在的により多くのコアがそれらのプロセッサに存在し得る。用語“プロセッサ”は、レジスタ及び／又はメモリに記憶されることが可能である他の電子データにその電子データを変換するように、レジスタ及び／又はメモリからの電子データを処理する何れかの装置又は装置の部分のことをいう。
【００３１】
第１プロセッサ５７０は、メモリ制御器ハブ（ＭＣＨ）５７２並びにポイントツーポイント（Ｐ−Ｐ）インタフェース５７６及び５７８を更に有する。同様に、第２プロセッサ５８０はＭＣＨ５８２並びにＰ−Ｐインタフェース５８６及び５８８を有する。ＭＣＨ５７２及び５８２は、それぞれのプロセッサにローカルに取り付けられた主メモリ（例えば、ＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）の部分であることが可能であるそれぞれのメモリ、即ち、メモリ５３２及びメモリ５３４にそれらのプロセッサを結合する。第１プロセッサ５７０及び第２プロセッサ５８０は、Ｐ−Ｐ相互接続５５２及び５５４のそれぞれを介してチップセット５９０に結合されることが可能である。チップセット５９０は、Ｐ−Ｐインタフェース５９４及び５９８を有する。
【００３２】
更に、チップセット５９０は、Ｐ−Ｐ相互接続５３９により、高性能グラフィクスエンジン５３８とチップセット５９０を結合するインタフェース５９２を有する。また、チップセット５９０は、インタフェース５９６を介して第１バス５１６に結合されることが可能である。種々の入力／出力（Ｉ／Ｏ）装置５１４は、第１バス５１６から第２バス５２０に結合するバスブリッジ５１８と共に、第１バス５１６に結合されることが可能である。種々の装置は第２バス５２０に結合されることが可能であり、それらには、例えば、キーボード／マウス５２２、通信装置５２６、ディスクドライブ又は他の大容量記憶装置等のデータ記憶ユニット５２８があり、一実施形態においては、コード５３０を有することが可能である。更に、オーディオＩ／Ｏ５２４は、第２バス５２０に結合されることが可能である。
【００３３】
実施形態においては、コードで実行されることが可能であり、命令を実行するシステムをプログラムするように用いられることが可能である命令が記憶された記憶媒体に記憶されることが可能である。記憶媒体には、フロッピー（登録商標）ディスク、光ディスク、固体デバイス（ＳＳＤ）、ＣＤ−ＲＯＭ（Ｃｏｍａｐａｃｔ  Ｄｉｃｋ  Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＣＤ−ＲＷ（Ｃｏｍｐａｃｔ  Ｄｉｃｋ  Ｒｅｗｉｔａｂｌｅ）、光磁気ディスク、ＲＯＭ（読み出し専用メモリ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ））等の半導体デバイス、ＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＳＲＡＭ（Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フラッシュメモリ、ＥＥＰＲＯＭ（Ｅｌｅｃｔｒｉｃａｌｌｙ  Ｅｒａｓａｂｌｅ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、磁気カード、光カード、又は電子命令を記憶するために適切な他の何れかのタイプの媒体を含む何れかのタイプのディスクがあるが、それらに限定されるものではない。
【００３４】
本発明の実施形態については、本明細書において、命令、機能、手順、データ構造、アプリケーションプログラム、構成設定、コード等と共に記載されることが可能である。データが機器によりアクセスされるとき、その機器は、本明細書で記載されているように、タスクを実行し、抽象データタイプを規定し、下位ハードウェアコンテキストを確立し、及び／又は他の動作を実行することにより応答することが可能である。データは、揮発性及び／又は不揮発性データ記憶装置に記憶されることが可能である。本明細書の目的に対しては、用語“コード”又は“プログラム”は、広い範囲の構成要素をカバーし、アプリケーション、ドライバ、処理、ルーチン、方法、モジュール及びサブプログラムを構成する。従って、用語“コード”又は“プログラム”は、処理システムにより実行されるときに、好ましい動作を実行する命令の何れかの収集のことをいうように用いられることが可能である。更に、代替の実施形態においては、開示されている動作の全てより少なく用いる処理、異なるシーケンスにおいて同じ動作を用いる処理、並びに本明細書で開示されている個々の動作が組み合わされる、副分割される又は変更される処理を有することが可能である。エンディアン変換はしばしば、本明細書においては、バイトスワップ命令に関して説明されているが、種々の実施形態は、エンディアン変換を実行する又は促進する何れかの特定の命令のタイプを用いることに必ずしも限定されない。
【００３５】
本発明について、限定された数の実施形態に関して、上で説明しているが、当業者は、多くの修正及び変形が存在することを理解することができる。同時提出の特許請求の範囲は、本発明の主旨及び範囲から逸脱することなく、そのような修正及び変形全て網羅することができるように意図されている。
【符号の説明】
【００３６】
５１４    Ｉ／Ｏ装置
５１８    バスブリッジ
５２２    キーボード／マウス
５２４    オーディオＩ／Ｏ
５２６    通信装置
５２８    データ記憶装置
５３０    コード
５３２    メモリ
５３４    メモリ
５３８    高性能グラフィクスエンジン
５７０    プロセッサ
５８０    プロセッサ
５９０    チップセット
５７４ａ  プロセッサコア
５８４ａ  プロセッサコア
【図１】
2011129132.tif 000007
【図２】
2011129132.tif 000008
【図３】
2011129132.tif 000009
【図４】
2011129132.tif 000010