mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-19 00:49:09 +02:00
* reimplemented r28329 in a different way, as suggested by Jonas
git-svn-id: trunk@28332 -
This commit is contained in:
parent
ff77bd1bf2
commit
94bcb9878a
@ -508,14 +508,14 @@ type
|
|||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Clear;
|
procedure Clear;
|
||||||
{ finds an entry by key }
|
{ finds an entry by key }
|
||||||
function Find(Key: Pointer; KeyLen: Integer): PHashSetItem;
|
function Find(Key: Pointer; KeyLen: Integer): PHashSetItem;virtual;
|
||||||
{ finds an entry, creates one if not exists }
|
{ finds an entry, creates one if not exists }
|
||||||
function FindOrAdd(Key: Pointer; KeyLen: Integer;
|
function FindOrAdd(Key: Pointer; KeyLen: Integer;
|
||||||
var Found: Boolean): PHashSetItem;
|
var Found: Boolean): PHashSetItem;virtual;
|
||||||
{ finds an entry, creates one if not exists }
|
{ finds an entry, creates one if not exists }
|
||||||
function FindOrAdd(Key: Pointer; KeyLen: Integer): PHashSetItem;
|
function FindOrAdd(Key: Pointer; KeyLen: Integer): PHashSetItem;virtual;
|
||||||
{ returns Data by given Key }
|
{ returns Data by given Key }
|
||||||
function Get(Key: Pointer; KeyLen: Integer): TObject;
|
function Get(Key: Pointer; KeyLen: Integer): TObject;virtual;
|
||||||
{ removes an entry, returns False if entry wasn't there }
|
{ removes an entry, returns False if entry wasn't there }
|
||||||
function Remove(Entry: PHashSetItem): Boolean;
|
function Remove(Entry: PHashSetItem): Boolean;
|
||||||
property Count: LongWord read FCount;
|
property Count: LongWord read FCount;
|
||||||
|
@ -142,10 +142,7 @@ interface
|
|||||||
checkforwarddefs,
|
checkforwarddefs,
|
||||||
deflist,
|
deflist,
|
||||||
symlist : TFPObjectList;
|
symlist : TFPObjectList;
|
||||||
ptrdefs : THashSet; { list of pointerdefs created in this module so we can reuse them (not saved/restored) }
|
ptrdefs : tPtrDefHashSet; { list of pointerdefs created in this module so we can reuse them (not saved/restored) }
|
||||||
{$ifdef x86}
|
|
||||||
x86ptrdefs : array [tx86pointertyp] of THashSet;
|
|
||||||
{$endif x86}
|
|
||||||
arraydefs : THashSet; { list of single-element-arraydefs created in this module so we can reuse them (not saved/restored) }
|
arraydefs : THashSet; { list of single-element-arraydefs created in this module so we can reuse them (not saved/restored) }
|
||||||
ansistrdef : tobject; { an ansistring def redefined for the current module }
|
ansistrdef : tobject; { an ansistring def redefined for the current module }
|
||||||
wpoinfo : tunitwpoinfobase; { whole program optimization-related information that is generated during the current run for this unit }
|
wpoinfo : tunitwpoinfobase; { whole program optimization-related information that is generated during the current run for this unit }
|
||||||
@ -517,9 +514,6 @@ implementation
|
|||||||
var
|
var
|
||||||
n:string;
|
n:string;
|
||||||
fn:TPathStr;
|
fn:TPathStr;
|
||||||
{$ifdef x86}
|
|
||||||
ptrtyp:tx86pointertyp;
|
|
||||||
{$endif x86}
|
|
||||||
begin
|
begin
|
||||||
if amodulename='' then
|
if amodulename='' then
|
||||||
n:=ChangeFileExt(ExtractFileName(afilename),'')
|
n:=ChangeFileExt(ExtractFileName(afilename),'')
|
||||||
@ -573,13 +567,7 @@ implementation
|
|||||||
derefdataintflen:=0;
|
derefdataintflen:=0;
|
||||||
deflist:=TFPObjectList.Create(false);
|
deflist:=TFPObjectList.Create(false);
|
||||||
symlist:=TFPObjectList.Create(false);
|
symlist:=TFPObjectList.Create(false);
|
||||||
{$ifdef x86}
|
ptrdefs:=cPtrDefHashSet.Create;
|
||||||
for ptrtyp in tx86pointertyp do
|
|
||||||
x86ptrdefs[ptrtyp]:=THashSet.Create(64,true,false);
|
|
||||||
ptrdefs:=x86ptrdefs[tcpupointerdefclass(cpointerdef).default_x86_data_pointer_type];
|
|
||||||
{$else x86}
|
|
||||||
ptrdefs:=THashSet.Create(64,true,false);
|
|
||||||
{$endif x86}
|
|
||||||
arraydefs:=THashSet.Create(64,true,false);
|
arraydefs:=THashSet.Create(64,true,false);
|
||||||
ansistrdef:=nil;
|
ansistrdef:=nil;
|
||||||
wpoinfo:=nil;
|
wpoinfo:=nil;
|
||||||
@ -622,9 +610,6 @@ implementation
|
|||||||
var
|
var
|
||||||
i : longint;
|
i : longint;
|
||||||
current_debuginfo_reset : boolean;
|
current_debuginfo_reset : boolean;
|
||||||
{$ifdef x86}
|
|
||||||
ptrtyp : tx86pointertyp;
|
|
||||||
{$endif x86}
|
|
||||||
begin
|
begin
|
||||||
if assigned(unitmap) then
|
if assigned(unitmap) then
|
||||||
freemem(unitmap);
|
freemem(unitmap);
|
||||||
@ -696,13 +681,7 @@ implementation
|
|||||||
derefdata.free;
|
derefdata.free;
|
||||||
deflist.free;
|
deflist.free;
|
||||||
symlist.free;
|
symlist.free;
|
||||||
{$ifdef x86}
|
|
||||||
for ptrtyp in tx86pointertyp do
|
|
||||||
x86ptrdefs[ptrtyp].free;
|
|
||||||
ptrdefs:=nil;
|
|
||||||
{$else x86}
|
|
||||||
ptrdefs.free;
|
ptrdefs.free;
|
||||||
{$endif x86}
|
|
||||||
arraydefs.free;
|
arraydefs.free;
|
||||||
ansistrdef:=nil;
|
ansistrdef:=nil;
|
||||||
wpoinfo.free;
|
wpoinfo.free;
|
||||||
@ -722,9 +701,6 @@ implementation
|
|||||||
var
|
var
|
||||||
i : longint;
|
i : longint;
|
||||||
current_debuginfo_reset : boolean;
|
current_debuginfo_reset : boolean;
|
||||||
{$ifdef x86}
|
|
||||||
ptrtyp : tx86pointertyp;
|
|
||||||
{$endif x86}
|
|
||||||
begin
|
begin
|
||||||
if assigned(scanner) then
|
if assigned(scanner) then
|
||||||
begin
|
begin
|
||||||
@ -767,17 +743,8 @@ implementation
|
|||||||
deflist:=TFPObjectList.Create(false);
|
deflist:=TFPObjectList.Create(false);
|
||||||
symlist.free;
|
symlist.free;
|
||||||
symlist:=TFPObjectList.Create(false);
|
symlist:=TFPObjectList.Create(false);
|
||||||
{$ifdef x86}
|
|
||||||
for ptrtyp in tx86pointertyp do
|
|
||||||
begin
|
|
||||||
x86ptrdefs[ptrtyp].free;
|
|
||||||
x86ptrdefs[ptrtyp]:=THashSet.Create(64,true,false);
|
|
||||||
end;
|
|
||||||
ptrdefs:=x86ptrdefs[tcpupointerdefclass(cpointerdef).default_x86_data_pointer_type];
|
|
||||||
{$else x86}
|
|
||||||
ptrdefs.free;
|
ptrdefs.free;
|
||||||
ptrdefs:=THashSet.Create(64,true,false);
|
ptrdefs:=cPtrDefHashSet.Create;
|
||||||
{$endif x86}
|
|
||||||
arraydefs.free;
|
arraydefs.free;
|
||||||
arraydefs:=THashSet.Create(64,true,false);
|
arraydefs:=THashSet.Create(64,true,false);
|
||||||
wpoinfo.free;
|
wpoinfo.free;
|
||||||
|
@ -207,5 +207,7 @@ begin
|
|||||||
cconstsym:=tcpuconstsym;
|
cconstsym:=tcpuconstsym;
|
||||||
cenumsym:=tcpuenumsym;
|
cenumsym:=tcpuenumsym;
|
||||||
csyssym:=tcpusyssym;
|
csyssym:=tcpusyssym;
|
||||||
|
|
||||||
|
cPtrDefHashSet:=tx86PtrDefHashSet;
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ const
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
globals, cpuinfo, verbose;
|
globals, cpuinfo, verbose, fmodule;
|
||||||
|
|
||||||
|
|
||||||
function is_proc_far(p: tabstractprocdef): boolean;
|
function is_proc_far(p: tabstractprocdef): boolean;
|
||||||
@ -470,5 +470,7 @@ begin
|
|||||||
cconstsym:=tcpuconstsym;
|
cconstsym:=tcpuconstsym;
|
||||||
cenumsym:=tcpuenumsym;
|
cenumsym:=tcpuenumsym;
|
||||||
csyssym:=tcpusyssym;
|
csyssym:=tcpusyssym;
|
||||||
|
|
||||||
|
cPtrDefHashSet:=tx86PtrDefHashSet;
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -435,6 +435,14 @@ interface
|
|||||||
function GetCopy:tmacro;
|
function GetCopy:tmacro;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ tPtrDefHashSet }
|
||||||
|
|
||||||
|
tPtrDefHashSet = class(THashSet)
|
||||||
|
public
|
||||||
|
constructor Create;virtual;
|
||||||
|
end;
|
||||||
|
tPtrDefHashSetClass = class of tPtrDefHashSet;
|
||||||
|
|
||||||
var
|
var
|
||||||
generrorsym : tsym;
|
generrorsym : tsym;
|
||||||
|
|
||||||
@ -452,6 +460,7 @@ interface
|
|||||||
cconstsym: tconstsymclass;
|
cconstsym: tconstsymclass;
|
||||||
cenumsym: tenumsymclass;
|
cenumsym: tenumsymclass;
|
||||||
csyssym: tsyssymclass;
|
csyssym: tsyssymclass;
|
||||||
|
cPtrDefHashSet : tPtrDefHashSetClass = tPtrDefHashSet;
|
||||||
|
|
||||||
{ generate internal static field name based on regular field name }
|
{ generate internal static field name based on regular field name }
|
||||||
function internal_static_field_name(const fieldname: TSymStr): TSymStr;
|
function internal_static_field_name(const fieldname: TSymStr): TSymStr;
|
||||||
@ -2690,4 +2699,14 @@ implementation
|
|||||||
Result:=p;
|
Result:=p;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{****************************************************************************
|
||||||
|
tPtrDefHashSet
|
||||||
|
****************************************************************************}
|
||||||
|
|
||||||
|
constructor tPtrDefHashSet.Create;
|
||||||
|
begin
|
||||||
|
inherited Create(64,true,false);
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -26,7 +26,7 @@ unit symx86;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
globtype,
|
globtype, cclasses,
|
||||||
symconst, symtype,symdef,symsym;
|
symconst, symtype,symdef,symsym;
|
||||||
|
|
||||||
type
|
type
|
||||||
@ -45,6 +45,24 @@ type
|
|||||||
end;
|
end;
|
||||||
tx86pointerdefclass = class of tx86pointerdef;
|
tx86pointerdefclass = class of tx86pointerdef;
|
||||||
|
|
||||||
|
tx86PtrDefKey = packed record
|
||||||
|
def: tdef;
|
||||||
|
x86typ:tx86pointertyp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ tx86PtrDefHashSet }
|
||||||
|
|
||||||
|
tx86PtrDefHashSet = class(TPtrDefHashSet)
|
||||||
|
private
|
||||||
|
class procedure Key2FullKey(Key: Pointer; out FullKey: tx86PtrDefKey);
|
||||||
|
public
|
||||||
|
function Find(Key: Pointer; KeyLen: Integer): PHashSetItem;override;
|
||||||
|
function FindOrAdd(Key: Pointer; KeyLen: Integer;
|
||||||
|
var Found: Boolean): PHashSetItem;override;
|
||||||
|
function FindOrAdd(Key: Pointer; KeyLen: Integer): PHashSetItem;override;
|
||||||
|
function Get(Key: Pointer; KeyLen: Integer): TObject;override;
|
||||||
|
end;
|
||||||
|
|
||||||
{ returns a pointerdef for def, reusing an existing one in case it exists
|
{ returns a pointerdef for def, reusing an existing one in case it exists
|
||||||
in the current module }
|
in the current module }
|
||||||
function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef;
|
function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef;
|
||||||
@ -52,17 +70,20 @@ type
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
globals, verbose, cclasses,
|
globals, verbose,
|
||||||
symbase, fmodule;
|
symbase, fmodule;
|
||||||
|
|
||||||
function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef;
|
function getx86pointerdef(def: tdef;x86typ:tx86pointertyp): tpointerdef;
|
||||||
var
|
var
|
||||||
res: PHashSetItem;
|
res: PHashSetItem;
|
||||||
oldsymtablestack: tsymtablestack;
|
oldsymtablestack: tsymtablestack;
|
||||||
|
key: tx86PtrDefKey;
|
||||||
begin
|
begin
|
||||||
if not assigned(current_module) then
|
if not assigned(current_module) then
|
||||||
internalerror(2011071101);
|
internalerror(2011071101);
|
||||||
res:=current_module.x86ptrdefs[x86typ].FindOrAdd(@def,sizeof(def));
|
key.def:=def;
|
||||||
|
key.x86typ:=x86typ;
|
||||||
|
res:=current_module.ptrdefs.FindOrAdd(@key,sizeof(key));
|
||||||
if not assigned(res^.Data) then
|
if not assigned(res^.Data) then
|
||||||
begin
|
begin
|
||||||
{ since these pointerdefs can be reused anywhere in the current
|
{ since these pointerdefs can be reused anywhere in the current
|
||||||
@ -167,5 +188,69 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{****************************************************************************
|
||||||
|
tx86PtrDefHashSet
|
||||||
|
****************************************************************************}
|
||||||
|
|
||||||
|
class procedure tx86PtrDefHashSet.Key2FullKey(Key: Pointer; out FullKey: tx86PtrDefKey);
|
||||||
|
type
|
||||||
|
pdef=^tdef;
|
||||||
|
begin
|
||||||
|
FullKey.def:=pdef(Key)^;
|
||||||
|
FullKey.x86typ:=tx86pointerdefclass(cpointerdef).default_x86_data_pointer_type;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function tx86PtrDefHashSet.Find(Key: Pointer; KeyLen: Integer): PHashSetItem;
|
||||||
|
var
|
||||||
|
FullKey: tx86PtrDefKey;
|
||||||
|
begin
|
||||||
|
if KeyLen=SizeOf(tdef) then
|
||||||
|
begin
|
||||||
|
Key2FullKey(Key, FullKey);
|
||||||
|
Result:=inherited Find(@FullKey, SizeOf(FullKey));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result:=inherited Find(Key, KeyLen);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function tx86PtrDefHashSet.FindOrAdd(Key: Pointer; KeyLen: Integer; var Found: Boolean): PHashSetItem;
|
||||||
|
var
|
||||||
|
FullKey: tx86PtrDefKey;
|
||||||
|
begin
|
||||||
|
if KeyLen=SizeOf(tdef) then
|
||||||
|
begin
|
||||||
|
Key2FullKey(Key, FullKey);
|
||||||
|
Result:=inherited FindOrAdd(@FullKey, SizeOf(FullKey), Found);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result:=inherited FindOrAdd(Key, KeyLen, Found);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function tx86PtrDefHashSet.FindOrAdd(Key: Pointer; KeyLen: Integer): PHashSetItem;
|
||||||
|
var
|
||||||
|
FullKey: tx86PtrDefKey;
|
||||||
|
begin
|
||||||
|
if KeyLen=SizeOf(tdef) then
|
||||||
|
begin
|
||||||
|
Key2FullKey(Key, FullKey);
|
||||||
|
Result:=inherited FindOrAdd(@FullKey, SizeOf(FullKey));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result:=inherited FindOrAdd(Key, KeyLen);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function tx86PtrDefHashSet.Get(Key: Pointer; KeyLen: Integer): TObject;
|
||||||
|
var
|
||||||
|
FullKey: tx86PtrDefKey;
|
||||||
|
begin
|
||||||
|
if KeyLen=SizeOf(tdef) then
|
||||||
|
begin
|
||||||
|
Key2FullKey(Key, FullKey);
|
||||||
|
Result:=inherited Get(@FullKey, SizeOf(FullKey));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result:=inherited Get(Key, KeyLen);
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -207,5 +207,7 @@ begin
|
|||||||
cconstsym:=tcpuconstsym;
|
cconstsym:=tcpuconstsym;
|
||||||
cenumsym:=tcpuenumsym;
|
cenumsym:=tcpuenumsym;
|
||||||
csyssym:=tcpusyssym;
|
csyssym:=tcpusyssym;
|
||||||
|
|
||||||
|
cPtrDefHashSet:=tx86PtrDefHashSet;
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user