mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 04:29:28 +02:00
FpDebug: Refactor TFpSymbolDwarfTypeSubRange bound info
git-svn-id: trunk@61751 -
This commit is contained in:
parent
fb065ad50b
commit
42ba3bfcc7
@ -672,19 +672,19 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
|
|||||||
// TODO not a modifier, maybe have a forwarder base class
|
// TODO not a modifier, maybe have a forwarder base class
|
||||||
private
|
private
|
||||||
FLowBoundConst: Int64;
|
FLowBoundConst: Int64;
|
||||||
FLowBoundValue: TFpSymbolDwarfData;
|
FLowBoundValue: TFpValue;
|
||||||
FLowBoundState: TFpDwarfSubRangeBoundReadState;
|
FLowBoundState: TFpDwarfSubRangeBoundReadState;
|
||||||
FHighBoundConst: Int64;
|
FHighBoundConst: Int64;
|
||||||
FHighBoundValue: TFpSymbolDwarfData;
|
FHighBoundValue: TFpValue;
|
||||||
FHighBoundState: TFpDwarfSubRangeBoundReadState;
|
FHighBoundState: TFpDwarfSubRangeBoundReadState;
|
||||||
FCountConst: Int64;
|
FCountConst: Int64;
|
||||||
FCountValue: TFpSymbolDwarfData;
|
FCountValue: TFpValue;
|
||||||
FCountState: TFpDwarfSubRangeBoundReadState;
|
FCountState: TFpDwarfSubRangeBoundReadState;
|
||||||
FLowEnumIdx, FHighEnumIdx: Integer;
|
FLowEnumIdx, FHighEnumIdx: Integer;
|
||||||
FEnumIdxValid: Boolean;
|
FEnumIdxValid: Boolean;
|
||||||
procedure InitEnumIdx;
|
procedure InitEnumIdx;
|
||||||
procedure ReadBound(AValueObj: TFpValueDwarf; AnAttrib: Cardinal;
|
procedure ReadBound(AValueObj: TFpValueDwarf; AnAttrib: Cardinal;
|
||||||
var ABoundConst: Int64; var ABoundValue: TFpSymbolDwarfData; var ABoundState: TFpDwarfSubRangeBoundReadState);
|
var ABoundConst: Int64; var ABoundValue: TFpValue; var ABoundState: TFpDwarfSubRangeBoundReadState);
|
||||||
protected
|
protected
|
||||||
function DoGetNestedTypeInfo: TFpSymbolDwarfType;override;
|
function DoGetNestedTypeInfo: TFpSymbolDwarfType;override;
|
||||||
function GetHasBounds: Boolean; override;
|
function GetHasBounds: Boolean; override;
|
||||||
@ -698,6 +698,7 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
|
|||||||
procedure Init; override;
|
procedure Init; override;
|
||||||
public
|
public
|
||||||
procedure ResetValueBounds; override;
|
procedure ResetValueBounds; override;
|
||||||
|
destructor Destroy; override;
|
||||||
|
|
||||||
function GetValueBounds(AValueObj: TFpValue; out ALowBound, AHighBound: Int64): Boolean; override;
|
function GetValueBounds(AValueObj: TFpValue; out ALowBound, AHighBound: Int64): Boolean; override;
|
||||||
function GetValueLowBound(AValueObj: TFpValue; out ALowBound: Int64): Boolean; override;
|
function GetValueLowBound(AValueObj: TFpValue; out ALowBound: Int64): Boolean; override;
|
||||||
@ -3589,8 +3590,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFpSymbolDwarfTypeSubRange.ReadBound(AValueObj: TFpValueDwarf;
|
procedure TFpSymbolDwarfTypeSubRange.ReadBound(AValueObj: TFpValueDwarf;
|
||||||
AnAttrib: Cardinal; var ABoundConst: Int64;
|
AnAttrib: Cardinal; var ABoundConst: Int64; var ABoundValue: TFpValue;
|
||||||
var ABoundValue: TFpSymbolDwarfData;
|
|
||||||
var ABoundState: TFpDwarfSubRangeBoundReadState);
|
var ABoundState: TFpDwarfSubRangeBoundReadState);
|
||||||
var
|
var
|
||||||
FwdInfoPtr: Pointer;
|
FwdInfoPtr: Pointer;
|
||||||
@ -3599,6 +3599,7 @@ var
|
|||||||
AnAddress: TFpDbgMemLocation;
|
AnAddress: TFpDbgMemLocation;
|
||||||
InitLocParserData: TInitLocParserData;
|
InitLocParserData: TInitLocParserData;
|
||||||
AttrData: TDwarfAttribData;
|
AttrData: TDwarfAttribData;
|
||||||
|
BoundSymbol: TFpSymbolDwarfData;
|
||||||
begin
|
begin
|
||||||
// TODO: assert(AValueObj <> nil, 'TFpSymbolDwarfTypeSubRange.ReadBound: AValueObj <> nil');
|
// TODO: assert(AValueObj <> nil, 'TFpSymbolDwarfTypeSubRange.ReadBound: AValueObj <> nil');
|
||||||
if ABoundState <> rfNotRead then exit;
|
if ABoundState <> rfNotRead then exit;
|
||||||
@ -3607,9 +3608,14 @@ begin
|
|||||||
// TODO: check the FORM, to determine what data to read.
|
// TODO: check the FORM, to determine what data to read.
|
||||||
if InformationEntry.ReadReference(AttrData, FwdInfoPtr, FwdCompUint) then begin
|
if InformationEntry.ReadReference(AttrData, FwdInfoPtr, FwdCompUint) then begin
|
||||||
NewInfo := TDwarfInformationEntry.Create(FwdCompUint, FwdInfoPtr);
|
NewInfo := TDwarfInformationEntry.Create(FwdCompUint, FwdInfoPtr);
|
||||||
ABoundValue := TFpSymbolDwarfData.CreateValueSubClass('', NewInfo);
|
BoundSymbol := TFpSymbolDwarfData.CreateValueSubClass('', NewInfo);
|
||||||
NewInfo.ReleaseReference;
|
NewInfo.ReleaseReference;
|
||||||
if (ABoundValue = nil) or (ABoundValue.Value =nil) or not (svfInteger in ABoundValue.Value.FieldFlags) then begin
|
ABoundValue := nil;
|
||||||
|
if BoundSymbol <> nil then begin
|
||||||
|
ABoundValue := BoundSymbol.Value;
|
||||||
|
ABoundValue.AddReference;
|
||||||
|
end;
|
||||||
|
if (ABoundValue = nil) or not (svfInteger in ABoundValue.FieldFlags) then begin
|
||||||
// Not implemented in DwarfSymbolClassMap.GetDwarfSymbolClass // or not a value type (bound can not be a type)
|
// Not implemented in DwarfSymbolClassMap.GetDwarfSymbolClass // or not a value type (bound can not be a type)
|
||||||
ABoundState := rfError;
|
ABoundState := rfError;
|
||||||
exit;
|
exit;
|
||||||
@ -3753,6 +3759,14 @@ begin
|
|||||||
FCountState := rfNotRead;
|
FCountState := rfNotRead;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
destructor TFpSymbolDwarfTypeSubRange.Destroy;
|
||||||
|
begin
|
||||||
|
FLowBoundValue.ReleaseReference;
|
||||||
|
FHighBoundValue.ReleaseReference;
|
||||||
|
FCountValue.ReleaseReference;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
function TFpSymbolDwarfTypeSubRange.GetValueBounds(AValueObj: TFpValue; out
|
function TFpSymbolDwarfTypeSubRange.GetValueBounds(AValueObj: TFpValue; out
|
||||||
ALowBound, AHighBound: Int64): Boolean;
|
ALowBound, AHighBound: Int64): Boolean;
|
||||||
begin
|
begin
|
||||||
@ -3767,12 +3781,11 @@ begin
|
|||||||
assert((AValueObj = nil) or (AValueObj is TFpValueDwarf), 'TFpSymbolDwarfTypeSubRange.GetValueLowBound: AValueObj is TFpValueDwarf(');
|
assert((AValueObj = nil) or (AValueObj is TFpValueDwarf), 'TFpSymbolDwarfTypeSubRange.GetValueLowBound: AValueObj is TFpValueDwarf(');
|
||||||
if FLowBoundState = rfNotRead then
|
if FLowBoundState = rfNotRead then
|
||||||
ReadBound(TFpValueDwarf(AValueObj), DW_AT_lower_bound, FLowBoundConst, FLowBoundValue, FLowBoundState);
|
ReadBound(TFpValueDwarf(AValueObj), DW_AT_lower_bound, FLowBoundConst, FLowBoundValue, FLowBoundState);
|
||||||
Result := FLowBoundState in [rfConst, rfValue];
|
Result := True;
|
||||||
if Result then begin
|
case FLowBoundState of
|
||||||
if FLowBoundState = rfConst then
|
rfConst: ALowBound := FLowBoundConst;
|
||||||
ALowBound := FLowBoundConst
|
rfValue: ALowBound := FLowBoundValue.AsInteger;
|
||||||
else
|
else Result := False;
|
||||||
ALowBound := FLowBoundValue.Value.AsInteger;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3782,25 +3795,25 @@ begin
|
|||||||
assert((AValueObj = nil) or (AValueObj is TFpValueDwarf), 'TFpSymbolDwarfTypeSubRange.GetValueHighBound: AValueObj is TFpValueDwarf(');
|
assert((AValueObj = nil) or (AValueObj is TFpValueDwarf), 'TFpSymbolDwarfTypeSubRange.GetValueHighBound: AValueObj is TFpValueDwarf(');
|
||||||
if FHighBoundState = rfNotRead then
|
if FHighBoundState = rfNotRead then
|
||||||
ReadBound(TFpValueDwarf(AValueObj), DW_AT_upper_bound, FHighBoundConst, FHighBoundValue, FHighBoundState);
|
ReadBound(TFpValueDwarf(AValueObj), DW_AT_upper_bound, FHighBoundConst, FHighBoundValue, FHighBoundState);
|
||||||
Result := FHighBoundState in [rfConst, rfValue];
|
|
||||||
if Result then begin
|
Result := True;
|
||||||
if FHighBoundState = rfConst then
|
case FHighBoundState of
|
||||||
AHighBound := FHighBoundConst
|
rfConst: AHighBound := FHighBoundConst;
|
||||||
else
|
rfValue: AHighBound := FHighBoundValue.AsInteger;
|
||||||
AHighBound := FHighBoundValue.Value.AsInteger;
|
rfNotFound: begin
|
||||||
end
|
Result := GetValueLowBound(AValueObj, AHighBound);
|
||||||
else
|
if not Result then
|
||||||
if FHighBoundState = rfNotFound then begin
|
exit;
|
||||||
|
if FCountState = rfNotRead then
|
||||||
ReadBound(TFpValueDwarf(AValueObj), DW_AT_count, FCountConst, FCountValue, FCountState);
|
ReadBound(TFpValueDwarf(AValueObj), DW_AT_count, FCountConst, FCountValue, FCountState);
|
||||||
Result := (FCountState in [rfConst, rfValue]) and
|
case FCountState of
|
||||||
GetValueLowBound(AValueObj, AHighBound);
|
rfConst: AHighBound := AHighBound + FCountConst;
|
||||||
if Result then begin
|
rfValue: AHighBound := AHighBound + FCountValue.AsInteger;
|
||||||
if FCountState = rfConst then
|
else Result := False;
|
||||||
AHighBound := AHighBound + FCountConst
|
|
||||||
else
|
|
||||||
AHighBound := AHighBound + FCountValue.Value.AsInteger;
|
|
||||||
end
|
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
else Result := False;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TFpSymbolDwarfTypeSubRange.Init;
|
procedure TFpSymbolDwarfTypeSubRange.Init;
|
||||||
|
Loading…
Reference in New Issue
Block a user