/compiler/jvm/dbgjasm.pas
https://github.com/slibre/freepascal · Pascal · 202 lines · 134 code · 33 blank · 35 comment · 9 complexity · 8d4cd1db5f8fb41946032e936586f79a MD5 · raw file
- {
- Copyright (c) 2003-2006 by Peter Vreman, Florian Klaempfl, and Jonas Maebe
- This units contains support for Jasmin debug info generation
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- ****************************************************************************
- }
- unit dbgjasm;
- {$i fpcdefs.inc}
- interface
- uses
- cclasses,globtype,
- aasmbase,aasmtai,aasmdata,
- symbase,symconst,symtype,symdef,symsym,
- finput,
- DbgBase;
- type
- { TDebugInfoJasmin }
- TDebugInfoJasmin=class(TDebugInfo)
- protected
- fcurrprocstart,
- fcurrprocend: tasmsymbol;
- procedure appendsym_localsym(list: TAsmList; sym: tabstractnormalvarsym);
- procedure appendsym_paravar(list:TAsmList;sym:tparavarsym);override;
- procedure appendsym_localvar(list:TAsmList;sym:tlocalvarsym);override;
- procedure beforeappenddef(list:TAsmList;def:tdef);override;
- procedure appendprocdef(list:TAsmList;def:tprocdef);override;
- public
- procedure inserttypeinfo;override;
- procedure insertlineinfo(list:TAsmList);override;
- end;
- implementation
- uses
- sysutils,cutils,cfileutl,constexp,
- version,globals,verbose,systems,
- cpubase,cpuinfo,cgbase,paramgr,
- fmodule,
- defutil,symtable,jvmdef,ppu
- ;
- {****************************************************************************
- TDebugInfoJasmin
- ****************************************************************************}
- procedure TDebugInfoJasmin.appendsym_localsym(list: TAsmList; sym: tabstractnormalvarsym);
- var
- jvar: tai_jvar;
- proc: tprocdef;
- begin
- if tdef(sym.owner.defowner).typ<>procdef then
- exit;
- if not(sym.localloc.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
- exit;
- proc:=tprocdef(sym.owner.defowner);
- jvar:=tai_jvar.create(sym.localloc.reference.offset,jvmmangledbasename(sym,true),fcurrprocstart,fcurrprocend);
- proc.exprasmlist.InsertAfter(jvar,proc.procstarttai);
- end;
- procedure TDebugInfoJasmin.appendsym_paravar(list: TAsmList; sym: tparavarsym);
- begin
- appendsym_localsym(list,sym);
- end;
- procedure TDebugInfoJasmin.appendsym_localvar(list: TAsmList; sym: tlocalvarsym);
- begin
- appendsym_localsym(list,sym);
- end;
- procedure TDebugInfoJasmin.beforeappenddef(list: TAsmList; def: tdef);
- begin
- end;
- procedure TDebugInfoJasmin.appendprocdef(list: TAsmList; def: tprocdef);
- var
- procstartlabel,
- procendlabel : tasmlabel;
- begin
- { insert debug information for local variables and parameters, but only
- for routines implemented in the Pascal code }
- if not assigned(def.procstarttai) then
- exit;
- current_asmdata.getlabel(procstartlabel,alt_dbgtype);
- current_asmdata.getlabel(procendlabel,alt_dbgtype);
- def.exprasmlist.insertafter(tai_label.create(procstartlabel),def.procstarttai);
- def.exprasmlist.insertbefore(tai_label.create(procendlabel),def.procendtai);
- fcurrprocstart:=procstartlabel;
- fcurrprocend:=procendlabel;
- write_symtable_parasyms(list,def.paras);
- { not assigned for unit init }
- if assigned(def.localst) then
- write_symtable_syms(list,def.localst);
- end;
- procedure TDebugInfoJasmin.inserttypeinfo;
- begin
- { write all procedures and methods }
- if assigned(current_module.globalsymtable) then
- write_symtable_procdefs(nil,current_module.globalsymtable);
- if assigned(current_module.localsymtable) then
- write_symtable_procdefs(nil,current_module.localsymtable);
- end;
- procedure TDebugInfoJasmin.insertlineinfo(list: TAsmList);
- var
- currfileinfo,
- lastfileinfo : tfileposinfo;
- nolineinfolevel : Integer;
- currfuncname : pshortstring;
- hp : tai;
- begin
- FillChar(lastfileinfo,sizeof(lastfileinfo),0);
- hp:=Tai(list.first);
- nolineinfolevel:=0;
- while assigned(hp) do
- begin
- case hp.typ of
- ait_function_name :
- begin
- currfuncname:=tai_function_name(hp).funcname;
- list.concat(tai_comment.Create(strpnew('function: '+currfuncname^)));
- end;
- ait_force_line :
- begin
- lastfileinfo.line:=-1;
- end;
- ait_marker :
- begin
- case tai_marker(hp).kind of
- mark_NoLineInfoStart:
- inc(nolineinfolevel);
- mark_NoLineInfoEnd:
- dec(nolineinfolevel);
- end;
- end;
- end;
- { Java does not support multiple source files }
- if (hp.typ=ait_instruction) and
- (nolineinfolevel=0) and
- (tailineinfo(hp).fileinfo.fileindex=main_module.unit_index) then
- begin
- currfileinfo:=tailineinfo(hp).fileinfo;
- { line changed ? }
- if (lastfileinfo.line<>currfileinfo.line) and (currfileinfo.line<>0) then
- begin
- { line directive }
- list.insertbefore(tai_directive.Create(asd_jline,tostr(currfileinfo.line)),hp);
- end;
- lastfileinfo:=currfileinfo;
- end;
- hp:=tai(hp.next);
- end;
- end;
- {****************************************************************************
- ****************************************************************************}
- const
- dbg_jasmin_info : tdbginfo =
- (
- id : dbg_jasmin;
- idtxt : 'JASMIN';
- );
- initialization
- RegisterDebugInfo(dbg_jasmin_info,TDebugInfoJasmin);
- end.