mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 03:19:17 +02:00
Updated MemModel structure.
This commit is contained in:
parent
2369bbb1dd
commit
3ecbb52069
@ -30,9 +30,37 @@ const
|
||||
nSREG = 'SReg';
|
||||
|
||||
type
|
||||
|
||||
{ TFpDbgAvrMemModel }
|
||||
|
||||
TFpDbgAvrMemModel = class(TFpDbgMemModel)
|
||||
const
|
||||
AvrProgramMemoryOffset = 0;
|
||||
AvrDataMemoryOffset = $800000;
|
||||
AvrEepromMemoryOffset = $810000;
|
||||
AvrDataMemoryClass = 0;
|
||||
AvrProgramMemoryClass = 1;
|
||||
AvrEepromMemoryClass = 2;
|
||||
public
|
||||
function UpdateLocationToCodeAddress(const ALocation: TFpDbgMemLocation): TFpDbgMemLocation; override;
|
||||
function LocationToAddress(const ALocation: TFpDbgMemLocation): TDBGPtr; override;
|
||||
function AddressToTargetLocation(const AAddress: TDBGPtr): TFpDbgMemLocation; override;
|
||||
end;
|
||||
|
||||
{ TAvrMemManager }
|
||||
|
||||
TAvrMemManager = class(TFpDbgMemManager)
|
||||
function ReadMemory(AReadDataType: TFpDbgMemReadDataType;
|
||||
const ASourceLocation: TFpDbgMemLocation; const ASourceSize: TFpDbgValueSize;
|
||||
const ADest: Pointer; const ADestSize: QWord; AContext: TFpDbgLocationContext;
|
||||
const AFlags: TFpDbgMemManagerFlags = []
|
||||
): Boolean; override;
|
||||
function WriteMemory(AReadDataType: TFpDbgMemReadDataType;
|
||||
const ADestLocation: TFpDbgMemLocation; const ADestSize: TFpDbgValueSize;
|
||||
const ASource: Pointer; const ASourceSize: QWord; AContext: TFpDbgLocationContext;
|
||||
const AFlags: TFpDbgMemManagerFlags = []
|
||||
): Boolean; override;
|
||||
|
||||
function ReadRegisterAsAddress(ARegNum: Cardinal; out AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean; override;
|
||||
end;
|
||||
|
||||
@ -76,7 +104,8 @@ type
|
||||
public
|
||||
class function isSupported(target: TTargetDescriptor): boolean; override;
|
||||
constructor Create(const AFileName: string; AnOsClasses: TOSDbgClasses;
|
||||
AMemManager: TFpDbgMemManager; AProcessConfig: TDbgProcessConfig); override;
|
||||
AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel;
|
||||
AProcessConfig: TDbgProcessConfig = nil); override;
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
|
||||
@ -88,8 +117,100 @@ uses
|
||||
var
|
||||
DBG_VERBOSE, DBG_WARNINGS: PLazLoggerLogGroup;
|
||||
|
||||
{ TFpDbgAvrMemModel }
|
||||
|
||||
function TFpDbgAvrMemModel.UpdateLocationToCodeAddress(const
|
||||
ALocation: TFpDbgMemLocation): TFpDbgMemLocation;
|
||||
begin
|
||||
Result := ALocation;
|
||||
Result.AddressClass := AvrProgramMemoryClass;
|
||||
Result.Address := word(ALocation.Address) shl 1;
|
||||
end;
|
||||
|
||||
function TFpDbgAvrMemModel.LocationToAddress(const
|
||||
ALocation: TFpDbgMemLocation): TDBGPtr;
|
||||
begin
|
||||
Result := inherited LocationToAddress(ALocation);
|
||||
// Ensure address is a 16 bit value
|
||||
Result := word(Result);
|
||||
if ALocation.MType = mlfTargetMem then
|
||||
// Mask address according to address class
|
||||
case ALocation.AddressClass of
|
||||
// Data memory
|
||||
0: Result := Result or $800000;
|
||||
// Program memory
|
||||
1: ;
|
||||
// EEPROM
|
||||
2: Result := Result or $810000;
|
||||
else
|
||||
;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TFpDbgAvrMemModel.AddressToTargetLocation(const
|
||||
AAddress: TDBGPtr): TFpDbgMemLocation;
|
||||
begin
|
||||
// Address class will default to 0, or data space
|
||||
Result := inherited AddressToTargetLocation(AAddress);
|
||||
|
||||
case (Result.Address and $FF0000) of
|
||||
// Data memory
|
||||
AvrProgramMemoryOffset: Result.AddressClass := AvrProgramMemoryClass;
|
||||
// Program memory
|
||||
AvrDataMemoryOffset: Result.AddressClass := AvrDataMemoryClass;
|
||||
// EEPROM
|
||||
AvrEepromMemoryOffset: Result.AddressClass := AvrEepromMemoryClass;
|
||||
else
|
||||
// Probably a read that overran pointer limits, mark as data memory
|
||||
Result.AddressClass := AvrDataMemoryClass;
|
||||
end;
|
||||
// Truncate address to 16 bits
|
||||
Result.Address := word(Result.Address);
|
||||
end;
|
||||
|
||||
{ TAvrMemManager }
|
||||
|
||||
function TAvrMemManager.ReadMemory(AReadDataType: TFpDbgMemReadDataType; const
|
||||
ASourceLocation: TFpDbgMemLocation; const ASourceSize: TFpDbgValueSize; const
|
||||
ADest: Pointer; const ADestSize: QWord; AContext: TFpDbgLocationContext;
|
||||
const AFlags: TFpDbgMemManagerFlags): Boolean;
|
||||
var
|
||||
loc: TFpDbgMemLocation;
|
||||
tmp: QWord;
|
||||
begin
|
||||
loc := ASourceLocation;
|
||||
// Update address to include possible address class modifications
|
||||
if ASourceLocation.MType = mlfTargetMem then
|
||||
loc.Address := MemModel.LocationToAddress(ASourceLocation);
|
||||
Result := inherited ReadMemory(AReadDataType, loc, ASourceSize,
|
||||
ADest, ADestSize, AContext, AFlags);
|
||||
|
||||
{ Assume an address is located in data memory.
|
||||
This can be updated when more information is known, e.g.
|
||||
in TFpSymbolDwarfTypeSubroutine.GetDataAddress }
|
||||
if (AReadDataType = rdtAddress) then
|
||||
begin
|
||||
tmp := PQWord(ADest)^;
|
||||
tmp := (tmp and $FFFF) or $800000;
|
||||
PQWord(ADest)^ := tmp;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TAvrMemManager.WriteMemory(AReadDataType: TFpDbgMemReadDataType; const
|
||||
ADestLocation: TFpDbgMemLocation; const ADestSize: TFpDbgValueSize; const
|
||||
ASource: Pointer; const ASourceSize: QWord; AContext: TFpDbgLocationContext;
|
||||
const AFlags: TFpDbgMemManagerFlags): Boolean;
|
||||
var
|
||||
loc: TFpDbgMemLocation;
|
||||
begin
|
||||
loc := ADestLocation;
|
||||
// Update address to include possible address class modifications
|
||||
if ADestLocation.MType = mlfTargetMem then
|
||||
loc.Address := MemModel.LocationToAddress(ADestLocation);
|
||||
Result := inherited WriteMemory(AReadDataType, loc, ADestSize,
|
||||
ASource, ASourceSize, AContext, AFlags);
|
||||
end;
|
||||
|
||||
function TAvrMemManager.ReadRegisterAsAddress(ARegNum: Cardinal; out
|
||||
AValue: TDbgPtr; AContext: TFpDbgLocationContext): Boolean;
|
||||
const
|
||||
@ -312,11 +433,12 @@ begin
|
||||
result := nil;
|
||||
end;
|
||||
|
||||
constructor TDbgAvrProcess.Create(const AFileName: string; AnOsClasses: TOSDbgClasses;
|
||||
AMemManager: TFpDbgMemManager; AProcessConfig: TDbgProcessConfig);
|
||||
constructor TDbgAvrProcess.Create(const AFileName: string;
|
||||
AnOsClasses: TOSDbgClasses; AMemManager: TFpDbgMemManager;
|
||||
AMemModel: TFpDbgMemModel; AProcessConfig: TDbgProcessConfig);
|
||||
begin
|
||||
FRegArrayLength := FNumRegisters;
|
||||
inherited Create(AFileName, AnOsClasses, AMemManager, AProcessConfig);
|
||||
inherited Create(AFileName, AnOsClasses, AMemManager, AMemModel, AProcessConfig);
|
||||
end;
|
||||
|
||||
destructor TDbgAvrProcess.Destroy;
|
||||
|
@ -604,6 +604,7 @@ type
|
||||
TDbgInstance = class(TObject)
|
||||
private
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
FMode: TFPDMode;
|
||||
FFileName: String;
|
||||
FProcess: TDbgProcess;
|
||||
@ -646,6 +647,7 @@ type
|
||||
property Mode: TFPDMode read FMode;
|
||||
property PointerSize: Integer read GetPointerSize;
|
||||
property MemManager: TFpDbgMemManager read FMemManager;
|
||||
property MemModel: TFpDbgMemModel read FMemModel;
|
||||
property LoaderList: TDbgImageLoaderList read FLoaderList;
|
||||
end;
|
||||
|
||||
@ -780,7 +782,8 @@ type
|
||||
public
|
||||
class function isSupported(ATargetInfo: TTargetDescriptor): boolean; virtual;
|
||||
constructor Create(const AFileName: string; AnOsClasses: TOSDbgClasses;
|
||||
AMemManager: TFpDbgMemManager; AProcessConfig: TDbgProcessConfig = nil); virtual;
|
||||
AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel;
|
||||
AProcessConfig: TDbgProcessConfig = nil); virtual;
|
||||
destructor Destroy; override;
|
||||
|
||||
function StartInstance(AParams, AnEnvironment: TStrings; AWorkingDirectory, AConsoleTty: string;
|
||||
@ -1951,6 +1954,7 @@ constructor TDbgInstance.Create(const AProcess: TDbgProcess);
|
||||
begin
|
||||
FProcess := AProcess;
|
||||
FMemManager := AProcess.MemManager;
|
||||
FMemModel := AProcess.MemModel;
|
||||
FLoaderList := TDbgImageLoaderList.Create(True);
|
||||
|
||||
inherited Create;
|
||||
@ -2020,12 +2024,12 @@ begin
|
||||
FMode:=dm64
|
||||
else
|
||||
FMode:=dm32;
|
||||
FDbgInfo := TFpDwarfInfo.Create(FLoaderList, MemManager);
|
||||
FDbgInfo := TFpDwarfInfo.Create(FLoaderList, MemManager, MemModel);
|
||||
TFpDwarfInfo(FDbgInfo).LoadCompilationUnits;
|
||||
if self is TDbgProcess then
|
||||
FSymbolTableInfo := TFpSymbolInfo.Create(FLoaderList, MemManager)
|
||||
FSymbolTableInfo := TFpSymbolInfo.Create(FLoaderList, MemManager, MemModel)
|
||||
else
|
||||
FSymbolTableInfo := TFpSymbolInfo.Create(FLoaderList, MemManager, ExtractFileNameOnly(FFileName));
|
||||
FSymbolTableInfo := TFpSymbolInfo.Create(FLoaderList, MemManager, ExtractFileNameOnly(FFileName), MemModel);
|
||||
TFpDwarfInfo(FDbgInfo).LoadCallFrameInstructions;
|
||||
end;
|
||||
|
||||
@ -2175,8 +2179,9 @@ begin
|
||||
Result := lib.FindProcSymbol(AName);
|
||||
end;
|
||||
|
||||
constructor TDbgProcess.Create(const AFileName: string; AnOsClasses: TOSDbgClasses;
|
||||
AMemManager: TFpDbgMemManager; AProcessConfig: TDbgProcessConfig);
|
||||
constructor TDbgProcess.Create(const AFileName: string;
|
||||
AnOsClasses: TOSDbgClasses; AMemManager: TFpDbgMemManager;
|
||||
AMemModel: TFpDbgMemModel; AProcessConfig: TDbgProcessConfig);
|
||||
const
|
||||
{.$IFDEF CPU64}
|
||||
MAP_ID_SIZE = itu8;
|
||||
@ -2185,6 +2190,7 @@ const
|
||||
{.$ENDIF}
|
||||
begin
|
||||
FMemManager := AMemManager;
|
||||
FMemModel := AMemModel;
|
||||
FProcessID := 0;
|
||||
FThreadID := 0;
|
||||
FOSDbgClasses := AnOsClasses;
|
||||
|
@ -263,6 +263,7 @@ type
|
||||
private
|
||||
FLastError: TFpError;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
FDefaultContext: TFpDbgLocationContext;
|
||||
FStoredDefaultContext: TFpDbgLocationContext; // while function eval calling
|
||||
FOnLibraryLoadedEvent: TOnLibraryLoadedEvent;
|
||||
@ -308,7 +309,7 @@ type
|
||||
FCommand, FCommandToBeFreed: TDbgControllerCmd;
|
||||
function GetProcess(const AProcessIdentifier: THandle; out AProcess: TDbgProcess): Boolean;
|
||||
public
|
||||
constructor Create(AMemManager: TFpDbgMemManager); virtual;
|
||||
constructor Create(AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel); virtual;
|
||||
destructor Destroy; override;
|
||||
(* InitializeCommand: set new command
|
||||
Not called if command is replaced by OnThreadProcessLoopCycleEvent *)
|
||||
@ -330,6 +331,7 @@ type
|
||||
property CurrentCommand: TDbgControllerCmd read FCommand;
|
||||
property OsDbgClasses: TOSDbgClasses read FOsDbgClasses;
|
||||
property MemManager: TFpDbgMemManager read FMemManager;
|
||||
property MemModel: TFpDbgMemModel read FMemModel;
|
||||
property DefaultContext: TFpDbgLocationContext read GetDefaultContext; // CurrentThread, TopStackFrame
|
||||
property LastError: TFpError read FLastError;
|
||||
property Event: TFPDEvent read FPDEvent;
|
||||
@ -1658,7 +1660,7 @@ begin
|
||||
Flags := [];
|
||||
if RedirectConsoleOutput then Include(Flags, siRediretOutput);
|
||||
if ForceNewConsoleWin then Include(Flags, siForceNewConsole);
|
||||
FCurrentProcess := OSDbgClasses.DbgProcessClass.Create(FExecutableFilename, OsDbgClasses, MemManager, ProcessConfig);
|
||||
FCurrentProcess := OSDbgClasses.DbgProcessClass.Create(FExecutableFilename, OsDbgClasses, MemManager, MemModel, ProcessConfig);
|
||||
if not Assigned(FCurrentProcess) then
|
||||
begin
|
||||
Result := false;
|
||||
@ -2104,9 +2106,11 @@ begin
|
||||
Result := FProcessMap.GetData(AProcessIdentifier, AProcess) and (AProcess <> nil);
|
||||
end;
|
||||
|
||||
constructor TDbgController.Create(AMemManager: TFpDbgMemManager);
|
||||
constructor TDbgController.Create(AMemManager: TFpDbgMemManager;
|
||||
AMemModel: TFpDbgMemModel);
|
||||
begin
|
||||
FMemManager := AMemManager;
|
||||
FMemModel := AMemModel;
|
||||
FParams := TStringList.Create;
|
||||
FEnvironment := TStringList.Create;
|
||||
FProcessMap := TMap.Create(itu4, SizeOf(TDbgProcess));
|
||||
|
@ -601,7 +601,7 @@ type
|
||||
): Boolean;
|
||||
// GetDataAddress: data of a class, or string
|
||||
function GetDataAddress(AValueObj: TFpValueDwarf; var AnAddress: TFpDbgMemLocation;
|
||||
ATargetType: TFpSymbolDwarfType = nil): Boolean;
|
||||
ATargetType: TFpSymbolDwarfType = nil): Boolean; virtual;
|
||||
function GetNextTypeInfoForDataAddress(ATargetType: TFpSymbolDwarfType): TFpSymbolDwarfType; virtual;
|
||||
function GetDataAddressNext(AValueObj: TFpValueDwarf; var AnAddress: TFpDbgMemLocation;
|
||||
out ADoneWork: Boolean; ATargetType: TFpSymbolDwarfType): Boolean; virtual;
|
||||
@ -866,6 +866,8 @@ DECL = DW_AT_decl_column, DW_AT_decl_file, DW_AT_decl_line
|
||||
out ADoneWork: Boolean; ATargetType: TFpSymbolDwarfType): Boolean; override;
|
||||
procedure KindNeeded; override;
|
||||
function DoReadSize(const AValueObj: TFpValue; out ASize: TFpDbgValueSize): Boolean; override;
|
||||
function GetDataAddress(AValueObj: TFpValueDwarf; var AnAddress: TFpDbgMemLocation;
|
||||
ATargetType: TFpSymbolDwarfType = nil): Boolean; override;
|
||||
public
|
||||
destructor Destroy; override;
|
||||
function GetTypedValueObject({%H-}ATypeCast: Boolean; AnOuterType: TFpSymbolDwarfType = nil): TFpValueDwarf; override;
|
||||
@ -2557,7 +2559,7 @@ var
|
||||
begin
|
||||
a := GetDerefAddress;
|
||||
if IsTargetAddr(a) then
|
||||
Result := LocToAddr(a)
|
||||
Result := Context.MemModel.LocationToAddress(a)
|
||||
else
|
||||
Result := 0;
|
||||
end;
|
||||
@ -5723,6 +5725,13 @@ begin
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
function TFpSymbolDwarfTypeSubroutine.GetDataAddress(AValueObj: TFpValueDwarf;
|
||||
var AnAddress: TFpDbgMemLocation; ATargetType: TFpSymbolDwarfType): Boolean;
|
||||
begin
|
||||
inherited;
|
||||
AnAddress := AValueObj.Context.MemModel.UpdateLocationToCodeAddress(AnAddress);
|
||||
end;
|
||||
|
||||
destructor TFpSymbolDwarfTypeSubroutine.Destroy;
|
||||
begin
|
||||
FreeAndNil(FProcMembers);
|
||||
|
@ -800,7 +800,7 @@ type
|
||||
function FindCompilationUnitByOffs(AOffs: QWord): TDwarfCompilationUnit;
|
||||
function FindDwarfUnitSymbol(AAddress: TDbgPtr): TDbgDwarfSymbolBase; inline;
|
||||
public
|
||||
constructor Create(ALoaderList: TDbgImageLoaderList; AMemManager: TFpDbgMemManager); override;
|
||||
constructor Create(ALoaderList: TDbgImageLoaderList; AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel); override;
|
||||
destructor Destroy; override;
|
||||
function FindSymbolScope(ALocationContext: TFpDbgLocationContext; AAddress: TDbgPtr = 0): TFpDbgSymbolScope; override;
|
||||
function FindDwarfProcSymbol(AAddress: TDbgPtr): TDbgDwarfSymbolBase; inline;
|
||||
@ -3653,7 +3653,7 @@ end;
|
||||
{ TFpDwarfInfo }
|
||||
|
||||
constructor TFpDwarfInfo.Create(ALoaderList: TDbgImageLoaderList;
|
||||
AMemManager: TFpDbgMemManager);
|
||||
AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel);
|
||||
var
|
||||
Section: TDwarfSection;
|
||||
p: PDbgImageSection;
|
||||
@ -3662,7 +3662,7 @@ begin
|
||||
FWorkQueue := FpDbgGlobalWorkerQueue;
|
||||
FWorkQueue.AddRef;
|
||||
|
||||
inherited Create(ALoaderList, AMemManager);
|
||||
inherited Create(ALoaderList, AMemManager, AMemModel);
|
||||
FTargetInfo := ALoaderList.TargetInfo;
|
||||
FCompilationUnits := TList.Create;
|
||||
FCallFrameInformationList := TObjectList.Create(True);
|
||||
@ -5340,11 +5340,11 @@ function TDwarfCompilationUnit.ReadTargetAddressFromDwarfSection(var AData: Poin
|
||||
begin
|
||||
// do not need mem reader, address is in dwarf. Should be in correct format
|
||||
if (FAddressSize = 8) then
|
||||
Result := TargetLoc(PQWord(AData)^)
|
||||
Result := Owner.MemModel.AddressToTargetLocation(PQWord(AData)^)
|
||||
else if (FAddressSize = 4) then
|
||||
Result := TargetLoc(PLongWord(AData)^)
|
||||
Result := Owner.MemModel.AddressToTargetLocation(PLongWord(AData)^)
|
||||
else if (FAddressSize = 2) then
|
||||
Result := TargetLoc(PWord(AData)^);
|
||||
Result := Owner.MemModel.AddressToTargetLocation(PWord(AData)^);
|
||||
if AIncPointer then inc(AData, FAddressSize);
|
||||
end;
|
||||
|
||||
@ -5353,9 +5353,9 @@ function TDwarfCompilationUnit.ReadDwarfSectionOffsetOrLenFromDwarfSection(var A
|
||||
begin
|
||||
// do not need mem reader, address is in dwarf. Should be in correct format
|
||||
if ((Version>2) and IsDwarf64) or ((version < 3) and (FAddressSize = 8)) then
|
||||
Result := TargetLoc(PQWord(AData)^)
|
||||
Result := Owner.MemModel.AddressToTargetLocation(PQWord(AData)^)
|
||||
else
|
||||
Result := TargetLoc(PLongWord(AData)^);
|
||||
Result := Owner.MemModel.AddressToTargetLocation(PLongWord(AData)^);
|
||||
if AIncPointer then inc(AData, FAddressSize);
|
||||
end;
|
||||
|
||||
|
@ -602,12 +602,14 @@ type
|
||||
TFpDbgSimpleLocationContext = class(TFpDbgLocationContext)
|
||||
private
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
FAddress: TDbgPtr;
|
||||
FThreadId: Integer;
|
||||
FStackFrame: Integer;
|
||||
FSizeOfAddr: Integer;
|
||||
protected
|
||||
function GetMemManager: TFpDbgMemManager; override;
|
||||
function GetMemModel: TFpDbgMemModel; override;
|
||||
function GetAddress: TDbgPtr; override;
|
||||
function GetThreadId: Integer; override;
|
||||
function GetStackFrame: Integer; override;
|
||||
@ -652,6 +654,7 @@ type
|
||||
private
|
||||
FBaseContext: TFpDbgLocationContext;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
FMemReader: TFpDbgCallMemReader;
|
||||
FIsValid: Boolean;
|
||||
FMessage: string;
|
||||
@ -678,11 +681,12 @@ type
|
||||
private
|
||||
FHasInfo: Boolean;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
protected
|
||||
FTargetInfo: TTargetDescriptor;
|
||||
procedure SetHasInfo;
|
||||
public
|
||||
constructor Create({%H-}ALoaderList: TDbgImageLoaderList; AMemManager: TFpDbgMemManager); virtual;
|
||||
constructor Create({%H-}ALoaderList: TDbgImageLoaderList; AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel); virtual;
|
||||
(* Context should be searched by Thread, and StackFrame. The Address can be
|
||||
derived from this.
|
||||
However a different Address may be froced.
|
||||
@ -701,6 +705,7 @@ type
|
||||
//property MemManager: TFpDbgMemReaderBase read GetMemManager write SetMemManager;
|
||||
property TargetInfo: TTargetDescriptor read FTargetInfo write FTargetInfo;
|
||||
property MemManager: TFpDbgMemManager read FMemManager;
|
||||
property MemModel: TFpDbgMemModel read FMemModel;
|
||||
end;
|
||||
|
||||
function dbgs(ADbgSymbolKind: TDbgSymbolKind): String; overload;
|
||||
@ -781,8 +786,9 @@ begin
|
||||
FBaseContext:=ABaseContext;
|
||||
FBaseContext.AddReference;
|
||||
|
||||
FMemModel := TFpDbgMemModel.Create;
|
||||
FMemReader := TFpDbgCallMemReader.Create(AMemReader);
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, AMemConverter);
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, AMemConverter, FMemModel);
|
||||
|
||||
FIsValid := True;
|
||||
|
||||
@ -1569,6 +1575,11 @@ begin
|
||||
Result := FMemManager;
|
||||
end;
|
||||
|
||||
function TFpDbgSimpleLocationContext.GetMemModel: TFpDbgMemModel;
|
||||
begin
|
||||
Result := FMemModel;
|
||||
end;
|
||||
|
||||
function TFpDbgSimpleLocationContext.GetAddress: TDbgPtr;
|
||||
begin
|
||||
Result := fAddress;
|
||||
@ -1595,6 +1606,7 @@ begin
|
||||
inherited Create;
|
||||
AddReference;
|
||||
FMemManager := AMemManager;
|
||||
FMemModel := AMemManager.MemModel;
|
||||
FAddress := AnAddress;
|
||||
FSizeOfAddr := AnSizeOfAddr;
|
||||
FThreadId := AThreadId;
|
||||
@ -2098,9 +2110,10 @@ end;
|
||||
{ TDbgInfo }
|
||||
|
||||
constructor TDbgInfo.Create(ALoaderList: TDbgImageLoaderList;
|
||||
AMemManager: TFpDbgMemManager);
|
||||
AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel);
|
||||
begin
|
||||
FMemManager := AMemManager;
|
||||
FMemModel := AMemModel;
|
||||
inherited Create;
|
||||
end;
|
||||
|
||||
|
@ -351,7 +351,8 @@ type
|
||||
procedure AddLib(const ALibrary: tDbgLinuxLibrary);
|
||||
public
|
||||
class function isSupported(ATargetInfo: TTargetDescriptor): boolean; override;
|
||||
constructor Create(const AFileName: string; AnOsClasses: TOSDbgClasses; AMemManager: TFpDbgMemManager; AProcessConfig: TDbgProcessConfig = nil); override;
|
||||
constructor Create(const AFileName: string; AnOsClasses: TOSDbgClasses;
|
||||
AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel; AProcessConfig: TDbgProcessConfig = nil); override;
|
||||
destructor Destroy; override;
|
||||
|
||||
function StartInstance(AParams, AnEnvironment: TStrings;
|
||||
@ -1153,12 +1154,12 @@ end;
|
||||
|
||||
constructor TDbgLinuxProcess.Create(const AFileName: string;
|
||||
AnOsClasses: TOSDbgClasses; AMemManager: TFpDbgMemManager;
|
||||
AProcessConfig: TDbgProcessConfig);
|
||||
AMemModel: TFpDbgMemModel; AProcessConfig: TDbgProcessConfig);
|
||||
begin
|
||||
FMasterPtyFd:=-1;
|
||||
FSingleSteppingThreadID := -1;
|
||||
FPostponedSignals := TFpDbgLinuxSignalQueue.Create;
|
||||
inherited Create(AFileName, AnOsClasses, AMemManager, AProcessConfig);
|
||||
inherited Create(AFileName, AnOsClasses, AMemManager, AMemModel, AProcessConfig);
|
||||
end;
|
||||
|
||||
destructor TDbgLinuxProcess.Destroy;
|
||||
|
@ -82,7 +82,8 @@ type
|
||||
function RemoveBreakInstructionCode(const ALocation: TDBGPtr; const OrigValue: Byte): Boolean; override;
|
||||
public
|
||||
constructor Create(const AFileName: string; AnOsClasses: TOSDbgClasses;
|
||||
AMemManager: TFpDbgMemManager; AProcessConfig: TDbgProcessConfig = nil); override;
|
||||
AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel;
|
||||
AProcessConfig: TDbgProcessConfig = nil); override;
|
||||
destructor Destroy; override;
|
||||
|
||||
function StartInstance(AParams, AnEnvironment: TStrings; AWorkingDirectory, AConsoleTty: string;
|
||||
@ -380,7 +381,7 @@ end;
|
||||
|
||||
constructor TDbgRspProcess.Create(const AFileName: string;
|
||||
AnOsClasses: TOSDbgClasses; AMemManager: TFpDbgMemManager;
|
||||
AProcessConfig: TDbgProcessConfig);
|
||||
AMemModel: TFpDbgMemModel; AProcessConfig: TDbgProcessConfig);
|
||||
begin
|
||||
if Assigned(AProcessConfig) and (AProcessConfig is TRemoteConfig) then
|
||||
begin
|
||||
@ -388,7 +389,7 @@ begin
|
||||
FRemoteConfig.Assign(AProcessConfig);
|
||||
end;
|
||||
|
||||
inherited Create(AFileName, AnOsClasses, AMemManager);
|
||||
inherited Create(AFileName, AnOsClasses, AMemManager, AMemModel);
|
||||
end;
|
||||
|
||||
destructor TDbgRspProcess.Destroy;
|
||||
|
@ -57,8 +57,8 @@ type
|
||||
FSymbolList: TfpSymbolList;
|
||||
FLibName: String;
|
||||
public
|
||||
constructor Create(ALoaderList: TDbgImageLoaderList; AMemManager: TFpDbgMemManager); override;
|
||||
constructor Create(ALoaderList: TDbgImageLoaderList; AMemManager: TFpDbgMemManager; ALibName: String);
|
||||
constructor Create(ALoaderList: TDbgImageLoaderList; AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel); override; overload;
|
||||
constructor Create(ALoaderList: TDbgImageLoaderList; AMemManager: TFpDbgMemManager; ALibName: String; AMemModel: TFpDbgMemModel); overload;
|
||||
destructor Destroy; override;
|
||||
function FindSymbolScope(ALocationContext: TFpDbgLocationContext; AAddress: TDbgPtr = 0): TFpDbgSymbolScope; override;
|
||||
function FindProcSymbol(const AName: String; AIgnoreCase: Boolean = False): TFpSymbol; override; overload;
|
||||
@ -160,12 +160,12 @@ end;
|
||||
{ TFpSymbolInfo }
|
||||
|
||||
constructor TFpSymbolInfo.Create(ALoaderList: TDbgImageLoaderList;
|
||||
AMemManager: TFpDbgMemManager);
|
||||
AMemManager: TFpDbgMemManager; AMemModel: TFpDbgMemModel);
|
||||
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
inherited Create(ALoaderList, AMemManager);
|
||||
inherited Create(ALoaderList, AMemManager, AMemModel);
|
||||
|
||||
FSymbolList := TfpSymbolList.Create;
|
||||
for i := 0 to ALoaderList.Count-1 do
|
||||
@ -176,10 +176,10 @@ begin
|
||||
end;
|
||||
|
||||
constructor TFpSymbolInfo.Create(ALoaderList: TDbgImageLoaderList;
|
||||
AMemManager: TFpDbgMemManager; ALibName: String);
|
||||
AMemManager: TFpDbgMemManager; ALibName: String; AMemModel: TFpDbgMemModel);
|
||||
begin
|
||||
FLibName := ALibName;
|
||||
Create(ALoaderList, AMemManager);
|
||||
Create(ALoaderList, AMemManager, AMemModel);
|
||||
end;
|
||||
|
||||
destructor TFpSymbolInfo.Destroy;
|
||||
|
@ -61,10 +61,12 @@ type
|
||||
end;
|
||||
PFpDbgValueSize = ^TFpDbgValueSize;
|
||||
|
||||
TDbgAddressClass = byte;
|
||||
TFpDbgMemLocation = packed record
|
||||
Address: TDbgPtr;
|
||||
MType: TFpDbgMemLocationType;
|
||||
BitOffset: TBitAddr;
|
||||
AddressClass: TDbgAddressClass; // Used by AVR. 0 = data (or unspecified), 1 = progmem, 2 = EEPROM
|
||||
end;
|
||||
PFpDbgMemLocation = ^TFpDbgMemLocation;
|
||||
|
||||
@ -74,6 +76,7 @@ type
|
||||
|
||||
TByteDynArray = array of Byte;
|
||||
|
||||
TFpDbgMemModel = class;
|
||||
|
||||
{ TFpDbgLocationContext }
|
||||
|
||||
@ -87,12 +90,14 @@ type
|
||||
function GetThreadId: Integer; virtual; abstract;
|
||||
function GetSizeOfAddress: Integer; virtual; abstract;
|
||||
function GetMemManager: TFpDbgMemManager; virtual; abstract;
|
||||
function GetMemModel: TFpDbgMemModel; virtual; abstract;
|
||||
public
|
||||
property Address: TDbgPtr read GetAddress;
|
||||
property ThreadId: Integer read GetThreadId;
|
||||
property StackFrame: Integer read GetStackFrame;
|
||||
property SizeOfAddress: Integer read GetSizeOfAddress;
|
||||
property MemManager: TFpDbgMemManager read GetMemManager;
|
||||
property MemModel: TFpDbgMemModel read GetMemModel;
|
||||
public
|
||||
procedure ClearLastMemError;
|
||||
property LastMemError: TFpError read GetLastMemError;
|
||||
@ -378,6 +383,16 @@ type
|
||||
property MaxNullStringSearchLen: QWord read FMaxNullStringSearchLen write FMaxNullStringSearchLen;
|
||||
end;
|
||||
|
||||
{ TFpDbgMemModel }
|
||||
|
||||
// Here Location is the fpdebug representation of an address
|
||||
// and Ref is the target representation of an address
|
||||
TFpDbgMemModel = class
|
||||
function UpdateLocationToCodeAddress(const ALocation: TFpDbgMemLocation): TFpDbgMemLocation; virtual;
|
||||
function LocationToAddress(const ALocation: TFpDbgMemLocation): TDBGPtr; virtual;
|
||||
function AddressToTargetLocation(const AAddress: TDBGPtr): TFpDbgMemLocation; virtual;
|
||||
end;
|
||||
|
||||
(* TFpDbgMemManager
|
||||
* allows to to pretend reading from the target, by using its own memory, or
|
||||
a constant.
|
||||
@ -410,6 +425,7 @@ type
|
||||
FSelfMemConvertor: TFpDbgMemConvertor; // used when resizing constants (or register values, which are already in self format)
|
||||
FStartWirteableSelfMem: TDBGPtr;
|
||||
FLenWirteableSelfMem: Cardinal;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
function GetCacheManager: TFpDbgMemCacheManagerBase;
|
||||
procedure BitShiftMem(ASrcMem, ADestMem: Pointer; ASrcSize, ADestSize: cardinal; ABitCnt: Integer);
|
||||
protected
|
||||
@ -417,12 +433,12 @@ type
|
||||
const ASourceLocation: TFpDbgMemLocation; const ASourceSize: TFpDbgValueSize;
|
||||
const ADest: Pointer; const ADestSize: QWord; AContext: TFpDbgLocationContext;
|
||||
const AFlags: TFpDbgMemManagerFlags = []
|
||||
): Boolean;
|
||||
): Boolean; virtual;
|
||||
function WriteMemory(AReadDataType: TFpDbgMemReadDataType;
|
||||
const ADestLocation: TFpDbgMemLocation; const ADestSize: TFpDbgValueSize;
|
||||
const ASource: Pointer; const ASourceSize: QWord; AContext: TFpDbgLocationContext;
|
||||
const AFlags: TFpDbgMemManagerFlags = []
|
||||
): Boolean;
|
||||
): Boolean; virtual;
|
||||
function ReadMemoryEx(const ASourceLocation: TFpDbgMemLocation; AnAddressSpace: TDbgPtr; ASize: TFpDbgValueSize; ADest: Pointer; AContext: TFpDbgLocationContext = nil): Boolean;
|
||||
(* ReadRegister needs a Context, to get the thread/stackframe
|
||||
*)
|
||||
@ -433,8 +449,10 @@ type
|
||||
procedure SetCacheManager(ACacheMgr: TFpDbgMemCacheManagerBase);
|
||||
property CacheManager: TFpDbgMemCacheManagerBase read GetCacheManager;
|
||||
public
|
||||
constructor Create(AMemReader: TFpDbgMemReaderBase; AMemConvertor: TFpDbgMemConvertor);
|
||||
constructor Create(AMemReader: TFpDbgMemReaderBase; ATargenMemConvertor, ASelfMemConvertor: TFpDbgMemConvertor);
|
||||
constructor Create(AMemReader: TFpDbgMemReaderBase; AMemConvertor: TFpDbgMemConvertor;
|
||||
AMemModel: TFpDbgMemModel);
|
||||
constructor Create(AMemReader: TFpDbgMemReaderBase; ATargenMemConvertor, ASelfMemConvertor: TFpDbgMemConvertor;
|
||||
AMemModel: TFpDbgMemModel);
|
||||
destructor Destroy; override;
|
||||
procedure ClearLastError;
|
||||
|
||||
@ -457,6 +475,7 @@ type
|
||||
property PartialReadResultLenght: QWord read FPartialReadResultLenght;
|
||||
property LastError: TFpError read FLastError;
|
||||
property MemLimits: TFpDbgMemLimits read FMemLimits;
|
||||
property MemModel: TFpDbgMemModel read FMemModel;
|
||||
end;
|
||||
|
||||
function NilLoc: TFpDbgMemLocation; inline;
|
||||
@ -530,21 +549,18 @@ var
|
||||
function NilLoc: TFpDbgMemLocation;
|
||||
begin
|
||||
Result := Default(TFpDbgMemLocation);
|
||||
Result.Address := 0;
|
||||
Result.MType := mlfTargetMem;
|
||||
end;
|
||||
|
||||
function InvalidLoc: TFpDbgMemLocation;
|
||||
begin
|
||||
Result := Default(TFpDbgMemLocation);
|
||||
Result.Address := 0;
|
||||
Result.MType := mlfInvalid;
|
||||
end;
|
||||
|
||||
function UnInitializedLoc: TFpDbgMemLocation;
|
||||
begin
|
||||
Result := Default(TFpDbgMemLocation);
|
||||
Result.Address := 0;
|
||||
Result.MType := mlfUninitialized;
|
||||
end;
|
||||
|
||||
@ -600,6 +616,7 @@ begin
|
||||
Result.Address := Result.Address - 1; // Going to ADD some bits back
|
||||
// E.g. b=-1 means (b and 7) = 7 and that means adding 7 bits, instead of substracting 1
|
||||
Result.BitOffset := ABitOffset and 7;
|
||||
Result.AddressClass := AnAddr.AddressClass;
|
||||
{$POP}
|
||||
end;
|
||||
|
||||
@ -1003,8 +1020,12 @@ function TFpDbgLocationContext.ReadAddress(const ALocation: TFpDbgMemLocation;
|
||||
ASize: TFpDbgValueSize): TFpDbgMemLocation;
|
||||
begin
|
||||
Result := Default(TFpDbgMemLocation);
|
||||
Result.MType := mlfTargetMem;
|
||||
if not MemManager.ReadMemory(rdtAddress, ALocation, ASize, @Result.Address, SizeOf(Result.Address), Self) then
|
||||
if MemManager.ReadMemory(rdtAddress, ALocation, ASize, @Result.Address, SizeOf(Result.Address), Self) then
|
||||
begin
|
||||
Result := MemModel.AddressToTargetLocation(Result.Address);
|
||||
Result.MType := mlfTargetMem;
|
||||
end
|
||||
else
|
||||
Result := InvalidLoc;
|
||||
end;
|
||||
|
||||
@ -1020,9 +1041,13 @@ function TFpDbgLocationContext.ReadAddress(const ALocation: TFpDbgMemLocation;
|
||||
begin
|
||||
AnAddress := Default(TFpDbgMemLocation);
|
||||
Result := MemManager.ReadMemory(rdtAddress, ALocation, ASize, @AnAddress.Address, (SizeOf(AnAddress.Address)), Self);
|
||||
if Result
|
||||
then AnAddress.MType := mlfTargetMem
|
||||
else AnAddress := InvalidLoc;
|
||||
if Result then
|
||||
begin
|
||||
AnAddress := MemModel.AddressToTargetLocation(AnAddress.Address);
|
||||
AnAddress.MType := mlfTargetMem;
|
||||
end
|
||||
else
|
||||
AnAddress := InvalidLoc;
|
||||
end;
|
||||
|
||||
function TFpDbgLocationContext.ReadUnsignedInt(
|
||||
@ -1104,6 +1129,26 @@ begin
|
||||
FMaxNullStringSearchLen := 20 * 1024;
|
||||
end;
|
||||
|
||||
{ TFpDbgMemModel }
|
||||
|
||||
function TFpDbgMemModel.UpdateLocationToCodeAddress(const
|
||||
ALocation: TFpDbgMemLocation): TFpDbgMemLocation;
|
||||
begin
|
||||
Result := ALocation;
|
||||
end;
|
||||
|
||||
function TFpDbgMemModel.LocationToAddress(const
|
||||
ALocation: TFpDbgMemLocation): TDBGPtr;
|
||||
begin
|
||||
Result := LocToAddr(ALocation);
|
||||
end;
|
||||
|
||||
function TFpDbgMemModel.AddressToTargetLocation(const
|
||||
AAddress: TDBGPtr): TFpDbgMemLocation;
|
||||
begin
|
||||
Result := TargetLoc(AAddress);
|
||||
end;
|
||||
|
||||
{ TFpDbgMemReaderBase }
|
||||
|
||||
function TFpDbgMemReaderBase.ReadMemory(AnAddress: TDbgPtr; ASize: Cardinal;
|
||||
@ -1850,21 +1895,23 @@ begin
|
||||
end;
|
||||
|
||||
constructor TFpDbgMemManager.Create(AMemReader: TFpDbgMemReaderBase;
|
||||
AMemConvertor: TFpDbgMemConvertor);
|
||||
AMemConvertor: TFpDbgMemConvertor; AMemModel: TFpDbgMemModel);
|
||||
begin
|
||||
FMemLimits := TFpDbgMemLimits.Create;
|
||||
FMemReader := AMemReader;
|
||||
FTargetMemConvertor := AMemConvertor;
|
||||
FSelfMemConvertor := AMemConvertor;
|
||||
FMemModel := AMemModel;
|
||||
end;
|
||||
|
||||
constructor TFpDbgMemManager.Create(AMemReader: TFpDbgMemReaderBase; ATargenMemConvertor,
|
||||
ASelfMemConvertor: TFpDbgMemConvertor);
|
||||
ASelfMemConvertor: TFpDbgMemConvertor; AMemModel: TFpDbgMemModel);
|
||||
begin
|
||||
FMemLimits := TFpDbgMemLimits.Create;
|
||||
FMemReader := AMemReader;
|
||||
FTargetMemConvertor := ATargenMemConvertor;
|
||||
FSelfMemConvertor := ASelfMemConvertor;
|
||||
FMemModel := AMemModel;
|
||||
end;
|
||||
|
||||
destructor TFpDbgMemManager.Destroy;
|
||||
|
@ -385,6 +385,7 @@ type
|
||||
function CreateMemReader: TDbgMemReader; virtual;
|
||||
function CreateMemConverter: TFpDbgMemConvertor; virtual;
|
||||
function CreateMemManager: TFpDbgMemManager; virtual;
|
||||
function CreateMemModel: TFpDbgMemModel; virtual;
|
||||
function CreateLineInfo: TDBGLineInfo; override;
|
||||
function CreateWatches: TWatchesSupplier; override;
|
||||
function CreateThreads: TThreadsSupplier; override;
|
||||
@ -3598,7 +3599,12 @@ end;
|
||||
|
||||
function TFpDebugDebugger.CreateMemManager: TFpDbgMemManager;
|
||||
begin
|
||||
Result := TFpDbgMemManager.Create(FMemReader, FMemConverter);
|
||||
Result := TFpDbgMemManager.Create(FMemReader, FMemConverter, FMemModel);
|
||||
end;
|
||||
|
||||
function TFpDebugDebugger.CreateMemModel: TFpDbgMemModel;
|
||||
begin
|
||||
Result := TFpDbgMemModel.Create;
|
||||
end;
|
||||
|
||||
function TFpDebugDebugger.GetClassInstanceName(AnAddr: TDBGPtr): string;
|
||||
@ -4610,12 +4616,13 @@ begin
|
||||
FPrettyPrinter := TFpPascalPrettyPrinter.Create(sizeof(pointer));
|
||||
FMemReader := CreateMemReader;
|
||||
FMemConverter := CreateMemConverter;
|
||||
FMemModel := CreateMemModel;
|
||||
FMemManager := CreateMemManager;
|
||||
FMemManager.MemLimits.MaxMemReadSize := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxMemReadSize;
|
||||
FMemManager.MemLimits.MaxArrayLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxArrayLen;
|
||||
FMemManager.MemLimits.MaxStringLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxStringLen;
|
||||
FMemManager.MemLimits.MaxNullStringSearchLen := TFpDebugDebuggerProperties(GetProperties).MemLimits.MaxNullStringSearchLen;
|
||||
FDbgController := TDbgController.Create(FMemManager);
|
||||
FDbgController := TDbgController.Create(FMemManager, FMemModel);
|
||||
FDbgController.OnCreateProcessEvent:=@FDbgControllerCreateProcessEvent;
|
||||
FDbgController.OnHitBreakpointEvent:=@FDbgControllerHitBreakpointEvent;
|
||||
FDbgController.OnProcessExitEvent:=@FDbgControllerProcessExitEvent;
|
||||
@ -4651,6 +4658,7 @@ begin
|
||||
FreeAndNil(FBreakUpdateList);
|
||||
FreeAndNil(FDbgController);
|
||||
FreeAndNil(FPrettyPrinter);
|
||||
FreeAndNil(FMemModel);
|
||||
FreeAndNil(FMemManager);
|
||||
FreeAndNil(FMemConverter);
|
||||
FreeAndNil(FMemReader);
|
||||
|
@ -21,6 +21,7 @@ type
|
||||
protected
|
||||
FDbgController: TDbgController;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
FMemReader: TDbgMemReader;
|
||||
FMemConverter: TFpDbgMemConvertor;
|
||||
FLockList: TFpDbgLockList;
|
||||
|
@ -74,6 +74,7 @@ type
|
||||
FPrettyPrinter: TFpPascalPrettyPrinter;
|
||||
FMemReader: TFpGDBMIDbgMemReader;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
// cache last context
|
||||
FLastContext: array [0..MAX_CTX_CACHE-1] of TFpDbgSymbolScope;
|
||||
FLockUnLoadDwarf: integer;
|
||||
@ -788,9 +789,10 @@ begin
|
||||
{$Else}
|
||||
FMemReader := TFpGDBMIDbgMemReader.Create(Self);
|
||||
{$ENDIF}
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, TFpDbgMemConvertorLittleEndian.Create);
|
||||
FMemModel := TFpDbgMemModel.Create;
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, TFpDbgMemConvertorLittleEndian.Create, FMemModel);
|
||||
|
||||
FDwarfInfo := TFpDwarfInfo.Create(FImageLoaderList, FMemManager);
|
||||
FDwarfInfo := TFpDwarfInfo.Create(FImageLoaderList, FMemManager, FMemModel);
|
||||
FDwarfInfo.LoadCompilationUnits;
|
||||
FPrettyPrinter := TFpPascalPrettyPrinter.Create(SizeOf(Pointer));
|
||||
end;
|
||||
@ -809,6 +811,7 @@ begin
|
||||
if FMemManager <> nil then
|
||||
FMemManager.TargetMemConvertor.Free;
|
||||
FreeAndNil(FMemManager);
|
||||
FreeAndNil(FMemModel);
|
||||
FreeAndNil(FPrettyPrinter);
|
||||
end;
|
||||
|
||||
|
@ -100,6 +100,7 @@ type
|
||||
FIsSuccess: Boolean;
|
||||
FMemReader: TFpLldbDbgMemReader;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
FReaderErrors: String;
|
||||
public
|
||||
procedure Execute; override;
|
||||
@ -110,6 +111,7 @@ type
|
||||
property DwarfInfo: TFpDwarfInfo read FDwarfInfo;
|
||||
property MemReader: TFpLldbDbgMemReader read FMemReader;
|
||||
property MemManager: TFpDbgMemManager read FMemManager;
|
||||
property MemModel: TFpDbgMemModel read FMemModel;
|
||||
property ReaderErrors: String read FReaderErrors;
|
||||
property IsSuccess: Boolean read FIsSuccess;
|
||||
end;
|
||||
@ -181,6 +183,7 @@ type
|
||||
FPrettyPrinter: TFpPascalPrettyPrinter;
|
||||
FMemReader: TFpLldbDbgMemReader;
|
||||
FMemManager: TFpDbgMemManager;
|
||||
FMemModel: TFpDbgMemModel;
|
||||
FDwarfLoaderThread: TDwarfLoaderThread;
|
||||
// cache last context
|
||||
FLastContext: array [0..MAX_CTX_CACHE-1] of TFpDbgSymbolScope;
|
||||
@ -495,13 +498,14 @@ begin
|
||||
{$Else}
|
||||
FMemReader := TFpLldbDbgMemReader.Create(FDebugger);
|
||||
{$ENDIF}
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, TFpDbgMemConvertorLittleEndian.Create);
|
||||
FMemModel := TFpDbgMemModel.Create;
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, TFpDbgMemConvertorLittleEndian.Create, FMemModel);
|
||||
FMemManager.SetCacheManager(TFpLldbDbgMemCacheManagerSimple.Create);
|
||||
if Terminated then
|
||||
exit;
|
||||
|
||||
|
||||
FDwarfInfo := TFpDwarfInfo.Create(FImageLoaderList, FMemManager);
|
||||
FDwarfInfo := TFpDwarfInfo.Create(FImageLoaderList, FMemManager, FMemManager.MemModel);
|
||||
if Terminated then
|
||||
exit;
|
||||
|
||||
@ -532,6 +536,7 @@ begin
|
||||
if FMemManager <> nil then
|
||||
FMemManager.TargetMemConvertor.Free;
|
||||
FreeAndNil(FMemManager);
|
||||
FreeAndNil(FMemModel);
|
||||
end;
|
||||
|
||||
|
||||
@ -1384,7 +1389,8 @@ begin
|
||||
{$Else}
|
||||
FMemReader := TFpLldbDbgMemReader.Create(Self);
|
||||
{$ENDIF}
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, TFpDbgMemConvertorLittleEndian.Create);
|
||||
FMemModel := TFpDbgMemModel.Create;
|
||||
FMemManager := TFpDbgMemManager.Create(FMemReader, TFpDbgMemConvertorLittleEndian.Create, FMemModel);
|
||||
FMemManager.SetCacheManager(TFpLldbDbgMemCacheManagerSimple.Create);
|
||||
|
||||
FMemManager.MemLimits.MaxMemReadSize := TFpLldbDebuggerProperties(GetProperties).MemLimits.MaxMemReadSize;
|
||||
@ -1392,7 +1398,7 @@ begin
|
||||
FMemManager.MemLimits.MaxStringLen := TFpLldbDebuggerProperties(GetProperties).MemLimits.MaxStringLen;
|
||||
FMemManager.MemLimits.MaxNullStringSearchLen := TFpLldbDebuggerProperties(GetProperties).MemLimits.MaxNullStringSearchLen;
|
||||
|
||||
FDwarfInfo := TFpDwarfInfo.Create(FImageLoaderList, FMemManager);
|
||||
FDwarfInfo := TFpDwarfInfo.Create(FImageLoaderList, FMemManager, FMemManager.MemModel);
|
||||
FDwarfInfo.LoadCompilationUnits;
|
||||
|
||||
if FDwarfInfo.TargetInfo.bitness = b64 then
|
||||
@ -1422,6 +1428,7 @@ begin
|
||||
if FMemManager <> nil then
|
||||
FMemManager.TargetMemConvertor.Free;
|
||||
FreeAndNil(FMemManager);
|
||||
FreeAndNil(FMemModel);
|
||||
FreeAndNil(FPrettyPrinter);
|
||||
|
||||
if FDwarfLoaderThread <> nil then begin
|
||||
|
@ -68,6 +68,7 @@ type
|
||||
procedure UpdateProcessConfig;
|
||||
protected
|
||||
function CreateMemManager: TFpDbgMemManager; override;
|
||||
function CreateMemModel: TFpDbgMemModel; override;
|
||||
public
|
||||
constructor Create(const AExternalDebugger: String); override;
|
||||
destructor Destroy; override;
|
||||
@ -100,7 +101,12 @@ end;
|
||||
|
||||
function TFpRspRemoteDebugger.CreateMemManager: TFpDbgMemManager;
|
||||
begin
|
||||
Result := TAvrMemManager.Create(FMemReader, FMemConverter);
|
||||
Result := TAvrMemManager.Create(FMemReader, FMemConverter, FMemModel);
|
||||
end;
|
||||
|
||||
function TFpRspRemoteDebugger.CreateMemModel: TFpDbgMemModel;
|
||||
begin
|
||||
Result := TFpDbgAvrMemModel.Create;
|
||||
end;
|
||||
|
||||
constructor TFpRspRemoteDebugger.Create(const AExternalDebugger: String);
|
||||
|
Loading…
Reference in New Issue
Block a user