mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 06:31:34 +01:00 
			
		
		
		
	* fixed resetting defs after generating the llvm "type" instructions: the
dbg_state is not sufficient to determine whether or not a def has
    already been processed or not -> use stab_number (and reset it)
   o also record all defs we don't emit "type" instruction for, but which
     we still process to find other defs, so we reset those too
git-svn-id: trunk@32520 -
			
			
This commit is contained in:
		
							parent
							
								
									ba92fdafcc
								
							
						
					
					
						commit
						ef3bafd67c
					
				| @ -143,10 +143,14 @@ implementation | |||||||
|     function TLLVMTypeInfo.record_def(def:tdef): tdef; |     function TLLVMTypeInfo.record_def(def:tdef): tdef; | ||||||
|       begin |       begin | ||||||
|         result:=def; |         result:=def; | ||||||
|         if def.dbg_state<>dbg_state_unused then |         if def.stab_number<>0 then | ||||||
|           exit; |           exit; | ||||||
|         def.dbg_state:=dbg_state_used; |         def.stab_number:=1; | ||||||
|         deftowritelist.Add(def); |         if def.dbg_state=dbg_state_unused then | ||||||
|  |           begin | ||||||
|  |             def.dbg_state:=dbg_state_used; | ||||||
|  |             deftowritelist.Add(def); | ||||||
|  |           end; | ||||||
|         defnumberlist.Add(def); |         defnumberlist.Add(def); | ||||||
|       end; |       end; | ||||||
| 
 | 
 | ||||||
| @ -472,6 +476,7 @@ implementation | |||||||
| 
 | 
 | ||||||
|     procedure TLLVMTypeInfo.appenddef_array(list:TAsmList;def:tarraydef); |     procedure TLLVMTypeInfo.appenddef_array(list:TAsmList;def:tarraydef); | ||||||
|       begin |       begin | ||||||
|  |         record_def(def); | ||||||
|         appenddef(list,def.elementdef); |         appenddef(list,def.elementdef); | ||||||
|       end; |       end; | ||||||
| 
 | 
 | ||||||
| @ -481,6 +486,7 @@ implementation | |||||||
|         symdeflist: tfpobjectlist; |         symdeflist: tfpobjectlist; | ||||||
|         i: longint; |         i: longint; | ||||||
|       begin |       begin | ||||||
|  |         record_def(def); | ||||||
|         symdeflist:=tabstractrecordsymtable(def.symtable).llvmst.symdeflist; |         symdeflist:=tabstractrecordsymtable(def.symtable).llvmst.symdeflist; | ||||||
|         for i:=0 to symdeflist.Count-1 do |         for i:=0 to symdeflist.Count-1 do | ||||||
|           record_def(tllvmshadowsymtableentry(symdeflist[i]).def); |           record_def(tllvmshadowsymtableentry(symdeflist[i]).def); | ||||||
| @ -497,6 +503,7 @@ implementation | |||||||
| 
 | 
 | ||||||
|     procedure TLLVMTypeInfo.appenddef_pointer(list:TAsmList;def:tpointerdef); |     procedure TLLVMTypeInfo.appenddef_pointer(list:TAsmList;def:tpointerdef); | ||||||
|       begin |       begin | ||||||
|  |         record_def(def); | ||||||
|         appenddef(list,def.pointeddef); |         appenddef(list,def.pointeddef); | ||||||
|       end; |       end; | ||||||
| 
 | 
 | ||||||
| @ -505,6 +512,7 @@ implementation | |||||||
|       var |       var | ||||||
|         i: longint; |         i: longint; | ||||||
|       begin |       begin | ||||||
|  |         record_def(def); | ||||||
|         { todo: handle mantis #25551; there is no way to create a symbolic |         { todo: handle mantis #25551; there is no way to create a symbolic | ||||||
|           la_type for a procvardef (unless it's a procedure of object/record), |           la_type for a procvardef (unless it's a procedure of object/record), | ||||||
|           which means that recursive references should become plain "procedure" |           which means that recursive references should become plain "procedure" | ||||||
| @ -659,11 +667,9 @@ implementation | |||||||
|         { reset all def labels } |         { reset all def labels } | ||||||
|         for i:=0 to defnumberlist.count-1 do |         for i:=0 to defnumberlist.count-1 do | ||||||
|           begin |           begin | ||||||
|             def := tdef(defnumberlist[i]); |             def:=tdef(defnumberlist[i]); | ||||||
|             if assigned(def) then |             def.dbg_state:=dbg_state_unused; | ||||||
|               begin |             def.stab_number:=0; | ||||||
|                 def.dbg_state:=dbg_state_unused; |  | ||||||
|               end; |  | ||||||
|           end; |           end; | ||||||
| 
 | 
 | ||||||
|         defnumberlist.free; |         defnumberlist.free; | ||||||
| @ -678,7 +684,10 @@ implementation | |||||||
|     procedure TLLVMTypeInfo.appenddef_object(list:TAsmList;def: tobjectdef); |     procedure TLLVMTypeInfo.appenddef_object(list:TAsmList;def: tobjectdef); | ||||||
|       begin |       begin | ||||||
|         if is_any_interface_kind(def) then |         if is_any_interface_kind(def) then | ||||||
|           record_def(def.vmt_def) |           begin | ||||||
|  |             record_def(def); | ||||||
|  |             record_def(def.vmt_def); | ||||||
|  |           end | ||||||
|         else |         else | ||||||
|           appenddef_abstractrecord(list,def); |           appenddef_abstractrecord(list,def); | ||||||
|       end; |       end; | ||||||
| @ -686,18 +695,21 @@ implementation | |||||||
| 
 | 
 | ||||||
|     procedure TLLVMTypeInfo.appenddef_classref(list: TAsmList; def: tclassrefdef); |     procedure TLLVMTypeInfo.appenddef_classref(list: TAsmList; def: tclassrefdef); | ||||||
|       begin |       begin | ||||||
|  |         record_def(def); | ||||||
|         record_def(tobjectdef(tclassrefdef(def).pointeddef).vmt_def); |         record_def(tobjectdef(tclassrefdef(def).pointeddef).vmt_def); | ||||||
|       end; |       end; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     procedure TLLVMTypeInfo.appenddef_variant(list:TAsmList;def: tvariantdef); |     procedure TLLVMTypeInfo.appenddef_variant(list:TAsmList;def: tvariantdef); | ||||||
|       begin |       begin | ||||||
|  |         record_def(def); | ||||||
|         appenddef(list,tabstractrecorddef(search_system_type('TVARDATA').typedef)); |         appenddef(list,tabstractrecorddef(search_system_type('TVARDATA').typedef)); | ||||||
|       end; |       end; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     procedure TLLVMTypeInfo.appenddef_file(list:TAsmList;def:tfiledef); |     procedure TLLVMTypeInfo.appenddef_file(list:TAsmList;def:tfiledef); | ||||||
|       begin |       begin | ||||||
|  |         record_def(def); | ||||||
|         case tfiledef(def).filetyp of |         case tfiledef(def).filetyp of | ||||||
|           ft_text    : |           ft_text    : | ||||||
|             appenddef(list,tabstractrecorddef(search_system_type('TEXTREC').typedef)); |             appenddef(list,tabstractrecorddef(search_system_type('TEXTREC').typedef)); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Jonas Maebe
						Jonas Maebe