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

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

Info

Publication number
JPH04257033A
JPH04257033A JP3269122A JP26912291A JPH04257033A JP H04257033 A JPH04257033 A JP H04257033A JP 3269122 A JP3269122 A JP 3269122A JP 26912291 A JP26912291 A JP 26912291A JP H04257033 A JPH04257033 A JP H04257033A
Authority
JP
Japan
Prior art keywords
information
class
code
debug
file
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.)
Granted
Application number
JP3269122A
Other languages
English (en)
Other versions
JP3304995B2 (ja
Inventor
Dmitry Lenkov
ドミトリ・レンコフ
Shankar Unni
シャンカル・ウニ
Michey Mehta
ミチェイ・メータ
Mark W Mcdowell
マーク・ダブリュー・マクドウエル
Manoj Dadoo
マノジ・ダドゥ
Bruno Melli
ブルーノ・メリ
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

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】本公報は電子出願前の出願データであるた
め要約のデータは記録されません。

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シリーズ300
、600、または800コンピュータプラットフォーム
であり、ここで走っているオペレーティングシステム2
04は、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
 Manual (注訳付きC++便覧)」(Addi
son Wesley 1990)を参照されたい。C
言語も周知な事項であるが、一般的説明が必要ならば、
American National Standar
d for Information Systems
−Programming Language C(情
報システムに関するアメリカ国家規格−プログラム言語
C)(文書番号X3J11/90−013)を参照され
たい。 【0038】次の各章では本発明228のトランスレー
タベースのコンパイルシステムのシステムについて一層
詳細に説明する。 【0039】コンパイラ114のような、本発明228
の或る局面は、既存のコンパイラ、トランスレータ、リ
ンカ及びデバッガの技術を用いて実現することができる
。しかし、既存のトランスレータ及びデバッガの技術に
修正を加えることは、本発明の改善を達成するのに必要
である。以下の各章での説明は、既存のトランスレータ
及びデバッガの技術(及び革新的なマージャ312)に
加えられるこれら修正に重点を置く。既存のコンパイラ
、リンカ、トランスレータ及びデバッガの技術も当業者
には周知名者であるが、その一般的説明については、A
lfred V.Aho、Ravi Sethi及びJ
effrey D.Ullman著「Compiler
s, Princioles, Techniques
, and Tools(コンパイラ、原理、手法及び
ツール)」(Addison Wesley 1986
)を参照されたい。 【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, Pri
nciples, Techniques, and 
Tools」に書いてある。 【0045】トランスレータ302に含まれているデバ
ッグ情報生成部410とコンパイラ114に含まれてい
るデバッグ情報生成部の主な相違は、デバッグ情報生成
部410はトランスレータ302に含まれているので、
ソースコード102の構造及び内容を知っているという
ことである。それ故、デバッグ情報生成部410により
発生されるトランスレータデバッグ情報306は、ソー
スコード102の構造及び内容を正確且つ完全に反映し
ている。 【0046】しかし、トランスレータ302に含まれて
いるデバッグ情報生成部410は、マシンアーキテクチ
ャ及びマシンアドレス(関数及び変数のアドレスを含む
)を取扱う情報を知っていない。それ故、デバッグ情報
生成部410により発生されるトランスレータデバッグ
情報306は、マシンアーキテクチャ及びマシンアドレ
スの情報を欠いている。トランスレータデバッグ情報3
06に欠けている特定の局面について下に詳細に説明す
る。 【0047】3.0 マージャ マージャ312は、トランスレータ302が作製したシ
ンボリックデバッグ情報306をコンパイラ114が作
製したコンパイラデバッグ情報126(及びオブジェク
トコード124)と組合せる。 【0048】図5は、マージャ312の構造図/機能フ
ローチャートを示す。図5で、長方形はソフトウェアモ
ジュール/プロセスを表わし、長円形はソフトウェアモ
ジュール/プロセスの入力及び出力を表わしている。 【0049】図5に示す通り、マージャ312は、入力
オブジェクトファイルインターフェース502、504
、デバッグ情報マニピュレータ510及び出力オブジェ
クトファイルインターフェース514を含んでいる。 一般に、入力オブジェクトファイルインターフェース5
02は、オブジェクトコードファイル118から読出し
を行ってコンパイラデバッグデータ構造516を生成す
る。入力オブジェクトファイルインターフェース504
は、トランスレータデバッグ情報306から読出しを行
ってトランスレータデバッグデータ構造518を生成す
る。デバッグ情報マニピュレータ510は、デバッグデ
ータ構造516、518に入っている情報を組合せてマ
ージ済みルックアップテーブル528及びポータブル出
力決定用情報(portable input fix
up)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 T
ype Talbe、GNTT)及びローカルな名前及
び型テーブル(Local Name and Typ
e Table、LNTT)等の各種情報を含んでいる
。コンパイラデバッグ情報126は、コンパイラからの
値テーブル(VT)も含んでいるが、これは実質的には
名前ストリングのテーブルである。コンパイラデバッグ
情報126はまた、コンパイラ114のオブジェクトコ
ード124のソース行テーブル(SLT)を含んでいる
。コンパイラデバッグ情報126はまた決定用情報リス
ト(fixup list)を含んでいるが、これはリ
ンカ128がコンパイラ114のオブジェクトコード1
24を決定、設定するのに必要とする情報を含んでいる
。オブジェクトファイル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 *h
eader;  // 各種デバッグ情報要素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; /
/ 古い決定情報リスト (gntt, lntt) oldfixuplist *oldlfxup;ne
wfixuplist *gfxup; // 新しい
決定情報リスト (gntt, lntt) newfixuplist *lfxup;}; 【0061】入力オブジェクトファイルインターフェー
ス502及び入力オブジェクトファイルインターフェー
ス504は、本質的に同じ様に動作する。しかし、多少
の些細な相違がある。このような相違はその入力が相違
していることを反映している。例えば、入力オブジェク
トファイルインターフェース502は、オブジェクトコ
ード124中の名前がソースコード102中の名前と一
致するように名前を復元するソフトウェアルーチンを含
んでいる。 【0062】本発明228の好適実施例では、入力オブ
ジェクトファイルインターフェース502、504(及
び出力オブジェクトファイルインターフェース514も
)は、クラスとして実現されている。これらクラスのイ
ンスタンスはオブジェクトコード及びデバッグ情報が入
っているファイルを読み書きするのに使用される。 【0063】これらのクラスは2つの層に分けられる。 これらの層とは、基底クラス(BaseClass)を
表わす中核オブジェクトファイルクラス(Core O
bject File Classes)と、中核オブ
ジェクトファイル基底クラスから誘導されたクラスを表
わす特殊化クラス(Specialized Clas
ses)である。これらクラスについて次の章で説明す
る。 【0064】3.1.1 中核オブジェクトファイルク
ラス 中核オブジェクトファイルクラスは、オブジェクトファ
イルヘッダやシンボルテーブルのような共通なオブジェ
クトファイルデータ構造を読出すのに使用される。中核
オブジェクトファイルクラスは、シンボルテーブル内の
シンボルを参照するアクセスルーチン及び初期設定ポイ
ンタを参照するアクセスルーチンを含む。中核オブジェ
クトファイルクラスはオブジェクトファイルを読み書き
するジェネリックルーチンもある。 【0065】本発明の好適実施例228では、2つの中
核オブジェクトファイルクラス、som300とsom
800、がある。som300はHP9000シリーズ
300コンピュータプラットフォーム202 で動作し
、som800はHP9000シリーズの600及び8
00コンピュータプラットフォーム202で動作する。 som300及びsom800について次章で説明する
。 【0066】3.1.1.1 クラスsom300クラ
スsom300という抽象概念の主な目的は、オブジェ
クト/デバッグファイル118、306、316に対す
る効率的且つユーザから分かりやすいインターフェース
を提供することである。クラスsom300を構成する
コンピュータプログラムセグメントを表2に示す。 【0067】          〈表−2〉 class coffheader : public
 exec {  public:     coffheader() {}    co
ffheader(fstream&);    co
ffheader(coffheader& othe
r) {*this = other;}    in
t validate();}; class syment300 : public 
nlist_ {  public:     syment300() {name = N
ULL;};    ■syment300();     char *name;     int copy(char *ptr); 
   int symsiz() {return (
    sizeof(long) +       
                   2 * si
zeof(char) +             
             2 * sizeof(s
hort) +                  
        n_length);}    sy
ment300& operator = (syme
nt300& 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 va
lid;}    // パッケージされた入出力アク
セスルーチン    // これらのルーチンはfst
ream中の対応するルーチンと    //   同
じ機能を果す     streampos   tellg () 
               {                     retur
n somfile−>tellg();      
          }     istream&    seekg (st
reamoff so, seek_dir ds);
                {                     retur
n somfile−>seekg(so, sd);
                }     istream&    read (cha
r *s, long n)            
    {                     retur
n somfile−>read(s, (int) 
n);                }     streampos   tellp () 
               {                     retur
n somfile−>tellp();      
          }     ostream&    seekp (st
reamoff so, seek_dir sd) 
               {                     retur
n somfile−>seekp(so, sd);
                }     ostream&    write (ch
ar *s, long n)           
     {                     retur
n somfile−>write(s, (int)
 n);                }     // シンボルテーブルアクセスルーチン  
  int         num_symbols
() {return sym_count;}   
 syment300  *get_symbols(
) {return sym;}    syment
300  *find_symbol(char *)
;    char       *sym_name
 (syment300& s);         
       {                     retur
n s.name;                
}     long        sym_loc (
syment300& s); // ファイル中でs
ymが                      
                     // 指
している位置    long        sym
_val (syment300& s); // ロ
ードされたプログ                 
                         
 // ラム中でsymが             
                         
     // 指している位置 【0068】sym_loc()関数は、オブジェクト
/デバッグファイル118、306中でシンボルの初期
設定値を格納しているロケーションを返す。sym_l
oc()関数は初期設定ポインタにパッチを当てるのに
使用される。 【0069】sym_val()関数は、コンピュータ
プログラムをRAM210にロードされた時のシンボル
の実行時アドレスを返す。 【0070】coffheaderクラスは、コンスト
ラクタ及び検査子関数を付加するために、ヘッダを包む
のに主に使用される。 【0071】cyment300クラスは重要である。 HP9000シリーズ300コンピュータプラットフォ
ーム202で作られたオブジェクトコードファイル11
8の中のシンボルの通常の表現は、クランチ(crun
ch)されたレコード(struct nlist_)
の後ろに、当該シンボル名をナルコードで終端しないと
きの正確なバイト長を示す数が付けられたものである。 【0072】従って、その最初の動作として、コンスト
ラクタsom300()は、シンボルテーブル全体を読
取り、シンボルテーブルをもっと使いやすい形に、具体
的にはsyment300レコードの配列に変換する。 syment300の配列には2つの長所がある。 1.大きさが一定のレコードの配列であるから、走査(
traverse)し易い。 2.名前は今やナルコードで終端され且つその先頭部分
への直接のポインタを含んでいるので取扱い易い。 【0073】クラスsyment300のcopy()
関数は、加工前のシンボルテーブルからsyment3
00ノードを作り出すために、digest()関数に
より使用される。演算子「=」はこのようなノードのコ
ピーを容易にする。 【0074】3.1.1.2 クラスsom800クラ
スsom800はクラスsom300より幾らか複雑で
ある(HP9000シリーズ600及び800のオブジ
ェクトファイルのフォーマットが複雑であるため)。し
かし、クラスsom800はクラスsom300と実質
上同じ機能を果す。 【0075】クラスsom800を構成するコンピュー
タプログラムセグメントを表3に示す。クラスsom8
00に含まれているクラス、データ構造及び機能はクラ
スsom300にあるものと相似である。 【0076】          〈表−3〉 class somheader : public 
header {  public:     somheader() {}    som
header(fstream&);    somh
eader(somheader& other) {
*this = other;}    int va
lidate();}; class som800 {   protected:     char       open;     
      // このsomはオープンしているか?
    char       valid;    
      // このsomは正しいか?    s
omheader *header_ptr;    
 // オブジェクトファイルヘッダへの      
                         
   // ポインタ    SPAHDR    *
space_dict;     // スペーステー
ブルへのポインタ    int        sp
ace_count;    // スペースの数  
  SCNHDR    *subspace_dic
t;  // サブスペーステーブルへのポインタ  
  int        subspace_cou
nt; // サブスペースの数    char  
    *space_strings;  // ス
ペース文字列テーブルへのポインタ    int  
      space_strings_size;
 // その長さ    SYMENT    *sy
m;            // シンボルテーブル
へのポインタ    int        sym_
count;      // シンボルの数    
char      *symbol_strings
; // シンボル文字列テーブルへのポインタ   
 int        symbol_string
s_size; // その長さ    INITPT
R    init_ptrs;      // 初
期化ポインタへのポインタ    int      
  init_ptrs_count;    // 
初期化ポインタの数    fstream   *s
omfile;        // オープンしてい
るファイルのポインタ  public:     // コンストラクタ及びデストラクタ   
 som800();     som800(char *filename
, int mode=ios::in); // フ
ァイル名で初期化    ■som800();     // 手短な正当性チェッカ                operator i
nt() {return valid;}    /
/ パッケージされた入出力アクセスルーチン    
// これらのルーチンはfstream中の対応する
ルーチンと同じ機能を果す    streampos
  tellg ()               
{                    return
 somfile−>tellg();       
        }     istream&   seekg (str
eamoff 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 (str
eamoff so, seek_dir sd)  
             {                    return
 somfile−>seekp(so, sd); 
              }     ostream&   write (cha
r *s, long n)            
   {                    return
 somfile−>write(s, (int) 
n);               }     // シンボルテーブルアクセスルーチン  
  int        num_spaces()
 {return space_count;}   
 int        num_subspaces
() {return subspace_count
;}    int        num_symb
ols() {return sym_count;}
    int        num_init_p
trs() {return init_ptrs_c
ount;}    unsigned int dp
() {return header_ptr−>pr
esumed_dp;}    SPAHDR    
*get_space_dict() {return
 space_dict;}    SCNHDR  
  *get_subspace_dict() {r
eturn subspace_dict;}    
SYMENT    *get_symbols() 
{return sym;}    INITPTR 
  *get_init_ptrs() {retur
n init_ptrs;}    SPAHDR  
  *find_space(char *);   
 char      *space_name(SP
AHDR& s);               {                    return
 &space_strings[s.STR_IND
EX];               }     SCNHDR    *find_subsp
ace(SPAHDR *, char *);   
 char      *subspace_name
 (SCNHDR& s)             
  {                    return
 &space_strings[s.STR_IND
EX];               }     SYMENT    *find_symbo
l(char *, SCNHDR *subsp =
 NULL, int typ = −1);    
char       *sym_name 8SYM
ENT& s)               {                    return
 &symbol_strings[s.offset
];               }     long       sym_loc (S
YMENT& s); // ファイル中でsymが指
す位置    long       sym_val
 (SYMENT& s); // ファイル中でロー
ドされた                     
                  // プログラ
ムが指す位置}; 【0077】3.1.2 特殊化クラス特殊化クラスは
、コンパイラ及びトランスレータデバッグ情報126、
306に対する読み書を行うルーチンを含む。特殊化ク
ラスは、オブジェクト/デバッグファイル118、30
6を他のオブジェクト/デバッグファイル(代替デバッ
グテーブルが入っている)にコピーし、シンボルをオブ
ジェクト/デバッグファイル118、306に入ってい
るシンボルテーブルに追加するルーチンも含んでいる。 【0078】本発明の好適実施例228では、debu
gsom300及びdebugsom800という2つ
の特殊化クラスがある。 debugsom300はHP9000シリーズ300
コンピュータプラットフォーム202で動作し、deb
ugsom800はHP9000シリーズ600及び8
00コンピュータプラットフォーム202で動作する。 debugsom300及びdebugsom800に
ついて次の章で説明する。 【0079】3.1.2.1 クラスdebugsom
300クラスdebugsom300を構成するコンピ
ュータプログラムセグメントを表4に示す。 【0080】          〈表−4〉 class debugsom300 : publi
c som300 {  protected:     long       last_writt
en_pos; // 最後の書込位置を憶えておく 
 public:     // コンストラクタ     debugsom300();    deb
ugsom300(char *filename, 
int mode=ios::in); // ファイ
ル名で                      
                         
    // 初期化する    // デストラクタ
はない     // (seekpのために)最後の書込位置
を返す    int        endpos(
) {return last_written_po
s;}    // デバッグ情報を読み書きする  
  debuginfo *read_debug_i
nfo();    int        writ
e_debug_info(debuginfo *n
ew_dbg_info);    // シンボルテ
ーブルにシンボルを付加する    syment30
0 *add_symbol(char *nm, i
nt sym_typ, int dreloc = 
0);    // 力仕事ルーチン:oldsomを
*thisに複写して、    //   デバッグ情
報をcpp_infoで置き換える    int  
      copy(debugsom300& o
ldsom, debuginfo *cpp_inf
o);}; 【0081】ルーチンdebugsom300()はオ
ブジェクト/デバッグファイル118、306をオープ
ンし、その内容の一部を読出す。ルーチンread_d
ebug_info()はファイル118、306にア
クセスしてその内容の残りを読出す。 【0082】ルーチンread_debug_info
()はまた情報をデバッグデータ構造(表1に示す)に
書き込む。 【0083】3.1.2.2 クラスdebugsom
800クラスdebugsom800を構成するコンピ
ュータプログラムセグメントを表5に示す。クラスde
bugsom800に含まれているクラス、データ構造
及び機能は、debugsom300クラス中のものと
相似である。 【0084】          〈表−5〉 class debugsom800 : publi
c som800 {  protected:     int        last_writt
en_pos; // 最後の書込位置    // 
手入れ情報を書き出すためのルーチン    int 
           copy_old_fixup
s(debugsom800& newsom);  
  int            add_new_
fixups(void);  public:     // コンストラクタ     debugsom800();    deb
ugsom800(char *filename, 
int mode=ios::in); // ファイ
ル名で                      
                         
    // 初期化する    // デストラクタ
はない     // (seekpのために)最後の書込位置
を返す    int        endpos(
) {return last_written_po
s;}    // デバッグ情報を読み書きする  
  debuginfo *read_debug_i
nfo();    int        writ
e_debug_info(debuginfo *n
ew_dbg_info);    // シンボルテ
ーブルにシンボルを付加する    syment80
0 *add_symbol(char *nm, i
nt sym_typ,              
                      int
 sym_scope, int subsp);  
       // 力仕事ルーチン:oldsomを*th
isに複写して、    //   デバッグ情報をc
pp_infoで置き換える    int     
   copy(debugsom800& olds
om, debuginfo *cpp_info);
    // 古い手入れ情報を読む     friend oldfixuplist *
read_debug_fixups(debugso
m800&, int,              
                      cha
r *);}; 【0085】3.2 デバッグ情報マニピュレータ図7
は、デバッグ情報マニピュレータ510の構造図/機能
フローチャートを示す。図7で、長方形は、ソフトウェ
アモジュール/プロセスを表わし、長円形は、ソフトウ
ェアモジュール/プロセスの入力及び出力を表わす。 【0086】図7に示す通り、デバッグ情報マニピュレ
ータは、ルックアップテーブル構築部710、712、
ルックアップテーブル整合部(lookup tabl
e matcher)726及びルックアップテーブル
調整部(lookup table fixer)74
4を含んでいる。 【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のエントリ全てについてのエントリを含んで
いるという点で、それぞれコンパイラデバッグデータ構
造516及びトランスレータデバッグデータ構造518
中に含まれているDNTTを抽象化したものである。 【0089】ステップ806で、ルックアップテーブル
整合部726は、ルックアップテーブル718、720
を整合(match)させて整合済みコンパイラルック
アップテーブル(matched compiler 
lookup table)732及び整合済みトラン
スレータルックアップテーブル(matched tr
anslator lookup table)734
をそれぞれ作製する。ステップ806が終了すると、整
合済みコンパイラルックアップテーブル732のエント
リは整合済みトランスレータルックアップテーブル73
4のエントリと整合している、つまり対応するようにな
っている。 【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の各種のエント
リの値は、整合済みコンパイラルックアップテーブル7
32からの情報を用いて修正されなければならない。こ
のようなDNTTエントリにはSVARエントリがある
が、そのロケーション及びオフセット値は整合済みコン
パイラルックアップテーブル732からの情報を用いて
修正されなければならない。他のこのようなDNTTエ
ントリにはDVAR及びFPARAMのエントリがあり
、これらのロケーション及びレジスタパラメータ値は整
合済みコンパイラルックアップテーブル732からの情
報を用いて修正されなければならない。 【0094】他のそのようなDNTTエントリにはFU
NCエントリがあり、そのentryaddr、low
addr、hiaddr、addr及び最適化値は、整
合済みコンパイラルックアップテーブル732からの情
報を用いて修正されなければならない。 【0095】他のそのようなDNTTエントリには、B
EGIN、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エントリを追加及び削除し、整合しないDNT
Tエントリを無効にする。整合しないSLT及びDNT
Tエントリには除去用の印を付ける。 【0098】多くの場合、整合済みトランスレータルッ
クアップテーブル734に挿入しなければならない情報
は、リンク時点までわからない。例えば、静的変数のア
ドレス、あるいは関数の開始及び終りについてのコード
アドレスは、リンクするまでわからない。 【0099】これらの場合には、ルックアップテーブル
調整部744は、決定用情報(fixup)を作り出し
て、リンカ128にリンクプロセス中適切な値をオブジ
ェクトコード316中の最終デバッグ情報に挿入するよ
う指示する。 【0100】決定用情報は、DNTTのSVAR、FU
NC及びOBJECT_IDの各エントリについて作ら
なければならない。 【0101】ステップ814で、ルックアップテーブル
調整部744は整頓段階に入り、除去用の印が付いてい
るSLT及びDNTTを削除する(SLTエントリの場
合)かまたは無効にする(DNTTエントリの場合)。 【0102】ステップ810及び814の終了に続いて
、図7に示すように、ルックアップテーブル調整部74
4は、マージ済みルックアップテーブル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_FU
NCTION と K_END ・ K_BEGIN 
と K_END 【0105】このような対は、各々別
個のクラスで表わされるが、これらクラスは皆dtab
と呼ばれる共通基底クラスから誘導される。 【0106】例えば、下記のコンピュータプログラムの
抜粋を考える。 【0107】int vl; main (int argc, char **ar
gv){ 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: 4000
8988;          End NTT: 4
0008988; Start SLT: −1; E
nd SLT: −1; Srcf: 0)     
 Src (Name: t1.c; NTT: 40
0089a0; SLT: −1)      Sva
r (Name: v1; NTT: 40008aa
8; Off: 0; disp: 0; loc: 
0;            sym: 0; Src
f: 0)      Svar (Name: v2
; NTT: 40008ac0; off: 0; 
disp: 0; loc: 0;         
   sym: 0; Srcf: 0)      
FUNCTION (Name: main; Ali
as: _MAIN_; Start NTT: 40
0089ac;                En
d NTT: 400089ac; Start SL
T −1; End SLT: −1;       
         Srcf: 400097c8) 
         Fparam (Name: ar
gc; NTT: 400089d0; spoff:
 0;                  Srcf
: 400097c8)          Fpar
am (Name: argv; NTT: 4000
8a00; spoff: 0;          
        Srcf: 400097c8)  
        BLOCK (Start NTT:
 40008a18; End NTT: 40008
a18;                 Star
t SLT: −1;               
  End SLT: −1; Srcf: 4000
97c8)              Dvar (
Name: j; NTT: 40008a3c; s
poff: 0;                 
   Srcf: 400097c8)       
       Dvar (Name: k; NTT
: 40008a24; spoff: 0;    
                Srcf: 400
097c8)              BLOCK
 (Start NTT: 30008a54; En
d NTT: 40008a54;         
            Start SLT: −1
;                     End
 SLT: −1; Srcf: 400097c8)
                  Dvar (N
ame: foo; NTT: 40008a6c; 
spoff: 0;                
        Srcf: 400097c8)  
            BLOCK (Start 
NTT: 40008a90; End NTT: 4
0008a90;                 
    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に対応する)についての他
のTABLEテーブルが生成される(表6には示されて
いない)。このテーブルはブロック構造を有していない
。 【0115】本発明の好適実施例では、ブロック構造対
を表わす以下の5つのクラスがある:datab, b
locktab, 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, numtable
s;    dtablist *firstchil
d;       // テーブルの下位リストへの 
                         
        // ポインタ    dtab *
parent;               // 
親テーブルへのポインタ    dtablist *
nextchild;        // 反復子が
使用    dnttentry *ntt_star
t, *ntt_end;  // テーブルの付き合
わせ及び                     
                  // 手当をす
るルーチンが使用    SLTPOINTER sl
t_start, slt_end;   // 同 
 上    dtab *corresponding
;             // 同  上         dsrcent *srcf, *esrcf
;      // ソースファイルテーブル要素への
                         
         // ポインタ    fakeb
lock *n_fakes;         //
 このブロック内の                
                 // 「フェイク
(模造)」ブロック  protected:     int make_table(int bu
ckets); // コンストラクタから呼ばれる 
 public:     // コンストラクタ及びデストラクタ   
 dtab() {make_table(DTABS
IZ);}    dtab(int buckets
) {make_table(buckets);} 
   virtual ■dtab();    //
 テーブル操作ルーチン     int hash(char *);    
int insert(dsyment *entry
);    int remove(dsyment 
*entry);    dsyment *look
up (char *n, int nofollow
=0,                      
   int kind=K_NIL);    in
t add_subtable (dtab *sub
tab);    // このテーブルは何か「実際」
の要素を含んでいるか?    int empty(
);     // デバッグ情報のためのアクセスルーチン
    void set_slt_start(SL
TPOINTER n) {slt_start = 
n;}    void set_slt_end(S
LTPOINTER n) {slt_start =
 n;}    SLTPOINTER get_sl
t_start() {return slt_sta
rt;}    SLTPOINTER get_sl
t_end() {return slt_end;}
    void set_ntt_start (d
nttentry *ntt) {ntt_start
 =                       
                         
  ntt;}    void set_ntt_e
nd (dnttentry *ntt) {ntt_
end = ntt;}    dnttentry 
*get_ntt_start () {return
 ntt_start;}    dnttentry
 *get_ntt_end () {return 
ntt_end;}    void set_sou
rcefile(dsrcent *x) {srcf
 = x;}    void set_endsou
rcefile(dsrcent *x) {esrc
f = x;}    dsrcent *sourc
efile() {return srcf;}   
 dsrcent *endsourcefile()
 {return esrcf;}    // フェ
イクブロックへのアクセスルーチン    void 
set fakes(fakeblock *f) {
n_fakes = f;}    fakebloc
k *fakes() {return n_fake
s;}    // テーブル反復子     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 d
tab {public: // コンストラクタ blocktab() {} // テーブルタイプ virtual int ttyp();      
// K_BEGIN}; 【0124】3.2.1.3 クラスfunctabf
unctabは、blocktabから誘導されたクラ
スである。functabは、関数の最も外側のブロッ
クを表わすのに使用される。functabは関数の名
前及びエイリアスを定義する。functabはまた名
前及びエイリアスにアクセスして修正する一組のアクセ
スルーチンを定義する。 【0125】クラスfunctabを構成するクラス、
データ構造、変数及び関数を表9に示す。 【0126】 〈表−9〉 class functab : public bl
ocktab {private: char *n_name, *n_alias; /
/ 関数の名前とエイリアスpublic: // コンストラクタ functab(char *n, char *a)
;// 名前とエイリアスへのアクセスルーチンcha
r *name() {return n_name;
}char *alias() {return n_
alias;}void set_name (cha
r *n) {n_name = n;}void s
et_alias (char *n) {n_ali
as =n;}// テーブルタイプ virtual int ttyp();      
// K_FUNCTION}; 【0127】3.2.1.4 クラスmodtabmo
dtabは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 blo
cktab {  private:     char *n_name, *n_alia
s;  // モジュールの名前とエイリアス  pu
blic:     // コンストラクタ     modtab(char *n, char 
*a);    // 名前とエイリアスへのアクセス
ルーチン    char *name() {ret
urn n_name;}    char *ali
as() {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 クラスnulltabn
ulltabはdtabから誘導されたクラスである。 nulltabは最も外側のレベルのローカル及びグロ
ーバルNTTを表わすのに使用される。例えば、GNT
TはグローバルなSVARを全て含んでいるnullt
abにより表わされる。同様に、LNTTの中のmod
tabはnulltabの内側に包まれる。 【0132】クラスnulltabの主な特徴は、色々
なハッシュテーブルサイズを与えてインスタンスを生成
することができることである(テーブルが本質的にフラ
ットで、小さなハッシュテーブルでは多数の衝突を引き
起こしてしまうGNTTに有用である)。 【0133】クラスnulltabを構成するクラス、
データ構造、変数及び関数を表11に示す。 【0134】 〈表−11〉 class public : public dta
b {public: // コンストラクタ nulltab() {} nulltab(int buckets) : dt
ab(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、D
VAR及びFPARAMのような)変数エントリにだけ
注意を払う。 【0141】オブジェクトコードファイル118はトラ
ンスレータ302により作られたテンポラリデータにつ
いての多数のエントリを含んでいる。これらテンポラリ
データができるために、コンパイラデバッグデータ構造
516に入っているコンパイラデバッグ情報126のブ
ロック構造が変化する。例えば、トランスレータルック
アップテーブル720の中では空になっているテーブル
が、コンパイラルックアップテーブル718中では空で
はなくなっていることがある。 【0142】それ故、ステップ902の間、ルックアッ
プテーブル整合部726は、トランスレータ302が作
り出したテンポラリデータを表わすDVARを無視する
。このようなテンポラリデータDVARはその名前で識
別することができる。本発明の好適実施例では、DVA
Rテンポラリデータは文字列「__[A−Z]」(すな
わち、2つのアンダースコア文字の次に大文字のアルフ
ァベットが続くもの)で始まる名前を持っているとされ
ている。 【0143】本発明の好適実施例では、ルックアップテ
ーブル整合部726はステップ902を行うのに表12
に擬似コードで示すアルゴリズムを使用している。 【0144】              〈表−12〉for ta
ble_root.depth−first−sear
ch() 中の各テーブル do    if tab
le.empty() then        # 
 このテーブルを消去する        このテーブ
ルの全要素を親テーブル中にコピーする       
 このテーブルへの親テーブルからのリンクポインタを
            このテーブルのサブテーブル
のリストで置換する    endif endfor 【0145】ルックアップテーブル整合部726は、テ
ーブルがSVARを含まずかつテーブルに入っているD
VARがトランスレータ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, dt
ab *ctab){     cpp_tab と c_bab の互に対応
するフィールドを指示する    for cpp_t
ab の各子 do        c_tab の次
の子を得る        matching_tab
les (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エントリに削除用の印を付ける。その他の場
合には、整合済みコンパイラルックアップテーブル73
2からの情報を整合済みトランスレータルックアップテ
ーブル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フィールド値及びh
iaddrフィールド値をコピーする。実現の仕方によ
っては、ルックアップテーブル調整部744は、これら
フィールドについての決定用情報を設定してもよい。 【0156】OBJECT_IDエントリについては、
ルックアップテーブル調整部744はobject_i
dentフィールド値についての決定用情報を設定する
。 【0157】3.2.3.2. SLTルックアップテ
ーブル調整部744は、対応するDNTT_BEGIN
/DNTT_END対をSLT_BEGIN/SLT_
END対と整合させる。 ルックアップテーブル調整部744はまた、MODUL
E対及びFUNCTION対を整合させる。そのように
整合させることができないSLTまたはDNTT BE
GIN/ENDエントリは、削除の目標である(ただし
下の説明を参照)。 【0158】また、ルックアップテーブル調整部744
は、SLT_CLASS_SCOPEエントリ及びSL
T_WITHエントリ(及びそれに対応するSLT_E
ND)を挿入し、対応するDNTTエントリを整合させ
る。コンパイラ114はこれらのエントリを出力しない
。それは、それらがトランスレータデバッグ情報306
に固有のものであるからである。 【0159】また、ルックアップテーブル調整部744
は、余分のSLT_BEGIN/SLT_END対を挿
入して、関数内部のクラス宣言に包まれているDNTT
_BEGIN/DNTT_END対と整合させる。これ
らは決して削除してはならない。 【0160】上述の操作を行うには、ルックアップテー
ブル調整部744は最初に初期SLTを設定し、次にS
LTを増加する。これら2つのステップについて次の章
で詳細に説明する。 【0161】3.2.3.2.1 初期SLTを設定す
る表6及び表7に示すように、テーブルノードは2つの
SLTポインタ用フィールドを含んでいる。1つはSL
T_BEGIN(またはFUNCTIONまたはMOD
ULE)へのポインタであり、もう1つはブロックを区
切るDNTTに対応するSLT_ENDへのポインタで
ある。 【0162】これらノードは、整合済みコンパイラルッ
クアップテーブル732については正しく設定されるが
、トランスレータルックアップテーブル734について
は正しく設定されない。ルックアップテーブル調整部7
44は、下記のステップを行って整合済みトランスレー
タルックアップテーブル734についてのこれらノード
を設定する。 【0163】最初に、ルックアップテーブル調整部74
4は、整合済みトランスレータルックアップテーブル7
34についての修正のためのSLTのコピーを、整合済
みコンパイラルックアップテーブル732から作る。こ
のコピー中のDNTT逆方向ポインタはクリアされる。 【0164】調整ステップ810の間(ルックアップテ
ーブル調整部744は、この動作の間は挿入や削除を行
わない)、ルックアップテーブル調整部744は、整合
済みコンパイラルックアップテーブル732中の対応す
るエントリが指すものと同じオフセットにある対応する
SLTエントリを指すように、整合済みトランスレータ
ルックアップテーブル734を設定する(また、勿論、
これら新しいSLTエントリに対する対応する逆方向ポ
インタを設定する)。 【0165】これら2つのステップが終了してからも、
幾つかの未整合DNTT_BEGIN/DNTT_EN
D対と、おそらくは幾つかの未整合SLT_BEGIN
/SLT_END対が存在することがある。ルックアッ
プテーブル調整部744はこれらを削除の目標とする。 【0166】また、ルックアップテーブル調整部744
は、幾つかのSLT_BEGIN及びSLT_FUNC
TIONノードに或る特別の印を設定し、これにより、
後のSLT増加操作を行う段階で何等かのノードを生成
してそれらのノードの回りに挿入しなければならないこ
とを示す。 【0167】3.2.3.2.2 SLTを増加する上
に記したように、或るDNTTノードについて、ルック
アップテーブル調整部744はSLTエントリを生成す
る。 これらDNTTノードには以下の2つの種類がある。 【0168】第1のものは、DNTT_CLASS_S
COPE及びDNTT_WITHノードである。これら
はクラスのメンバ関数に対するDNTT_FUNCノー
ドの前及び後に来る(それらに対応するDNTT_EN
Dもまた関数のDNTT_ENDを括る)。 【0169】第2のものは、特別に印の付いたDNTT
_BEGIN及びDNTT_ENDノードである。これ
らは、関数内部のローカルクラス宣言を取り囲むものと
して出力される。これらノードは、普通のBEGIN及
びENDとしては処理されない(すなわち、これらにつ
いてはテーブルが作られない)。 【0170】第1の場合については、ルックアップテー
ブル調整部744は、DNTT_FUNCの未使用フィ
ールドに、関数の前のDNTT_CLASS_SCOP
Eの有無及び関数の後のDNTT_WITHの有無につ
いて1ビットづつ、合計2ビットの印を付ける。 【0171】第2の場合については簡単な印を付けるこ
とは不可能である。各々がDNTT_FUNCTION
/DNTT_END対の内部(すなわち、ローカルブロ
ックの内側で宣言されたクラス)ではなく、DNTT_
BEGIN/DNTT_END対の内部に現われる、任
意の個数のBEGIN/END対が存在できる。 【0172】模造ブロック(fake block)と
いう概念は、これらの状況を取扱うのに使用される。 【0173】模造ブロックは「現実のブロック」と同じ
であるが、テーブル構築ステップ802の間、ルックア
ップテーブル構築部710、712が印の付いたBEG
IN(またはこのような印の付いたBEGINに対応す
るEND)を見つけたとき、ルックアップテーブル構築
部が別個のテーブルスタックにプッシュダウンしたりポ
ップアップする点だけが違う。最後のこのようなエント
リがポップアップされると、サブトリー全体が直ぐ外側
の「現実の」テーブルに取付けられる。 【0174】SLTを埋め盡すには、ルックアップテー
ブル調整部744は、SLTを走査してこれを1エント
リづつ新しいコピーに転写する。ルックアップテーブル
調整部744は、役に立たないSLTエントリ(例えば
、DNTT_SRCFILEに対応しなかったSLT_
SRCFILE)を捨て、上述のように幾つかのSLT
エントリを挿入する。 【0175】ルックアップテーブル調整部744は、加
除されたSLTエントリの数のカウンタを保持している
。SLT_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にコピ
ーする(そして逆方向ポインタにより指示されているD
NTTエントリを調節する)。 【0179】SLT_BEGINエントリについては、
DNTT逆方向ポインタがDNTT_NILであれば、
ルックアップテーブル調整部744はこのSLT_BE
GINエントリを捨て、オフセットカウンタをデクリメ
ントさせる。 【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_CLASS_SCOP
E及び/またはDNTT_WITHの存在を示すフラグ
がないかどうかチェックする。 【0184】クラススコープに関するフラグが設定され
ていれば、ルックアップテーブル調整部744はSLT
_CLASS_SCOPEを生成してオフセットカウン
タをインクリメントさせる。ルックアップテーブル調整
部744はDNTT_FUNCTIONから後向きに探
し、DNTT_CLASS_SCOPEの位置を突きと
めてこれを整合させる。 【0185】次に、ルックアップテーブル調整部744
は、SLT_FUNCTIONノード全体をコピーし、
DNTT_FUNCTIONのSLTポインタを、オフ
セットカウンタにより調節する。 【0186】DNTT_WITHフラグが設定されてい
れば、ルックアップテーブル構築部744は、SLT_
WITHを生成し、同様にDNTT_WITHを捜し出
して前進・後退ポインタを設定する。 【0187】最後に、ルックアップテーブル構築部74
4は模造ブロックがないかどうかチェックし、DNTT
_BEGINに対するのと同じ手続を取る。 【0188】SLT_ENDエントリについては、DN
TT逆方向ポインタがDNTT_NILであれば、ルッ
クアップテーブル構築部744はこのエントリを捨て、
オフセットカウンタをデクリメントさせる。そうでない
場合には、ルックアップテーブル構築部744は、(そ
れに対応したDNTT_ENDを見出しそのbegin
scopeフィールドを調べることにより)そのスコー
プを開始した対応するDNTTをチェックする。対応し
たDNTTがDNTT_FUNCTIONであってかつ
class_scopeまたはwithフラグがセット
されていれば、ルックアップテーブル構築部744がS
LT_ENDを生成して既に作られているSLT_CL
ASS_SCOPEまたはSLT_WITHを整合させ
、これに従ってポインタとオフセットカウンタにパッチ
を当てる。ルックアップテーブル構築部744はSLT
_FUNCTIONに対するのと同じ手法を取る。すな
わち、クラススコープに対してSLT_ENDを挿入し
、このENDをコピーし、withに対してSLT_E
NDを挿入する。 【0189】SLT_MODULEエントリについては
、ルックアップテーブル調整部744はエントリを完全
にコピーする。それは1つのものしか存在しないからで
ある。 【0190】上の処置が完了した後には、要素ごとにL
NTTに正しく整合つまり対応している新しいSLTが
存在する。また、この新しいSLTには使用されていな
いエントリは含まれていない。 【0191】3.2.3.3 DNTT_SRCFIL
EとSLT_SRCFILEを整合させる SRCFILEエントリは、デバッグ情報構成の中で最
も体系的でない部分である。SCRFILEをどこに出
力するかについては、コンパイラが異れば、その方針が
異なる。 【0192】これに加えて、ある侵すことのできないS
RCFILEエントリが存在する(例えば、FUNCT
IONエントリの直前にあるSCRFILEエントリ)
。 【0193】整合ルックアップテーブル732、734
中の各ノード及びテーブルは、そのノードの直前にある
SCRFILEエントリへのポインタを有している。こ
れに加えて、各テーブルノードは、そのテーブルのDN
TT_ENDの直前のSRCFILEへのポインタを有
している。 【0194】ルックアップテーブル調整部744はこの
問題点を解決するために発見的方法を利用している。 【0195】調整ステップ810の間にトリーを走査す
ると、ルックアップテーブル調整部744はSRCFI
LEエントリを飛越す(これらのエントリは帳簿付け及
びデバッグのためだけに整合済みトランスレータルック
アップテーブル734中に存在する)。その代り、ルッ
クアップテーブル調整部744はテーブルに出会う毎に
下記アルゴリズムを使用する。 【0196】ステップ1:ルックアップテーブル調整部
744は、対応するテーブルのSRCFILEエントリ
を使用して、ブロックのBEGINに対応するSRCF
ILEエントリを決定する(fix up)。 【0197】ステップ2:ルックアップテーブル調整部
744は、上述のように整合済みトランスレータルック
アップテーブル734のサブテーブルの深さ優先の走査
を行う。 【0198】ステップ3:ルックアップテーブル調整部
744はブロックのENDに対応するSRCFILEエ
ントリを決定する。 【0199】ステップ4:整合済みトランスレータルッ
クアップテーブル734の各エントリについて、ルック
アップテーブル調整部744は、このノードにより指示
されているSRCFILEエントリを決定する。 【0200】ルックアップテーブル調整部744は、F
UNCTIONまたはBEGINのノードに出逢うと、
最後に見たSRCFILEをNULLにリセットする。 これは、SRCFILEが上記のアルゴリズムのステッ
プ1により修正されるために可能である。 【0201】上の4ステップアルゴリズムが終了した後
、FUNCTIONに対応する各SRCFILEが決定
される。他のSRCFILEは、関数の内部で変化する
もの以外は重要ではなく、これらはステップ3及びステ
ップ4でルックアップテーブル調整部により処理される
。 【0202】3.2.4. ステップ814−整頓する
ステップ814の間、ルックアップテーブル調整部74
4は、削除用の印が付いているエントリを削除すること
により名前及び型テーブル(Name andType
 Table, NTT)を整頓する。ルックアップテ
ーブル調整部744は、このステップの間、LNTTと
GNTTの内部の相互リンクがあるため注意を払わなけ
ればならない。 【0203】ルックアップテーブル調整部744は、問
題となっているエントリを、その種類フィールドをK_
NILに設定することにより削除し、または無効にする
。エントリがDNTT_BLOCKの1個分より長けれ
ば、2番目以降のブロックも加工されていないDNTT
_BLOCKとして処理され、その種類フィールドはK
_NILに設定され、その延長フラグは0にリセットさ
れる(こうしてこのエントリを幾つかの隣接したK_N
ILブロックのように見せる)。 【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は次に、延長ヘッダ、デバッグヘッダ、GNT
T、LNTT、SLT及びVT(及びもしあればXT)
及び別の延長部分から成るデバッグ情報をファイル31
6に書込む。また、延長ヘッダのオフセット及びサイズ
がオブジェクトファイルヘッダに記録される。 【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_de
bug_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)の特徴についての備えも持っている。デ
バッグ情報1108は、各匿名の共用体メンバを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は、この動作を、クラスデスクリプタテーブ
ルを参照して現在のスコープ中で見える与えられた名前
を使ってクラスを判定することにより行う。デバッガ3
20は次に、手続デスクリプタテーブルを参照し、その
デスクリプタが以前にクラスデスクリプタテーブルの中
で突き止められたエントリを逆方向に参照するところの
、与えられた名前を持つ関数を探す。 【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:出力オブジェクトファイルインターフェース5
16:コンパイラデバッグデータ構造518:トランス
レータデバッグデータ構造528:マージ済みルックア
ップテーブル530:ポータブル出力決定用情報 710、712:ルックアップテーブル構築部718:
コンパイラルックアップテーブル720:トランスレー
タルックアップテーブル726:ルックアップテーブル
整合部 732:整合済みコンパイラルックアップテーブル73
4:整合済みトランスレータルックアップテーブル74
0:ポータブル入力決定情報 744:ルックアップテーブル調整部 1104:プリプロセッサ 1108:前処理されたデバッグ情報 1112:主デバッガ 1118:ユーザ

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】以下の(A)ないし(C)を含み、トラン
    スレータベースのソフトウエアコンパイラでの使用に適
    合するように、意味のあるソースコードのシンボリック
    デバッグ情報を生成するシステム: (A)ソースコードについての第1デバッグ情報を生成
    する第1手段; (B)以下の(a)ないし(c)を含む第2手段:(a
    )ソースコードに対するオブジェクトコードを生成する
    手段; (b)ソースコードに対する第2デバッグ情報を生成す
    る手段; (c)前記オブジェクトコードと前記第2デバッグ情報
    を第1オブジェクトファイルにストアする手段;(C)
    前記第1デバッグ情報と前記第2デバッグ情報をマージ
    してソースコードに対する第3デバッグ情報を形成する
    :前記第3デバッグ情報は前記ソースコードを完全かつ
    正確に表現する。
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 true JPH04257033A (ja) 1992-09-11
JP3304995B2 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)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011096083A (ja) * 2009-10-30 2011-05-12 Nippon Steel Corp 言語変換装置、言語変換方法およびプログラム
US8291386B2 (en) 2008-08-21 2012-10-16 International Business Machines Corporation System and process for debugging object-oriented programming code
JP2014503902A (ja) * 2010-12-17 2014-02-13 マイクロソフト コーポレーション 異なるコンパイラステージからのデバッグ情報の融合
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

Families Citing this family (65)

* 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
US5764989A (en) * 1996-02-29 1998-06-09 Supercede, Inc. Interactive software development system
US5848274A (en) * 1996-02-29 1998-12-08 Supercede, Inc. Incremental byte code compilation 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 プログラム実行装置及び機能仕様とコードアドレスとの対応付け方法
CA2194020C (en) * 1996-12-24 2002-02-05 Kevin Paul Hickman Minimizing debug information for global types in compiled languages
CA2194021A1 (en) 1996-12-24 1998-06-24 Kevin Paul Hickman Binary class library with debugging support
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
WO2000072152A1 (en) * 1999-05-19 2000-11-30 Koninklijke Philips Electronics N.V. Data processor with a debug circuit
US6931572B1 (en) 1999-11-30 2005-08-16 Synplicity, Inc. Design instrumentation circuitry
US7356786B2 (en) * 1999-11-30 2008-04-08 Synplicity, Inc. Method and user interface for debugging an electronic system
US7072818B1 (en) 1999-11-30 2006-07-04 Synplicity, Inc. Method and system for debugging an electronic system
US6823497B2 (en) 1999-11-30 2004-11-23 Synplicity, Inc. Method and user interface for debugging an electronic system
US6581191B1 (en) 1999-11-30 2003-06-17 Synplicity, Inc. Hardware debugging in a hardware description language
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
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
US7644394B2 (en) * 2001-11-30 2010-01-05 International Business Machines Corporation Object-oriented creation breakpoints
US7398519B2 (en) * 2001-11-30 2008-07-08 International Business Machines Corporation Inheritance breakpoints for use in debugging object-oriented computer programs
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
US20030226135A1 (en) * 2002-05-29 2003-12-04 Oracle International Corporation Optimized program analysis
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
US8122017B1 (en) * 2008-09-18 2012-02-21 Google Inc. Enhanced retrieval of source code
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
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
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
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
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

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8291386B2 (en) 2008-08-21 2012-10-16 International Business Machines Corporation System and process for debugging object-oriented programming code
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
JP2011096083A (ja) * 2009-10-30 2011-05-12 Nippon Steel Corp 言語変換装置、言語変換方法およびプログラム
JP2014503902A (ja) * 2010-12-17 2014-02-13 マイクロソフト コーポレーション 異なるコンパイラステージからのデバッグ情報の融合

Also Published As

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

Similar Documents

Publication Publication Date Title
JPH04257033A (ja) シンボリックデバッグシステム及びその方法
US5361351A (en) System and method for supporting run-time data type identification of objects within a computer program
KR101099212B1 (ko) 예외 처리 구조물들을 포함하는 소프트웨어의 소스 언어 독립형 중간 표현을 처리하는 방법, 다수의 소스 코드 언어들에 대한 소스 언어 독립형 예외 처리 중간 표현들을 구현하기 위한 시스템 및 컴퓨터 판독가능 저장 매체
EP0643851B1 (en) Debugger program which includes correlation of computer program source code with optimized objet code
US5339419A (en) ANDF compiler using the HPcode-plus compiler intermediate language
US6149318A (en) Link-time and run-time error detection, and program instrumentation
US5850550A (en) No preprocessor and a source level debugger for embedded SQL in a 3GL
US6038378A (en) Method and apparatus for testing implementations of software specifications
US5276881A (en) ANDF producer using the HPcode-Plus compiler intermediate language
Kirby Reflection and hyper-programming in persistent programming systems
Bailey et al. A formal model and specification language for procedure calling conventions
JPH08504526A (ja) コンピュータにてオブジェクト指向プログラムの少なくとも1つのクラスのテストをする方法
US20130152061A1 (en) Full fidelity parse tree for programming language processing
Frankl The use of data flow information for the selection and evaluation of software test data
EP0520708B1 (en) Method and apparatus for converting high level form abstract syntaxes into an intermediate form
WO2022116342A1 (zh) 事件推送方法、系统、区块链平台、合约调用端及介质
Paulson A compiler generator for semantic grammars
Betz Xlisp: an object-oriented lisp
Kakkad et al. Portable run-time type description for conventional compilers
Thompson Plan 9 C compilers
CA2266291C (en) Method and apparatus for cobol to java translation
Nguyen Compiler design and implementation in OCaml with LLVM framework
Artúr et al. COMPILER FRONT END FUSION: UNDO DESUGARING IN LANGUAGE PROCESSING TOOLS
POÓR et al. COMPILER FRONT END FUSION: UNDO DESUGARING IN LANGUAGE PROCESSING TOOLS
d’Andrea et al. Tecnical Documentation

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