Browse Source

LLVM lineinfo: fix nolineinfo generation

LLVM requires line info metadata for all call instructions that may potentially
be inlined. So attach one to all call instructions in nolineinfo regions, but
set their line number to 0 (same as what clang does)
Jonas Maebe 3 years ago
parent
commit
f832444eaa
1 changed files with 20 additions and 11 deletions
  1. 20 11
      compiler/llvm/dbgllvm.pas

+ 20 - 11
compiler/llvm/dbgllvm.pas

@@ -93,7 +93,7 @@ interface
         function def_meta_node(def: tdef): tai_llvmspecialisedmetadatanode;
         function def_meta_node(def: tdef): tai_llvmspecialisedmetadatanode;
         function def_meta_ref(def: tdef): tai_simpletypedconst;
         function def_meta_ref(def: tdef): tai_simpletypedconst;
         function file_getmetanode(moduleindex: tfileposmoduleindex; fileindex: tfileposfileindex): tai_llvmspecialisedmetadatanode;
         function file_getmetanode(moduleindex: tfileposmoduleindex; fileindex: tfileposfileindex): tai_llvmspecialisedmetadatanode;
-        function filepos_getmetanode(const filepos: tfileposinfo; const functionfileindex: tfileposfileindex; const functionscope: tai_llvmspecialisedmetadatanode): tai_llvmspecialisedmetadatanode;
+        function filepos_getmetanode(const filepos: tfileposinfo; const functionfileindex: tfileposfileindex; const functionscope: tai_llvmspecialisedmetadatanode; nolineinfo: boolean): tai_llvmspecialisedmetadatanode;
         function get_def_metatai(def:tdef): PLLVMMetaDefHashSetItem;
         function get_def_metatai(def:tdef): PLLVMMetaDefHashSetItem;
 
 
         procedure appenddef_array_internal(list: TAsmList; fordef: tdef; eledef: tdef; lowrange, highrange: asizeint);
         procedure appenddef_array_internal(list: TAsmList; fordef: tdef; eledef: tdef; lowrange, highrange: asizeint);
@@ -201,7 +201,7 @@ implementation
       cpubase,cpuinfo,paramgr,
       cpubase,cpuinfo,paramgr,
       fmodule,
       fmodule,
       defutil,symtable,symcpu,ppu,
       defutil,symtable,symcpu,ppu,
-      llvminfo,aasmllvm
+      llvminfo,llvmbase,aasmllvm
       ;
       ;
 
 
 {
 {
@@ -533,7 +533,7 @@ implementation
       end;
       end;
 
 
 
 
-    function TDebugInfoLLVM.filepos_getmetanode(const filepos: tfileposinfo; const functionfileindex: tfileposfileindex; const functionscope: tai_llvmspecialisedmetadatanode): tai_llvmspecialisedmetadatanode;
+    function TDebugInfoLLVM.filepos_getmetanode(const filepos: tfileposinfo; const functionfileindex: tfileposfileindex; const functionscope: tai_llvmspecialisedmetadatanode; nolineinfo: boolean): tai_llvmspecialisedmetadatanode;
       var
       var
         item: PHashSetItem;
         item: PHashSetItem;
         filemeta,
         filemeta,
@@ -572,14 +572,22 @@ implementation
         else
         else
           locationscopemeta:=functionscope;
           locationscopemeta:=functionscope;
         locationkey.scope:=locationscopemeta;
         locationkey.scope:=locationscopemeta;
-        locationkey.line:=filepos.line;
+        if not nolineinfo then
+          locationkey.line:=filepos.line
+        else
+          locationkey.line:=0;
         locationkey.column:=filepos.column;
         locationkey.column:=filepos.column;
         item:=flocationmeta.FindOrAdd(@locationkey,sizeof(locationkey));
         item:=flocationmeta.FindOrAdd(@locationkey,sizeof(locationkey));
         if not assigned(item^.Data) then
         if not assigned(item^.Data) then
           begin
           begin
             result:=tai_llvmspecialisedmetadatanode.create(tspecialisedmetadatanodekind.DILocation);
             result:=tai_llvmspecialisedmetadatanode.create(tspecialisedmetadatanodekind.DILocation);
-            result.addqword('line',filepos.line);
-            result.addqword('column',filepos.column);
+            if not nolineinfo then
+              begin
+                result.addqword('line',filepos.line);
+                result.addqword('column',filepos.column);
+              end
+            else
+              result.addqword('line',0);
             result.addmetadatarefto('scope',locationscopemeta);
             result.addmetadatarefto('scope',locationscopemeta);
             current_asmdata.AsmLists[al_dwarf_line].concat(result);
             current_asmdata.AsmLists[al_dwarf_line].concat(result);
             item^.Data:=result;
             item^.Data:=result;
@@ -781,8 +789,8 @@ implementation
         power: longint;
         power: longint;
         flags: TLLVMDIFlags;
         flags: TLLVMDIFlags;
       begin
       begin
-        if is_dynamic_array(def) and
-           not(llvmflag_array_datalocation in llvmversion_properties[current_settings.llvmversion]) then
+        if is_dynamic_array(def) { and
+           not(llvmflag_array_datalocation in llvmversion_properties[current_settings.llvmversion]) } then
           begin
           begin
             dinode:=def_set_meta_impl(def,tai_llvmspecialisedmetadatanode.create(tspecialisedmetadatanodekind.DIDerivedType));
             dinode:=def_set_meta_impl(def,tai_llvmspecialisedmetadatanode.create(tspecialisedmetadatanodekind.DIDerivedType));
             dinode.addqword('tag',ord(DW_TAG_pointer_type));
             dinode.addqword('tag',ord(DW_TAG_pointer_type));
@@ -2444,12 +2452,13 @@ implementation
             end;
             end;
 
 
             if (hp.typ=ait_llvmins) and
             if (hp.typ=ait_llvmins) and
-               (nolineinfolevel=0) then
+               ((nolineinfolevel=0) or
+                (taillvm(hp).llvmopcode=la_call)) then
               begin
               begin
-                { file changed ? (must be before line info) }
+                { valid file -> add info }
                 if (tailineinfo(hp).fileinfo.fileindex<>0) then
                 if (tailineinfo(hp).fileinfo.fileindex<>0) then
                   begin
                   begin
-                    positionmeta:=filepos_getmetanode(tailineinfo(hp).fileinfo,procdeffileindex,functionscope);
+                    positionmeta:=filepos_getmetanode(tailineinfo(hp).fileinfo,procdeffileindex,functionscope,nolineinfolevel<>0);
                     if assigned(positionmeta) then
                     if assigned(positionmeta) then
                       taillvm(hp).addinsmetadata(tai_llvmmetadatareferenceoperand.createreferenceto('dbg',positionmeta));
                       taillvm(hp).addinsmetadata(tai_llvmmetadatareferenceoperand.createreferenceto('dbg',positionmeta));
                   end;
                   end;