dbgbase.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. {
  2. Copyright (c) 2003-2006 by Peter Vreman and Florian Klaempfl
  3. This units contains the base class for debug info generation
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. }
  17. unit dbgbase;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. cclasses,
  22. systems,
  23. parabase,
  24. symconst,symbase,symdef,symtype,symsym,
  25. fmodule,
  26. aasmtai,aasmdata;
  27. type
  28. TDebugInfo=class
  29. protected
  30. { definitions }
  31. { collect all defs in one list so we can reset them easily }
  32. defnumberlist : TFPObjectList;
  33. deftowritelist : TFPObjectList;
  34. procedure appenddef(list:TAsmList;def:tdef);
  35. procedure beforeappenddef(list:TAsmList;def:tdef);virtual;
  36. procedure afterappenddef(list:TAsmList;def:tdef);virtual;
  37. procedure appenddef_ord(list:TAsmList;def:torddef);virtual;
  38. procedure appenddef_float(list:TAsmList;def:tfloatdef);virtual;
  39. procedure appenddef_file(list:TAsmList;def:tfiledef);virtual;
  40. procedure appenddef_enum(list:TAsmList;def:tenumdef);virtual;
  41. procedure appenddef_array(list:TAsmList;def:tarraydef);virtual;
  42. procedure appenddef_record(list:TAsmList;def:trecorddef);virtual;
  43. procedure appenddef_object(list:TAsmList;def:tobjectdef);virtual;
  44. procedure appenddef_classref(list:TAsmList;def: tclassrefdef);virtual;
  45. procedure appenddef_pointer(list:TAsmList;def:tpointerdef);virtual;
  46. procedure appenddef_string(list:TAsmList;def:tstringdef);virtual;
  47. procedure appenddef_procvar(list:TAsmList;def:tprocvardef);virtual;
  48. procedure appenddef_variant(list:TAsmList;def:tvariantdef);virtual;
  49. procedure appenddef_set(list:TAsmList;def:tsetdef);virtual;
  50. procedure appenddef_formal(list:TAsmList;def:tformaldef);virtual;
  51. procedure appenddef_undefined(list:TAsmList;def: tundefineddef);virtual;
  52. procedure appendprocdef(list:TAsmList;def:tprocdef);virtual;
  53. procedure write_remaining_defs_to_write(list:TAsmList);
  54. { symbols }
  55. procedure appendsym(list:TAsmList;sym:tsym);
  56. procedure beforeappendsym(list:TAsmList;sym:tsym);virtual;
  57. procedure afterappendsym(list:TAsmList;sym:tsym);virtual;
  58. procedure appendsym_staticvar(list:TAsmList;sym:tstaticvarsym);virtual;
  59. procedure appendsym_paravar(list:TAsmList;sym:tparavarsym);virtual;
  60. procedure appendsym_localvar(list:TAsmList;sym:tlocalvarsym);virtual;
  61. procedure appendsym_fieldvar(list:TAsmList;sym:tfieldvarsym);virtual;
  62. procedure appendsym_unit(list:TAsmList;sym:tunitsym);virtual;
  63. procedure appendsym_const(list:TAsmList;sym:tconstsym);virtual;
  64. procedure appendsym_type(list:TAsmList;sym:ttypesym);virtual;
  65. procedure appendsym_label(list:TAsmList;sym:tlabelsym);virtual;
  66. procedure appendsym_absolute(list:TAsmList;sym:tabsolutevarsym);virtual;
  67. procedure appendsym_property(list:TAsmList;sym:tpropertysym);virtual;
  68. { symtable }
  69. procedure write_symtable_parasyms(list:TAsmList;paras: tparalist);
  70. procedure write_symtable_syms(list:TAsmList;st:TSymtable);
  71. procedure write_symtable_defs(list:TAsmList;st:TSymtable);
  72. procedure write_symtable_procdefs(list:TAsmList;st:TSymtable);
  73. procedure reset_unit_type_info;
  74. procedure write_used_unit_type_info(list:TAsmList;hp:tmodule);
  75. public
  76. constructor Create;virtual;
  77. procedure inserttypeinfo;virtual;
  78. procedure insertmoduleinfo;virtual;
  79. procedure insertlineinfo(list:TAsmList);virtual;
  80. procedure referencesections(list:TAsmList);virtual;
  81. end;
  82. TDebugInfoClass=class of TDebugInfo;
  83. var
  84. CDebugInfo : array[tdbg] of TDebugInfoClass;
  85. current_debuginfo : tdebuginfo;
  86. procedure InitDebugInfo(hp:tmodule; restore_current_debuginfo : boolean);
  87. procedure DoneDebugInfo(hp:tmodule;var current_debuginfo_reset : boolean);
  88. procedure RegisterDebugInfo(const r:tdbginfo;c:TDebugInfoClass);
  89. implementation
  90. uses
  91. cutils,
  92. globals,
  93. verbose,
  94. cgbase;
  95. constructor TDebugInfo.Create;
  96. begin
  97. end;
  98. procedure TDebugInfo.insertmoduleinfo;
  99. begin
  100. end;
  101. procedure TDebugInfo.inserttypeinfo;
  102. begin
  103. end;
  104. procedure TDebugInfo.insertlineinfo(list:TAsmList);
  105. begin
  106. end;
  107. procedure TDebugInfo.referencesections(list:TAsmList);
  108. begin
  109. end;
  110. {**************************************
  111. Definition
  112. **************************************}
  113. procedure TDebugInfo.appendprocdef(list:TAsmList;def:tprocdef);
  114. begin
  115. end;
  116. procedure TDebugInfo.beforeappenddef(list:TAsmList;def:tdef);
  117. begin
  118. end;
  119. procedure TDebugInfo.afterappenddef(list:TAsmList;def:tdef);
  120. begin
  121. end;
  122. procedure TDebugInfo.appenddef_ord(list:TAsmList;def:torddef);
  123. begin
  124. end;
  125. procedure TDebugInfo.appenddef_float(list:TAsmList;def:tfloatdef);
  126. begin
  127. end;
  128. procedure TDebugInfo.appenddef_formal(list:TAsmList;def: tformaldef);
  129. begin
  130. end;
  131. procedure TDebugInfo.appenddef_undefined(list:TAsmList;def: tundefineddef);
  132. begin
  133. end;
  134. procedure TDebugInfo.appenddef_set(list:TAsmList;def: tsetdef);
  135. begin
  136. end;
  137. procedure TDebugInfo.appenddef_object(list:TAsmList;def: tobjectdef);
  138. begin
  139. end;
  140. procedure TDebugInfo.appenddef_classref(list:TAsmList;def: tclassrefdef);
  141. begin
  142. appenddef_pointer(list,tpointerdef(pvmttype));
  143. end;
  144. procedure TDebugInfo.appenddef_variant(list:TAsmList;def: tvariantdef);
  145. begin
  146. end;
  147. procedure TDebugInfo.appenddef_enum(list:TAsmList;def:tenumdef);
  148. begin
  149. end;
  150. procedure TDebugInfo.appenddef_file(list:TAsmList;def: tfiledef);
  151. begin
  152. end;
  153. procedure TDebugInfo.appenddef_array(list:TAsmList;def:tarraydef);
  154. begin
  155. end;
  156. procedure TDebugInfo.appenddef_record(list:TAsmList;def:trecorddef);
  157. begin
  158. end;
  159. procedure TDebugInfo.appenddef_pointer(list:TAsmList;def:tpointerdef);
  160. begin
  161. end;
  162. procedure TDebugInfo.appenddef_string(list:TAsmList;def:tstringdef);
  163. begin
  164. end;
  165. procedure TDebugInfo.appenddef_procvar(list:TAsmList;def:tprocvardef);
  166. begin
  167. end;
  168. procedure TDebugInfo.appenddef(list:TAsmList;def:tdef);
  169. begin
  170. if (def.dbg_state in [dbg_state_writing,dbg_state_written]) then
  171. exit;
  172. { never write generic template defs }
  173. if df_generic in def.defoptions then
  174. begin
  175. def.dbg_state:=dbg_state_written;
  176. exit;
  177. end;
  178. { to avoid infinite loops }
  179. def.dbg_state := dbg_state_writing;
  180. beforeappenddef(list,def);
  181. { queued defs have to be written later }
  182. if (def.dbg_state=dbg_state_queued) then
  183. exit;
  184. case def.typ of
  185. stringdef :
  186. appenddef_string(list,tstringdef(def));
  187. enumdef :
  188. appenddef_enum(list,tenumdef(def));
  189. orddef :
  190. appenddef_ord(list,torddef(def));
  191. pointerdef :
  192. appenddef_pointer(list,tpointerdef(def));
  193. floatdef :
  194. appenddef_float(list,tfloatdef(def));
  195. filedef :
  196. appenddef_file(list,tfiledef(def));
  197. recorddef :
  198. appenddef_record(list,trecorddef(def));
  199. variantdef :
  200. appenddef_variant(list,tvariantdef(def));
  201. classrefdef :
  202. appenddef_classref(list,tclassrefdef(def));
  203. setdef :
  204. appenddef_set(list,tsetdef(def));
  205. formaldef :
  206. appenddef_formal(list,tformaldef(def));
  207. arraydef :
  208. appenddef_array(list,tarraydef(def));
  209. procvardef :
  210. appenddef_procvar(list,tprocvardef(def));
  211. objectdef :
  212. appenddef_object(list,tobjectdef(def));
  213. undefineddef :
  214. appenddef_undefined(list,tundefineddef(def));
  215. procdef :
  216. begin
  217. { procdefs are already written in a separate step. procdef
  218. support in appenddef is only needed for beforeappenddef to
  219. write all local type defs }
  220. end;
  221. else
  222. internalerror(200601281);
  223. end;
  224. afterappenddef(list,def);
  225. def.dbg_state := dbg_state_written;
  226. end;
  227. procedure TDebugInfo.write_remaining_defs_to_write(list:TAsmList);
  228. var
  229. n : integer;
  230. looplist,
  231. templist: TFPObjectList;
  232. def : tdef;
  233. begin
  234. templist := TFPObjectList.Create(False);
  235. looplist := deftowritelist;
  236. while looplist.count > 0 do
  237. begin
  238. deftowritelist := templist;
  239. for n := 0 to looplist.count - 1 do
  240. begin
  241. def := tdef(looplist[n]);
  242. case def.dbg_state of
  243. dbg_state_written:
  244. continue;
  245. dbg_state_writing:
  246. internalerror(200610052);
  247. dbg_state_unused:
  248. internalerror(200610053);
  249. dbg_state_used:
  250. appenddef(list,def);
  251. dbg_state_queued:
  252. begin
  253. { can happen in case an objectdef was used from another
  254. unit that was compiled without debug info, and we are
  255. using Stabs (which means that parent types have to be
  256. written before child types). In this case, the child
  257. objectdef will be queued and never written, because its
  258. definition is not inside the current unit and hence will
  259. not be encountered }
  260. if def.typ<>objectdef then
  261. internalerror(2012072401);
  262. if not assigned(tobjectdef(def).childof) or
  263. (tobjectdef(def).childof.dbg_state=dbg_state_written) then
  264. appenddef(list,def)
  265. else if tobjectdef(def).childof.dbg_state=dbg_state_queued then
  266. begin
  267. { ensure that the parent is indeed queued }
  268. deftowritelist.add(tobjectdef(def).childof);
  269. deftowritelist.add(def);
  270. end
  271. else if tobjectdef(def).childof.dbg_state=dbg_state_used then
  272. { comes somewhere after the current def in the looplist
  273. and will be written at that point, so we will have to
  274. wait until the next iteration }
  275. deftowritelist.add(def)
  276. else
  277. internalerror(2012072402);
  278. end;
  279. end;
  280. end;
  281. looplist.clear;
  282. templist := looplist;
  283. looplist := deftowritelist;
  284. end;
  285. templist.free;
  286. templist := nil;
  287. end;
  288. {**************************************
  289. Symbols
  290. **************************************}
  291. procedure TDebugInfo.beforeappendsym(list:TAsmList;sym:tsym);
  292. begin
  293. end;
  294. procedure TDebugInfo.afterappendsym(list:TAsmList;sym:tsym);
  295. begin
  296. end;
  297. procedure TDebugInfo.appendsym_staticvar(list:TAsmList;sym:tstaticvarsym);
  298. begin
  299. end;
  300. procedure TDebugInfo.appendsym_paravar(list:TAsmList;sym: tparavarsym);
  301. begin
  302. end;
  303. procedure TDebugInfo.appendsym_localvar(list:TAsmList;sym: tlocalvarsym);
  304. begin
  305. end;
  306. procedure TDebugInfo.appendsym_fieldvar(list:TAsmList;sym: tfieldvarsym);
  307. begin
  308. end;
  309. procedure TDebugInfo.appendsym_const(list:TAsmList;sym:tconstsym);
  310. begin
  311. end;
  312. procedure TDebugInfo.appendsym_label(list:TAsmList;sym: tlabelsym);
  313. begin
  314. end;
  315. procedure TDebugInfo.appendsym_property(list:TAsmList;sym: tpropertysym);
  316. begin
  317. end;
  318. procedure TDebugInfo.appendsym_type(list:TAsmList;sym: ttypesym);
  319. begin
  320. end;
  321. procedure TDebugInfo.appendsym_unit(list:TAsmList;sym: tunitsym);
  322. begin
  323. end;
  324. procedure TDebugInfo.appendsym_absolute(list:TAsmList;sym:tabsolutevarsym);
  325. begin
  326. end;
  327. procedure TDebugInfo.appendsym(list:TAsmList;sym:tsym);
  328. begin
  329. if sym.isdbgwritten then
  330. exit;
  331. beforeappendsym(list,sym);
  332. case sym.typ of
  333. staticvarsym :
  334. if not assigned(tstaticvarsym(sym).fieldvarsym) or
  335. not(df_generic in tdef(tstaticvarsym(sym).fieldvarsym.owner.defowner).defoptions) then
  336. appendsym_staticvar(list,tstaticvarsym(sym));
  337. unitsym:
  338. appendsym_unit(list,tunitsym(sym));
  339. labelsym :
  340. appendsym_label(list,tlabelsym(sym));
  341. localvarsym :
  342. appendsym_localvar(list,tlocalvarsym(sym));
  343. paravarsym :
  344. if tparavarsym(sym).localloc.loc<>LOC_VOID then
  345. appendsym_paravar(list,tparavarsym(sym));
  346. constsym :
  347. appendsym_const(list,tconstsym(sym));
  348. typesym :
  349. appendsym_type(list,ttypesym(sym));
  350. enumsym :
  351. { ignore enum syms, they are written by the owner }
  352. ;
  353. syssym :
  354. { ignore sys syms, they are only of internal use }
  355. ;
  356. procsym :
  357. { ignore proc syms, they are written by procdefs }
  358. ;
  359. absolutevarsym :
  360. appendsym_absolute(list,tabsolutevarsym(sym));
  361. propertysym :
  362. appendsym_property(list,tpropertysym(sym));
  363. namespacesym :
  364. { ignore namespace syms, they are only of internal use }
  365. ;
  366. else
  367. internalerror(200601242);
  368. end;
  369. afterappendsym(list,sym);
  370. sym.isdbgwritten:=true;
  371. end;
  372. {**************************************
  373. Symtables
  374. **************************************}
  375. procedure TDebugInfo.write_symtable_defs(list:TAsmList;st:TSymtable);
  376. var
  377. def : tdef;
  378. i : longint;
  379. nonewadded : boolean;
  380. begin
  381. case st.symtabletype of
  382. staticsymtable :
  383. list.concat(tai_comment.Create(strpnew('Defs - Begin Staticsymtable')));
  384. globalsymtable :
  385. list.concat(tai_comment.Create(strpnew('Defs - Begin unit '+st.name^+' has index '+tostr(st.moduleid))));
  386. else
  387. ;
  388. end;
  389. repeat
  390. nonewadded:=true;
  391. for i:=0 to st.DefList.Count-1 do
  392. begin
  393. def:=tdef(st.DefList[i]);
  394. if (def.dbg_state in [dbg_state_used,dbg_state_queued]) then
  395. begin
  396. appenddef(list,def);
  397. nonewadded:=false;
  398. end;
  399. end;
  400. until nonewadded;
  401. case st.symtabletype of
  402. staticsymtable :
  403. list.concat(tai_comment.Create(strpnew('Defs - End Staticsymtable')));
  404. globalsymtable :
  405. list.concat(tai_comment.Create(strpnew('Defs - End unit '+st.name^+' has index '+tostr(st.moduleid))));
  406. else
  407. ;
  408. end;
  409. end;
  410. procedure TDebugInfo.write_symtable_parasyms(list:TAsmList;paras: tparalist);
  411. var
  412. i : longint;
  413. sym : tsym;
  414. begin
  415. for i:=0 to paras.Count-1 do
  416. begin
  417. sym:=tsym(paras[i]);
  418. if (sym.visibility<>vis_hidden) then
  419. begin
  420. appendsym(list,sym);
  421. { if we ever write this procdef again for some reason (this
  422. can happen with DWARF), then we want to write all the
  423. parasyms again as well. }
  424. sym.isdbgwritten:=false;
  425. end;
  426. end;
  427. end;
  428. procedure TDebugInfo.write_symtable_syms(list:TAsmList;st:TSymtable);
  429. var
  430. i : longint;
  431. sym : tsym;
  432. begin
  433. case st.symtabletype of
  434. staticsymtable :
  435. list.concat(tai_comment.Create(strpnew('Syms - Begin Staticsymtable')));
  436. globalsymtable :
  437. list.concat(tai_comment.Create(strpnew('Syms - Begin unit '+st.name^+' has index '+tostr(st.moduleid))));
  438. else
  439. ;
  440. end;
  441. for i:=0 to st.SymList.Count-1 do
  442. begin
  443. sym:=tsym(st.SymList[i]);
  444. if (sym.visibility<>vis_hidden) and
  445. (not sym.isdbgwritten) and
  446. { avoid all generic symbols }
  447. not (sp_generic_dummy in sym.symoptions) and
  448. not ((sym.typ=typesym) and assigned(ttypesym(sym).typedef) and
  449. (df_generic in ttypesym(sym).typedef.defoptions)) then
  450. appendsym(list,sym);
  451. end;
  452. case st.symtabletype of
  453. staticsymtable :
  454. list.concat(tai_comment.Create(strpnew('Syms - End Staticsymtable')));
  455. globalsymtable :
  456. list.concat(tai_comment.Create(strpnew('Syms - End unit '+st.name^+' has index '+tostr(st.moduleid))));
  457. else
  458. ;
  459. end;
  460. end;
  461. procedure TDebugInfo.write_symtable_procdefs(list:TAsmList;st:TSymtable);
  462. var
  463. i : longint;
  464. def : tdef;
  465. begin
  466. for i:=0 to st.DefList.Count-1 do
  467. begin
  468. def:=tdef(st.DefList[i]);
  469. case def.typ of
  470. procdef :
  471. begin
  472. appendprocdef(list,tprocdef(def));
  473. if assigned(tprocdef(def).localst) then
  474. write_symtable_procdefs(list,tprocdef(def).localst);
  475. end;
  476. objectdef,recorddef :
  477. begin
  478. write_symtable_procdefs(list,tabstractrecorddef(def).symtable);
  479. end;
  480. else
  481. ;
  482. end;
  483. end;
  484. end;
  485. procedure TDebugInfo.reset_unit_type_info;
  486. var
  487. hp : tmodule;
  488. begin
  489. hp:=tmodule(loaded_units.first);
  490. while assigned(hp) do
  491. begin
  492. hp.is_dbginfo_written:=false;
  493. hp:=tmodule(hp.next);
  494. end;
  495. end;
  496. procedure TDebugInfo.write_used_unit_type_info(list:TAsmList;hp:tmodule);
  497. var
  498. pu : tused_unit;
  499. begin
  500. pu:=tused_unit(hp.used_units.first);
  501. while assigned(pu) do
  502. begin
  503. if not pu.u.is_dbginfo_written and not assigned(pu.u.package) then
  504. begin
  505. { prevent infinte loop for circular dependencies }
  506. pu.u.is_dbginfo_written:=true;
  507. { write type info from used units, use a depth first
  508. strategy to reduce the recursion in writing all
  509. dependent stabs }
  510. write_used_unit_type_info(list,pu.u);
  511. if assigned(pu.u.globalsymtable) then
  512. write_symtable_defs(list,pu.u.globalsymtable);
  513. end;
  514. pu:=tused_unit(pu.next);
  515. end;
  516. end;
  517. {****************************************************************************
  518. Init / Done
  519. ****************************************************************************}
  520. procedure InitDebugInfo(hp:tmodule; restore_current_debuginfo : boolean);
  521. begin
  522. if not assigned(CDebugInfo[target_dbg.id]) then
  523. begin
  524. Comment(V_Fatal,'cg_f_debuginfo_output_not_supported');
  525. exit;
  526. end;
  527. {$ifndef llvm}
  528. hp.DebugInfo:=CDebugInfo[target_dbg.id].Create;
  529. {$else}
  530. { we can't override the assignment of target_dbg with the LLVM class,
  531. because we still need to know whether to tell LLVM to generate
  532. DWARFv2/3/4/5/... }
  533. hp.DebugInfo:=CDebugInfo[dbg_llvm].Create;
  534. {$endif}
  535. if restore_current_debuginfo then
  536. begin
  537. if current_debuginfo=nil then
  538. current_debuginfo:=tdebuginfo(hp.DebugInfo)
  539. else
  540. internalerror(2012032101);
  541. end;
  542. end;
  543. procedure DoneDebugInfo(hp:tmodule;var current_debuginfo_reset : boolean);
  544. begin
  545. current_debuginfo_reset:=false;
  546. if assigned(hp.DebugInfo) then
  547. begin
  548. if hp.DebugInfo=current_debuginfo then
  549. begin
  550. current_debuginfo:=nil;
  551. current_debuginfo_reset:=true;
  552. end;
  553. hp.DebugInfo.Free;
  554. hp.DebugInfo:=nil;
  555. end;
  556. end;
  557. procedure RegisterDebugInfo(const r:tdbginfo;c:TDebugInfoClass);
  558. var
  559. t : tdbg;
  560. begin
  561. t:=r.id;
  562. if assigned(dbginfos[t]) then
  563. writeln('Warning: DebugInfo is already registered!')
  564. else
  565. Getmem(dbginfos[t],sizeof(tdbginfo));
  566. dbginfos[t]^:=r;
  567. CDebugInfo[t]:=c;
  568. end;
  569. const
  570. dbg_none_info : tdbginfo =
  571. (
  572. id : dbg_none;
  573. idtxt : 'NONE';
  574. );
  575. initialization
  576. RegisterDebugInfo(dbg_none_info,TDebugInfo);
  577. end.