mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 10:19:36 +02:00
FpDebug: DW_FORM_strps lenght equals the adres size in Dwarf 1/2
git-svn-id: trunk@45774 -
This commit is contained in:
parent
fbb1391396
commit
f38e91869e
@ -785,7 +785,7 @@ begin
|
|||||||
then Result := Result or (Int64(-1) shl n);
|
then Result := Result or (Int64(-1) shl n);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function SkipEntryDataForForm(var AEntryData: Pointer; AForm: Cardinal; AddrSize: Byte; IsDwarf64: boolean): Boolean; inline;
|
function SkipEntryDataForForm(var AEntryData: Pointer; AForm: Cardinal; AddrSize: Byte; IsDwarf64: boolean; Version: word): Boolean; inline;
|
||||||
var
|
var
|
||||||
UValue: QWord;
|
UValue: QWord;
|
||||||
begin
|
begin
|
||||||
@ -820,20 +820,32 @@ begin
|
|||||||
while (PByte(AEntryData)^ and $80) <> 0 do Inc(AEntryData);
|
while (PByte(AEntryData)^ and $80) <> 0 do Inc(AEntryData);
|
||||||
Inc(AEntryData);
|
Inc(AEntryData);
|
||||||
end;
|
end;
|
||||||
DW_FORM_strp,
|
DW_FORM_strp: begin
|
||||||
DW_FORM_ref_addr : begin
|
|
||||||
if IsDwarf64 then
|
if IsDwarf64 then
|
||||||
Inc(AEntryData, 8)
|
Inc(AEntryData, 8)
|
||||||
else
|
else
|
||||||
Inc(AEntryData, 4);
|
Inc(AEntryData, 4);
|
||||||
end;
|
end;
|
||||||
|
DW_FORM_ref_addr : begin
|
||||||
|
// In Dwarf-version 3 and higher, the size of a DW_FORM_ref_addr depends
|
||||||
|
// on the Dwarf-format. In prior Dwarf-versions it is equal to the
|
||||||
|
// Addres-size.
|
||||||
|
if Version>2 then begin
|
||||||
|
if IsDwarf64 then
|
||||||
|
Inc(AEntryData, 8)
|
||||||
|
else
|
||||||
|
Inc(AEntryData, 4);
|
||||||
|
end else begin
|
||||||
|
Inc(AEntryData, AddrSize);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
DW_FORM_string : begin
|
DW_FORM_string : begin
|
||||||
while PByte(AEntryData)^ <> 0 do Inc(AEntryData);
|
while PByte(AEntryData)^ <> 0 do Inc(AEntryData);
|
||||||
Inc(AEntryData);
|
Inc(AEntryData);
|
||||||
end;
|
end;
|
||||||
DW_FORM_indirect : begin
|
DW_FORM_indirect : begin
|
||||||
while AForm = DW_FORM_indirect do AForm := ULEB128toOrdinal(AEntryData);
|
while AForm = DW_FORM_indirect do AForm := ULEB128toOrdinal(AEntryData);
|
||||||
Result := SkipEntryDataForForm(AEntryData, AForm, AddrSize, IsDwarf64);
|
Result := SkipEntryDataForForm(AEntryData, AForm, AddrSize, IsDwarf64, Version);
|
||||||
end;
|
end;
|
||||||
else begin
|
else begin
|
||||||
DebugLn(FPDBG_DWARF_WARNINGS, ['Error: Unknown Form: ', AForm]);
|
DebugLn(FPDBG_DWARF_WARNINGS, ['Error: Unknown Form: ', AForm]);
|
||||||
@ -2304,7 +2316,7 @@ begin
|
|||||||
for i := 0 to FAbbrev^.count - 1 do begin
|
for i := 0 to FAbbrev^.count - 1 do begin
|
||||||
if FAbbrevData[i].Attribute = AnAttrib then
|
if FAbbrevData[i].Attribute = AnAttrib then
|
||||||
exit(i);
|
exit(i);
|
||||||
SkipEntryDataForForm(AInfoPointer, FAbbrevData[i].Form, AddrSize, FCompUnit.IsDwarf64);
|
SkipEntryDataForForm(AInfoPointer, FAbbrevData[i].Form, AddrSize, FCompUnit.IsDwarf64, FCompUnit.Version);
|
||||||
end;
|
end;
|
||||||
Result := -1;
|
Result := -1;
|
||||||
end;
|
end;
|
||||||
@ -3781,7 +3793,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
AEntry := AList.List[i];
|
AEntry := AList.List[i];
|
||||||
if not SkipEntryDataForForm(AEntry, ADefs[AbrIdx].Form, FAddressSize, IsDwarf64) then
|
if not SkipEntryDataForForm(AEntry, ADefs[AbrIdx].Form, FAddressSize, IsDwarf64, Version) then
|
||||||
break;
|
break;
|
||||||
AList.List[i+1] := AEntry;
|
AList.List[i+1] := AEntry;
|
||||||
inc(i);
|
inc(i);
|
||||||
@ -3820,7 +3832,7 @@ begin
|
|||||||
Exit;
|
Exit;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
if not SkipEntryDataForForm(AEntry, ADefs[n].Form, FAddressSize, IsDwarf64) then
|
if not SkipEntryDataForForm(AEntry, ADefs[n].Form, FAddressSize, IsDwarf64, Version) then
|
||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -3847,7 +3859,7 @@ function TDwarfCompilationUnit.LocateEntry(ATag: Cardinal; out
|
|||||||
AddrSize := FAddressSize;
|
AddrSize := FAddressSize;
|
||||||
for idx := 0 to ADef^.Count - 1 do
|
for idx := 0 to ADef^.Count - 1 do
|
||||||
begin
|
begin
|
||||||
if not SkipEntryDataForForm(p, ADefs^.Form, AddrSize, IsDwarf64) then
|
if not SkipEntryDataForForm(p, ADefs^.Form, AddrSize, IsDwarf64, Version) then
|
||||||
exit(False);
|
exit(False);
|
||||||
inc(ADefs);
|
inc(ADefs);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user