mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-22 07:22:20 +02:00
FpDebug: Don't read debug info with unknown DW_FORM
This commit is contained in:
parent
c9cb29b47a
commit
532aae6212
@ -223,6 +223,8 @@ const
|
|||||||
DW_FORM_ref_udata = $15; // reference
|
DW_FORM_ref_udata = $15; // reference
|
||||||
DW_FORM_indirect = $16; //
|
DW_FORM_indirect = $16; //
|
||||||
|
|
||||||
|
DW_FORM_MAX = $16; //
|
||||||
|
|
||||||
|
|
||||||
{ DWARF operation encodings }
|
{ DWARF operation encodings }
|
||||||
|
|
||||||
|
@ -215,6 +215,7 @@ type
|
|||||||
FMap: TMap; // Abbrevs
|
FMap: TMap; // Abbrevs
|
||||||
{$Endif}
|
{$Endif}
|
||||||
FDefinitions: array of TDwarfAbbrevEntry;
|
FDefinitions: array of TDwarfAbbrevEntry;
|
||||||
|
FValid: Boolean;
|
||||||
function GetEntryPointer(AIndex: Integer): PDwarfAbbrevEntry; inline;
|
function GetEntryPointer(AIndex: Integer): PDwarfAbbrevEntry; inline;
|
||||||
procedure LoadAbbrevs(AnAbbrevDataPtr: Pointer);
|
procedure LoadAbbrevs(AnAbbrevDataPtr: Pointer);
|
||||||
public
|
public
|
||||||
@ -224,6 +225,7 @@ type
|
|||||||
function FindLe128bFromPointer(AnAbbrevPtr: Pointer; out AData: TDwarfAbbrev{Pointer}): Pointer; reintroduce;
|
function FindLe128bFromPointer(AnAbbrevPtr: Pointer; out AData: TDwarfAbbrev{Pointer}): Pointer; reintroduce;
|
||||||
{$Endif}
|
{$Endif}
|
||||||
property EntryPointer[AIndex: Integer]: PDwarfAbbrevEntry read GetEntryPointer;
|
property EntryPointer[AIndex: Integer]: PDwarfAbbrevEntry read GetEntryPointer;
|
||||||
|
property Valid: Boolean read FValid;
|
||||||
end;
|
end;
|
||||||
{%endregion Abbreviation Data / Section "debug_abbrev"}
|
{%endregion Abbreviation Data / Section "debug_abbrev"}
|
||||||
|
|
||||||
@ -1560,6 +1562,7 @@ var
|
|||||||
DbgVerbose: Boolean;
|
DbgVerbose: Boolean;
|
||||||
f: TDwarfAbbrevFlags;
|
f: TDwarfAbbrevFlags;
|
||||||
begin
|
begin
|
||||||
|
FValid := False;
|
||||||
abbrev := 0;
|
abbrev := 0;
|
||||||
CurAbbrevIndex := 0;
|
CurAbbrevIndex := 0;
|
||||||
DbgVerbose := (FPDBG_DWARF_VERBOSE_LOAD <> nil) and (FPDBG_DWARF_VERBOSE_LOAD^.Enabled);
|
DbgVerbose := (FPDBG_DWARF_VERBOSE_LOAD <> nil) and (FPDBG_DWARF_VERBOSE_LOAD^.Enabled);
|
||||||
@ -1616,6 +1619,10 @@ begin
|
|||||||
Include(f, dafHasAbstractOrigin);
|
Include(f, dafHasAbstractOrigin);
|
||||||
|
|
||||||
form := ULEB128toOrdinal(pbyte(AnAbbrevDataPtr));
|
form := ULEB128toOrdinal(pbyte(AnAbbrevDataPtr));
|
||||||
|
if form > DW_FORM_MAX then begin
|
||||||
|
DebugLn(FPDBG_DWARF_WARNINGS, ['Unknown FW_FORM: ', form, ' found. Aborting']);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
MakeRoom(CurAbbrevIndex + 1);
|
MakeRoom(CurAbbrevIndex + 1);
|
||||||
FDefinitions[CurAbbrevIndex].Attribute := attrib;
|
FDefinitions[CurAbbrevIndex].Attribute := attrib;
|
||||||
@ -1636,6 +1643,7 @@ begin
|
|||||||
|
|
||||||
Inc(pword(AnAbbrevDataPtr));
|
Inc(pword(AnAbbrevDataPtr));
|
||||||
end;
|
end;
|
||||||
|
FValid := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TDwarfAbbrevList.Create(AnAbbrData, AnAbbrDataEnd: Pointer; AnAbbrevOffset,
|
constructor TDwarfAbbrevList.Create(AnAbbrData, AnAbbrDataEnd: Pointer; AnAbbrevOffset,
|
||||||
@ -4245,7 +4253,8 @@ begin
|
|||||||
Result := FCompilationUnits.Count;
|
Result := FCompilationUnits.Count;
|
||||||
|
|
||||||
for i := 0 to Result - 1 do
|
for i := 0 to Result - 1 do
|
||||||
TDwarfCompilationUnit(FCompilationUnits[i]).FComputeNameHashesWorker.MarkReadyToRun;
|
if TDwarfCompilationUnit(FCompilationUnits[i]).FComputeNameHashesWorker <> nil then
|
||||||
|
TDwarfCompilationUnit(FCompilationUnits[i]).FComputeNameHashesWorker.MarkReadyToRun;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TFpDwarfInfo.CompilationUnitForAddr(AnAddr: TDBGPtr
|
function TFpDwarfInfo.CompilationUnitForAddr(AnAddr: TDBGPtr
|
||||||
@ -5060,6 +5069,11 @@ begin
|
|||||||
|
|
||||||
FFirstScope.Init(nil); // invalid
|
FFirstScope.Init(nil); // invalid
|
||||||
|
|
||||||
|
if not FAbbrevList.Valid then begin
|
||||||
|
FDwarfSymbolClassMap := DwarfSymbolClassMapList.FDefaultMap.Create(Self, nil);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
FComputeNameHashesWorker := TFpThreadWorkerComputeNameHashes.Create(Self);
|
FComputeNameHashesWorker := TFpThreadWorkerComputeNameHashes.Create(Self);
|
||||||
FComputeNameHashesWorker.AddRef;
|
FComputeNameHashesWorker.AddRef;
|
||||||
FScanAllWorker := TFpThreadWorkerScanAll.Create(Self, FComputeNameHashesWorker);
|
FScanAllWorker := TFpThreadWorkerScanAll.Create(Self, FComputeNameHashesWorker);
|
||||||
@ -5068,6 +5082,7 @@ begin
|
|||||||
Scope := FScanAllWorker.FindCompileUnit(FScopeList);
|
Scope := FScanAllWorker.FindCompileUnit(FScopeList);
|
||||||
if not Scope.IsValid then begin
|
if not Scope.IsValid then begin
|
||||||
DebugLn(FPDBG_DWARF_WARNINGS, ['WARNING compilation unit has no compile_unit tag']);
|
DebugLn(FPDBG_DWARF_WARNINGS, ['WARNING compilation unit has no compile_unit tag']);
|
||||||
|
FDwarfSymbolClassMap := DwarfSymbolClassMapList.FDefaultMap.Create(Self, nil);
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
FValid := True;
|
FValid := True;
|
||||||
@ -5131,6 +5146,8 @@ destructor TDwarfCompilationUnit.Destroy;
|
|||||||
var
|
var
|
||||||
n: Integer;
|
n: Integer;
|
||||||
begin
|
begin
|
||||||
|
if FLineNumberMap = nil then
|
||||||
|
exit;
|
||||||
for n := 0 to FLineNumberMap.Count - 1 do
|
for n := 0 to FLineNumberMap.Count - 1 do
|
||||||
Dispose(PDWarfLineMap(FLineNumberMap.Objects[n]));
|
Dispose(PDWarfLineMap(FLineNumberMap.Objects[n]));
|
||||||
FreeAndNil(FLineNumberMap);
|
FreeAndNil(FLineNumberMap);
|
||||||
|
Loading…
Reference in New Issue
Block a user