符号:
tsym = class(TSymEntry)
protected
public
fileinfo : tfileposinfo; 文件位置
symoptions : tsymoptions; 符号参数
refs : longint; 引用计数
reflist : TLinkedList; 引用列表
visibility : tvisibility; 可见性
{ deprecated optionally can have a message }
deprecatedmsg: pshortstring; 不建议使用提示信息
isdbgwritten : boolean; 调试器可写?
constructor create(st:tsymtyp;const aname:string); 创建符号
destructor destroy;override; 释放
function mangledname:string; virtual; mangled名字
function prettyname:string; virtual; 真实名
procedure buildderef;virtual; 建立引用
procedure deref;virtual; 解引用
procedure ChangeOwner(st:TSymtable); 切换到另一符号表
procedure IncRefCount; 引用加
procedure IncRefCountBy(AValue : longint); 引用加
procedure MaybeCreateRefList; 创建引用列表
procedure AddRef; 引用加
end;
定义:
tdef = class(TDefEntry)
typesym : tsym; { which type the definition was generated this def }定义的类型的符号
{ maybe it's useful to merge the dwarf and stabs debugging info with some hacking }
{ dwarf debugging }
dwarf_lab : tasmsymbol; dwarf调试格式符号
dwarf_ref_lab : tasmsymbol; dwarf调试格式引用符号
{ stabs debugging }
stab_number : word; stabs调试格式num
dbg_state : tdefdbgstatus; 调试状态
defoptions : tdefoptions; 参数
defstates : tdefstates; 状态
constructor create(dt:tdeftyp);
procedure buildderef;virtual;abstract;
procedure buildderefimpl;virtual;abstract;
procedure deref;virtual;abstract;
procedure derefimpl;virtual;abstract;
function typename:string; 类型名
function GetTypeName:string;virtual; 当前类型名
function typesymbolprettyname:string;virtual;
function mangledparaname:string; mangled名
function getmangledparaname:string;virtual;
function rtti_mangledname(rt:trttitype):string;virtual;abstract;
function OwnerHierarchyName: string; virtual; abstract; 拥有者层次名
function size:asizeint;virtual;abstract;
function packedbitsize:asizeint;virtual;
function alignment:shortint;virtual;abstract;
function getvardef:longint;virtual;abstract;
function getparentdef:tdef;virtual;
function geTSymtable(t:tgeTSymtable):TSymtable;virtual;
function is_publishable:boolean;virtual;abstract; 是否打印
function needs_inittable:boolean;virtual;abstract; 是否需要初始化
function is_related(def:tdef):boolean;virtual; 是否与某定义相关
procedure ChangeOwner(st:TSymtable); 修改拥有者
procedure register_created_object_type;virtual; 注册已经创建的对象类型
end;
从上一内容可以看到,符号表主要有两内容一是符号二是定义。当然每个符号表都对应一个模块,即我们所说的单元文件。
符号表本身不包括从文件中读取并保存方法可用性差,以下就是一个可存储的符号表。
tstoredsymtable = class(TSymtable)
private
b_needs_init_final : boolean; 是否需要初始结束化
procedure _needs_init_final(sym:TObject;arg:pointer); 符号或定义检查是否需要初始结束化
procedure check_forward(sym:TObject;arg:pointer); 符号或定义向前检查
procedure labeldefined(sym:TObject;arg:pointer); lablesym符号检查是否定义
procedure varsymbolused(sym:TObject;arg:pointer); 检查某个符号是否被使用
以上三个是每当编译解析完一个body后,便会进行检查没有使用过符号,向前定义,过程。静态需要在模块里检查。
{Check for unused labels, forwards, symbols for procedures. Static symtable is checked in pmodules. }
procedure TestPrivate(sym:TObject;arg:pointer); 检查符号的私有符号表里是否有未使用的变量
procedure objectprivatesymbolused(sym:TObject;arg:pointer); 检查对象或记录的符号表是否有未使用的变量
procedure loaddefs(ppufile:tcompilerppufile); 从PPU符号文件中加载定义
procedure loadsyms(ppufile:tcompilerppufile); 从PPU符号文件中加载符号
procedure writedefs(ppufile:tcompilerppufile); 写定义到符号文件
procedure writesyms(ppufile:tcompilerppufile); 写符号到符号文件
public
procedure insert(sym:TSymEntry;checkdup:boolean=true);override; 插入一符号默认不允许重复
procedure delete(sym:TSymEntry);override; 删除一符号
这两完全继承父类
{ load/write }
procedure ppuload(ppufile:tcompilerppufile);virtual; 从PPU加载符号及定义
procedure ppuwrite(ppufile:tcompilerppufile);virtual; 写符号及定义到PPU
procedure buildderef;virtual;
procedure buildderefimpl;virtual;
procedure deref;virtual;
procedure derefimpl;virtual;
function checkduplicate(var hashedid:THashedIDString;sym:TSymEntry):boolean;override;
procedure allsymbolsused;
procedure allprivatesused;
procedure check_forwards;
procedure checklabels;
function needs_init_final : boolean;
procedure testfordefaultproperty(sym:TObject;arg:pointer);
end;
tstoreddef = class(tdef)
protected
typesymderef : tderef; 类型符号解定义
public
{$ifdef EXTDEBUG}
fileinfo : tfileposinfo;
{$endif}
{ generic support }
genericdef : tstoreddef; 泛型定义
genericdefderef : tderef; 泛型定义解定义
generictokenbuf : tdynamicarray; 泛型缓冲
constructor create(dt:tdeftyp);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
destructor destroy;override;
function getcopy : tstoreddef;virtual;
procedure ppuwrite(ppufile:tcompilerppufile);virtual;
procedure buildderef;override; 建立解定义,包括泛型
procedure buildderefimpl;override;
procedure deref;override; 重载解定义
procedure derefimpl;override;
function size:asizeint;override; 大小
function getvardef:longint;override; var定义ID
function alignment:shortint;override; 对齐
function is_publishable : boolean;override; 可打印?
function needs_inittable : boolean;override; 需要初始化?
function rtti_mangledname(rt:trttitype):string;override; RTTI的mangled名称
function OwnerHierarchyName: string; override; 拥有者层名
function in_currentunit: boolean;
{ regvars }
function is_intregable : boolean; 通用寄存器
function is_fpuregable : boolean; 浮点寄存器
{ generics }
procedure initgeneric; 初始泛型
private
savesize : asizeuint;
end;
文件定义
tfiletyp = (ft_text,ft_typed,ft_untyped);
tfiledef = class(tstoreddef)
filetyp : tfiletyp; 文件类型
typedfiledef : tdef; 类型字段定义
typedfiledefderef : tderef; 类型字段解定义
constructor createtext; 文本文件
constructor createuntyped; 单元文件
constructor createtyped(def : tdef); 定义类型文件
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
function GetTypeName:string;override;
function getmangledparaname:string;override;
procedure setsize;
end;
变体定义
tvarianttype = (
vt_normalvariant,vt_olevariant
);
tvariantdef = class(tstoreddef)
varianttype : tvarianttype; 变体类型
constructor create(v : tvarianttype);
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
function GetTypeName:string;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function getvardef:longint;override;
procedure setsize;
function is_publishable : boolean;override;
function needs_inittable : boolean;override;
end;
类型形势定义
tformaldef = class(tstoreddef)
typed:boolean;
constructor create(Atyped:boolean);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
end;
向前定义
tforwarddef = class(tstoreddef)
tosymname : pshortstring;
forwardpos : tfileposinfo;
constructor create(const s:string;const pos:tfileposinfo);
destructor destroy;override;
function getcopy:tstoreddef;override;
function GetTypeName:string;override;
end;
未知定义
tundefineddef = class(tstoreddef)
constructor create;
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
end;
错误定义
terrordef = class(tstoreddef)
constructor create;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
function getmangledparaname : string;override;
end;
抽象指针定义
tabstractpointerdef = class(tstoreddef)
pointeddef : tdef;
pointeddefderef : tderef;
constructor create(dt:tdeftyp;def:tdef);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
指针定义
tpointerdef = class(tabstractpointerdef)
is_far : boolean;
has_pointer_math : boolean;
constructor create(def:tdef);
constructor createfar(def:tdef);
function getcopy:tstoreddef;override;
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
end;
tprocdef = class;
{ tabstractrecorddef }
抽象记录定义
tabstractrecorddef= class(tstoreddef)
objname,
objrealname : PShortString;
symtable : TSymtable;
cloneddef : tabstractrecorddef;
cloneddefderef : tderef;
objectoptions : tobjectoptions;
constructor create(const n:string; dt:tdeftyp);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
destructor destroy; override;
procedure check_forwards; virtual;
function find_procdef_bytype(pt:tproctypeoption): tprocdef;
function GetSymtable(t:tGetSymtable):TSymtable;override;
function is_packed:boolean;
function RttiName: string;
{ enumerator support }
function search_enumerator_get: tprocdef; virtual;
function search_enumerator_move: tprocdef; virtual;
function search_enumerator_current: tsym; virtual;
end;
记录定义
trecorddef = class(tabstractrecorddef)
public
isunion : boolean;
constructor create(const n:string; p:TSymtable);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
function size:asizeint;override;
function alignment : shortint;override;
function padalignment: shortint;
function GetTypeName:string;override;
{ debug }
function needs_inittable : boolean;override;
end;
对象定义
tobjectdef = class(tabstractrecorddef)
private
fcurrent_dispid: longint; 当前类型ID
public
dwarf_struct_lab : tasmsymbol; dwarf的LABLE结构符号
childof : tobjectdef; 子对象定义
childofderef : tderef; 子对象解定义
{ for Object Pascal helpers }
extendeddef : tdef; 扩展定义
extendeddefderef: tderef; 扩展解定义
{ for C++ classes: name of the library this class is imported from }
import_lib, 导入lib,objective-c扩展名
{ for Objective-C: protocols and classes can have the same name there }
objextname : pshortstring;
{ to be able to have a variable vmt position }
{ and no vmt field for objects without virtuals }
vmtentries : TFPList; vmt列表
vmcallstaticinfo : pmvcallstaticinfo;
vmt_offset : longint; vmt偏移
objecttype : tobjecttyp; 对象类型
iidguid : pguid; guid
iidstr : pshortstring; guid字符串
writing_class_record_dbginfo, 是否写入类或记录调试信息stabs
{ a class of this type has been created in this module }
created_in_current_module,
{ a loadvmtnode for this class has been created in this
module, so if a classrefdef variable of this or a parent
class is used somewhere to instantiate a class, then this
class may be instantiated
}
maybe_created_in_current_module,
{ a "class of" this particular class has been created in
this module
}
classref_created_in_current_module : boolean;
{ store implemented interfaces defs and name mappings }
ImplementedInterfaces : TFPObjectList;
constructor create(ot:tobjecttyp;const n:string;c:tobjectdef);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
procedure buildderef;override;
procedure deref;override;
procedure buildderefimpl;override;
procedure derefimpl;override;
procedure resetvmtentries;
procedure copyvmtentries(objdef:tobjectdef);
function getparentdef:tdef;override;
function size : asizeint;override;
function alignment:shortint;override;
function vmtmethodoffset(index:longint):longint;
function members_need_inittable : boolean;
function find_implemented_interface(aintfdef:tobjectdef):TImplementedInterface;
{ this should be called when this class implements an interface }
procedure prepareguid;
function is_publishable : boolean;override;
function is_related(d : tdef) : boolean;override;
function needs_inittable : boolean;override;
function rtti_mangledname(rt:trttitype):string;override;
function vmt_mangledname : string;
procedure check_forwards; override;
procedure insertvmt;
procedure set_parent(c : tobjectdef);
function find_destructor: tprocdef;
function implements_any_interfaces: boolean;
{ dispinterface support }
function get_next_dispid: longint;
{ enumerator support }
function search_enumerator_get: tprocdef; override;
function search_enumerator_move: tprocdef; override;
function search_enumerator_current: tsym; override;
{ WPO }
procedure register_created_object_type;override;
procedure register_maybe_created_object_type;
procedure register_created_classref_type;
procedure register_vmt_call(index:longint);
{ ObjC }
procedure finish_objc_data;
function check_objc_types: boolean;
{ C++ }
procedure finish_cpp_data;
end;
类型定义
tclassrefdef = class(tabstractpointerdef)
constructor create(def:tdef);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function getcopy:tstoreddef;override;
function GetTypeName:string;override;
function is_publishable : boolean;override;
function rtti_mangledname(rt:trttitype):string;override;
procedure register_created_object_type;override;
end;
数组定义
tarraydef = class(tstoreddef)
lowrange,
highrange : asizeint;
rangedef : tdef;
rangedefderef : tderef;
arrayoptions : tarraydefoptions;
symtable : TSymtable;
protected
_elementdef : tdef;
_elementdefderef : tderef;
procedure setelementdef(def:tdef);
public
function elesize : asizeint;
function elepackedbitsize : asizeint;
function elecount : asizeuint;
constructor create_from_pointer(def:tdef);
constructor create(l,h:asizeint;def:tdef);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy; override;
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
function getmangledparaname : string;override;
procedure buildderef;override;
procedure deref;override;
function size : asizeint;override;
function alignment : shortint;override;
{ returns the label of the range check string }
function needs_inittable : boolean;override;
property elementdef : tdef read _elementdef write setelementdef;
function is_publishable : boolean;override;
end;
序数定义
torddef = class(tstoreddef)
low,high : TConstExprInt;
ordtype : tordtype;
constructor create(t : tordtype;v,b : TConstExprInt);
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function is_publishable : boolean;override;
function GetTypeName:string;override;
function alignment:shortint;override;
procedure setsize;
function packedbitsize: asizeint; override;
function getvardef : longint;override;
end;
浮点定义
tfloatdef = class(tstoreddef)
floattype : tfloattype;
constructor create(t : tfloattype);
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
function is_publishable : boolean;override;
function alignment:shortint;override;
procedure setsize;
function getvardef:longint;override;
end;
抽象过程定义
tabstractprocdef = class(tstoreddef)
{ saves a definition to the return type }
returndef : tdef;
returndefderef : tderef;
parast : TSymtable;
paras : tparalist;
proctypeoption : tproctypeoption;
proccalloption : tproccalloption;
procoptions : tprocoptions;
callerargareasize,
calleeargareasize: pint;
{ number of user visibile parameters }
maxparacount,
minparacount : byte;
{$ifdef m68k}
exp_funcretloc : tregister; { explicit funcretloc for AmigaOS }
{$endif}
funcretloc : array[tcallercallee] of TCGPara;
has_paraloc_info : tcallercallee; { paraloc info is available }
constructor create(dt:tdeftyp;level:byte);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
procedure calcparas;
function typename_paras(showhidden:boolean): string;
function is_methodpointer:boolean;virtual;
function is_addressonly:boolean;virtual;
function no_self_node:boolean;
procedure check_mark_as_nested;
procedure init_paraloc_info(side: tcallercallee);
function stack_tainting_parameter(side: tcallercallee): boolean;
private
procedure count_para(p:TObject;arg:pointer);
procedure insert_para(p:TObject;arg:pointer);
end;
过程定义
tprocvardef = class(tabstractprocdef)
constructor create(level:byte);
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetSymtable(t:tGetSymtable):TSymtable;override;
function size : asizeint;override;
function GetTypeName:string;override;
function is_publishable : boolean;override;
function is_methodpointer:boolean;override;
function is_addressonly:boolean;override;
function getmangledparaname:string;override;
end;
可存储符号
tstoredsym = class(tsym)
public
constructor create(st:tsymtyp;const n : string);
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);virtual;
end;
标签符号
tlabelsym = class(tstoredsym)
used,
defined,
nonlocal : boolean;
{ points to the matching node, only valid resultdef pass is run and
the goto<->label relation in the node tree is created, should
be a tnode }
code : pointer;
{ points to the jump buffer }
jumpbuf : tstoredsym;
{ when the label is defined in an asm block, this points to the
generated asmlabel }
asmblocklabel : tasmlabel;
constructor create(const n : string);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function mangledname:string;override;
end;
单元符号
tunitsym = class(Tstoredsym)
module : tobject; { tmodule }
constructor create(const n : string;amodule : tobject);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
错误符号
terrorsym = class(Tsym)
constructor create;
end;
过程符号
tprocsym = class(tstoredsym)
protected
FProcdefList : TFPObjectList;
FProcdefDerefList : TFPList;
public
constructor create(const n : string);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
{ writes all declarations except the specified one }
procedure write_parameter_lists(skipdef:tprocdef);
{ tests, if all procedures definitions are defined and not }
{ only forward }
procedure check_forward;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
function find_procdef_bytype(pt:Tproctypeoption):Tprocdef;
function find_procdef_bypara(para:TFPObjectList;retdef:tdef;cpoptions:tcompare_paras_options):Tprocdef;
function find_procdef_byoptions(ops:tprocoptions): Tprocdef;
function find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
function find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
function find_procdef_enumerator_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
property ProcdefList:TFPObjectList read FProcdefList;
end;
类型符号
ttypesym = class(Tstoredsym)
typedef : tdef;
typedefderef : tderef;
constructor create(const n : string;def:tdef);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
抽象var符号
tabstractvarsym = class(tstoredsym)
varoptions : tvaroptions;
notifications : Tlinkedlist;
varspez : tvarspez; { sets the type of access }
varregable : tvarregable;
varstate : tvarstate;
{ Has the address of this variable potentially escaped the }
{ block in which is was declared? }
{ could also be part of tabstractnormalvarsym, but there's }
{ one byte left here till the next 4 byte alignment }
addr_taken : boolean;
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
function getsize : asizeint;
function getpackedbitsize : longint;
function is_regvar(refpara: boolean):boolean;
procedure trigger_notifications(what:Tnotification_flag);
function register_notification(flags:Tnotification_flags;
callback:Tnotification_callback):cardinal;
procedure unregister_notification(id:cardinal);
private
_vardef : tdef;
vardefderef : tderef;
procedure setvardef(def:tdef);
public
property vardef: tdef read _vardef write setvardef;
end;
字段var符号
tfieldvarsym = class(tabstractvarsym)
fieldoffset : asizeint; { offset in record/object }
objcoffsetmangledname: pshortstring; { mangled name of offset, calculated as needed }
constructor create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function mangledname:string;override;
destructor destroy;override;
end;
抽象normalval符号
tabstractnormalvarsym = class(tabstractvarsym)
defaultconstsym : tsym;
defaultconstsymderef : tderef;
localloc : TLocation; { register/reference for local var }
initialloc : TLocation; { initial location so it can still be initialized later after the location was changed by SSA }
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
局部var符号
tlocalvarsym = class(tabstractnormalvarsym)
constructor create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
参数var符号
tparavarsym = class(tabstractnormalvarsym)
paraloc : array[tcallercallee] of TCGPara;
paranr : word; { position of this parameter }
{ in MacPas mode, "univ" parameters mean that type checking should
be disabled, except that the size of the passed parameter must
match the size of the formal parameter }
univpara : boolean;
{$ifdef EXTDEBUG}
eqval : tequaltype;
{$endif EXTDEBUG}
constructor create(const n : string;nr:word;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
静态var符号
tstaticvarsym = class(tabstractnormalvarsym)
private
_mangledname : pshortstring;
public
section : ansistring;
constructor create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor create_dll(const n : string;vsp:tvarspez;def:tdef);
constructor create_C(const n,mangled : string;vsp:tvarspez;def:tdef);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function mangledname:string;override;
procedure set_mangledname(const s:string);
end;
绝对var符号
tabsolutevarsym = class(tabstractvarsym)
public
abstyp : absolutetyp;
{$ifdef i386}
absseg : boolean;
{$endif i386}
asmname : pshortstring;
addroffset : aword;
ref : tpropaccesslist;
constructor create(const n : string;def:tdef);
constructor create_ref(const n : string;def:tdef;_ref:tpropaccesslist);
destructor destroy;override;
constructor ppuload(ppufile:tcompilerppufile);
procedure buildderef;override;
procedure deref;override;
function mangledname : string;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
属性符号
tpropaccesslisttypes=(palt_none,palt_read,palt_write,palt_stored);
tpropertysym = class(Tstoredsym)
propoptions : tpropertyoptions;
overriddenpropsym : tpropertysym;
overriddenpropsymderef : tderef;
propdef : tdef;
propdefderef : tderef;
indexdef : tdef;
indexdefderef : tderef;
index,
default : longint;
dispid : longint;
propaccesslist: array[tpropaccesslisttypes] of tpropaccesslist;
constructor create(const n : string);
destructor destroy;override;
constructor ppuload(ppufile:tcompilerppufile);
function getsize : asizeint;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
常量符号
tconstvalue = record
case integer of
0: (valueord : tconstexprint);
1: (valueordptr : tconstptruint);
2: (valueptr : pointer; len : longint);
end;
tconstsym = class(tstoredsym)
constdef : tdef;
constdefderef : tderef;
consttyp : tconsttyp;
value : tconstvalue;
constructor create_ord(const n : string;t : tconsttyp;v : tconstexprint;def:tdef);
constructor create_ordptr(const n : string;t : tconsttyp;v : tconstptruint;def:tdef);
constructor create_ptr(const n : string;t : tconsttyp;v : pointer;def:tdef);
constructor create_string(const n : string;t : tconsttyp;str:pchar;l:longint);
constructor create_wstring(const n : string;t : tconsttyp;pw:pcompilerwidestring);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure buildderef;override;
procedure deref;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
枚举符号
tenumsym = class(Tstoredsym)
value : longint;
definition : tenumdef;
definitionderef : tderef;
constructor create(const n : string;def : tenumdef;v : longint);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
系统符号
tsyssym = class(Tstoredsym)
number : longint;
constructor create(const n : string;l : longint);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
tsym = class(TSymEntry)
protected
public
fileinfo : tfileposinfo; 文件位置
symoptions : tsymoptions; 符号参数
refs : longint; 引用计数
reflist : TLinkedList; 引用列表
visibility : tvisibility; 可见性
{ deprecated optionally can have a message }
deprecatedmsg: pshortstring; 不建议使用提示信息
isdbgwritten : boolean; 调试器可写?
constructor create(st:tsymtyp;const aname:string); 创建符号
destructor destroy;override; 释放
function mangledname:string; virtual; mangled名字
function prettyname:string; virtual; 真实名
procedure buildderef;virtual; 建立引用
procedure deref;virtual; 解引用
procedure ChangeOwner(st:TSymtable); 切换到另一符号表
procedure IncRefCount; 引用加
procedure IncRefCountBy(AValue : longint); 引用加
procedure MaybeCreateRefList; 创建引用列表
procedure AddRef; 引用加
end;
定义:
tdef = class(TDefEntry)
typesym : tsym; { which type the definition was generated this def }定义的类型的符号
{ maybe it's useful to merge the dwarf and stabs debugging info with some hacking }
{ dwarf debugging }
dwarf_lab : tasmsymbol; dwarf调试格式符号
dwarf_ref_lab : tasmsymbol; dwarf调试格式引用符号
{ stabs debugging }
stab_number : word; stabs调试格式num
dbg_state : tdefdbgstatus; 调试状态
defoptions : tdefoptions; 参数
defstates : tdefstates; 状态
constructor create(dt:tdeftyp);
procedure buildderef;virtual;abstract;
procedure buildderefimpl;virtual;abstract;
procedure deref;virtual;abstract;
procedure derefimpl;virtual;abstract;
function typename:string; 类型名
function GetTypeName:string;virtual; 当前类型名
function typesymbolprettyname:string;virtual;
function mangledparaname:string; mangled名
function getmangledparaname:string;virtual;
function rtti_mangledname(rt:trttitype):string;virtual;abstract;
function OwnerHierarchyName: string; virtual; abstract; 拥有者层次名
function size:asizeint;virtual;abstract;
function packedbitsize:asizeint;virtual;
function alignment:shortint;virtual;abstract;
function getvardef:longint;virtual;abstract;
function getparentdef:tdef;virtual;
function geTSymtable(t:tgeTSymtable):TSymtable;virtual;
function is_publishable:boolean;virtual;abstract; 是否打印
function needs_inittable:boolean;virtual;abstract; 是否需要初始化
function is_related(def:tdef):boolean;virtual; 是否与某定义相关
procedure ChangeOwner(st:TSymtable); 修改拥有者
procedure register_created_object_type;virtual; 注册已经创建的对象类型
end;
从上一内容可以看到,符号表主要有两内容一是符号二是定义。当然每个符号表都对应一个模块,即我们所说的单元文件。
符号表本身不包括从文件中读取并保存方法可用性差,以下就是一个可存储的符号表。
tstoredsymtable = class(TSymtable)
private
b_needs_init_final : boolean; 是否需要初始结束化
procedure _needs_init_final(sym:TObject;arg:pointer); 符号或定义检查是否需要初始结束化
procedure check_forward(sym:TObject;arg:pointer); 符号或定义向前检查
procedure labeldefined(sym:TObject;arg:pointer); lablesym符号检查是否定义
procedure varsymbolused(sym:TObject;arg:pointer); 检查某个符号是否被使用
以上三个是每当编译解析完一个body后,便会进行检查没有使用过符号,向前定义,过程。静态需要在模块里检查。
{Check for unused labels, forwards, symbols for procedures. Static symtable is checked in pmodules. }
procedure TestPrivate(sym:TObject;arg:pointer); 检查符号的私有符号表里是否有未使用的变量
procedure objectprivatesymbolused(sym:TObject;arg:pointer); 检查对象或记录的符号表是否有未使用的变量
procedure loaddefs(ppufile:tcompilerppufile); 从PPU符号文件中加载定义
procedure loadsyms(ppufile:tcompilerppufile); 从PPU符号文件中加载符号
procedure writedefs(ppufile:tcompilerppufile); 写定义到符号文件
procedure writesyms(ppufile:tcompilerppufile); 写符号到符号文件
public
procedure insert(sym:TSymEntry;checkdup:boolean=true);override; 插入一符号默认不允许重复
procedure delete(sym:TSymEntry);override; 删除一符号
这两完全继承父类
{ load/write }
procedure ppuload(ppufile:tcompilerppufile);virtual; 从PPU加载符号及定义
procedure ppuwrite(ppufile:tcompilerppufile);virtual; 写符号及定义到PPU
procedure buildderef;virtual;
procedure buildderefimpl;virtual;
procedure deref;virtual;
procedure derefimpl;virtual;
function checkduplicate(var hashedid:THashedIDString;sym:TSymEntry):boolean;override;
procedure allsymbolsused;
procedure allprivatesused;
procedure check_forwards;
procedure checklabels;
function needs_init_final : boolean;
procedure testfordefaultproperty(sym:TObject;arg:pointer);
end;
tstoreddef = class(tdef)
protected
typesymderef : tderef; 类型符号解定义
public
{$ifdef EXTDEBUG}
fileinfo : tfileposinfo;
{$endif}
{ generic support }
genericdef : tstoreddef; 泛型定义
genericdefderef : tderef; 泛型定义解定义
generictokenbuf : tdynamicarray; 泛型缓冲
constructor create(dt:tdeftyp);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
destructor destroy;override;
function getcopy : tstoreddef;virtual;
procedure ppuwrite(ppufile:tcompilerppufile);virtual;
procedure buildderef;override; 建立解定义,包括泛型
procedure buildderefimpl;override;
procedure deref;override; 重载解定义
procedure derefimpl;override;
function size:asizeint;override; 大小
function getvardef:longint;override; var定义ID
function alignment:shortint;override; 对齐
function is_publishable : boolean;override; 可打印?
function needs_inittable : boolean;override; 需要初始化?
function rtti_mangledname(rt:trttitype):string;override; RTTI的mangled名称
function OwnerHierarchyName: string; override; 拥有者层名
function in_currentunit: boolean;
{ regvars }
function is_intregable : boolean; 通用寄存器
function is_fpuregable : boolean; 浮点寄存器
{ generics }
procedure initgeneric; 初始泛型
private
savesize : asizeuint;
end;
文件定义
tfiletyp = (ft_text,ft_typed,ft_untyped);
tfiledef = class(tstoreddef)
filetyp : tfiletyp; 文件类型
typedfiledef : tdef; 类型字段定义
typedfiledefderef : tderef; 类型字段解定义
constructor createtext; 文本文件
constructor createuntyped; 单元文件
constructor createtyped(def : tdef); 定义类型文件
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
function GetTypeName:string;override;
function getmangledparaname:string;override;
procedure setsize;
end;
变体定义
tvarianttype = (
vt_normalvariant,vt_olevariant
);
tvariantdef = class(tstoreddef)
varianttype : tvarianttype; 变体类型
constructor create(v : tvarianttype);
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
function GetTypeName:string;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function getvardef:longint;override;
procedure setsize;
function is_publishable : boolean;override;
function needs_inittable : boolean;override;
end;
类型形势定义
tformaldef = class(tstoreddef)
typed:boolean;
constructor create(Atyped:boolean);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
end;
向前定义
tforwarddef = class(tstoreddef)
tosymname : pshortstring;
forwardpos : tfileposinfo;
constructor create(const s:string;const pos:tfileposinfo);
destructor destroy;override;
function getcopy:tstoreddef;override;
function GetTypeName:string;override;
end;
未知定义
tundefineddef = class(tstoreddef)
constructor create;
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
end;
错误定义
terrordef = class(tstoreddef)
constructor create;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
function getmangledparaname : string;override;
end;
抽象指针定义
tabstractpointerdef = class(tstoreddef)
pointeddef : tdef;
pointeddefderef : tderef;
constructor create(dt:tdeftyp;def:tdef);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
指针定义
tpointerdef = class(tabstractpointerdef)
is_far : boolean;
has_pointer_math : boolean;
constructor create(def:tdef);
constructor createfar(def:tdef);
function getcopy:tstoreddef;override;
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
end;
tprocdef = class;
{ tabstractrecorddef }
抽象记录定义
tabstractrecorddef= class(tstoreddef)
objname,
objrealname : PShortString;
symtable : TSymtable;
cloneddef : tabstractrecorddef;
cloneddefderef : tderef;
objectoptions : tobjectoptions;
constructor create(const n:string; dt:tdeftyp);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
destructor destroy; override;
procedure check_forwards; virtual;
function find_procdef_bytype(pt:tproctypeoption): tprocdef;
function GetSymtable(t:tGetSymtable):TSymtable;override;
function is_packed:boolean;
function RttiName: string;
{ enumerator support }
function search_enumerator_get: tprocdef; virtual;
function search_enumerator_move: tprocdef; virtual;
function search_enumerator_current: tsym; virtual;
end;
记录定义
trecorddef = class(tabstractrecorddef)
public
isunion : boolean;
constructor create(const n:string; p:TSymtable);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
function size:asizeint;override;
function alignment : shortint;override;
function padalignment: shortint;
function GetTypeName:string;override;
{ debug }
function needs_inittable : boolean;override;
end;
对象定义
tobjectdef = class(tabstractrecorddef)
private
fcurrent_dispid: longint; 当前类型ID
public
dwarf_struct_lab : tasmsymbol; dwarf的LABLE结构符号
childof : tobjectdef; 子对象定义
childofderef : tderef; 子对象解定义
{ for Object Pascal helpers }
extendeddef : tdef; 扩展定义
extendeddefderef: tderef; 扩展解定义
{ for C++ classes: name of the library this class is imported from }
import_lib, 导入lib,objective-c扩展名
{ for Objective-C: protocols and classes can have the same name there }
objextname : pshortstring;
{ to be able to have a variable vmt position }
{ and no vmt field for objects without virtuals }
vmtentries : TFPList; vmt列表
vmcallstaticinfo : pmvcallstaticinfo;
vmt_offset : longint; vmt偏移
objecttype : tobjecttyp; 对象类型
iidguid : pguid; guid
iidstr : pshortstring; guid字符串
writing_class_record_dbginfo, 是否写入类或记录调试信息stabs
{ a class of this type has been created in this module }
created_in_current_module,
{ a loadvmtnode for this class has been created in this
module, so if a classrefdef variable of this or a parent
class is used somewhere to instantiate a class, then this
class may be instantiated
}
maybe_created_in_current_module,
{ a "class of" this particular class has been created in
this module
}
classref_created_in_current_module : boolean;
{ store implemented interfaces defs and name mappings }
ImplementedInterfaces : TFPObjectList;
constructor create(ot:tobjecttyp;const n:string;c:tobjectdef);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
procedure buildderef;override;
procedure deref;override;
procedure buildderefimpl;override;
procedure derefimpl;override;
procedure resetvmtentries;
procedure copyvmtentries(objdef:tobjectdef);
function getparentdef:tdef;override;
function size : asizeint;override;
function alignment:shortint;override;
function vmtmethodoffset(index:longint):longint;
function members_need_inittable : boolean;
function find_implemented_interface(aintfdef:tobjectdef):TImplementedInterface;
{ this should be called when this class implements an interface }
procedure prepareguid;
function is_publishable : boolean;override;
function is_related(d : tdef) : boolean;override;
function needs_inittable : boolean;override;
function rtti_mangledname(rt:trttitype):string;override;
function vmt_mangledname : string;
procedure check_forwards; override;
procedure insertvmt;
procedure set_parent(c : tobjectdef);
function find_destructor: tprocdef;
function implements_any_interfaces: boolean;
{ dispinterface support }
function get_next_dispid: longint;
{ enumerator support }
function search_enumerator_get: tprocdef; override;
function search_enumerator_move: tprocdef; override;
function search_enumerator_current: tsym; override;
{ WPO }
procedure register_created_object_type;override;
procedure register_maybe_created_object_type;
procedure register_created_classref_type;
procedure register_vmt_call(index:longint);
{ ObjC }
procedure finish_objc_data;
function check_objc_types: boolean;
{ C++ }
procedure finish_cpp_data;
end;
类型定义
tclassrefdef = class(tabstractpointerdef)
constructor create(def:tdef);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function getcopy:tstoreddef;override;
function GetTypeName:string;override;
function is_publishable : boolean;override;
function rtti_mangledname(rt:trttitype):string;override;
procedure register_created_object_type;override;
end;
数组定义
tarraydef = class(tstoreddef)
lowrange,
highrange : asizeint;
rangedef : tdef;
rangedefderef : tderef;
arrayoptions : tarraydefoptions;
symtable : TSymtable;
protected
_elementdef : tdef;
_elementdefderef : tderef;
procedure setelementdef(def:tdef);
public
function elesize : asizeint;
function elepackedbitsize : asizeint;
function elecount : asizeuint;
constructor create_from_pointer(def:tdef);
constructor create(l,h:asizeint;def:tdef);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy; override;
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
function getmangledparaname : string;override;
procedure buildderef;override;
procedure deref;override;
function size : asizeint;override;
function alignment : shortint;override;
{ returns the label of the range check string }
function needs_inittable : boolean;override;
property elementdef : tdef read _elementdef write setelementdef;
function is_publishable : boolean;override;
end;
序数定义
torddef = class(tstoreddef)
low,high : TConstExprInt;
ordtype : tordtype;
constructor create(t : tordtype;v,b : TConstExprInt);
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function is_publishable : boolean;override;
function GetTypeName:string;override;
function alignment:shortint;override;
procedure setsize;
function packedbitsize: asizeint; override;
function getvardef : longint;override;
end;
浮点定义
tfloatdef = class(tstoreddef)
floattype : tfloattype;
constructor create(t : tfloattype);
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetTypeName:string;override;
function is_publishable : boolean;override;
function alignment:shortint;override;
procedure setsize;
function getvardef:longint;override;
end;
抽象过程定义
tabstractprocdef = class(tstoreddef)
{ saves a definition to the return type }
returndef : tdef;
returndefderef : tderef;
parast : TSymtable;
paras : tparalist;
proctypeoption : tproctypeoption;
proccalloption : tproccalloption;
procoptions : tprocoptions;
callerargareasize,
calleeargareasize: pint;
{ number of user visibile parameters }
maxparacount,
minparacount : byte;
{$ifdef m68k}
exp_funcretloc : tregister; { explicit funcretloc for AmigaOS }
{$endif}
funcretloc : array[tcallercallee] of TCGPara;
has_paraloc_info : tcallercallee; { paraloc info is available }
constructor create(dt:tdeftyp;level:byte);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
procedure calcparas;
function typename_paras(showhidden:boolean): string;
function is_methodpointer:boolean;virtual;
function is_addressonly:boolean;virtual;
function no_self_node:boolean;
procedure check_mark_as_nested;
procedure init_paraloc_info(side: tcallercallee);
function stack_tainting_parameter(side: tcallercallee): boolean;
private
procedure count_para(p:TObject;arg:pointer);
procedure insert_para(p:TObject;arg:pointer);
end;
过程定义
tprocvardef = class(tabstractprocdef)
constructor create(level:byte);
constructor ppuload(ppufile:tcompilerppufile);
function getcopy : tstoreddef;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function GetSymtable(t:tGetSymtable):TSymtable;override;
function size : asizeint;override;
function GetTypeName:string;override;
function is_publishable : boolean;override;
function is_methodpointer:boolean;override;
function is_addressonly:boolean;override;
function getmangledparaname:string;override;
end;
可存储符号
tstoredsym = class(tsym)
public
constructor create(st:tsymtyp;const n : string);
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);virtual;
end;
标签符号
tlabelsym = class(tstoredsym)
used,
defined,
nonlocal : boolean;
{ points to the matching node, only valid resultdef pass is run and
the goto<->label relation in the node tree is created, should
be a tnode }
code : pointer;
{ points to the jump buffer }
jumpbuf : tstoredsym;
{ when the label is defined in an asm block, this points to the
generated asmlabel }
asmblocklabel : tasmlabel;
constructor create(const n : string);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function mangledname:string;override;
end;
单元符号
tunitsym = class(Tstoredsym)
module : tobject; { tmodule }
constructor create(const n : string;amodule : tobject);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
错误符号
terrorsym = class(Tsym)
constructor create;
end;
过程符号
tprocsym = class(tstoredsym)
protected
FProcdefList : TFPObjectList;
FProcdefDerefList : TFPList;
public
constructor create(const n : string);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
{ writes all declarations except the specified one }
procedure write_parameter_lists(skipdef:tprocdef);
{ tests, if all procedures definitions are defined and not }
{ only forward }
procedure check_forward;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
function find_procdef_bytype(pt:Tproctypeoption):Tprocdef;
function find_procdef_bypara(para:TFPObjectList;retdef:tdef;cpoptions:tcompare_paras_options):Tprocdef;
function find_procdef_byoptions(ops:tprocoptions): Tprocdef;
function find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
function find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
function find_procdef_enumerator_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
property ProcdefList:TFPObjectList read FProcdefList;
end;
类型符号
ttypesym = class(Tstoredsym)
typedef : tdef;
typedefderef : tderef;
constructor create(const n : string;def:tdef);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
抽象var符号
tabstractvarsym = class(tstoredsym)
varoptions : tvaroptions;
notifications : Tlinkedlist;
varspez : tvarspez; { sets the type of access }
varregable : tvarregable;
varstate : tvarstate;
{ Has the address of this variable potentially escaped the }
{ block in which is was declared? }
{ could also be part of tabstractnormalvarsym, but there's }
{ one byte left here till the next 4 byte alignment }
addr_taken : boolean;
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
function getsize : asizeint;
function getpackedbitsize : longint;
function is_regvar(refpara: boolean):boolean;
procedure trigger_notifications(what:Tnotification_flag);
function register_notification(flags:Tnotification_flags;
callback:Tnotification_callback):cardinal;
procedure unregister_notification(id:cardinal);
private
_vardef : tdef;
vardefderef : tderef;
procedure setvardef(def:tdef);
public
property vardef: tdef read _vardef write setvardef;
end;
字段var符号
tfieldvarsym = class(tabstractvarsym)
fieldoffset : asizeint; { offset in record/object }
objcoffsetmangledname: pshortstring; { mangled name of offset, calculated as needed }
constructor create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
function mangledname:string;override;
destructor destroy;override;
end;
抽象normalval符号
tabstractnormalvarsym = class(tabstractvarsym)
defaultconstsym : tsym;
defaultconstsymderef : tderef;
localloc : TLocation; { register/reference for local var }
initialloc : TLocation; { initial location so it can still be initialized later after the location was changed by SSA }
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
局部var符号
tlocalvarsym = class(tabstractnormalvarsym)
constructor create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
参数var符号
tparavarsym = class(tabstractnormalvarsym)
paraloc : array[tcallercallee] of TCGPara;
paranr : word; { position of this parameter }
{ in MacPas mode, "univ" parameters mean that type checking should
be disabled, except that the size of the passed parameter must
match the size of the formal parameter }
univpara : boolean;
{$ifdef EXTDEBUG}
eqval : tequaltype;
{$endif EXTDEBUG}
constructor create(const n : string;nr:word;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
静态var符号
tstaticvarsym = class(tabstractnormalvarsym)
private
_mangledname : pshortstring;
public
section : ansistring;
constructor create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor create_dll(const n : string;vsp:tvarspez;def:tdef);
constructor create_C(const n,mangled : string;vsp:tvarspez;def:tdef);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
function mangledname:string;override;
procedure set_mangledname(const s:string);
end;
绝对var符号
tabsolutevarsym = class(tabstractvarsym)
public
abstyp : absolutetyp;
{$ifdef i386}
absseg : boolean;
{$endif i386}
asmname : pshortstring;
addroffset : aword;
ref : tpropaccesslist;
constructor create(const n : string;def:tdef);
constructor create_ref(const n : string;def:tdef;_ref:tpropaccesslist);
destructor destroy;override;
constructor ppuload(ppufile:tcompilerppufile);
procedure buildderef;override;
procedure deref;override;
function mangledname : string;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
属性符号
tpropaccesslisttypes=(palt_none,palt_read,palt_write,palt_stored);
tpropertysym = class(Tstoredsym)
propoptions : tpropertyoptions;
overriddenpropsym : tpropertysym;
overriddenpropsymderef : tderef;
propdef : tdef;
propdefderef : tderef;
indexdef : tdef;
indexdefderef : tderef;
index,
default : longint;
dispid : longint;
propaccesslist: array[tpropaccesslisttypes] of tpropaccesslist;
constructor create(const n : string);
destructor destroy;override;
constructor ppuload(ppufile:tcompilerppufile);
function getsize : asizeint;
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
常量符号
tconstvalue = record
case integer of
0: (valueord : tconstexprint);
1: (valueordptr : tconstptruint);
2: (valueptr : pointer; len : longint);
end;
tconstsym = class(tstoredsym)
constdef : tdef;
constdefderef : tderef;
consttyp : tconsttyp;
value : tconstvalue;
constructor create_ord(const n : string;t : tconsttyp;v : tconstexprint;def:tdef);
constructor create_ordptr(const n : string;t : tconsttyp;v : tconstptruint;def:tdef);
constructor create_ptr(const n : string;t : tconsttyp;v : pointer;def:tdef);
constructor create_string(const n : string;t : tconsttyp;str:pchar;l:longint);
constructor create_wstring(const n : string;t : tconsttyp;pw:pcompilerwidestring);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure buildderef;override;
procedure deref;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
枚举符号
tenumsym = class(Tstoredsym)
value : longint;
definition : tenumdef;
definitionderef : tderef;
constructor create(const n : string;def : tenumdef;v : longint);
constructor ppuload(ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
procedure deref;override;
end;
系统符号
tsyssym = class(Tstoredsym)
number : longint;
constructor create(const n : string;l : longint);
constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;