JP3304995B2 - シンボリックデバッグシステム及びその方法 - Google Patents

シンボリックデバッグシステム及びその方法

Info

Publication number
JP3304995B2
JP3304995B2 JP26912291A JP26912291A JP3304995B2 JP 3304995 B2 JP3304995 B2 JP 3304995B2 JP 26912291 A JP26912291 A JP 26912291A JP 26912291 A JP26912291 A JP 26912291A JP 3304995 B2 JP3304995 B2 JP 3304995B2
Authority
JP
Japan
Prior art keywords
look
debug
information
debug information
compiler
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP26912291A
Other languages
English (en)
Other versions
JPH04257033A (ja
Inventor
ドミトリ・レンコフ
シャンカル・ウニ
ミチェイ・メータ
マーク・ダブリュー・マクドウエル
マノジ・ダドゥ
ブルーノ・メリ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
HP Inc
Original Assignee
Hewlett Packard Co
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hewlett Packard Co filed Critical Hewlett Packard Co
Publication of JPH04257033A publication Critical patent/JPH04257033A/ja
Application granted granted Critical
Publication of JP3304995B2 publication Critical patent/JP3304995B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/32Monitoring with visual or acoustical indication of the functioning of the machine

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、トランスレータベース
のソフトウェアコンパイルシステムで意味のあるシンボ
リックデバッグ情報を発生するコンピュータシステム及
び方法に関する。
【0002】
【従来技術及びその問題点】図1は、従来のトランスレ
ータベースのコンパイルシステム100の構造図/機能
フローチャートを示す。図1で、長方形はソフトウェア
モジュール/プロセスを表わし、長円形はソフトウェア
モジュール/プロセスの入力及び出力を表わす。
【0003】図1に示すように、従来のトランスレータ
ベースのコンパイルシステム100は、トランスレータ
106、コンパイラ114、リンカ128及びデバッガ
122を含んでいる。
【0004】トランスレータ106は、ソースコード1
02(例えば、C++言語で書かれている)を中間ソー
スコード110(例えば、C言語で書かれている)に翻
訳する。コンパイラ114は、中間ソースコードをコン
パイルし、オブジェクトコード124及びコンパイラデ
バッグ情報126を発生する。オブジェクトコード12
4及びコンパイラデバッグ情報126は、オブジェクト
コードファイル118に格納される。
【0005】リンカ128は、オブジェクトコードファ
イル118を他のオブジェクトコードファイル134と
リンクして実行可能ファイル132を作製する。実行可
能ファイル132にはオブジェクトコード124及びコ
ンパイラデバッグ情報126が入っている。
【0006】コンパイラデバッグ情報126は、これを
ソースコード102の誤りを突きとめて修正する(すな
わち、ソースコード102を「デバッグする」)のに使
用することができるので非常に重要である。特に、ユー
ザ(図1には示してない)の監督のもとで、テバッグ1
22はオブジェクトコード124及びコンパイラデバッ
グ情報126が入っている実行可能ファイル132を受
取り、デバッグ情報126を使用してソースコード10
2をデバッグする。
【0007】しかし、従来のトランスレータベースのコ
ンパイルシステム100では、コンパイラ114はソー
スコード102についての正確で完全なデバッグ情報を
発生することができない。これは、ソースコード102
の構造及び内容に関する情報の多くがソースコード10
2から中間ソースコード110に翻訳する際に失われる
からである。
【0008】それ故、コンパイラ114で発生されたコ
ンパイラデバッグ情報126では、ソースコード102
を効率良く且つ有効にデバッグするのに使用することが
できない。
【0009】この問題を解決する従来の試みの1つに
「何もしない」という方法があった。この従来の解決法
では、デバッグ122がコンパイラ114により発生さ
れたコンパイラデバッグ情報124を読取り、本来の変
数名や関数名を復元しようとしたり、発見的方法を使用
してソースコード中の元来のデータ構造などを大まかに
再現しようとしたりする。
【0010】しかし、この従来の方法では、デバッガ1
22が元来のソースコード102を表示することができ
たとしても、デバッガ122の診断出力はどんなに良く
ても不完全で、多くの場合理解できない。また、ほとん
どの場合、ユーザは、変数及び関数を検査するために
は、中間コード中にある「変換された」変数名や関数名
をデバッガ122に対して手操作で指定しなければなら
なかった。
【0011】この問題を解決する従来の他の試みには
「後退法」という方法があった。この従来の解法では、
デバッグ情報126を、元来のソースコード102の元
来のデータ構造などを再構成するように変換する試みが
なされた。この修正されたデバッグ情報は、次にデバッ
ガ122に提示された。
【0012】しかし、この従来の方法では、修正された
デバッグ情報は、中間ソースコード110からソースコ
ード102を再構成することが必らずしも可能ではない
ため、不完全で恐らくは不正でさえある。
【0013】
【発明の目的】本発明は、トランスレータベースのソフ
トウェアコンパイルシステムで意味のあるシンボリック
デバッグ情報を発生することを目的とする。
【0014】
【発明の概要】本発明の一実施例においては、図2及び
図3に図示するように、また以下に詳細に説明するよう
に、従来の解法に固有の問題点を、コンパイラ114及
び修正されたトランスレータ302に各々がそれぞれデ
バック情報126及び306を適宜発生させることによ
り解決している。デバッグ情報126及び306はマー
ジャ312を革新的に使用して組合わされる。得られる
ところの最終デバッグ情報を含むオブジェクトコード3
16には完全且つ正確なデバッグ情報が入っている。オ
ブジェクトコード316に入っている最終デバッグ情報
は、元来のソースコード102を完全且つ正確に記述す
る。
【0015】オブジェクトコード316にこの最終デバ
ッグ情報が入り、リンカ128により作製される実行可
能ファイル350に導入されることにより、修正された
デバッガ320は元来のソースコード102を完全且つ
正確に表示することができ、変数及び関数を用いて作業
するとき(元のソースコード102中の)実際の変数名
及び関数名を効率良く且つ効果的に使用することができ
る。また、このデバッグ情報があるため、デバッガ32
0は、オーバーロード機能、インヘリタンス及びカプセ
ル化のような概念を取扱うことができる。
【0016】
【実施例】本発明のこれらの及び他の利点及び特徴、更
には本発明がそれらを如何にして実現しているかは、種
々な実施例に関する以下の詳細な説明及び特許請求の範
囲から解るだろう。
【0017】まず、以下の実施例の説明の目次を示す。 1.0. 概観 2.0. トランスレータ 3.0. マージャ 3.1. 入力オブジェクトファイルのインターフェー
ス 3.1.1. 中核オブジェクトファイルクラス 3.1.2. 特殊化クラス 3.2. デバッグ情報マニピュレータ 3.2.1. ステップ802−ルックアップテーブル
を構成 3.2.2. ステップ806−ルックアップテーブル
に合せる 3.2.3. ステップ810−固定 3.2.4. ステップ814−整頓する 3.3. 出力オブジェクトファイルのインターフェー
ス 4.0. デバッガ
【0018】1.0. 概観 図3は、本発明228のトランスレータベースのコンパ
イルシステムの構造図/機能フローチャートを示す。図
3で、長方形はソフトウェアモジュール/プロセスを表
わし、長円形はソフトウェアモジュール/プロセスの入
力及び出力を表わしている。
【0019】図3に示すように、本発明の一実施例22
8は、従来の解法に固有の問題点を、コンパイラ114
及び修正されたトランスレータ302に、各々がそれぞ
れコンパイラデバッグ情報126及びトランスレータデ
バッグ情報306を適宜発生させることにより解決して
いる。コンパイラデバッグ情報126及びトランスレー
タデバッグ306は、マージャ312を革新的に使用し
て組合わされる。得られるオブジェクトコード316に
は完全且つ正確な最終デバッグ情報が入っている。この
デバッグ情報は元来のソースコード102を完全且つ正
確に記述している。
【0020】下に詳細に説明する通り、オブジェクトコ
ード316中に最終デバッグ情報が入っていることによ
り、修正されたデバッガ320は元来のソースコード1
02を表示することができ、変数及び関数を用いて作業
するとき(元来のソースコード102中の)実際の変数
名及び関数名を使用することができる。また、この最終
デバッグ情報があるため、デバッガ320は、オーバー
ロード機能、インヘリタンス及びカプセル化のような概
念を取扱うことができる。
【0021】図2に示すように、本発明のトランスレー
タベースのコンパイルシステムは、コンピュータプラッ
トフォーム202で動作するアプリケーションコンピュ
ータプログラム228である。コンピュータプラットフ
ォーム202は、中央処理装置(CPU)212、ラン
ダムアクセスメモリ(RAM)210及び入出力インタ
ーフェース214を含むハードウェアユニット208を
有している。コンピュータプラットフォーム202はオ
ペレーティングシステムを含んでおり、マイクロ命令コ
ード206を含んでいる場合もある。端末218、デー
タストレージ222及びプリンタ226のような種々の
周辺構成要素をコンピュータプラットフォーム202に
接続することができる。
【0022】本発明の好適実施例では、コンピュータプ
ラットフォーム202は、HP9000シリーズ30
0、600、または800コンピュータプラットフォー
ムであり、ここで走っているオペレーティングシステム
204は、HP−UXバージョン7.0である。また、
本発明の一実施例にかかるトランスレータベースのコン
パイルシステム228は好適にはC++言語で書かれて
いる。
【0023】HP9000シリーズの600及び800
コンピュータプラットフォームは、実質上同じである。
それ故、ここでHP9000シリーズ800コンピュー
タプラットフォームというときはHP9000シリーズ
の600及び800の2つのコンピュータプラットフォ
ームを指すことを理解しなければならない。
【0024】図3に示すように、本発明の一実施例のト
ランスレータベースのコンパイルシステム228は、修
正されたトランスレータ302、コンパイラ114、革
新的なマージャ312、リンカ128及び修正されたデ
バッガ320を含んでいる。
【0025】本発明228の動作を図3を参照して全般
的に説明する。
【0026】トランスレータ302は、入力としてソー
スコード102を受取る。ソースコードは、C++のよ
うな高レベルのプログラム言語で書くことができる。ト
ランスレータ302は、ソースコード102の中間変形
体を発生する。ソースコード102の中間変形体は中間
ソースコード110と呼ばれ、Cのようなコンピュータ
プログラム言語で書かれていてよい。
【0027】トランスレータ302はトランスレータデ
バッグ情報306も発生する。コンパイラデバッグ情報
118(以下に説明する)とは異なり、トランスレータ
デバッグ情報306はソースコードの構造及び内容を正
確に反映している。しかし、トランスレータデバッグ情
報306は、トランスレータ302がメモリの割当やコ
ード生成のような機械特有の事項に関するコンパイラの
判断の知識を持合せていないので、不完全である。
【0028】コンパイラ114は、中間ソースコード1
10を受取り、ソースコード102に対するオブジェク
トコード124を発生する。コンパイラ114はコンパ
イラデバッグ情報126も発生する。オブジェクトコー
ド124及びデバッグ情報126は、オブジェクトコー
ドファイル118に格納される。
【0029】トランスレータ302と異なり、コンパイ
ラ114はメモリの割当やコードの生成のような機械特
有の事項に関するコンパイラの判断の知識を持ってい
る。それ故、コンパイラデバッグ情報126は、この点
では欠けていない。しかし、上に述べたように、コンパ
イラデバッグ情報126はなお、ソースコード102の
構造及び内容を完全且つ正確に表わしていない。
【0030】マージャ312は、オブジェクトコードフ
ァイル118とトランスレータデバッグ情報306を受
け取る。上述の通り、コンパイラデバッグ情報126及
びトランスレータデバッグ情報306はそれぞれある領
域を欠いている。しかし、これらの領域は重なっていな
い。それ故、マージ312はコンパイラデバッグ情報1
26及びトランスレータデバッグ情報306に入ってい
る情報を組合せて最終デバッグ情報を作製する。マージ
ャ312は、最終デバッグ情報をコンパイラ114が発
生したオブジェクトコード118と組合せて、最終デバ
ッグ情報を含むオブジェクトコード316を作製する。
【0031】最終デバッグ情報は元来のソースコード1
02を完全且つ正確に表わしている。
【0032】リンカ128は、最終デバッグ情報を含む
オブジェクトコード316を他のオブジェクトコードフ
ァイル134とリンクする。リンカ128は、最終デバ
ッグ情報が入っている実行可能ファイル350を作製す
る。
【0033】デバッガ320は、最終デバッグ情報が入
っている実行可能ファイル350を入力として受取る。
ユーザ(図3には示してない)の監督のもとに、デバッ
ガ320は最終デバッグ情報を使用して元来のソースコ
ード102を表示し、変数及び関数を用いて作業すると
きは(元来のソースコード102中の)実際の変数名及
び関数名を使用する。また、デバッガ320は、最終デ
バッグ情報を使用してオーバーロード機能、インヘリタ
ンス及びカプセル化のような概念を取扱う。
【0034】本発明の一実施例のシステム228のデバ
ッガ320は、それが最終デバッグ情報中に埋め込まれ
たトランスレータデバッグ情報を利用するという特徴を
備えているという点で従来のデバッガ122の修正され
たものである。
【0035】本発明の好適実施例では、ソースコード1
02はC++言語で書かれており、中間ソースコード1
10はC言語で書かれている。
【0036】しかし、本発明は、どんなトランスレータ
ベース環境でも働くようにされており、またそのように
意図されている。従って、本発明の範囲は、C++/C
言語に限定されない。
【0037】C++言語は当業者には周知の事項である
が、その一般的説明が必要ならば、Margaret Ellis及び
Bjarne Stroustrup 著「Annotated C++ Reference Manu
al (注訳付きC++便覧)」(Addison Wesley 1990)
を参照されたい。C言語も周知な事項であるが、一般的
説明が必要ならば、American National Standard for I
nformation Systems-Programming Language C(情報シ
ステムに関するアメリカ国家規格−プログラム言語C)
(文書番号X3J11/90-013)を参照されたい。
【0038】次の各章では本発明228のトランスレー
タベースのコンパイルシステムのシステムについて一層
詳細に説明する。
【0039】コンパイラ114のような、本発明228
の或る局面は、既存のコンパイラ、トランスレータ、リ
ンカ及びデバッガの技術を用いて実現することができ
る。しかし、既存のトランスレータ及びデバッガの技術
に修正を加えることは、本発明の改善を達成するのに必
要である。以下の各章での説明は、既存のトランスレー
タ及びデバッガの技術(及び革新的なマージャ312)
に加えられるこれら修正に重点を置く。既存のコンパイ
ラ、リンカ、トランスレータ及びデバッガの技術も当業
者には周知名者であるが、その一般的説明については、
Alfred V.Aho、Ravi Sethi及びJeffrey D.Ullman著「Co
mpilers, Princioles, Techniques, and Tools(コンパ
イラ、原理、手法及びツール)」(Addison Wesley 198
6)を参照されたい。
【0040】2.0 トランスレータ 図4は、本発明228のトランスレータ302の構造図
/フローチャートを示す。図4で、長方形はソフトウェ
アモジュール/プロセスを表わし、長円形はソフトウェ
アモジュール/プロセスの入力及び出力を表わす。
【0041】図4に示す通り、本発明のシステム228
のトランスレータ302は、スキャナ/パーザ402、
デバッグ情報生成部410及びコード生成部418を含
んでいる。
【0042】スキャナ/パーザ402は、C++のよう
な高レベルプログラム言語で書くことができるソースコ
ード102を受取り、ソースコード102を表わす意味
情報を含む内部データ構造(意味情報/内部データ構造
406)を構築する。デバッグ情報生成部410は、意
味情報含む内部データ構造、つまり意味情報/内部デー
タ構造406を受取り、トランスレータデバッグ情報3
06を生成する。
【0043】コード生成部418はまた意味情報/内部
データ構造406を受取って中間ソースコード110を
発生する。中間ソースコード110はC言語で書かれて
いてよい。
【0044】トランスレータ302に含まれているデバ
ッグ情報生成部410は、コンパイラ114に含まれて
いるデバッグ情報生成部(図示せず)と非常に良く似た
動作をする。従って、デバッグ情報生成部410の構造
及び動作の一般的説明は、上に引用したAlfred V.Aho、
Ravi Sethi及びJeffery D.Ullman著「Compilers, Princ
iples, Techniques, and Tools」に書いてある。
【0045】トランスレータ302に含まれているデバ
ッグ情報生成部410とコンパイラ114に含まれてい
るデバッグ情報生成部の主な相違は、デバッグ情報生成
部410はトランスレータ302に含まれているので、
ソースコード102の構造及び内容を知っているという
ことである。それ故、デバッグ情報生成部410により
発生されるトランスレータデバッグ情報306は、ソー
スコード102の構造及び内容を正確且つ完全に反映し
ている。
【0046】しかし、トランスレータ302に含まれて
いるデバッグ情報生成部410は、マシンアーキテクチ
ャ及びマシンアドレス(関数及び変数のアドレスを含
む)を取扱う情報を知っていない。それ故、デバッグ情
報生成部410により発生されるトランスレータデバッ
グ情報306は、マシンアーキテクチャ及びマシンアド
レスの情報を欠いている。トランスレータデバッグ情報
306に欠けている特定の局面について下に詳細に説明
する。
【0047】3.0 マージャ マージャ312は、トランスレータ302が作製したシ
ンボリックデバッグ情報306をコンパイラ114が作
製したコンパイラデバッグ情報126(及びオブジェク
トコード124)と組合せる。
【0048】図5は、マージャ312の構造図/機能フ
ローチャートを示す。図5で、長方形はソフトウェアモ
ジュール/プロセスを表わし、長円形はソフトウェアモ
ジュール/プロセスの入力及び出力を表わしている。
【0049】図5に示す通り、マージャ312は、入力
オブジェクトファイルインターフェース502、50
4、デバッグ情報マニピュレータ510及び出力オブジ
ェクトファイルインターフェース514を含んでいる。
一般に、入力オブジェクトファイルインターフェース5
02は、オブジェクトコードファイル118から読出し
を行ってコンパイラデバッグデータ構造516を生成す
る。入力オブジェクトファイルインターフェース504
は、トランスレータデバッグ情報306から読出しを行
ってトランスレータデバッグデータ構造518を生成す
る。デバッグ情報マニピュレータ510は、デバッグデ
ータ構造516、518に入っている情報を組合せてマ
ージ済みルックアップテーブル528及びポータブル出
力決定用情報(portable input fixup)530を出力す
る。出力オブジェクトファイルインターフェース514
は最終デバッグ情報を含むオブジェクトコード316に
対する書込みを行う。
【0050】マージャ312の機能フローチャートを図
6に示す。マージャ312の動作を図5及び図6を参照
して下に説明する。
【0051】ステップ602と606で、入力オブジェ
クトファイルインターフェース502、504はオブジ
ェクトコードファイル118とトランスレータデバッグ
情報ファイル306をオープンし、デバッグ情報をこれ
らのファイル118、306から読出す。入力オブジェ
クトファイルインターフェース502、504は、デバ
ッグ情報をデバッグデータ構造516、518に置く。
ここに置かれた情報はデバッグ情報マニピュレータ51
0に渡される。
【0052】ステップ610で、デバッグ情報マニピュ
レータ510は、コンパイラデバッグデータ構造516
とトランスレータデバッグデータ構造518を比較し、
レコードをコンパイラデバッグデータ構造516からト
ランスレータデバッグデータ構造518の対応するレコ
ードにコピーする。更新されたトランスレータデバッグ
データ構造はマージ済みルックアップテーブル528に
格納される。
【0053】ステップ614で、出力オブジェクトファ
イルインターフェース514は、オブジェクトコード1
24及びマージ済みルックアップテーブル528からの
情報を新たな最終デバッグ情報を含むオブジェクトコー
ド316にコピーする。
【0054】入力オブジェクトファイルインターフェー
ス502、504、デバッグ情報マニピュレータ510
及び出力オブジェクトファイルインターフェース514
について次の章で一層詳細に説明する。
【0055】3.1 入力オブジェクトファイルインタ
ーフェース図5に示すように、入力オブジェクトファイ
ルインターフェース502及び504は、入力としてそ
れぞれオブジェクトコードファイル118及びトランス
レータデバッグ情報306を受取る。
【0056】オブジェクトコードファイル118のコン
パイラデバッグ情報126は、コンパイラからのデバッ
グ用名前及び型テーブル(すなわち、グローバルな名前
及び型テーブル(Global Name and Type Talbe、GNT
T)及びローカルな名前及び型テーブル(Local Name a
nd Type Table、LNTT)等の各種情報を含んでい
る。コンパイラデバッグ情報126は、コンパイラから
の値テーブル(VT)も含んでいるが、これは実質的に
は名前ストリングのテーブルである。コンパイラデバッ
グ情報126はまた、コンパイラ114のオブジェクト
コード124のソース行テーブル(SLT)を含んでい
る。コンパイラデバッグ情報126はまた決定用情報リ
スト(fixup list)を含んでいるが、これはリンカ12
8がコンパイラ114のオブジェクトコード124を決
定、設定するのに必要とする情報を含んでいる。オブジ
ェクトファイル118は、オブジェクトファイルシンボ
ルテーブルを含んでいる。このシンボルテーブルは各種
識別子(すなわち、シンボル)の名前及びアドレスを含
んでいる。これらのシンボルは決定用情報リスト中で参
照される。
【0057】コンパイラデバッグ情報124と同様、ト
ランスレータデバッグ情報306は、トランスレータか
らのデバッグ用名前及び型テーブルとトランスレータか
らの値テーブル(TV)を含んでいる。トランスレータ
デバッグ情報306はソース行テーブル(SLT)や決
定用情報リストを含んでいない。それは、トランスレー
タ302がそのような情報を発生しないからである。
【0058】入力オブジェクトファイルインターフェー
ス502は、コンパイラデバッグ情報126を読出し、
それをコンパイラデバッグデータ構造516に置く。同
様に、入力オブジェクトファイルインターフェース50
4は、トランスレータデバッグ情報306を読出してそ
れをトランスレータデバッグデータ構造518に置く。
図5に示すように、コンパイラ及びトランスレータデバ
ッグデータ構造516、518はデバッグ情報マニピュ
レータ510への入力である。
【0059】コンパイラデバッグデータ構造516とト
ランスレータデバッグデータ構造518は同じフォーマ
ットを共有している。この共通のフォーマットを表1に
示す。
【0060】 〈表−1〉 struct debuginfo { char *header; // 各種デバッグ情報要素 int header_len; char *gntt; int gntt_len; char *lntt; int lntt_len; char *slt; int slt_len; char *vt; int vt_len; dtab *gtbl; // 早見参照中間テーブル dtab *ltble; oldfixuplist *oldgfxup; // 古い決定情報リスト (gnt
t, lntt) oldfixuplist *oldlfxup; newfixuplist *gfxup; // 新しい決定情報リスト (gnt
t, lntt) newfixuplist *lfxup; };
【0061】入力オブジェクトファイルインターフェー
ス502及び入力オブジェクトファイルインターフェー
ス504は、本質的に同じ様に動作する。しかし、多少
の些細な相違がある。このような相違はその入力が相違
していることを反映している。例えば、入力オブジェク
トファイルインターフェース502は、オブジェクトコ
ード124中の名前がソースコード102中の名前と一
致するように名前を復元するソフトウェアルーチンを含
んでいる。
【0062】本発明228の好適実施例では、入力オブ
ジェクトファイルインターフェース502、504(及
び出力オブジェクトファイルインターフェース514
も)は、クラスとして実現されている。これらクラスの
インスタンスはオブジェクトコード及びデバッグ情報が
入っているファイルを読み書きするのに使用される。
【0063】これらのクラスは2つの層に分けられる。
これらの層とは、基底クラス(BaseClass)を表わす中
核オブジェクトファイルクラス(Core Object File Cla
sses)と、中核オブジェクトファイル基底クラスから誘
導されたクラスを表わす特殊化クラス(Specialized Cla
sses)である。これらクラスについて次の章で説明す
る。
【0064】3.1.1 中核オブジェクトファイルク
ラス 中核オブジェクトファイルクラスは、オブジェクトファ
イルヘッダやシンボルテーブルのような共通なオブジェ
クトファイルデータ構造を読出すのに使用される。中核
オブジェクトファイルクラスは、シンボルテーブル内の
シンボルを参照するアクセスルーチン及び初期設定ポイ
ンタを参照するアクセスルーチンを含む。中核オブジェ
クトファイルクラスはオブジェクトファイルを読み書き
するジェネリックルーチンもある。
【0065】本発明の好適実施例228では、2つの中
核オブジェクトファイルクラス、som300とsom800、があ
る。som300はHP9000シリーズ300コンピュータ
プラットフォーム202 で動作し、som800はHP9000
シリーズの600及び800コンピュータプラットフォ
ーム202で動作する。som300及びsom800について次章
で説明する。
【0066】3.1.1.1 クラスsom300クラスsom30
0という抽象概念の主な目的は、オブジェクト/デバッ
グファイル118、306、316に対する効率的且つ
ユーザから分かりやすいインターフェースを提供するこ
とである。クラスsom300を構成するコンピュータプログ
ラムセグメントを表2に示す。
【0067】 〈表−2〉 class coffheader : public exec { public: coffheader() {} coffheader(fstream&); coffheader(coffheader& other) {*this = other;} int validate(); }; class syment300 : public nlist_ { public: syment300() {name = NULL;}; ■syment300(); char *name; int copy(char *ptr); int symsiz() {return ( sizeof(long) + 2 * sizeof(char) + 2 * sizeof(short) + n_length);} syment300& operator = (syment300& other); friend int digest(char *, long, syment300 *&); }; class som300 { protected: char open; // このsomはオープンしているか? char valid; // このsomは正しいか? coffheader *header_ptr; // オブジェクトファイルヘッダへの // ポインタ syment300 *sym; // シンボルテーブルへのポインタ int sym_count; // シンボル数 long start_of_data; // オブジェクトファイル中での // 初期化されたデータのオフセット fstream *somfile; // 入出力のためにオープンしている // ファイルのポインタ public: // コンストラクタ及びデストラクタ som300(); som300(char *filename, int mode=iso::in); // ファイル名で初期化 ■som300(); // 手短に正当性をチェックするルーチン operator int() {return valid;} // パッケージされた入出力アクセスルーチン // これらのルーチンはfstream中の対応するルーチンと // 同じ機能を果す streampos tellg () { return somfile->tellg(); } istream& seekg (streamoff so, seek_dir ds); { return somfile->seekg(so, sd); } istream& read (char *s, long n) { return somfile->read(s, (int) n); } streampos tellp () { return somfile->tellp(); } ostream& seekp (streamoff so, seek_dir sd) { return somfile->seekp(so, sd); } ostream& write (char *s, long n) { return somfile->write(s, (int) n); } // シンボルテーブルアクセスルーチン int num_symbols() {return sym_count;} syment300 *get_symbols() {return sym;} syment300 *find_symbol(char *); char *sym_name (syment300& s); { return s.name; } long sym_loc (syment300& s); // ファイル中でsymが // 指している位置 long sym_val (syment300& s); // ロードされたプログ // ラム中でsymが // 指している位置
【0068】sym_loc()関数は、オブジェクト/デバッ
グファイル118、306中でシンボルの初期設定値を
格納しているロケーションを返す。sym_loc()関数は初
期設定ポインタにパッチを当てるのに使用される。
【0069】sym_val()関数は、コンピュータプログラ
ムをRAM210にロードされた時のシンボルの実行時
アドレスを返す。
【0070】coffheaderクラスは、コンストラクタ及び
検査子関数を付加するために、ヘッダを包むのに主に使
用される。
【0071】cyment300クラスは重要である。HP90
00シリーズ300コンピュータプラットフォーム20
2で作られたオブジェクトコードファイル118の中の
シンボルの通常の表現は、クランチ(crunch)されたレ
コード(struct nlist_)の後ろに、当該シンボル名を
ナルコードで終端しないときの正確なバイト長を示す数
が付けられたものである。
【0072】従って、その最初の動作として、コンスト
ラクタsom300()は、シンボルテーブル全体を読取り、シ
ンボルテーブルをもっと使いやすい形に、具体的にはsy
ment300レコードの配列に変換する。syment300の配列に
は2つの長所がある。 1.大きさが一定のレコードの配列であるから、走査
(traverse)し易い。 2.名前は今やナルコードで終端され且つその先頭部分
への直接のポインタを含んでいるので取扱い易い。
【0073】クラスsyment300のcopy()関数は、加工前
のシンボルテーブルからsyment300ノードを作り出すた
めに、digest()関数により使用される。演算子「=」は
このようなノードのコピーを容易にする。
【0074】3.1.1.2 クラスsom800 クラスsom800はクラスsom300より幾らか複雑である(H
P9000シリーズ600及び800のオブジェクトフ
ァイルのフォーマットが複雑であるため)。しかし、ク
ラスsom800はクラスsom300と実質上同じ機能を果す。
【0075】クラスsom800を構成するコンピュータプロ
グラムセグメントを表3に示す。クラスsom800に含まれ
ているクラス、データ構造及び機能はクラスsom300にあ
るものと相似である。
【0076】 〈表−3〉 class somheader : public header { public: somheader() {} somheader(fstream&); somheader(somheader& other) {*this = other;} int validate(); }; class som800 { protected: char open; // このsomはオープンしているか? char valid; // このsomは正しいか? somheader *header_ptr; // オブジェクトファイルヘッダへの // ポインタ SPAHDR *space_dict; // スペーステーブルへのポインタ int space_count; // スペースの数 SCNHDR *subspace_dict; // サブスペーステーブルへのポインタ int subspace_count; // サブスペースの数 char *space_strings; // スペース文字列テーブルへのポインタ int space_strings_size; // その長さ SYMENT *sym; // シンボルテーブルへのポインタ int sym_count; // シンボルの数 char *symbol_strings; // シンボル文字列テーブルへのポインタ int symbol_strings_size; // その長さ INITPTR init_ptrs; // 初期化ポインタへのポインタ int init_ptrs_count; // 初期化ポインタの数 fstream *somfile; // オープンしているファイルのポインタ public: // コンストラクタ及びデストラクタ som800(); som800(char *filename, int mode=ios::in); // ファイル名で初期化 ■som800(); // 手短な正当性チェッカ operator int() {return valid;} // パッケージされた入出力アクセスルーチン // これらのルーチンはfstream中の対応するルーチンと同じ機能を果す streampos tellg () { return somfile->tellg(); } istream& seekg (streamoff so, seek_dir sd) { return somfile->seekg(so, sd); } istream& read (char *s, long n) { return somfile->read(s, (int) n); } streampos tellp () { return somfile->tellp(); } ostream& seekp (streamoff so, seek_dir sd) { return somfile->seekp(so, sd); } ostream& write (char *s, long n) { return somfile->write(s, (int) n); } // シンボルテーブルアクセスルーチン int num_spaces() {return space_count;} int num_subspaces() {return subspace_count;} int num_symbols() {return sym_count;} int num_init_ptrs() {return init_ptrs_count;} unsigned int dp() {return header_ptr->presumed_dp;} SPAHDR *get_space_dict() {return space_dict;} SCNHDR *get_subspace_dict() {return subspace_dict;} SYMENT *get_symbols() {return sym;} INITPTR *get_init_ptrs() {return init_ptrs;} SPAHDR *find_space(char *); char *space_name(SPAHDR& s); { return &space_strings[s.STR_INDEX]; } SCNHDR *find_subspace(SPAHDR *, char *); char *subspace_name (SCNHDR& s) { return &space_strings[s.STR_INDEX]; } SYMENT *find_symbol(char *, SCNHDR *subsp = NULL, int typ = -1); char *sym_name 8SYMENT& s) { return &symbol_strings[s.offset]; } long sym_loc (SYMENT& s); // ファイル中でsymが指す位置 long sym_val (SYMENT& s); // ファイル中でロードされた // プログラムが指す位置 };
【0077】3.1.2 特殊化クラス 特殊化クラスは、コンパイラ及びトランスレータデバッ
グ情報126、306に対する読み書を行うルーチンを
含む。特殊化クラスは、オブジェクト/デバッグファイ
ル118、306を他のオブジェクト/デバッグファイ
ル(代替デバッグテーブルが入っている)にコピーし、
シンボルをオブジェクト/デバッグファイル118、3
06に入っているシンボルテーブルに追加するルーチン
も含んでいる。
【0078】本発明の好適実施例228では、debugsom
300及びdebugsom800という2つの特殊化クラスがある。
debugsom300はHP9000シリーズ300コンピュー
タプラットフォーム202で動作し、debugsom800はH
P9000シリーズ600及び800コンピュータプラ
ットフォーム202で動作する。debugsom300及びdebug
som800について次の章で説明する。
【0079】3.1.2.1 クラスdebugsom300 クラスdebugsom300を構成するコンピュータプログラム
セグメントを表4に示す。
【0080】 〈表−4〉 class debugsom300 : public som300 { protected: long last_written_pos; // 最後の書込位置を憶えておく public: // コンストラクタ debugsom300(); debugsom300(char *filename, int mode=ios::in); // ファイル名で // 初期化する // デストラクタはない // (seekpのために)最後の書込位置を返す int endpos() {return last_written_pos;} // デバッグ情報を読み書きする debuginfo *read_debug_info(); int write_debug_info(debuginfo *new_dbg_info); // シンボルテーブルにシンボルを付加する syment300 *add_symbol(char *nm, int sym_typ, int dreloc = 0); // 力仕事ルーチン:oldsomを*thisに複写して、 // デバッグ情報をcpp_infoで置き換える int copy(debugsom300& oldsom, debuginfo *cpp_info); };
【0081】ルーチンdebugsom300()はオブジェクト/
デバッグファイル118、306をオープンし、その内
容の一部を読出す。ルーチンread_debug_info()はファ
イル118、306にアクセスしてその内容の残りを読
出す。
【0082】ルーチンread_debug_info()はまた情報を
デバッグデータ構造(表1に示す)に書き込む。
【0083】3.1.2.2 クラスdebugsom800 クラスdebugsom800を構成するコンピュータプログラム
セグメントを表5に示す。クラスdebugsom800に含まれ
ているクラス、データ構造及び機能は、debugsom300ク
ラス中のものと相似である。
【0084】 〈表−5〉 class debugsom800 : public som800 { protected: int last_written_pos; // 最後の書込位置 // 手入れ情報を書き出すためのルーチン int copy_old_fixups(debugsom800& newsom); int add_new_fixups(void); public: // コンストラクタ debugsom800(); debugsom800(char *filename, int mode=ios::in); // ファイル名で // 初期化する // デストラクタはない // (seekpのために)最後の書込位置を返す int endpos() {return last_written_pos;} // デバッグ情報を読み書きする debuginfo *read_debug_info(); int write_debug_info(debuginfo *new_dbg_info); // シンボルテーブルにシンボルを付加する syment800 *add_symbol(char *nm, int sym_typ, int sym_scope, int subsp); // 力仕事ルーチン:oldsomを*thisに複写して、 // デバッグ情報をcpp_infoで置き換える int copy(debugsom800& oldsom, debuginfo *cpp_info); // 古い手入れ情報を読む friend oldfixuplist *read_debug_fixups(debugsom800&, int, char *); };
【0085】3.2 デバッグ情報マニピュレータ 図7は、デバッグ情報マニピュレータ510の構造図/
機能フローチャートを示す。図7で、長方形は、ソフト
ウェアモジュール/プロセスを表わし、長円形は、ソフ
トウェアモジュール/プロセスの入力及び出力を表わ
す。
【0086】図7に示す通り、デバッグ情報マニピュレ
ータは、ルックアップテーブル構築部710、712、
ルックアップテーブル整合部(lookup table matcher)
726及びルックアップテーブル調整部(lookup table
fixer)744を含んでいる。
【0087】図8は、デバッグ情報マニピュレータ51
0のフローチャートを示す(図8のフローチャートは、
図6のステップ610の動作をもっと詳細に見たもので
ある)。デバッグ情報マニピュレータ510の動作を、
今度は図5、図7及び図8を参照して説明する。
【0088】ステップ802で、ルックアップテーブル
構築部710及び712は、コンパイラデバッグデータ
構造516及びトランスレータデバッグデータ構造51
8を受取って、コンパイラルックアップテーブル718
及びトランスレータルックアップテーブル720を作
る。ルックアップテーブル718及び720は、ルック
アップテーブル718、720がDNTTの正確なブロック
構造を反映し、各入れ子ブロックテーブルが意味のある
DNTTのエントリ全てについてのエントリを含んでいると
いう点で、それぞれコンパイラデバッグデータ構造51
6及びトランスレータデバッグデータ構造518中に含
まれているDNTTを抽象化したものである。
【0089】ステップ806で、ルックアップテーブル
整合部726は、ルックアップテーブル718、720
を整合(match)させて整合済みコンパイラルックアッ
プテーブル(matched compiler lookup table)732
及び整合済みトランスレータルックアップテーブル(ma
tched translator lookup table)734をそれぞれ作
製する。ステップ806が終了すると、整合済みコンパ
イラルックアップテーブル732のエントリは整合済み
トランスレータルックアップテーブル734のエントリ
と整合している、つまり対応するようになっている。
【0090】ステップ810で、ルックアップテーブル
調整部744が整合ルックアップテーブル732、73
4を調整する。この調整過程中、ルックアップテーブル
調整部は、情報を整合済みコンパイラルックアップテー
ブル732から整合済みトランスレータルックアップテ
ーブル734にコピーする。
【0091】具体的には、ルックアップテーブル調整部
744は、整合ルックアップテーブル732、734を
走査して全ての可能且つ必要な情報を整合済みコンパイ
ラルックアップテーブル732のエントリからその対応
する整合済みトランスレータルックアップテーブル73
4のエントリにコピーする。調整する必要のあるフィー
ルドについて、ルックアップテーブル調整部744は、
出力オブジェクトファイルインターフェース514につ
いての「新しい決定用情報」ノードを作り出す。
【0092】整合済みコンパイラルックアップテーブル
732から整合済みトランスレータルックアップテーブ
ルにコピーされる情報には、デバッグ用名前及び型テー
ブル(DNTT)、ソース行テーブル(SLT)及びポ
ータブル決定用情報リストがある。(上に説明したよう
に、この情報はルックアップテーブル718、720に
入っている。)
【0093】具体的には、整合済みトランスレータルッ
クアップテーブルに入っているDNTTの各種のエントリの
値は、整合済みコンパイラルックアップテーブル732
からの情報を用いて修正されなければならない。このよ
うなDNTTエントリにはSVARエントリがあるが、そのロケ
ーション及びオフセット値は整合済みコンパイラルック
アップテーブル732からの情報を用いて修正されなけ
ればならない。他のこのようなDNTTエントリにはDVAR及
びFPARAMのエントリがあり、これらのロケーション及び
レジスタパラメータ値は整合済みコンパイラルックアッ
プテーブル732からの情報を用いて修正されなければ
ならない。
【0094】他のそのようなDNTTエントリにはFUNCエン
トリがあり、そのentryaddr、lowaddr、hiaddr、addr及
び最適化値は、整合済みコンパイラルックアップテーブ
ル732からの情報を用いて修正されなければならな
い。
【0095】他のそのようなDNTTエントリには、BEGI
N、END、CLASS_SCOPE、WITH、LABEL及びOBJECT_IDの各
エントリがあり、それらのアドレス値は整合済みコンパ
イラルックアップテーブル732からの情報を用いて修
正されなければならない。
【0096】また、ルックアップテーブル調整部744
は、整合済みコンパイラルックアップテーブル732に
入っているSLTを使用して整合済みトランスレータルッ
クアップテーブル734のためのSLTを作り出す。SLT
は、ステートメント及びブロックの始めと終りのロケー
ションを示す情報を含んでいる。
【0097】整合済みトランスレータルックアップテー
ブル734のためのSLTを作り出しながら、ルックアッ
プテーブル調整部744は、BEGIN及びENDのような、ス
コープに関係するSLTエントリをそれらの対応するDNTT
エントリと整合させる。従って、ルックアップテーブル
調整部744は、ソースコード102のブロック構造を
正しく反映するDNTT及びSLTのエントリの整合した組合
せが得られてそれが整合トランスレータルックアップテ
ーブル734に格納されるまで、SLTエントリを追加及
び削除し、整合しないDNTTエントリを無効にする。整合
しないSLT及びDNTTエントリには除去用の印を付ける。
【0098】多くの場合、整合済みトランスレータルッ
クアップテーブル734に挿入しなければならない情報
は、リンク時点までわからない。例えば、静的変数のア
ドレス、あるいは関数の開始及び終りについてのコード
アドレスは、リンクするまでわからない。
【0099】これらの場合には、ルックアップテーブル
調整部744は、決定用情報(fixup)を作り出して、
リンカ128にリンクプロセス中適切な値をオブジェク
トコード316中の最終デバッグ情報に挿入するよう指
示する。
【0100】決定用情報は、DNTTのSVAR、FUNC及びOBJE
CT_IDの各エントリについて作らなければならない。
【0101】ステップ814で、ルックアップテーブル
調整部744は整頓段階に入り、除去用の印が付いてい
るSLT及びDNTTを削除する(SLTエントリの場合)かまた
は無効にする(DNTTエントリの場合)。
【0102】ステップ810及び814の終了に続い
て、図7に示すように、ルックアップテーブル調整部7
44は、マージ済みルックアップテーブル528を出力
するが、これには整合ルックアップテーブル734及び
決定用情報リスト530が入っている。
【0103】図8のステップ802、804、810及
び814について、次章で更に詳細に説明する。
【0104】3.2.1 ステップ802−ルックアッ
プテーブルを構築するルックアップテーブル構築部71
0、712により発生されたルックアップテーブル71
8、720は、ブロック構造を持つ入れ子になったテー
ブルで、DNTTのエントリを保持するのに使用される。プ
ロック構造は次のDNTT対の形で表わされる。 ・ K_MODULE と K_END ・ K_FUNCTION と K_END ・ K_BEGIN と K_END
【0105】このような対は、各々別個のクラスで表わ
されるが、これらクラスは皆dtabと呼ばれる共通基底ク
ラスから誘導される。
【0106】例えば、下記のコンピュータプログラムの
抜粋を考える。
【0107】int vl; main (int argc, char **argv) { int k = argc; if( k > 1 ) { char* foo = argv[0]; } int j = k / 2; j += 2; if( j > 3 ) { char *foo = argv[1]; } } int v2;
【0108】以下の表6は、ルックアップテーブル構築
部710,712がこのプログラム抜粋をルックアップ
テーブル718、720中で表わす方法を示している。
【0109】 〈表−6〉 TABLE (Start NTT: 0; End NTT: 0; Srcf: 0) MODULE (Name: <<<NULL_SYMBOL>>>; Alias: ; Start NTT: 40008988; End NTT: 40008988; Start SLT: -1; End SLT: -1; Srcf: 0) Src (Name: t1.c; NTT: 400089a0; SLT: -1) Svar (Name: v1; NTT: 40008aa8; Off: 0; disp: 0; loc: 0; sym: 0; Srcf: 0) Svar (Name: v2; NTT: 40008ac0; off: 0; disp: 0; loc: 0; sym: 0; Srcf: 0) FUNCTION (Name: main; Alias: _MAIN_; Start NTT: 400089ac; End NTT: 400089ac; Start SLT -1; End SLT: -1; Srcf: 400097c8) Fparam (Name: argc; NTT: 400089d0; spoff: 0; Srcf: 400097c8) Fparam (Name: argv; NTT: 40008a00; spoff: 0; Srcf: 400097c8) BLOCK (Start NTT: 40008a18; End NTT: 40008a18; Start SLT: -1; End SLT: -1; Srcf: 400097c8) Dvar (Name: j; NTT: 40008a3c; spoff: 0; Srcf: 400097c8) Dvar (Name: k; NTT: 40008a24; spoff: 0; Srcf: 400097c8) BLOCK (Start NTT: 30008a54; End NTT: 40008a54; Start SLT: -1; End SLT: -1; Srcf: 400097c8) Dvar (Name: foo; NTT: 40008a6c; spoff: 0; Srcf: 400097c8) BLOCK (Start NTT: 40008a90; End NTT: 40008a90; Start SLT: -1; End SLT: -1; Srcf: 0) Dvar (Name: foo; NTT: 40008aa8; spoff: 0; Srcf: 0)
【0110】表6の中の表現の中で注意しておくべき特
徴がいくつかある。第1に、各「ブロック」は1つのテ
ーブルで表わされている。最も外側のレベル(グローバ
ルレベル)は、テーブルMODULEで表わされている。(実
際には、最も外側レベルは外側のTABLEで表わすべきで
あるが、DNTT_MODULEエントリに対するテーブルを作る
準備を行わなければならない。)「関数」レベルのブロ
ックはテーブルFUNCTIONで表わされる。内部ブロックは
全てテーブルBLOCKで表わされる。
【0111】第2に、テーブルノードは幾らかの一般情
報を含んでおり、テーブル型は幾らかの型固有の情報を
持っている。具体的には、ブロックの始めと終りに対応
するDNTTエントリへのポインタは、ブロックの始めの直
前及び終りの直前(表6には示されていない)に見られ
る直前のDNTT_SOURCEFILEへのポインタのように、全て
のテーブルについて格納される。
【0112】また、SLT内の対応するブロックの始めと
終りに対するSLTインデクスは、全ての関数、ブロック
及びモジュールについて格納される。また、名前及びエ
イリアスをへのポインタが全ての関数、ブロック及びモ
ジュールについて格納される。
【0113】第3に、ブロック内の全てのエントリは、
ハッシングされてそのブロックに対応するテーブルに入
れられている。色々な型のエントリが生成され、その各
々はそのエントリの型に対応する幾らかの特定の情報を
持っている。
【0114】最後に、エクスポート及びインポートされ
たグローバル変数(GNTTに対応する)についての他のTA
BLEテーブルが生成される(表6には示されていな
い)。このテーブルはブロック構造を有していない。
【0115】本発明の好適実施例では、ブロック構造対
を表わす以下の5つのクラスがある:datab, blocktab,
functab, modtab,及びnulltabである。これらクラスに
ついて次章で詳細に説明する。
【0116】3.2.1.1 クラスdtabdtabは、ルッ
クアップテーブル718、720の機能のほとんどを実
現する基底クラスである。dtabクラスは、エントリのた
めのハッシュテーブル、サブテーブルのリストへのポイ
ンタ、その直接の親テーブルへの逆方向ポインタを含
む。
【0117】これに加えて、dtabクラスは、反復の間の
状態を保持するメンバと、ある重要なデバッグ構造への
ポインタを含む。
【0118】dtabは抽象基底クラスである(表7中の宣
言ttyp()を参照)。
【0119】dtabクラスを構成するクラス、データ構
造、変数及び関数を表7に示す。
【0120】 〈表−7〉 class dtab { private: dsyment **ent; // 要素用のハッシュテーブル int numbuckets, numtables; dtablist *firstchild; // テーブルの下位リストへの // ポインタ dtab *parent; // 親テーブルへのポインタ dtablist *nextchild; // 反復子が使用 dnttentry *ntt_start, *ntt_end; // テーブルの付き合わせ及び // 手当をするルーチンが使用 SLTPOINTER slt_start, slt_end; // 同 上 dtab *corresponding; // 同 上 dsrcent *srcf, *esrcf; // ソースファイルテーブル要素への // ポインタ fakeblock *n_fakes; // このブロック内の // 「フェイク(模造)」ブロック protected: int make_table(int buckets); // コンストラクタから呼ばれる public: // コンストラクタ及びデストラクタ dtab() {make_table(DTABSIZ);} dtab(int buckets) {make_table(buckets);} virtual ■dtab(); // テーブル操作ルーチン int hash(char *); int insert(dsyment *entry); int remove(dsyment *entry); dsyment *lookup (char *n, int nofollow=0, int kind=K_NIL); int add_subtable (dtab *subtab); // このテーブルは何か「実際」の要素を含んでいるか? int empty(); // デバッグ情報のためのアクセスルーチン void set_slt_start(SLTPOINTER n) {slt_start = n;} void set_slt_end(SLTPOINTER n) {slt_start = n;} SLTPOINTER get_slt_start() {return slt_start;} SLTPOINTER get_slt_end() {return slt_end;} void set_ntt_start (dnttentry *ntt) {ntt_start = ntt;} void set_ntt_end (dnttentry *ntt) {ntt_end = ntt;} dnttentry *get_ntt_start () {return ntt_start;} dnttentry *get_ntt_end () {return ntt_end;} void set_sourcefile(dsrcent *x) {srcf = x;} void set_endsourcefile(dsrcent *x) {esrcf = x;} dsrcent *sourcefile() {return srcf;} dsrcent *endsourcefile() {return esrcf;} // フェイクブロックへのアクセスルーチン void set fakes(fakeblock *f) {n_fakes = f;} fakeblock *fakes() {return n_fakes;} // テーブル反復子 void iter_start(); dtab *nextsubtab(); // テーブルタイプ virtual int ttyp() = 0; // 他のメンバ及びフレンドの宣言 };
【0121】3.2.1.2 クラスblocktab blocktabはdtabから誘導されたクラスである。blocktab
は全てのソースブロックの基底クラスである。blocktab
は、演算子ttyp()以外は、dtabに追加して定義している
ものはない。ttyp()は関数の内側の全ての{}内部のシン
ボルを表わすのに使用される。
【0122】クラスblocktabを構成するクラス、データ
構造、変数及び関数を表8に示す。
【0123】 〈表−8〉 class blocktab : public dtab { public: // コンストラクタ blocktab() {} // テーブルタイプ virtual int ttyp(); // K_BEGIN };
【0124】3.2.1.3 クラスfunctab functabは、blocktabから誘導されたクラスである。fun
ctabは、関数の最も外側のブロックを表わすのに使用さ
れる。functabは関数の名前及びエイリアスを定義す
る。functabはまた名前及びエイリアスにアクセスして
修正する一組のアクセスルーチンを定義する。
【0125】クラスfunctabを構成するクラス、データ
構造、変数及び関数を表9に示す。
【0126】 〈表−9〉 class functab : public blocktab { private: char *n_name, *n_alias; // 関数の名前とエイリアス public: // コンストラクタ functab(char *n, char *a); // 名前とエイリアスへのアクセスルーチン char *name() {return n_name;} char *alias() {return n_alias;} void set_name (char *n) {n_name = n;} void set_alias (char *n) {n_alias =n;} // テーブルタイプ virtual int ttyp(); // K_FUNCTION };
【0127】3.2.1.4 クラスmodtab modtabはblocktabから誘導されたクラスである。modtab
は本質的にはfunctabと同じであり、代わりにfunctabか
ら誘導することができる。
【0128】modtabは関数ttyp()を再定義する。
【0129】クラスmodtabを構成するクラス、データ構
造、変数及び関数を表10に示す。
【0130】 〈表−10〉 class nulltab : public dtab { public: // コンストラクタ nulltab() {} nulltab(int buckets) : dtab(buckets) {} }; class modtab : public blocktab { private: char *n_name, *n_alias; // モジュールの名前とエイリアス public: // コンストラクタ modtab(char *n, char *a); // 名前とエイリアスへのアクセスルーチン char *name() {return n_name;} char *alias() {return n_alias;} void set_name (char *n) {n_name = n;} void set_alias (char *n) {n_alias = n;} // テーブルタイプ virtual int ttyp(); // K_MODULE };
【0131】3.2.1.5 クラスnulltab nulltabはdtabから誘導されたクラスである。nulltabは
最も外側のレベルのローカル及びグローバルNTTを表わ
すのに使用される。例えば、GNTTはグローバルなSVARを
全て含んでいるnulltabにより表わされる。同様に、LNT
Tの中のmodtabはnulltabの内側に包まれる。
【0132】クラスnulltabの主な特徴は、色々なハッ
シュテーブルサイズを与えてインスタンスを生成するこ
とができることである(テーブルが本質的にフラット
で、小さなハッシュテーブルでは多数の衝突を引き起こ
してしまうGNTTに有用である)。
【0133】クラスnulltabを構成するクラス、データ
構造、変数及び関数を表11に示す。
【0134】 〈表−11〉 class public : public dtab { public: // コンストラクタ nulltab() {} nulltab(int buckets) : dtab(backets) {} // テーブルタイプ virtual int ttyp(); // K_NIL };
【0135】3.2.2 ステップ806−ルックアッ
プテーブルを整合させる ステップ806の期間中、ルックアップテーブル整合部
726は、コンパイラルックアップテーブル718のエ
ントリをトランスレータルックアップテーブル720の
エントリと整合させる。
【0136】図9は、ルックアップテーブル整合部72
6の動作のフローチャートを示す(換言すれば、図9は
ステップ806の動作の詳細フローチャートを示す)。
ステップ902で、ルックアップテーブル整合部726
はルックアップテーブル718、720をその最もコン
パクトな形態に正規化する、すなわち縮約する。
【0137】ステップ906で、ルックアップテーブル
整合部726はトランスレータルックアップテーブル7
20の深さ優先の走査を行い、トランスレータルックア
ップテーブル720中の要素をコンパイラルックアップ
テーブル718中でそれに対応する要素(またはその祖
先原型のうちの1つ)と整合させる。
【0138】ステップ902及び906を次章で更に詳
細に説明する。
【0139】3.2.2.1 ステップ902−ルック
アップテーブルを正規化する ステップ902の間、ルックアップテーブル整合部72
6は関係のないテーブルを識別して捨てる。このステッ
プを行っている間の目標は、ルックアップテーブル71
8、720をその最小の大きさにまで圧縮してルックア
ップテーブル718、720の中のサブテーブルがそれ
ぞれ少くとも1つの関係のあるエントリを持つようにす
ることである。ステップ902でこの目標を達成するこ
とにより、ルックアップテーブル整合部726は、ステ
ップ906で入力用のルックアップテーブル718と7
20をエントリ毎に整合、つまり対応させることができ
る。
【0140】ステップ902を行うに際し、ルックアッ
プテーブル整合部726は型エントリを無視する。ルッ
クアップテーブル整合部726は、変数エントリだけが
デバッグ情報の修正を必要とするので、(SVAR、DVAR及
びFPARAMのような)変数エントリにだけ注意を払う。
【0141】オブジェクトコードファイル118はトラ
ンスレータ302により作られたテンポラリデータにつ
いての多数のエントリを含んでいる。これらテンポラリ
データができるために、コンパイラデバッグデータ構造
516に入っているコンパイラデバッグ情報126のブ
ロック構造が変化する。例えば、トランスレータルック
アップテーブル720の中では空になっているテーブル
が、コンパイラルックアップテーブル718中では空で
はなくなっていることがある。
【0142】それ故、ステップ902の間、ルックアッ
プテーブル整合部726は、トランスレータ302が作
り出したテンポラリデータを表わすDVARを無視する。こ
のようなテンポラリデータDVARはその名前で識別するこ
とができる。本発明の好適実施例では、DVARテンポラリ
データは文字列「__[A-Z]」(すなわち、2つのアンダ
ースコア文字の次に大文字のアルファベットが続くも
の)で始まる名前を持っているとされている。
【0143】本発明の好適実施例では、ルックアップテ
ーブル整合部726はステップ902を行うのに表12
に擬似コードで示すアルゴリズムを使用している。
【0144】 〈表−12〉 for table_root.depth-first-search() 中の各テーブル do if table.empty() then # このテーブルを消去する このテーブルの全要素を親テーブル中にコピーする このテーブルへの親テーブルからのリンクポインタを このテーブルのサブテーブルのリストで置換する endif endfor
【0145】ルックアップテーブル整合部726は、テ
ーブルがSVARを含まずかつテーブルに入っているDVARが
トランスレータ302で作られたテンポラリデータであ
れば、テーブルが空であるとみなす。
【0146】3.2.2.2 ステップ906−深さ優
先の走査を行う ステップ906の間、ルックアップテーブル整合部72
6はトランスレータルックアップテーブル720のエン
トリをコンパイラルックアップテーブルのそれに対応す
るエントリと整合させる。ステップ906を行うには、
ルックアップテーブル整合部726は2つのルックアッ
プテーブル718と720に対して並列、深さ優先の走
査を行う。
【0147】本発明の好適実施例では、ルックアップテ
ーブル整合部726はステップ906を行うのに表13
に疑似コードで示したアルゴリズムを使用する。
【0148】 〈表−13〉 match_tables (dtab *cpp_tab, dtab *ctab) { cpp_tab と c_bab の互に対応するフィールドを指示する for cpp_tab の各子 do c_tab の次の子を得る matching_tables (cpp_tab_child, c_tab_child); endfor }
【0149】表13に示したアルゴリズムは、コンパイ
ラルックアップテーブル718とトランスレータルック
アップテーブル720の双方において、対応するテーブ
ル(関数やローカルブロック等に対するもの)が正確に
同じ順序で現われるという仮定のもとに動作する。この
仮定はステップ902により保証される。
【0150】3.2.3 ステップ810−調整を行う ステップ810を行うには、ルックアップテーブル調整
部744は整合済みトランスレータルックアップテーブ
ル734に対しての深さ優先走査を行う。
【0151】整合済みトランスレータルックアップテー
ブル734だけに対して走査が行われる。整合済みトラ
ンスレータルックアップテーブル734の中の各サブテ
ーブルの各エントリを整合済みコンパイラルックアップ
テーブル732の中の対応するサブテーブル内で探す。
このようなエントリが整合済みコンパイラルックアップ
テーブル732内に存在しなければ、トランスレータル
ックアップテーブル734の中のこのエントリに対応す
るDNTTエントリに削除用の印を付ける。その他の場合に
は、整合済みコンパイラルックアップテーブル732か
らの情報を整合済みトランスレータルックアップテーブ
ル734にコピーする。
【0152】ルックアップテーブル調整部744が整合
ルックアップテーブル732と734の間で情報をコピ
ーするやり方を次の章で詳細に説明する。
【0153】3.2.3.1 DNTTフィールド値 整合済みコンパイラルックアップテーブル732に対応
するエントリが見つかると、ルックアップテーブル調整
部744は可能な全ての情報を整合済みトランスレータ
ルックアップテーブル734のエントリにコピーする。
具体的には、DVAR及びFPARAMのエントリについては、ル
ックアップテーブル調整部744は、スタックオフセッ
ト値及びレジスタフラブ値をコピーする。
【0154】SVARエントリについては、ルックアップテ
ーブル調整部744は、シンボルロケーション値につい
ての将来の決定用情報を設定し、シンボルオフセット
値、変位値及びロケーション値をコピーする。
【0155】FUNCエントリについては、ルックアップテ
ーブル調整部744は、entryaddr値、最適化フィール
ド値、lowaddrフィールド値及びhiaddrフィールド値を
コピーする。実現の仕方によっては、ルックアップテー
ブル調整部744は、これらフィールドについての決定
用情報を設定してもよい。
【0156】OBJECT_IDエントリについては、ルックア
ップテーブル調整部744はobject_identフィールド値
についての決定用情報を設定する。
【0157】3.2.3.2. SLT ルックアップテーブル調整部744は、対応するDNTT_B
EGIN/DNTT_END対をSLT_BEGIN/SLT_END対と整合させる。
ルックアップテーブル調整部744はまた、MODULE対及びF
UNCTION対を整合させる。そのように整合させることが
できないSLTまたはDNTT BEGIN/ENDエントリは、削除の
目標である(ただし下の説明を参照)。
【0158】また、ルックアップテーブル調整部744
は、SLT_CLASS_SCOPEエントリ及びSLT_WITHエントリ
(及びそれに対応するSLT_END)を挿入し、対応するDNTT
エントリを整合させる。コンパイラ114はこれらのエ
ントリを出力しない。それは、それらがトランスレータ
デバッグ情報306に固有のものであるからである。
【0159】また、ルックアップテーブル調整部744
は、余分のSLT_BEGIN/SLT_END対を挿入して、関数内部
のクラス宣言に包まれているDNTT_BEGIN/DNTT_END対と
整合させる。これらは決して削除してはならない。
【0160】上述の操作を行うには、ルックアップテー
ブル調整部744は最初に初期SLTを設定し、次にSLTを
増加する。これら2つのステップについて次の章で詳細
に説明する。
【0161】3.2.3.2.1 初期SLTを設定する 表6及び表7に示すように、テーブルノードは2つのSL
Tポインタ用フィールドを含んでいる。1つはSLT_BEGIN
(またはFUNCTIONまたはMODULE)へのポインタであり、
もう1つはブロックを区切るDNTTに対応するSLT_ENDへ
のポインタである。
【0162】これらノードは、整合済みコンパイラルッ
クアップテーブル732については正しく設定される
が、トランスレータルックアップテーブル734につい
ては正しく設定されない。ルックアップテーブル調整部
744は、下記のステップを行って整合済みトランスレ
ータルックアップテーブル734についてのこれらノー
ドを設定する。
【0163】最初に、ルックアップテーブル調整部74
4は、整合済みトランスレータルックアップテーブル7
34についての修正のためのSLTのコピーを、整合済み
コンパイラルックアップテーブル732から作る。この
コピー中のDNTT逆方向ポインタはクリアされる。
【0164】調整ステップ810の間(ルックアップテ
ーブル調整部744は、この動作の間は挿入や削除を行
わない)、ルックアップテーブル調整部744は、整合
済みコンパイラルックアップテーブル732中の対応す
るエントリが指すものと同じオフセットにある対応する
SLTエントリを指すように、整合済みトランスレータル
ックアップテーブル734を設定する(また、勿論、こ
れら新しいSLTエントリに対する対応する逆方向ポイン
タを設定する)。
【0165】これら2つのステップが終了してからも、
幾つかの未整合DNTT_BEGIN/DNTT_END対と、おそらくは
幾つかの未整合SLT_BEGIN/SLT_END対が存在することが
ある。ルックアップテーブル調整部744はこれらを削
除の目標とする。
【0166】また、ルックアップテーブル調整部744
は、幾つかのSLT_BEGIN及びSLT_FUNCTIONノードに或る
特別の印を設定し、これにより、後のSLT増加操作を行
う段階で何等かのノードを生成してそれらのノードの回
りに挿入しなければならないことを示す。
【0167】3.2.3.2.2 SLTを増加する 上に記したように、或るDNTTノードについて、ルックア
ップテーブル調整部744はSLTエントリを生成する。
これらDNTTノードには以下の2つの種類がある。
【0168】第1のものは、DNTT_CLASS_SCOPE及びDNTT
_WITHノードである。これらはクラスのメンバ関数に対
するDNTT_FUNCノードの前及び後に来る(それらに対応
するDNTT_ENDもまた関数のDNTT_ENDを括る)。
【0169】第2のものは、特別に印の付いたDNTT_BEG
IN及びDNTT_ENDノードである。これらは、関数内部のロ
ーカルクラス宣言を取り囲むものとして出力される。こ
れらノードは、普通のBEGIN及びENDとしては処理されな
い(すなわち、これらについてはテーブルが作られな
い)。
【0170】第1の場合については、ルックアップテー
ブル調整部744は、DNTT_FUNCの未使用フィールド
に、関数の前のDNTT_CLASS_SCOPEの有無及び関数の後の
DNTT_WITHの有無について1ビットづつ、合計2ビット
の印を付ける。
【0171】第2の場合については簡単な印を付けるこ
とは不可能である。各々がDNTT_FUNCTION/DNTT_END対の
内部(すなわち、ローカルブロックの内側で宣言された
クラス)ではなく、DNTT_BEGIN/DNTT_END対の内部に現
われる、任意の個数のBEGIN/END対が存在できる。
【0172】模造ブロック(fake block)という概念
は、これらの状況を取扱うのに使用される。
【0173】模造ブロックは「現実のブロック」と同じ
であるが、テーブル構築ステップ802の間、ルックア
ップテーブル構築部710、712が印の付いたBEGIN
(またはこのような印の付いたBEGINに対応するEND)を
見つけたとき、ルックアップテーブル構築部が別個のテ
ーブルスタックにプッシュダウンしたりポップアップす
る点だけが違う。最後のこのようなエントリがポップア
ップされると、サブトリー全体が直ぐ外側の「現実の」
テーブルに取付けられる。
【0174】SLTを埋め盡すには、ルックアップテーブ
ル調整部744は、SLTを走査してこれを1エントリづ
つ新しいコピーに転写する。ルックアップテーブル調整
部744は、役に立たないSLTエントリ(例えば、DNTT_
SRCFILEに対応しなかったSLT_SRCFILE)を捨て、上述の
ように幾つかのSLTエントリを挿入する。
【0175】ルックアップテーブル調整部744は、加
除されたSLTエントリの数のカウンタを保持している。S
LT_SPECIALが現われると、ルックアップテーブル調整部
744は、DNTTを逆方向に指示するそのDNTTPOINTERに
従い、このオフセットカウンタをそのSLTPOINTERに加え
る。
【0176】SLTへの各エントリについて、ルックアッ
プテーブル調整部744は次の処置を取る。
【0177】SLT_NORMALエントリについては、ルックア
ップテーブル調整部744は、これらを整合済みトラン
スレータルックアップテーブルにコピーし、両インデク
スを1だけインクリメントさせる。
【0178】SLT_SRCFILEエントリについては、DNTT逆
方向ポインタがDNTT_NTLであれば、ルックアップテーブ
ル調整部744はこのSLT_SRCFILEエントリを捨て、オ
フセットカウンタをデクリメントさせる。その他の場合
には、ルックアップテーブル調整部744はDNTT逆方向
ポインタを整合済みトランスレータルックアップテーブ
ル734にコピーする(そして逆方向ポインタにより指
示されているDNTTエントリを調節する)。
【0179】SLT_BEGINエントリについては、DNTT逆方
向ポインタがDNTT_NILであれば、ルックアップテーブル
調整部744はこのSLT_BEGINエントリを捨て、オフセ
ットカウンタをデクリメントさせる。
【0180】その他の場合には、ルックアップテーブル
調整部744はノードをコピーする。ルックアップテー
ブル調整部744は次にこのノードにより指示されてい
るDNTT_BEGINを調べる。調整ステップ810の間、ルッ
クアップテーブル調整部744は模造ブロックテーブル
のトリーのコピーをDNTT_BEGINの終りの未使用のパディ
ングワードに格納する。このノードが0でなければ、ル
ックアップテーブル調整部744は模造ブロックトリー
の深さ優先の走査を行う。
【0181】模造ブロックトリーの深さ優先の走査を行
いながら、ルックアップテーブル調整部744は、下降
途中で出逢う各テーブルについてSLT_BEGINを作る。こ
れらノードについてのDNTTポインタは模造ブロックノー
ドに格納され、DNTTからSLTへの前進及び後退リンクを
設定するのに使用される。ルックアップテーブル調整部
744は次にオフセットカウンタをインクリメントさせ
る。
【0182】ルックアップテーブル調整部744はま
た、上昇の途中で各テーブルについてのSLT_ENDを作
り、これに同様にパッチを当て、オフセットカウンタを
インクリメントさせる。
【0183】SLT_FUNCTIONエントリについては、ルック
アップテーブル調整部744は、これらのSLTエントリ
に対応するDNT_FUNCTIONエントリを追跡して位置を突き
とめる。ルックアップテーブル調整部744は、DNTT_C
LASS_SCOPE及び/またはDNTT_WITHの存在を示すフラグ
がないかどうかチェックする。
【0184】クラススコープに関するフラグが設定され
ていれば、ルックアップテーブル調整部744はSLT_CL
ASS_SCOPEを生成してオフセットカウンタをインクリメ
ントさせる。ルックアップテーブル調整部744はDNTT
_FUNCTIONから後向きに探し、DNTT_CLASS_SCOPEの位置
を突きとめてこれを整合させる。
【0185】次に、ルックアップテーブル調整部744
は、SLT_FUNCTIONノード全体をコピーし、DNTT_FUNCTIO
NのSLTポインタを、オフセットカウンタにより調節す
る。
【0186】DNTT_WITHフラグが設定されていれば、ル
ックアップテーブル構築部744は、SLT_WITHを生成
し、同様にDNTT_WITHを捜し出して前進・後退ポインタ
を設定する。
【0187】最後に、ルックアップテーブル構築部74
4は模造ブロックがないかどうかチェックし、DNTT_BEG
INに対するのと同じ手続を取る。
【0188】SLT_ENDエントリについては、DNTT逆方向
ポインタがDNTT_NILであれば、ルックアップテーブル構
築部744はこのエントリを捨て、オフセットカウンタ
をデクリメントさせる。そうでない場合には、ルックア
ップテーブル構築部744は、(それに対応したDNTT_E
NDを見出しそのbeginscopeフィールドを調べることによ
り)そのスコープを開始した対応するDNTTをチェックす
る。対応したDNTTがDNTT_FUNCTIONであってかつclass_s
copeまたはwithフラグがセットされていれば、ルックア
ップテーブル構築部744がSLT_ENDを生成して既に作
られているSLT_CLASS_SCOPEまたはSLT_WITHを整合さ
せ、これに従ってポインタとオフセットカウンタにパッ
チを当てる。ルックアップテーブル構築部744はSLT_
FUNCTIONに対するのと同じ手法を取る。すなわち、クラ
ススコープに対してSLT_ENDを挿入し、このENDをコピー
し、withに対してSLT_ENDを挿入する。
【0189】SLT_MODULEエントリについては、ルックア
ップテーブル調整部744はエントリを完全にコピーす
る。それは1つのものしか存在しないからである。
【0190】上の処置が完了した後には、要素ごとにLN
TTに正しく整合つまり対応している新しいSLTが存在す
る。また、この新しいSLTには使用されていないエント
リは含まれていない。
【0191】3.2.3.3 DNTT_SRCFILEとSLT_SRCFI
LEを整合させる SRCFILEエントリは、デバッグ情報構成の中で最も体系
的でない部分である。SCRFILEをどこに出力するかにつ
いては、コンパイラが異れば、その方針が異なる。
【0192】これに加えて、ある侵すことのできないSR
CFILEエントリが存在する(例えば、FUNCTIONエントリ
の直前にあるSCRFILEエントリ)。
【0193】整合ルックアップテーブル732、734
中の各ノード及びテーブルは、そのノードの直前にある
SCRFILEエントリへのポインタを有している。これに加
えて、各テーブルノードは、そのテーブルのDNTT_ENDの
直前のSRCFILEへのポインタを有している。
【0194】ルックアップテーブル調整部744はこの
問題点を解決するために発見的方法を利用している。
【0195】調整ステップ810の間にトリーを走査す
ると、ルックアップテーブル調整部744はSRCFILEエ
ントリを飛越す(これらのエントリは帳簿付け及びデバ
ッグのためだけに整合済みトランスレータルックアップ
テーブル734中に存在する)。その代り、ルックアッ
プテーブル調整部744はテーブルに出会う毎に下記ア
ルゴリズムを使用する。
【0196】ステップ1:ルックアップテーブル調整部
744は、対応するテーブルのSRCFILEエントリを使用
して、ブロックのBEGINに対応するSRCFILEエントリを決
定する(fix up)。
【0197】ステップ2:ルックアップテーブル調整部
744は、上述のように整合済みトランスレータルック
アップテーブル734のサブテーブルの深さ優先の走査
を行う。
【0198】ステップ3:ルックアップテーブル調整部
744はブロックのENDに対応するSRCFILEエントリを決
定する。
【0199】ステップ4:整合済みトランスレータルッ
クアップテーブル734の各エントリについて、ルック
アップテーブル調整部744は、このノードにより指示
されているSRCFILEエントリを決定する。
【0200】ルックアップテーブル調整部744は、FU
NCTIONまたはBEGINのノードに出逢うと、最後に見たSRC
FILEをNULLにリセットする。これは、SRCFILEが上記の
アルゴリズムのステップ1により修正されるために可能
である。
【0201】上の4ステップアルゴリズムが終了した
後、FUNCTIONに対応する各SRCFILEが決定される。他のS
RCFILEは、関数の内部で変化するもの以外は重要ではな
く、これらはステップ3及びステップ4でルックアップ
テーブル調整部により処理される。
【0202】3.2.4. ステップ814−整頓する ステップ814の間、ルックアップテーブル調整部74
4は、削除用の印が付いているエントリを削除すること
により名前及び型テーブル(Name andType Table, NT
T)を整頓する。ルックアップテーブル調整部744
は、このステップの間、LNTTとGNTTの内部の相互リンク
があるため注意を払わなければならない。
【0203】ルックアップテーブル調整部744は、問
題となっているエントリを、その種類フィールドをK_NI
Lに設定することにより削除し、または無効にする。エ
ントリがDNTT_BLOCKの1個分より長ければ、2番目以降
のブロックも加工されていないDNTT_BLOCKとして処理さ
れ、その種類フィールドはK_NILに設定され、その延長
フラグは0にリセットされる(こうしてこのエントリを
幾つかの隣接したK_NILブロックのように見せる)。
【0204】整頓を行うには、ルックアップテーブル調
整部744は、DNTTに対して最後の走査を行い、「特別
に印が付けられた」DNTTエントリを全て探し、それらを
上述のように無効にする。
【0205】3.3 出力オブジェクトファイルインタ
ーフェース 図5に示すように、出力オブジェクトファイルインタフ
ェース514は、新しいオブジェクトコード316を作
り、新しいオブジェクトコード316にオブジェクトコ
ード124及びトランスレータデバッグ情報306とコ
ンパイラデバック情報126の組合せを格納する。
【0206】出力オブジェクトファイルインターフェー
ス514のフローチャートを図10に示す。出力オブジ
ェクトファイルインターフェース514の動作を今度は
図5、図7及び図10を参照して説明する。
【0207】ステップ1002で、出力オブジェクトフ
ァイルインターフェース514は最終デバッグ情報を含
むオブジェクトコード316用のファイルを書き込み用
に生成する。
【0208】ステップ1006で、出力オブジェクトフ
ァイルインターフェース514はオブジェクトファイル
124のヘッダのためのスペースをオブジェクトコード
316用のファイルに残す。
【0209】ステップ1010で、出力オブジェクトフ
ァイルインターフェース514は、オブジェクトコード
ファイル118、マージ済みルックアップテーブル52
8及びポータブル出力決定用情報530からの情報を、
最終デバッグ情報を含むオブジェクトコード316用の
ファイルに書込む。出力オブジェクトファイルインター
フェース514は、この情報をこのファイルに次の順序
で書込む。
【0210】最初に、出力オブジェクトファイルインタ
ーフェース514は、テキストを、次にデータを、次に
もし存在すれば、Pascalインターフェースをこのファイ
ルに書込む。
【0211】出力オブジェクトファイルインターフェー
ス514は次に、シンボルテーブルを最終デバッグ情報
を含むオブジェクトファイル316に書込む。これはシ
ンボルテーブルをオブジェクトコードファイル118か
らこのファイル316にコピーすることにより行われ
る。次に、シンボルが関数add_symbol()を使用して付加
される(表4及び表5)。最後に、シンボルテーブルの
サイズをオブジェクトファイルのヘッダ中で調節する。
【0212】出力オブジェクトファイルインターフェー
ス514は次にSupsym、テキスト再配置レコード及びデ
ータ再配置レコードをファイル316に書込む。
【0213】出力オブジェクトファイルインターフェー
ス514は次に、延長ヘッダ、デバッグヘッダ、GNTT、
LNTT、SLT及びVT(及びもしあればXT)及び別の延長部
分から成るデバッグ情報をファイル316に書込む。ま
た、延長ヘッダのオフセット及びサイズがオブジェクト
ファイルヘッダに記録される。
【0214】ステップ1014で、出力オブジェクトフ
ァイルインターフェース514は、オブジェクトファイ
ルヘッダを最終デバッグ情報を含むファイル316のオ
フセット0の位置に書込む。
【0215】本発明の好適実施例228では、出力オブ
ジェクトファイルインターフェース514はクラスの形
態で実現されている。これらクラスのインスタンスはオ
ブジェクトコード及びデバッグ情報が入っているファイ
ルを読み書きするのに使用される。
【0216】出力オブジェクトファイルインターフェー
ス514のクラスは、入力オブジェクトファイルインタ
ーフェース502、504についてのクラスと同じであ
る。これらのクラスを構成するクラス、データ構造及び
関数は表2、表3、表4及び表5に示してある。
【0217】出力オブジェクトファイルインターフェー
ス514の動作は、関数を表2、表3、表4及び表5で
示したクラスから呼出すことにより行われる。例えば、
HP9000シリーズ300コンピュータプラットフォ
ーム202上で動作するときは、関数Write_debug_info
()を使用してデバッグ情報750をファイル316に書
込む。また、関数copy()を使用してオブジェクトコード
124をファイル316に書込む。
【0218】4.0 デバッガ 図11は、本発明の好適実施例228のデバッガ320
の構造図/機能フローチャートを示す。図11で、端末
218及びユーザ1118以外は、長方形はソフトウェ
アモジュール/プロセスを表わし、長円形はソフトウェ
アモジュール/プロセスの入力及び出力を表わす。
【0219】図11に示すように、デバッガ320は2
つのモジュール、すなわちプリプロセッサ1104と主
デバッガ1112を含んでいる。
【0220】プリプロセッサ1104は、実行可能ファ
イル350(実行可能ファイル350はオブジェクトコ
ード316中の最終デバッグ情報を含んでいる)を受取
り、前処理されたデバッグ情報1108を発生する。前
処理されたデバッグ情報1108は、プリプロセッサ1
104が重複した情報を除去し、情報の各部分間のポイ
ンタを決定し(fix up)、あるデータを特別のテーブル
(図11には図示してない)に集めてこれを主デバッガ
1112が使用するように、前処理されたデバッグ情報
1108に追加することを除いては、オブジェクトコー
ド316中の最終デバッグ情報と同じである。
【0221】具体的には、プリプロセッサ1104は、
ソースファイルデスクリプタテーブル、手続デスクリプ
タテーブル、クラスデスクリプタテーブル及びアドレス
エイリアステーブル(図11には示してない)を生成す
る。
【0222】ソースファイルデスクリプタテーブルに
は、生成されたコードのどの部分をソースコード102
にマップするかについての記述が入っている。ソースフ
ァイルデスクリプタテーブルには、ソースファイルデス
クリプタエントリが入っている。ソースファイルデスク
リプタエントリには、とりわけ、ファイルデスクリプタ
によりカバーされるコードアドレスの範囲を示す開始及
び終りのアドレスと、それからコードを生成したソース
ファイルの名前が入っている。主デバッグ1112が正
しく動作するには、ファイルデスクリプタにより記述さ
れるアドレス範囲が減少しないソース行レンジをカバー
しなければならない。このことは1つのソースファイル
がそれに関連する幾つかのファイルデスクリプタを備え
ることができることを意味している。
【0223】手続デスクリプタテーブルにはデバッグ可
能な手続及び/またはプログラム102の中の関数の全
ての記述が入っている。プリプロセッサ1104により
初期設定されるC++特有の情報は、関数がプログラム
102のどこかで二重になっているか、オーバーロード
されているか、メンバ関数であるか(もしそうなら、ど
のクラスのメンバか)、コンストラクタであるか、デス
トラクタであるか、静的であるか、仮想であるか、純仮
想(pure virtual)であるか、定数であるか、インライ
ン展開されているか及び/または演算子関数であるかを
示す。
【0224】クラスデスクリプタテーブルは、クラスが
定義されているソースコード102中のソース行の範囲
を指示することにより各クラスのスコープを記述する。
【0225】アドレスエイリアステーブルは、ソースコ
ード102の単一の部分から発生されたオブジェクトコ
ード124の中の複数のコード部分がもしあればそれを
記述する。
【0226】主デバッガ1112は、前処理されたデバ
ッグ情報1108を受取る。端末218を介して主デバ
ッガ1112と連絡するユーザ1118の指示のもと
に、主デバッガ1112は、ユーザ1118がソースコ
ード102の誤りを突きとめて修正するのを、前処理さ
れたデバッグ情報1108を使用して支援する。
【0227】具体的には、主デバッガ1112は、前処
理されたデバッグ情報1108を使用して、とりわけ、
ソースコード102を表示し、コンパイラ114が発生
したソースコード102のアセンブリコードへの翻訳を
表示し、ソースコード102上での実行のフローを制御
したり変更したりし、変数の型を表示し、変数の値を観
察したり設定する。
【0228】デバッガ320の構造及び動作は従来のデ
バッガ122のものと同じである。しかし、本発明の好
適実施例228のデバッガ320は、オブジェクトコー
ド316中の最終デバッグ情報、すなわちコンパイラデ
バッグ情報126とトランスレータデバッグ情報302
を組み合わせたものの中に入っている追加情報を活用す
るという別の修正された特徴を有しているという点で、
従来のデバッガ122に比べて改良されている。
【0229】本発明の好適実施例228では、デバッガ
320は、オブジェクトコード316中の最終デバッグ
情報に入っているC++関連情報を活用する多数の修正
された且つ追加的特徴を有している。
【0230】例えば、本発明の好適実施例228のデバ
ッガ320は、従来のデバッガ122では利用できなか
った別の関数の型情報を表示することができる。適用可
能なとき、この追加情報は、特定の関数が、インライン
展開される、オーバーロードされる、静的である、定数
である、または仮想であると宣言されているか否か、ま
た、関数がメンバ関数、演算子関数、コンストラクタ、
またはデストラクタとして宣言されているか否かを示
す。オブジェクトコード316中の最終デバッグ情報は
また、デバッガ320に、ソースコード102で宣言さ
れているが定義を与えられていない関数についての型情
報を表示できるようにする。
【0231】デバッガ320は、デバッグ情報1108
を使用してC++の匿名の共用体(anonymous union)
の特徴についての備えも持っている。デバッグ情報11
08は、各匿名の共用体メンバを2つの形態で効果的に
指定する。1つの形態では、匿名の共用体メンバをあた
かもそれが匿名の共用体の外にあるかのように指定す
る。これによりユーザ1118は、匿名の共用体メンバ
を個々の変数として観察し、また修正することができ
る。
【0232】もう1つの形態は、匿名の共用体メンバを
匿名の共用体のメンバとして指定することである。これ
によりユーザ1118は、匿名の共用体についての型及
びデータ情報を全体的に観察することができる。
【0233】所与の匿名の共用体の全てのメンバは、オ
ブジェクトコード316中の最終デバッグ情報中では構
造体のリンク付きリストとして表わされ、そのリストの
各ノードがそのメンバについての情報を指定し且つ匿名
の共用体の外則のその形態のメンバへのポインタを含ん
でいる。例えば、3つのメンバを有するローカルな匿名
の共用体は、これら3つのメンバが匿名の共用体の一部
でなかった場合と同じになるデバッグ情報を有する。そ
れで、匿名共用体の追加デバッグ情報は、それぞれこれ
ら3つのメンバに対するデバッグ情報を指示する3つの
構造体のリンク付きリストを所持する。
【0234】デバッガ320はまた、クラス内部で定義
された列挙型への備えも持っている。この特徴は、匿名
の共用体に対するのと同じ仕方で実現される。各列挙型
のメンバは2つの形態で表わされる。1つの形態では、
特定の列挙型について宣言された列挙型メンバのリスト
の一部として表される。第2の形態では、各列挙型メン
バは、それがあたかもそれが見つかったクラスの個別メ
ンバであるかのように表わされる。第1の形によりユー
ザ1118は、それがどのクラスで見つかるかを指定す
るという限定だけで各列挙型メンバを個別に使用するこ
とができる。
【0235】デバッガ320はまた、ソースコード10
2の所与の部分に結び付いた複数の同一コード部分につ
いての備えも持っている。
【0236】例えば、C++では、ソースコード102
のある特定のソースファイル中で定義されたメンバ関数
をソースコード102の他のソースファイルにインクル
ードすることができる。
【0237】このメンバ関数は、ソースコード102中
では1つしか存在しないが、トランスレータ106がこ
れを翻訳してコンパイラ114かコンパイルするための
中間ソースコード110になったときには複数箇所に対
応したコードができている。。すると、コンパイラ11
4により作られるところの、オブジェクトコード124
及びコンパイラデバッグ情報126を含むオブジェクト
コードファイル118中では、この同じメンバ関数に対
応する複数のコード部分が含まれる。
【0238】プリプロセッサ1104は、これら複数の
コード部分の各々についてのアドレス範囲を、オブジェ
クトコード316中の最終デバッグ情報から集めてアド
レスエイリアステーブルに入れ、前処理されたデバッグ
情報1108の中のこのテーブルをデバッガ1112に
渡す。アドレスエイリアステーブル内の各エントリは、
1つのコード部分の先頭と最後のアドレスとそのエイリ
アスであるテーブル内の他の全てのコード部分エントリ
を示す情報とを含んでいる。
【0239】デバッガ1112がコードアドレスに関係
する動作を行うと、このアドレスエイリアステーブルを
参照して、この所与のコードアドレスのエイリアスであ
る個々のアドレスを全て発見することができる。コード
アドレスがアドレスエイリアステーブル内のあるエント
リのアドレス範囲内に入っていれば、デバッガ1112
は、このエントリの開始アドレスからこの所与のアドレ
スまでのオフセットを計算する。次いで、計算されたオ
フセット値をコード部分の各々のエイリアスの開始アド
レスに加えることにより、所与のコードアドレスのエイ
リアスであるアドレスの集合を計算で求めることができ
る。
【0240】また、デバッガ320はクラススコープへ
の備えも持っている。ユーザ1118は、C++構文に
従ってクラスを明示的に宣言することにより、コマンド
式中で使用するクラスメンバを指定することができる。
例えば、メンバはA::Bとして与えることができる。ここ
で、Aはクラスであり、BはクラスAのメンバである。ク
ラス及び、必要な場合は、クラスオブジェクトが、現在
観察しているロケーションにより暗黙のうちに決まるの
であれば、ユーザ1118はクラス名を明示的に宣言す
る必要はない。クラススコープがそれを暗黙のうちに決
めるからである。
【0241】これらの場合には、ソースコード102中
で観察されているロケーションは、ファイル記述テーブ
ルから決まるコードアドレスにマッピングされる。この
コードアドレスは、手続デスクリプタテーブルから決ま
る関数にマッピングされる。この関数は、デバッガ32
0がクラス自身、その基底クラス及びそのスコープに関
して必要とする全ての情報を指すクラスデスクリプタテ
ーブル内のクラスにマッピングされる。
【0242】デバッガ320はまた、クラスメンバへの
ポインタを取り扱うに当たっては、このようなポインタ
に割当てられた値及びこのようなポインタをプリントす
ることにより表示される値が、数値の値ではなくクラス
識別子及びメンバ識別子それ自身を使用するようにす
る。例えば、Pと呼ばれるクラスメンバへのあるポイン
タの値をプリントすると、 P=&M::N が表示される。ここでMはクラスであり、NはクラスMの
メンバである。内部的に、ポインタは、数値定数のオフ
セットとして表わされるが、追加クラスデバッグ情報を
用いて、デバッガ1112は、どのクラスメンバにこの
数値が対応するかを判定し、この数値の代りに実際の識
別子をプリントするかを決定することができる。
【0243】デバッガ320はまた、インスタンスブレ
ークポイントを取り扱う。すなわち、デバッガ320
は、ユーザ1118がメンバ関数でブレークポイントを
設定して、関数が特定のオブジェクトに対して呼出され
た場合にのみこのブレークポイントが認識されるように
することができる。
【0244】デバッガ320はこの動作を、オブジェク
トのアドレスをブレークポイント自身と共に保存するこ
とにより行う。ブレークポイントに行き当たると、デバ
ッガ320は、前処理されたデバッグ情報1108の助
けを借りて、それについてこの関数が呼出されたオブジ
ェクトのアドレスを判定し、このアドレスを格納されて
いるアドレスと比較し、両者が等しい場合に限りデバッ
ガの実行をサスペンドする。それ以外の場合には、デバ
ッガはそのまま動作を続け、ユーザ1118から見て、
実行の中止は起こらない。
【0245】デバッガはまた、オブジェクトが定義され
ている範囲を離れて実行が進行しようとしたとき、イン
スタンスブレークポイントを自動的に削除するための備
えを持っている。
【0246】オブジェクトのスコープを決定することが
できる場合には、デバッガ320はまた、トリガブレー
クポイントと呼ばれる別のブレークポイントを、オブジ
ェクトコード内の、実行がこのスコープを離れようとす
る地点に設定する。このブレークポイントに行き当る
と、それが関連しているインスタンスブレークポイント
とこのトリガブレークポイント自身の双方が取除かれて
実行が継続する。
【0247】デバッガ320はまた、クラスブレークポ
イントも取り扱う。オブジェクトコード316中の最終
デバッグ情報は所与のクラスの及びそのクラスの基底ク
ラスのメンバ関数を示すので、デバッガ320を使え
ば、ユーザ1118はただ1つのコマンドを使うだけ
で、1つの特定のクラスの全てのメンバ関数に関するブ
レークポイントを設定することができる。このクラスブ
レークポイントは、クラスのどんなメンバ関数が呼出さ
れたときでもオブジェクトコードの実行をサスペンドさ
せる。
【0248】また、デバッガ320を使うことにより、
ユーザ1118はソースコード102中のあるロケーシ
ョンを見たりあるいはそこにブレークポイントを設定し
たいとき、クラス名を指定することによりソースコード
102の中の当該ロケーションを指定することができ
る。例えば、ユーザ118がクラスCのメンバである関
数fを見たい場合、このロケーションを、観察コマンド
の引数としてC::fとして指定することができる。デバッ
ガ320は、この動作を、クラスデスクリプタテーブル
を参照して現在のスコープ中で見える与えられた名前を
使ってクラスを判定することにより行う。デバッガ32
0は次に、手続デスクリプタテーブルを参照し、そのデ
スクリプタが以前にクラスデスクリプタテーブルの中で
突き止められたエントリを逆方向に参照するところの、
与えられた名前を持つ関数を探す。
【0249】デバッガ320はまた、オーバーロード関
数の任意の集合についての操作をグループとして取り扱
う。ユーザ1118は、特定の名前を持つオーバーロー
ド関数の型情報を、もし必要ならばクラス名を限定する
ことにより、プリントするように、デバッガ320に要
求することができる。同様に、ユーザ1118は、特定
の名前を持つ全てのオーバーロード関数に対して、また
必要ならば関数のクラス名を特定のものに限定して、ブ
レークポイントを設定することもできる。デバッガ32
0は、プリプロセッサ1104がオブジェクトコード3
16中の最終デバッグ情報から作り出した手続デスクリ
プタテーブルに現われるオーバーロード関数に関する情
報を使用する。
【0250】なお、本願の開示の一部は著作権保護を受
けるべき資料(具体的には表などに示された各種のコー
ド)を含んでいる。著作権者は、それが特許庁の包袋ま
たは記録に現われている限り、何人による特許開示の複
写にも異議を唱えるものではないが、それ以外の場合に
ついては全ての著作権を留保する。
【0251】
【効果】以上詳細に説明したように、本発明によれば、
トランスレータを使って一旦翻訳した後コンパイルする
タイプの言語でかかれたコードのシンボリックデバッグ
を、このようなトランスレータを解さないコンパイラ言
語で書かれたコードの場合と同じ様に行うことができる
ようになる。
【図面の簡単な説明】
【図1】本発明の適用対象であるトランスレータベース
のコンパイルシステムの構成例を説明する図。
【図2】コンピュータシステム全般のハードウエア及び
ソフトウエア構成を説明する図。
【図3】本願発明の一実施例の概略構成を説明する図。
【図4】図3中のトランスレータの構造を説明する図。
【図5】図3中のマージャの構造を説明する図。
【図6】図3中のマージャのフローチャート。
【図7】図5中のデバッグ情報マニピュレータの構造を
説明する図。
【図8】図5中のデバッグ情報マニピュレータのフロー
チャート。
【図9】図7中のルックアップテーブル整合部のフロー
チャート。
【図10】図5中の出力オブジェクトファイルインター
フェースのフローチャート。
【図11】図3中のデバッガの構造を説明する図。
【符号の説明】
100:コンパイルシステム 102:ソースコード 106:トランスレータ 110:中間ソースコード 114:コンパイラ 118、134:オブジェクトコードファイル 122、320:デバッガ 124、316:オブジェクトコード 126:コンパイラデバッグ情報 128:リンカ 132、350:実行可能ファイル 202:コンピュータプラットフォーム 204:オペレーティングシステム 206:マイクロ命令コード 208:ハードウエアユニット 210:RAM 212:CPU 214:入出力インターフェース 218:端末 222:データストレージ 226:プリンタ 228:アプリケーションプログラム 306:トランスレータデバッグ情報 312:マージャ 402:スキャナ/パーザ 406:意味情報/内部データ構造 410:デバッグ情報生成部 418:コード生成部 502、504:入力オブジェクトファイルインターフ
ェース 510:デバッグ情報マニピュレータ 514:出力オブジェクトファイルインターフェース 516:コンパイラデバッグデータ構造 518:トランスレータデバッグデータ構造 528:マージ済みルックアップテーブル 530:ポータブル出力決定用情報 710、712:ルックアップテーブル構築部 718:コンパイラルックアップテーブル 720:トランスレータルックアップテーブル 726:ルックアップテーブル整合部 732:整合済みコンパイラルックアップテーブル 734:整合済みトランスレータルックアップテーブル 740:ポータブル入力決定情報 744:ルックアップテーブル調整部 1104:プリプロセッサ 1108:前処理されたデバッグ情報 1112:主デバッガ 1118:ユーザ
───────────────────────────────────────────────────── フロントページの続き (72)発明者 ミチェイ・メータ アメリカ合衆国カリフォルニア州サンノ ゼ・ディープ・クリーク・コート 1856 (72)発明者 マーク・ダブリュー・マクドウエル アメリカ合衆国コロラド州フォート・コ リンズ・ソルスティス・レイン 1261 (72)発明者 マノジ・ダドゥ アメリカ合衆国カリフォルニア州サンノ ゼ・グレンロイ・ドライブ 1650 (72)発明者 ブルーノ・メリ アメリカ合衆国コロラド州フォート・コ リンズ・キャプストーン・フォート 4030 (56)参考文献 特開 昭59−180756(JP,A) (58)調査した分野(Int.Cl.7,DB名) G06F 11/28

Claims (15)

    (57)【特許請求の範囲】
  1. 【請求項1】以下の(a)ないし(c)を設け、トランスレー
    タベースのソフトウエアコンパイラでの使用に適合する
    ように、ソースコードのシンボリックデバッグ情報を生
    成するシステム: (a) ソースコードについてのトランスレータデバッグ情
    報を生成する第1手段; (b) 前記ソースコードについてのコンパイラデバッグ情
    報を生成する第2手段; (c) 前記トランスレータデバッグ情報と前記コンパイラ
    デバッグ情報をマージして前記ソースコードに対する最
    終的なデバッグ情報を形成する第3手段。
  2. 【請求項2】前記第2手段は 前記ソースコードについてのオブジェクトコードを生成
    する手段と、 前記オブジェクトコード及び前記コンパイラデバッグ情
    報を第1オブジェクトコードファイルに格納する手段を
    有することを特徴とする請求項1記載のシステム。
  3. 【請求項3】前記最終的なデバッグ情報を用いて前記ソ
    ースコード中の誤りを見出す第4手段を設けたことを特
    徴とする請求項1または2記載のシステム。
  4. 【請求項4】前記第4手段は前記見出された前記ソース
    コード中の誤りを修正することを特徴とする請求項3記
    載のシステム。
  5. 【請求項5】前記第4手段は、 関数の型情報の表示、 匿名の共用体のメンバの指定、 クラス内で定義された列挙型のメンバの指定、 複数の同一のコードセグメントの識別、 クラススコープに基づくメンバの識別、 インスタンスブレークポイントの実現、 クラスメンバへのポインタの記号表示、 クラスブレークポイントの実現、及び オーバーロードさ
    れた関数の集合についてのグループ操作を行うことがで
    きることを特徴とする請求項3または4記載のシステ
    ム。
  6. 【請求項6】 前記ソースコードが中間的にコンパイルさ
    れたものである中間ソースコードを生成する手段を設け
    たことを特徴とする請求項1記載のシステム。
  7. 【請求項7】 前記ソースコードはC++言語で書かれて
    おり、前記中間ソースコードはC言語で書かれているこ
    とを特徴とする請求項6記載のシステム。
  8. 【請求項8】 前記第3手段は以下の(1)ないし(3)を設け
    たことを特徴とする請求項2記載のシステム: (1) 前記トランスレータデバッグ情報及び前記コンパイ
    ラデバッグ情報から第1デバッグデータ構造及び第2デ
    バッグデータ構造を生成する第4手段; (2) 前記第1デバッグデータ構造及び前記第2デバッグ
    データ構造から、前記最終的なデバッグ情報を含むマー
    ジ済みルックアップテーブルを生成する第5手段; (3) 前記オブジェクトコード及び前記最終的なデバッグ
    情報を第2オブジェクトコードファイルにストアする第
    6手段。
  9. 【請求項9】 前記第5手段は以下の(4)ないし(6)を有す
    ることを特徴とする請求項8記載のシステム: (4) 前記第1デバッグデータ構造及び前記第2デバッグ
    データ構造から第1ルックアップテーブル及び第2ルッ
    クアップテーブルを生成する手段; (5) 前記第1ルックアップテーブル中のエントリと前記
    第2ルックアップテーブル中のエントリを対応付ける手
    ; (6) 前記コンパイラデバッグ情報の一部を前記第2ルッ
    クアップテーブルから前記第1ルックアップテーブルに
    コピーする手段であって、前記第1のルックアップテー
    ブルは前記マージ済みルックアップテーブルを含む、手
  10. 【請求項10】 以下の(1)ないし(3)を設け、トランスレ
    ータデバッグ情報とコンパイラデバッグ情報をマージし
    てソースコードについての最終的なデバッグ情報を形成
    する、前記ソースコードからのオブジェクトコードに使
    用するのに適合されたコンピュータを用いて構成された
    システム: (1) 前記トランスレータデバッグ情報及び前記コンパイ
    ラデバッグ情報から第1デバッグデータ構造及び第2デ
    バッグデータ構造を生成する第1手段; (2) 前記第1デバッグデータ構造及び前記第2デバッグ
    データ構造から、最終的なデバッグ情報を含むマージ済
    みルックアップテーブルを生成する第2手段; (3) 前記オブジェクトコード及び前記最終的なデバッグ
    情報を第2オブジェクトコードファイルにストアする第
    3手段。
  11. 【請求項11】 前記第2手段前記第1デバッグデータ
    構造及び前記第2デバッグデータ構造から第1ルックア
    ップテーブル及び第2ルックアップテーブルを生成する
    手段、及び 前記第1ルックアップテーブルのエントリと
    前記第2ルックアップテーブルのエントリを対応付ける
    手段を有し、 記コンパイラデバッグ情報の一部を前記第2ルックア
    ップテーブルから前記第1ルックアップテーブルにコピ
    ーし、前記第1のルックアップテーブルは前記マージ済
    みルックアップテーブルを含むことを特徴とする請求項
    10記載のシステム。
  12. 【請求項12】 以下の(a)ないし(d)のステップを設け、
    トランスレータデバッグ情報とコンパイラデバッグ情報
    をマージしてソースコードについての最終的なデバッグ
    情報を形成する、前記ソースコードからのオブジェクト
    コードに使用するのに適合された方法: (a) 前記トランスレータデバッグ情報及び前記コンパイ
    ラデバッグ情報を読み出すステップ; (b) 前記トランスレータデバッグ情報及び前記コンパイ
    ラデバッグ情報から第1デバッグデータ構造及び第2デ
    バッグデータ構造を生成するステップ; (c) 前記第1デバッグデータ構造及び前記第2デバッグ
    データ構造から、前記最終的なデバッグ情報を含むマー
    ジ済みルックアップテーブルを生成するステップ; (d) 前記オブジェクトコード及び前記最終的なデバッグ
    情報をオブジェクトコードファイルヘッダを有するオブ
    ジェクトコードファイルにストアするステップ
  13. 【請求項13】 前記ステップ(c)は以下のステップ(c-1)
    ないし(c-5)を有することを特徴とする請求項12記載
    の方法: (c-1) 前記第1デバッグデータ構造及び前記第2デバッ
    グデータ構造から第1ルックアップテーブル及び第2ル
    ックアップテーブルを生成するステップ; (c-2) 前記第1ルックアップテーブルのエントリと前記
    第2ルックアップテーブルのエントリを対応付けるステ
    ップ; (c-3) 前記コンパイラデバッグ情報の一部を前記第2ル
    ックアップテーブルから前記第1ルックアップテーブル
    へコピーするステップ; (c-4) 前記第1ルックアップテーブル中のエントリを削
    除のためにマークを付けるステップ; (c-5) 前記第1ルックアップテーブル中の前記マークを
    付けられたエントリを削除するステップであって、前記
    第1ルックアップテーブルが前記マージ済みルックアッ
    プテーブルを含む、ステップ
  14. 【請求項14】 前記ステップ(c-2)は以下のステップ(c-
    2-1)及び(c-2-2)を含むことを特徴とする請求項13記
    載の方法: (c-2-1) 前記第1ルップアップテーブル及び前記第2ル
    ックアップテーブルをそれぞれが有する階層構造中にお
    いて前記ソースプログラム中の変数情報を含まない要素
    を削除することによって縮小するステップ; (c-2-2) 前記第1ルックアップテーブルを前記第1ルッ
    クアップテーブルが有する階層構造に従って深さ優先走
    査するステップ
  15. 【請求項15】 前記ステップ(d)は以下のステップ(d-1)
    ないし(d-4)を含むことを特徴とする請求項13記載の
    方法: (d-1) 前記オブジェクトコードファイルを書き込み可能
    なようにオープンするステップ; (d-2) 前記オブジェクトコードファイル中にヘッダ領域
    を定義するステップ; (d-3) 前記オブジェクトコード及び前記マージされたル
    ックアップテーブルからの情報を前記オブジェクトコー
    ドファイル中であって前記ヘッダ領域以外の箇所にスト
    アするステップ; (d-4) 前記オブジェクトコードファイルヘッダを前記前
    記ヘッダ領域中にストアするステップ
JP26912291A 1990-09-21 1991-09-20 シンボリックデバッグシステム及びその方法 Expired - Fee Related JP3304995B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US07/586,521 US5560009A (en) 1990-09-21 1990-09-21 Generating symbolic debug information by merging translation and compiler debug information
US586521 1990-09-21

Publications (2)

Publication Number Publication Date
JPH04257033A JPH04257033A (ja) 1992-09-11
JP3304995B2 true JP3304995B2 (ja) 2002-07-22

Family

ID=24346081

Family Applications (1)

Application Number Title Priority Date Filing Date
JP26912291A Expired - Fee Related JP3304995B2 (ja) 1990-09-21 1991-09-20 シンボリックデバッグシステム及びその方法

Country Status (3)

Country Link
US (1) US5560009A (ja)
EP (1) EP0476667A3 (ja)
JP (1) JP3304995B2 (ja)

Families Citing this family (70)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3602857B2 (ja) * 1991-04-23 2004-12-15 株式会社日立製作所 多機種対応型情報処理システム、および、方法
US5410648A (en) * 1991-08-30 1995-04-25 International Business Machines Corporation Debugging system wherein multiple code views are simultaneously managed
JPH05274181A (ja) * 1992-03-25 1993-10-22 Nec Corp ブレークポイント設定・解除方式
US6151701A (en) * 1997-09-30 2000-11-21 Ahpah Software, Inc. Method for reconstructing debugging information for a decompiled executable file
US5537620A (en) * 1994-09-16 1996-07-16 International Business Machines Corporation Redundant load elimination on optimizing compilers
US5675730A (en) * 1995-07-07 1997-10-07 Sun Microsystems, Inc. Method and apparatus for extensible type-specific data presentation by a debugger
US5881288A (en) * 1995-09-29 1999-03-09 Matsushita Electric Industrial Co., Ltd. Debugging information generation system
US5812133A (en) * 1995-11-01 1998-09-22 Allen Bradley Company, Llc Industrial controller with display of rung execution
US5956479A (en) * 1995-11-13 1999-09-21 Object Technology Licensing Corporation Demand based generation of symbolic information
US5848274A (en) * 1996-02-29 1998-12-08 Supercede, Inc. Incremental byte code compilation system
US5764989A (en) * 1996-02-29 1998-06-09 Supercede, Inc. Interactive software development system
US6067413A (en) * 1996-06-13 2000-05-23 Instantations, Inc. Data representation for mixed-language program development
US6721941B1 (en) * 1996-08-27 2004-04-13 Compuware Corporation Collection of timing and coverage data through a debugging interface
JPH1091476A (ja) * 1996-09-17 1998-04-10 Toshiba Corp プログラム実行装置及び機能仕様とコードアドレスとの対応付け方法
CA2194021A1 (en) 1996-12-24 1998-06-24 Kevin Paul Hickman Binary class library with debugging support
CA2194020C (en) * 1996-12-24 2002-02-05 Kevin Paul Hickman Minimizing debug information for global types in compiled languages
CA2211505C (en) * 1997-07-25 2002-02-05 Ibm Canada Limited-Ibm Canada Limitee Setting instance breakpoints in object oriented computer programs
JPH1185496A (ja) * 1997-09-03 1999-03-30 Fujitsu Ltd オブジェクト指向プログラム作成支援装置
US6411974B1 (en) * 1998-02-04 2002-06-25 Novell, Inc. Method to collate and extract desired contents from heterogeneous text-data streams
US7526468B2 (en) * 1999-01-08 2009-04-28 Computer Associates Think, Inc. System and method for recursive path analysis of DBMS procedures
US6430707B1 (en) 1999-03-31 2002-08-06 International Business Machines Corporation Source-level debugging of client dump image in a computer network
KR100705847B1 (ko) * 1999-05-19 2007-04-09 코닌클리즈케 필립스 일렉트로닉스 엔.브이. 데이터 프로세서 및 데이터 처리 방법
US7065481B2 (en) 1999-11-30 2006-06-20 Synplicity, Inc. Method and system for debugging an electronic system using instrumentation circuitry and a logic analyzer
US7356786B2 (en) * 1999-11-30 2008-04-08 Synplicity, Inc. Method and user interface for debugging an electronic system
US6823497B2 (en) 1999-11-30 2004-11-23 Synplicity, Inc. Method and user interface for debugging an electronic system
US6931572B1 (en) 1999-11-30 2005-08-16 Synplicity, Inc. Design instrumentation circuitry
US6581191B1 (en) 1999-11-30 2003-06-17 Synplicity, Inc. Hardware debugging in a hardware description language
US7072818B1 (en) 1999-11-30 2006-07-04 Synplicity, Inc. Method and system for debugging an electronic system
US6637024B1 (en) * 2000-05-03 2003-10-21 International Business Machines Corporation Method and product for debugging a target java virtual machine having no debug information therein
US6651247B1 (en) 2000-05-09 2003-11-18 Hewlett-Packard Development Company, L.P. Method, apparatus, and product for optimizing compiler with rotating register assignment to modulo scheduled code in SSA form
US6981243B1 (en) * 2000-07-20 2005-12-27 International Business Machines Corporation Method and apparatus to debug a program from a predetermined starting point
US20020046396A1 (en) * 2000-08-02 2002-04-18 Knoll Stephen J. Object file server (OFS)
US7222315B2 (en) 2000-11-28 2007-05-22 Synplicity, Inc. Hardware-based HDL code coverage and design analysis
DE10125385B4 (de) * 2000-12-18 2009-07-30 Siemens Ag Vorrichtung, Anordnung und Verfahren zum Parametrieren, Projektieren und Inbetriebnehmen von Steuerungssystemen sowie zur zeitlichen Steuerung eines Systems
US20020169738A1 (en) * 2001-05-10 2002-11-14 Giel Peter Van Method and system for auditing an enterprise configuration
US7398519B2 (en) * 2001-11-30 2008-07-08 International Business Machines Corporation Inheritance breakpoints for use in debugging object-oriented computer programs
US7644394B2 (en) * 2001-11-30 2010-01-05 International Business Machines Corporation Object-oriented creation breakpoints
US7134115B2 (en) * 2002-02-07 2006-11-07 Matsushita Electric Industrial Co., Ltd. Apparatus, method, and program for breakpoint setting
US8769517B2 (en) 2002-03-15 2014-07-01 International Business Machines Corporation Generating a common symbol table for symbols of independent applications
US6957419B2 (en) * 2002-03-15 2005-10-18 International Business Machines Corporation Facilitating the use of aliases during the debugging of applications
US20030177419A1 (en) * 2002-03-15 2003-09-18 International Business Machines Corporation Facilitating the debugging of applications by employing user defined or redefined symbols
US7243338B2 (en) * 2002-05-29 2007-07-10 Oracle International Corporation Representation of core files in a generic format
US7299456B2 (en) * 2003-09-18 2007-11-20 International Business Machines Corporation Run into function
US7607123B2 (en) * 2004-09-21 2009-10-20 Hewlett-Packard Development Company, L.P. Systems and methods for validating debug information for optimized code
US7415021B1 (en) * 2004-09-22 2008-08-19 Sun Microsystems, Inc. Method and apparatus for preserving null semantics during use of a forwarding method
US7788640B2 (en) * 2004-12-28 2010-08-31 Microsoft Corporation Using code analysis to generate documentation
US7533373B2 (en) * 2005-01-25 2009-05-12 Taiwan Semiconductor Manufacturing Co., Ltd Method for prevention of system execution malfunction
JP4822817B2 (ja) * 2005-11-22 2011-11-24 パナソニック株式会社 コンパイルシステム
US20070150866A1 (en) * 2005-12-22 2007-06-28 International Business Machines Corporation Displaying parameters associated with call statements
US8930909B1 (en) * 2007-07-13 2015-01-06 The Mathworks, Inc. Debugging using presentation layer representations of objects
US20090271770A1 (en) * 2008-04-28 2009-10-29 International Business Machines Corporation Method, system, and computer program product for generating unit testing scripts
US8683439B2 (en) 2008-08-21 2014-03-25 International Business Machines Corporation System and process for debugging object-oriented programming code leveraging preprocessors
US8752020B2 (en) 2008-08-21 2014-06-10 International Business Machines Corporation System and process for debugging object-oriented programming code leveraging runtime metadata
US8291386B2 (en) 2008-08-21 2012-10-16 International Business Machines Corporation System and process for debugging object-oriented programming code
US8122017B1 (en) * 2008-09-18 2012-02-21 Google Inc. Enhanced retrieval of source code
JP5293563B2 (ja) * 2009-10-30 2013-09-18 新日鐵住金株式会社 言語変換装置、言語変換方法およびプログラム
FR2953612A1 (fr) 2009-12-03 2011-06-10 Flexycore Procede de mise au point d'application logicielle, systeme et produit programme d'ordinateur correspondant.
US8806436B2 (en) * 2010-04-30 2014-08-12 Cray Inc. Systems and methods for debugging applications using dual code generation
US20120159444A1 (en) * 2010-12-17 2012-06-21 Microsoft Corporation Fusing debug information from different compiler stages
US8799864B2 (en) * 2011-09-13 2014-08-05 Synopsys, Inc. Providing SystemVerilog testing harness for a standardized testing language
US9619214B2 (en) 2014-08-13 2017-04-11 International Business Machines Corporation Compiler optimizations for vector instructions
US10048960B2 (en) * 2014-12-17 2018-08-14 Semmle Limited Identifying source code used to build executable files
US10169014B2 (en) 2014-12-19 2019-01-01 International Business Machines Corporation Compiler method for generating instructions for vector operations in a multi-endian instruction set
US9588746B2 (en) 2014-12-19 2017-03-07 International Business Machines Corporation Compiler method for generating instructions for vector operations on a multi-endian processor
US9880821B2 (en) 2015-08-17 2018-01-30 International Business Machines Corporation Compiler optimizations for vector operations that are reformatting-resistant
US9594668B1 (en) * 2015-09-04 2017-03-14 International Business Machines Corporation Debugger display of vector register contents after compiler optimizations for vector instructions
CN106909353B (zh) * 2015-12-22 2019-12-13 阿里巴巴集团控股有限公司 应用程序的运行方法和装置
US9779012B1 (en) * 2016-02-26 2017-10-03 Mbit Wireless, Inc. Dynamic and global in-system debugger
CN108255693A (zh) * 2016-12-28 2018-07-06 乐视汽车(北京)有限公司 呈现调试信息的方法和装置
CN106940654B (zh) * 2017-02-15 2020-08-14 南京航空航天大学 源代码中内存错误的自动检测和定位方法

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4463423A (en) * 1982-07-14 1984-07-31 Burroughs Corporation Method of transforming high level language statements into multiple lower level language instruction sets
US4686623A (en) * 1985-06-07 1987-08-11 International Business Machines Corporation Parser-based attribute analysis
JPS62159274A (ja) * 1986-01-08 1987-07-15 Hitachi Ltd 条件分岐の分割・複写によるベクトル化方式
US4827404A (en) * 1986-04-14 1989-05-02 Schlumberger Technology Corporation Method and system for computer programming
US4860203A (en) * 1986-09-17 1989-08-22 International Business Machines Corporation Apparatus and method for extracting documentation text from a source code program
US4809170A (en) * 1987-04-22 1989-02-28 Apollo Computer, Inc. Computer device for aiding in the development of software system
US4953084A (en) * 1987-11-16 1990-08-28 Hewlett-Packard Company Method and apparatus using variable ranges to support symbolic debugging of optimized code
US4916610A (en) * 1988-10-05 1990-04-10 Racal Data Communications Inc. Multilanguage software integration through preprocessing

Also Published As

Publication number Publication date
EP0476667A2 (en) 1992-03-25
JPH04257033A (ja) 1992-09-11
US5560009A (en) 1996-09-24
EP0476667A3 (en) 1993-04-07

Similar Documents

Publication Publication Date Title
JP3304995B2 (ja) シンボリックデバッグシステム及びその方法
US6038378A (en) Method and apparatus for testing implementations of software specifications
US6149318A (en) Link-time and run-time error detection, and program instrumentation
KR101099212B1 (ko) 예외 처리 구조물들을 포함하는 소프트웨어의 소스 언어 독립형 중간 표현을 처리하는 방법, 다수의 소스 코드 언어들에 대한 소스 언어 독립형 예외 처리 중간 표현들을 구현하기 위한 시스템 및 컴퓨터 판독가능 저장 매체
US5870590A (en) Method and apparatus for generating an extended finite state machine architecture for a software specification
US8813047B2 (en) Yet another transformation language (YATL)
Kirby Reflection and hyper-programming in persistent programming systems
US20080178149A1 (en) Inferencing types of variables in a dynamically typed language
McCloskey et al. ASTEC: a new approach to refactoring C
Frankl The use of data flow information for the selection and evaluation of software test data
US20210089284A1 (en) Method and system for using subroutine graphs for formal language processing
JP2003216441A (ja) 対称構造パターン・マッチング
Paulson A compiler generator for semantic grammars
Chen et al. Formal Proofs of Tarjan's Strongly Connected Components Algorithm in Why3, Coq and Isabelle
JP5600301B2 (ja) システム表現およびハンドリング技術
Fischer On parsing and compiling arithmetic expressions on vector computers
Galles Modern Compiler Design
Kalleberg et al. Fusing a transformation language with an open compiler
Holt et al. The Turing language report
Aarssen et al. High-fidelity metaprogramming with separator syntax trees
Bowman Growing a proof assistant
Atterer Automatic test data generation from VDM-SL specifications
Blum Evaluating lambda terms with traversals
Ulle Source Code Analysis and Type Inference for R
Nguyen Compiler design and implementation in OCaml with LLVM framework

Legal Events

Date Code Title Description
R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees