mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 14:39:36 +01:00 
			
		
		
		
	+ support for writing JVM line number information
* moved emitting line information from agjasmin to dbgjasm (+ it now
    also works if -al is not used)
git-svn-id: branches/jvmbackend@18355 -
			
			
This commit is contained in:
		
							parent
							
								
									d456ec2ffe
								
							
						
					
					
						commit
						e20919f065
					
				@ -295,7 +295,7 @@ interface
 | 
				
			|||||||
        asd_reference,asd_no_dead_strip,asd_weak_reference,asd_lazy_reference,
 | 
					        asd_reference,asd_no_dead_strip,asd_weak_reference,asd_lazy_reference,
 | 
				
			||||||
        asd_weak_definition,
 | 
					        asd_weak_definition,
 | 
				
			||||||
        { for Jasmin }
 | 
					        { for Jasmin }
 | 
				
			||||||
        asd_jclass,asd_jinterface,asd_jsuper,asd_jfield,asd_jlimit
 | 
					        asd_jclass,asd_jinterface,asd_jsuper,asd_jfield,asd_jlimit,asd_jline
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const
 | 
					    const
 | 
				
			||||||
@ -307,7 +307,7 @@ interface
 | 
				
			|||||||
        'extern','nasm_import', 'tc', 'reference',
 | 
					        'extern','nasm_import', 'tc', 'reference',
 | 
				
			||||||
        'no_dead_strip','weak_reference','lazy_reference','weak_definition',
 | 
					        'no_dead_strip','weak_reference','lazy_reference','weak_definition',
 | 
				
			||||||
        { for Jasmin }
 | 
					        { for Jasmin }
 | 
				
			||||||
        'class','interface','super','field','limit'
 | 
					        'class','interface','super','field','limit','line'
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    type
 | 
					    type
 | 
				
			||||||
 | 
				
			|||||||
@ -164,9 +164,7 @@ implementation
 | 
				
			|||||||
        last_align := 2;
 | 
					        last_align := 2;
 | 
				
			||||||
        InlineLevel:=0;
 | 
					        InlineLevel:=0;
 | 
				
			||||||
        { lineinfo is only needed for al_procedures (PFV) }
 | 
					        { lineinfo is only needed for al_procedures (PFV) }
 | 
				
			||||||
        do_line:=(cs_asm_source in current_settings.globalswitches) or
 | 
					        do_line:=(cs_asm_source in current_settings.globalswitches);
 | 
				
			||||||
                 ((cs_lineinfo in current_settings.moduleswitches)
 | 
					 | 
				
			||||||
                   and (p=current_asmdata.asmlists[al_procedures]));
 | 
					 | 
				
			||||||
        hp:=tai(p.first);
 | 
					        hp:=tai(p.first);
 | 
				
			||||||
        while assigned(hp) do
 | 
					        while assigned(hp) do
 | 
				
			||||||
         begin
 | 
					         begin
 | 
				
			||||||
@ -193,6 +191,7 @@ implementation
 | 
				
			|||||||
                     { be sure to change line !! }
 | 
					                     { be sure to change line !! }
 | 
				
			||||||
                     lastfileinfo.line:=-1;
 | 
					                     lastfileinfo.line:=-1;
 | 
				
			||||||
                   end;
 | 
					                   end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                { write source }
 | 
					                { write source }
 | 
				
			||||||
                  if (cs_asm_source in current_settings.globalswitches) and
 | 
					                  if (cs_asm_source in current_settings.globalswitches) and
 | 
				
			||||||
                     assigned(infile) then
 | 
					                     assigned(infile) then
 | 
				
			||||||
 | 
				
			|||||||
@ -130,7 +130,57 @@ implementation
 | 
				
			|||||||
    end;
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  procedure TDebugInfoJasmin.insertlineinfo(list: TAsmList);
 | 
					  procedure TDebugInfoJasmin.insertlineinfo(list: TAsmList);
 | 
				
			||||||
 | 
					    var
 | 
				
			||||||
 | 
					      currfileinfo,
 | 
				
			||||||
 | 
					      lastfileinfo : tfileposinfo;
 | 
				
			||||||
 | 
					      nolineinfolevel : Integer;
 | 
				
			||||||
 | 
					      currfuncname : pshortstring;
 | 
				
			||||||
 | 
					      hp : tai;
 | 
				
			||||||
    begin
 | 
					    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;
 | 
					    end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user