diff --git a/compiler/llvm/dbgllvm.pas b/compiler/llvm/dbgllvm.pas index d3e07567e5..f610d1fdca 100644 --- a/compiler/llvm/dbgllvm.pas +++ b/compiler/llvm/dbgllvm.pas @@ -93,7 +93,7 @@ interface function def_meta_node(def: tdef): tai_llvmspecialisedmetadatanode; function def_meta_ref(def: tdef): tai_simpletypedconst; function file_getmetanode(moduleindex: tfileposmoduleindex; fileindex: tfileposfileindex): tai_llvmspecialisedmetadatanode; - function filepos_getmetanode(const filepos: tfileposinfo; const functionfileindex: tfileposfileindex; const functionscope: tai_llvmspecialisedmetadatanode; nolineinfo: boolean): tai_llvmspecialisedmetadatanode; + function filepos_getmetanode(const filepos: tfileposinfo; const functionfileinfo: tfileposinfo; const functionscope: tai_llvmspecialisedmetadatanode; nolineinfo: boolean): tai_llvmspecialisedmetadatanode; function get_def_metatai(def:tdef): PLLVMMetaDefHashSetItem; procedure appenddef_array_internal(list: TAsmList; fordef: tdef; eledef: tdef; lowrange, highrange: asizeint); @@ -548,7 +548,7 @@ implementation end; - function TDebugInfoLLVM.filepos_getmetanode(const filepos: tfileposinfo; const functionfileindex: tfileposfileindex; const functionscope: tai_llvmspecialisedmetadatanode; nolineinfo: boolean): tai_llvmspecialisedmetadatanode; + function TDebugInfoLLVM.filepos_getmetanode(const filepos: tfileposinfo; const functionfileinfo: tfileposinfo; const functionscope: tai_llvmspecialisedmetadatanode; nolineinfo: boolean): tai_llvmspecialisedmetadatanode; var item: PHashSetItem; filemeta, @@ -564,10 +564,15 @@ implementation end; begin - filemeta:=file_getmetanode(filepos.moduleindex,filepos.fileindex); + result:=nil; + if (filepos.fileindex<>0) then + filemeta:=file_getmetanode(filepos.moduleindex,filepos.fileindex) + else + filemeta:=file_getmetanode(functionfileinfo.moduleindex,functionfileinfo.fileindex); if not assigned(filemeta) then exit; - if filepos.fileindex<>functionfileindex then + if (filepos.fileindex<>0) and + (filepos.fileindex<>functionfileinfo.fileindex) then begin lexicalblockkey.scopemeta:=functionscope; lexicalblockkey.filemeta:=filemeta; @@ -588,10 +593,15 @@ implementation locationscopemeta:=functionscope; locationkey.scope:=locationscopemeta; if not nolineinfo then - locationkey.line:=filepos.line + begin + locationkey.line:=filepos.line; + locationkey.column:=filepos.column; + end else - locationkey.line:=0; - locationkey.column:=filepos.column; + begin + locationkey.line:=0; + locationkey.column:=0; + end; item:=flocationmeta.FindOrAdd(@locationkey,sizeof(locationkey)); if not assigned(item^.Data) then begin @@ -2470,13 +2480,18 @@ implementation ((nolineinfolevel=0) or (taillvm(hp).llvmopcode=la_call)) then begin + positionmeta:=nil; { valid file -> add info } if (tailineinfo(hp).fileinfo.fileindex<>0) then begin - positionmeta:=filepos_getmetanode(tailineinfo(hp).fileinfo,procdeffileindex,functionscope,nolineinfolevel<>0); - if assigned(positionmeta) then - taillvm(hp).addinsmetadata(tai_llvmmetadatareferenceoperand.createreferenceto('dbg',positionmeta)); + positionmeta:=filepos_getmetanode(tailineinfo(hp).fileinfo,procdeffileinfo,functionscope,nolineinfolevel<>0); + end + else if taillvm(hp).llvmopcode=la_call then + begin + positionmeta:=filepos_getmetanode(tailineinfo(hp).fileinfo,procdeffileinfo,functionscope,true); end; + if assigned(positionmeta) then + taillvm(hp).addinsmetadata(tai_llvmmetadatareferenceoperand.createreferenceto('dbg',positionmeta)); end; hp:=tai(hp.next); end;