* use TFPHashObjectList instead of TDictionary

git-svn-id: trunk@3133 -
This commit is contained in:
peter 2006-04-02 21:18:04 +00:00
parent 7c00500c05
commit d542fd97fb
3 changed files with 97 additions and 124 deletions

View File

@ -89,7 +89,7 @@ interface
TObjSectionOptions = set of TObjSectionOption;
TObjSymbol = class(TNamedIndexItem)
TObjSymbol = class(TFPHashObject)
public
bind : TAsmsymbind;
typ : TAsmsymtype;
@ -101,7 +101,7 @@ interface
size : aint;
{ Used for external and common solving during linking }
exesymbol : TExeSymbol;
constructor create(const s:string);
constructor create(AList:TFPHashObjectList;const AName:string);
function address:aint;
procedure SetAddress(apass:byte;aobjsec:TObjSection;abind:TAsmsymbind;atyp:Tasmsymtype);
end;
@ -127,7 +127,7 @@ interface
constructor CreateSection(ADataOffset:aint;aobjsec:TObjSection;Atyp:TObjRelocationType);
end;
TObjSection = class(TNamedIndexItem)
TObjSection = class(TFPHashObject)
private
FData : TDynamicArray;
FSecOptions : TObjSectionOptions;
@ -149,7 +149,7 @@ interface
ExeSection : TExeSection;
Used : boolean;
VTRefList : TFPObjectList;
constructor create(const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);virtual;
constructor create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);virtual;
destructor destroy;override;
function write(const d;l:aint):aint;
function writestr(const s:string):aint;
@ -172,14 +172,10 @@ interface
private
FName : string[80];
FCurrObjSec : TObjSection;
{ ObjSections will be stored in order in SectsIndex, this is at least
required for stabs debuginfo. The SectsDict is only used for lookups (PFV) }
FObjSectionDict : TDictionary;
FObjSectionList : TFPObjectList;
FObjSectionList : TFPHashObjectList;
FCObjSection : TObjSectionClass;
{ Symbols that will be defined in this object file }
FObjSymbolList : TFPObjectList;
FObjSymbolDict : TDictionary;
FObjSymbolList : TFPHashObjectList;
FCachedAsmSymbolList : TFPObjectList;
{ Special info sections that are written to during object generation }
FStabsObjSec,
@ -226,8 +222,8 @@ interface
procedure resetsections;
property Name:string[80] read FName;
property CurrObjSec:TObjSection read FCurrObjSec;
property ObjSymbolList:TFPObjectList read FObjSymbolList;
property ObjSectionList:TFPObjectList read FObjSectionList;
property ObjSymbolList:TFPHashObjectList read FObjSymbolList;
property ObjSectionList:TFPHashObjectList read FObjSectionList;
end;
TObjDataClass = class of TObjData;
@ -293,15 +289,14 @@ interface
function VTableRef(VTableIdx:Longint):TObjRelocation;
end;
TExeSymbol = class(TNamedIndexItem)
TExeSymbol = class(TFPHashObject)
ObjSymbol : TObjSymbol;
ExeSection : TExeSection;
{ Used for vmt references optimization }
VTable : TExeVTable;
constructor create(sym:TObjSymbol);
end;
TExeSection = class(tnamedindexitem)
TExeSection = class(TFPHashObject)
private
FSecSymIdx : longint;
FObjSectionList : TFPObjectList;
@ -311,7 +306,7 @@ interface
MemPos : aint;
SecAlign : shortint;
SecOptions : TObjSectionOptions;
constructor create(const n:string);virtual;
constructor create(AList:TFPHashObjectList;const AName:string);virtual;
destructor destroy;override;
procedure AddObjSection(objsec:TObjSection);
property ObjSectionList:TFPObjectList read FObjSectionList;
@ -325,12 +320,10 @@ interface
FCObjData : TObjDataClass;
FCExeSection : TExeSectionClass;
FCurrExeSec : TExeSection;
FExeSectionList : TFPObjectList;
FExeSectionDict : TDictionary;
FExeSectionList : TFPHashObjectList;
Fzeronr : longint;
{ Symbols }
FExeSymbolDict : TDictionary;
FExeSymbolList,
FExeSymbolList : TFPHashObjectList;
FUnresolvedExeSymbols : TFPObjectList;
FExternalObjSymbols,
FCommonObjSymbols : TFPObjectList;
@ -385,10 +378,9 @@ interface
procedure ResolveExternals(const libname:string);virtual;
function writeexefile(const fn:string):boolean;
property Writer:TObjectWriter read FWriter;
property ExeSections:TFPObjectList read FExeSectionList;
property ExeSections:TFPHashObjectList read FExeSectionList;
property ObjDataList:TFPObjectList read FObjDataList;
property ExeSymbolDict:TDictionary read FExeSymbolDict;
property ExeSymbolList:TFPObjectList read FExeSymbolList;
property ExeSymbolList:TFPHashObjectList read FExeSymbolList;
property UnresolvedExeSymbols:TFPObjectList read FUnresolvedExeSymbols;
property ExternalObjSymbols:TFPObjectList read FExternalObjSymbols;
property CommonObjSymbols:TFPObjectList read FCommonObjSymbols;
@ -411,16 +403,21 @@ implementation
cutils,globals,verbose,fmodule,ogmap;
const
sectionDatagrowsize = 1024;
sectionDatagrowsize = 256-sizeof(ptrint);
{$ifdef MEMDEBUG}
var
memobjsymbols,
memobjsections : TMemDebug;
{$endif MEMDEBUG}
{*****************************************************************************
TObjSymbol
*****************************************************************************}
constructor TObjSymbol.create(const s:string);
constructor TObjSymbol.create(AList:TFPHashObjectList;const AName:string);
begin;
inherited createname(s);
inherited create(AList,AName);
bind:=AB_EXTERNAL;
typ:=AT_NONE;
symidx:=-1;
@ -508,10 +505,9 @@ implementation
TObjSection
****************************************************************************}
constructor TObjSection.create(const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);
constructor TObjSection.create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);
begin
inherited createname(Aname);
name:=Aname;
inherited Create(AList,Aname);
{ Data }
Size:=0;
Datapos:=0;
@ -670,17 +666,11 @@ implementation
begin
inherited create;
FName:=SplitFileName(n);
{ sections, the SectsIndex owns the items, the FObjSectionDict
is only used for lookups }
FObjSectionDict:=tdictionary.create;
FObjSectionDict.noclear:=true;
FObjSectionList:=TFPObjectList.Create(true);
FObjSectionList:=TFPHashObjectList.Create(true);
FStabsObjSec:=nil;
FStabStrObjSec:=nil;
{ symbols }
FObjSymbolDict:=tdictionary.create;
FObjSymbolDict.noclear:=true;
FObjSymbolList:=TFPObjectList.Create(true);
FObjSymbolList:=TFPHashObjectList.Create(true);
FCachedAsmSymbolList:=TFPObjectList.Create(false);
{ section class type for creating of new sections }
FCObjSection:=TObjSection;
@ -695,20 +685,22 @@ implementation
begin
{$ifdef MEMDEBUG}
d:=tmemdebug.create(name+' - ObjData symbols');
MemObjSymbols.Start;
{$endif}
ResetCachedAsmSymbols;
FCachedAsmSymbolList.free;
FObjSymbolDict.free;
FObjSymbolList.free;
{$ifdef MEMDEBUG}
MemObjSymbols.Stop;
d.free;
{$endif}
{$ifdef MEMDEBUG}
d:=tmemdebug.create(name+' - ObjData sections');
MemObjSections.Start;
{$endif}
FObjSectionDict.free;
FObjSectionList.free;
{$ifdef MEMDEBUG}
MemObjSections.Stop;
d.free;
{$endif}
inherited destroy;
@ -788,12 +780,10 @@ implementation
function TObjData.createsection(const aname:string;aalign:shortint;aoptions:TObjSectionOptions):TObjSection;
begin
result:=TObjSection(FObjSectionDict.search(aname));
result:=TObjSection(FObjSectionList.Find(aname));
if not assigned(result) then
begin
result:=CObjSection.create(aname,aalign,aoptions);
FObjSectionDict.Insert(result);
FObjSectionList.Add(result);
result:=CObjSection.create(FObjSectionList,aname,aalign,aoptions);
result.ObjData:=self;
end;
FCurrObjSec:=result;
@ -807,7 +797,7 @@ implementation
function TObjData.FindSection(const aname:string):TObjSection;
begin
result:=TObjSection(FObjSectionDict.Search(aname));
result:=TObjSection(FObjSectionList.Find(aname));
end;
@ -821,13 +811,9 @@ implementation
function TObjData.createsymbol(const aname:string):TObjSymbol;
begin
result:=TObjSymbol(FObjSymbolDict.search(aname));
result:=TObjSymbol(FObjSymbolList.Find(aname));
if not assigned(result) then
begin
result:=TObjSymbol.Create(aname);
FObjSymbolDict.Insert(result);
FObjSymbolList.Add(result);
end;
result:=TObjSymbol.Create(FObjSymbolList,aname);
end;
@ -1173,23 +1159,12 @@ implementation
{****************************************************************************
TExeSymbol
TExeSection
****************************************************************************}
constructor TExeSymbol.create(sym:TObjSymbol);
constructor TExeSection.create(AList:TFPHashObjectList;const AName:string);
begin
inherited createname(sym.name);
ObjSymbol:=sym;
end;
{****************************************************************************
tExeSection
****************************************************************************}
constructor tExeSection.create(const n:string);
begin
inherited createname(n);
inherited create(AList,AName);
Size:=0;
MemPos:=0;
DataPos:=0;
@ -1198,14 +1173,14 @@ implementation
end;
destructor tExeSection.destroy;
destructor TExeSection.destroy;
begin
ObjSectionList.Free;
inherited destroy;
end;
procedure tExeSection.AddObjSection(objsec:TObjSection);
procedure TExeSection.AddObjSection(objsec:TObjSection);
begin
ObjSectionList.Add(objsec);
if (SecOptions<>[]) then
@ -1236,19 +1211,14 @@ implementation
{ object files }
FObjDataList:=TFPObjectList.Create(true);
{ symbols }
FExeSymbolDict:=tdictionary.create;
FExeSymbolDict.noclear:=true;
FExeSymbolDict.usehash;
FExeSymbolList:=TFPObjectList.Create(true);
FExeSymbolList:=TFPHashObjectList.Create(true);
FUnresolvedExeSymbols:=TFPObjectList.Create(false);
FExternalObjSymbols:=TFPObjectList.Create(false);
FCommonObjSymbols:=TFPObjectList.Create(false);
FExeVTableList:=TFPObjectList.Create(false);
FEntryName:='start';
{ sections }
FExeSectionDict:=TDictionary.create;
FExeSectionDict.noclear:=true;
FExeSectionList:=TFPObjectList.Create(true);
FExeSectionList:=TFPHashObjectList.Create(true);
FImageBase:=0;
SectionMemAlign:=$1000;
SectionDataAlign:=$200;
@ -1259,13 +1229,11 @@ implementation
destructor TExeOutput.destroy;
begin
FExeSymbolDict.free;
FExeSymbolList.free;
UnresolvedExeSymbols.free;
ExternalObjSymbols.free;
CommonObjSymbols.free;
ExeVTableList.free;
FExeSectionDict.free;
FExeSectionList.free;
ObjDatalist.free;
FWriter.free;
@ -1301,7 +1269,7 @@ implementation
function TExeOutput.FindExeSection(const aname:string):TExeSection;
begin
result:=TExeSection(FExeSectionDict.Search(aname));
result:=TExeSection(FExeSectionList.Find(aname));
end;
@ -1347,11 +1315,7 @@ implementation
begin
sec:=FindExeSection(aname);
if not assigned(sec) then
begin
sec:=CExeSection.create(aname);
FExeSectionDict.Insert(sec);
FExeSectionList.Add(sec);
end;
sec:=CExeSection.create(FExeSectionList,aname);
{ Clear ExeSection contents }
FCurrExeSec:=sec;
end;
@ -1401,7 +1365,7 @@ implementation
procedure TExeOutput.Order_Align(const aname:string);
var
code : integer;
alignval : longint;
alignval : shortint;
objsec : TObjSection;
begin
val(aname,alignval,code);
@ -1521,8 +1485,8 @@ implementation
k:=Pos('$$',hs);
if k=0 then
internalerror(200603311);
childexesym:=texesymbol(FExeSymbolDict.search(Copy(hs,1,k-1)));
parentexesym:=texesymbol(FExeSymbolDict.search(Copy(hs,k+2,length(hs)-k-1)));
childexesym:=texesymbol(FExeSymbolList.Find(Copy(hs,1,k-1)));
parentexesym:=texesymbol(FExeSymbolList.Find(Copy(hs,k+2,length(hs)-k-1)));
if not assigned(childexesym) or
not assigned(parentexesym)then
internalerror(200603312);
@ -1551,7 +1515,7 @@ implementation
k:=Pos('$$',hs);
if k=0 then
internalerror(200603319);
vtableexesym:=texesymbol(FExeSymbolDict.search(Copy(hs,1,k-1)));
vtableexesym:=texesymbol(FExeSymbolList.Find(Copy(hs,1,k-1)));
val(Copy(hs,k+2,length(hs)-k-1),vtableidx,code);
if (code<>0) then
internalerror(200603318);
@ -1618,13 +1582,9 @@ implementation
continue;
end;
{ Search for existing exesymbol }
exesym:=texesymbol(FExeSymbolDict.search(objsym.name));
exesym:=texesymbol(FExeSymbolList.Find(objsym.name));
if not assigned(exesym) then
begin
exesym:=texesymbol.createname(objsym.name);
FExeSymbolDict.insert(exesym);
FExeSymbolList.Add(exesym);
end;
exesym:=texesymbol.Create(FExeSymbolList,objsym.name);
{ Defining the symbol? }
if objsym.bind=AB_GLOBAL then
begin
@ -1684,7 +1644,7 @@ implementation
Comment(V_Debug,'Number of unresolved externals in objects '+tostr(UnresolvedExeSymbols.Count));
{ Find entry symbol and print in map }
exesym:=texesymbol(ExeSymbolDict.search(EntryName));
exesym:=texesymbol(ExeSymbolList.Find(EntryName));
if assigned(exesym) then
begin
EntrySym:=exesym.ObjSymbol;
@ -1964,8 +1924,7 @@ implementation
) then
begin
Comment(V_Debug,'Deleting empty section '+exesec.name);
FExeSectionDict.Delete(exesec.name);
FExeSectionList[i]:=nil;
FExeSectionList.Delete(i);
end;
end;
ExeSections.Pack;
@ -2097,7 +2056,7 @@ implementation
k:=Pos('$$',hs);
if k=0 then
internalerror(200603314);
vtableexesym:=texesymbol(FExeSymbolDict.search(Copy(hs,1,k-1)));
vtableexesym:=texesymbol(FExeSymbolList.Find(Copy(hs,1,k-1)));
val(Copy(hs,k+2,length(hs)-k-1),vtableidx,code);
if (code<>0) then
internalerror(200603317);
@ -2141,6 +2100,8 @@ implementation
for i:=0 to ExeSections.Count-1 do
begin
exesec:=TExeSection(ExeSections[i]);
if not assigned(exesec) then
continue;
for j:=0 to exesec.ObjSectionlist.count-1 do
begin
objsec:=TObjSection(exesec.ObjSectionlist[j]);
@ -2192,4 +2153,16 @@ implementation
Comment(V_Error,s+' while reading '+reader.filename);
end;
{$ifdef MEMDEBUG}
initialization
memobjsymbols:=TMemDebug.create('ObjSymbols');
memobjsymbols.stop;
memobjsections:=TMemDebug.create('ObjSections');
memobjsections.stop;
finalization
memobjsymbols.free;
memobjsections.free;
{$endif MEMDEBUG}
end.

View File

@ -45,17 +45,17 @@ interface
public
secidx : longint;
flags : longword;
constructor create(const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);override;
constructor create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);override;
procedure addsymsizereloc(ofs:aint;p:TObjSymbol;symsize:aint;reloctype:TObjRelocationType);
procedure fixuprelocs;override;
end;
TDJCoffObjSection = class(TCoffObjSection)
constructor create(const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);override;
constructor create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);override;
end;
TPECoffObjSection = class(TCoffObjSection)
constructor create(const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);override;
constructor create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);override;
end;
TCoffObjData = class(TObjData)
@ -143,15 +143,15 @@ interface
private
win32 : boolean;
public
constructor createcoff(const n:string;awin32:boolean);
constructor createcoff(AList:TFPHashObjectList;const n:string;awin32:boolean);
end;
TDJCoffExeSection = class(TCoffExeSection)
constructor create(const n:string);override;
constructor create(AList:TFPHashObjectList;const n:string);override;
end;
TPECoffExeSection = class(TCoffExeSection)
constructor create(const n:string);override;
constructor create(AList:TFPHashObjectList;const n:string);override;
end;
TCoffexeoutput = class(texeoutput)
@ -721,9 +721,9 @@ const win32stub : array[0..131] of byte=(
TCoffObjSection
****************************************************************************}
constructor TCoffObjSection.create(const aname:string;aalign:shortint;aoptions:TObjSectionOptions);
constructor TCoffObjSection.create(AList:TFPHashObjectList;const aname:string;aalign:shortint;aoptions:TObjSectionOptions);
begin
inherited create(aname,aalign,aoptions);
inherited create(AList,aname,aalign,aoptions);
end;
@ -816,9 +816,9 @@ const win32stub : array[0..131] of byte=(
TDJCoffObjSection
****************************************************************************}
constructor TDJCoffObjSection.create(const aname:string;aalign:shortint;aoptions:TObjSectionOptions);
constructor TDJCoffObjSection.create(AList:TFPHashObjectList;const aname:string;aalign:shortint;aoptions:TObjSectionOptions);
begin
inherited create(aname,aalign,aoptions);
inherited create(alist,aname,aalign,aoptions);
end;
@ -826,9 +826,9 @@ const win32stub : array[0..131] of byte=(
TPECoffObjSection
****************************************************************************}
constructor TPECoffObjSection.create(const aname:string;aalign:shortint;aoptions:TObjSectionOptions);
constructor TPECoffObjSection.create(AList:TFPHashObjectList;const aname:string;aalign:shortint;aoptions:TObjSectionOptions);
begin
inherited create(aname,aalign,aoptions);
inherited create(alist,aname,aalign,aoptions);
end;
@ -1783,22 +1783,22 @@ const win32stub : array[0..131] of byte=(
****************************************************************************}
constructor TCoffExeSection.createcoff(const n:string;awin32:boolean);
constructor TCoffExeSection.createcoff(AList:TFPHashObjectList;const n:string;awin32:boolean);
begin
inherited create(n);
inherited create(AList,n);
win32:=awin32;
end;
constructor TDJCoffExeSection.create(const n:string);
constructor TDJCoffExeSection.create(AList:TFPHashObjectList;const n:string);
begin
inherited createcoff(n,false);
inherited createcoff(AList,n,false);
end;
constructor TPECoffExeSection.create(const n:string);
constructor TPECoffExeSection.create(AList:TFPHashObjectList;const n:string);
begin
inherited createcoff(n,false);
inherited createcoff(AList,n,false);
end;

View File

@ -48,8 +48,8 @@ interface
shentsize : longint;
{ relocation }
relocsect : TElfObjSection;
constructor create(const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);override;
constructor create_ext(const Aname:string;Ashtype,Ashflags,Ashlink,Ashinfo:longint;Aalign:shortint;Aentsize:longint);
constructor create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);override;
constructor create_ext(AList:TFPHashObjectList;const Aname:string;Ashtype,Ashflags,Ashlink,Ashinfo:longint;Aalign:shortint;Aentsize:longint);
destructor destroy;override;
end;
@ -517,9 +517,9 @@ implementation
TSection
****************************************************************************}
constructor TElfObjSection.create(const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);
constructor TElfObjSection.create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);
begin
inherited create(Aname,Aalign,aoptions);
inherited create(AList,Aname,Aalign,aoptions);
secshidx:=0;
shstridx:=0;
encodesechdrflags(aoptions,shtype,shflags);
@ -531,12 +531,12 @@ implementation
end;
constructor TElfObjSection.create_ext(const Aname:string;Ashtype,Ashflags,Ashlink,Ashinfo:longint;Aalign:shortint;Aentsize:longint);
constructor TElfObjSection.create_ext(AList:TFPHashObjectList;const Aname:string;Ashtype,Ashflags,Ashlink,Ashinfo:longint;Aalign:shortint;Aentsize:longint);
var
aoptions : TObjSectionOptions;
begin
decodesechdrflags(Ashtype,Ashflags,aoptions);
inherited create(Aname,Aalign,aoptions);
inherited create(AList,Aname,Aalign,aoptions);
secshidx:=0;
shstridx:=0;
shtype:=AshType;
@ -565,9 +565,9 @@ implementation
inherited create(n);
CObjSection:=TElfObjSection;
{ default sections }
symtabsect:=TElfObjSection.create_ext('.symtab',SHT_SYMTAB,0,0,0,4,sizeof(telfsymbol));
strtabsect:=TElfObjSection.create_ext('.strtab',SHT_STRTAB,0,0,0,1,0);
shstrtabsect:=TElfObjSection.create_ext('.shstrtab',SHT_STRTAB,0,0,0,1,0);
symtabsect:=TElfObjSection.create_ext(ObjSectionList,'.symtab',SHT_SYMTAB,0,0,0,4,sizeof(telfsymbol));
strtabsect:=TElfObjSection.create_ext(ObjSectionList,'.strtab',SHT_STRTAB,0,0,0,1,0);
shstrtabsect:=TElfObjSection.create_ext(ObjSectionList,'.shstrtab',SHT_STRTAB,0,0,0,1,0);
{ insert the empty and filename as first in strtab }
strtabsect.writestr(#0);
strtabsect.writestr(SplitFileName(current_module.mainsource^)+#0);
@ -725,9 +725,9 @@ implementation
{$endif userodata}
{ create the reloc section }
{$ifdef i386}
s.relocsect:=TElfObjSection.create_ext('.rel'+s.name,SHT_REL,0,symtabsect.secshidx,s.secshidx,4,sizeof(TElfReloc));
s.relocsect:=TElfObjSection.create_ext(ObjSectionList,'.rel'+s.name,SHT_REL,0,symtabsect.secshidx,s.secshidx,4,sizeof(TElfReloc));
{$else i386}
s.relocsect:=TElfObjSection.create_ext('.rela'+s.name,SHT_RELA,0,symtabsect.secshidx,s.secshidx,4,sizeof(TElfReloc));
s.relocsect:=TElfObjSection.create_ext(ObjSectionList,'.rela'+s.name,SHT_RELA,0,symtabsect.secshidx,s.secshidx,4,sizeof(TElfReloc));
{$endif i386}
{ add the relocations }
for i:=0 to s.Objrelocations.count-1 do