* DLL index used for win32 target with DEF file

+ DLL initialization/finalization support
This commit is contained in:
pierre 1999-11-20 01:19:10 +00:00
parent 6f95642db5
commit 8025581bfd
3 changed files with 82 additions and 34 deletions

View File

@ -74,7 +74,10 @@ unit pexports;
begin
ProcName:=hp^.sym^.name;
InternalProcName:=hp^.sym^.mangledname;
delete(InternalProcName,1,1);
{ This is wrong if the first is not
an underline }
if InternalProcName[1]='_' then
delete(InternalProcName,1,1);
if length(InternalProcName)<2 then
Message(parser_e_procname_to_short_for_export);
DefString:=ProcName+'='+InternalProcName;
@ -85,7 +88,10 @@ unit pexports;
hp^.options:=hp^.options or eo_index;
val(pattern,hp^.index,code);
consume(_INTCONST);
DefString:=ProcName+'='+InternalProcName; {Index ignored!}
if target_os.id=os_i386_win32 then
DefString:=ProcName+' @'+tostr(hp^.index)+'='+InternalProcName
else
DefString:=ProcName+'='+InternalProcName; {Index ignored!}
end;
if (idtoken=_NAME) then
begin
@ -130,7 +136,11 @@ end.
{
$Log$
Revision 1.13 1999-10-26 12:30:44 peter
Revision 1.14 1999-11-20 01:19:10 pierre
* DLL index used for win32 target with DEF file
+ DLL initialization/finalization support
Revision 1.13 1999/10/26 12:30:44 peter
* const parameter is now checked
* better and generic check if a node can be used for assigning
* export fixes

View File

@ -210,6 +210,14 @@ unit pmodules;
end;
hp:=Pused_unit(hp^.next);
end;
if current_module^.islibrary then
if (current_module^.flags and uf_finalize)<>0 then
begin
{ INIT code is done by PASCALMAIN calling }
unitinits.concat(new(pai_const,init_32bit(0)));
unitinits.concat(new(pai_const_symbol,initname('FINALIZE$$'+current_module^.modulename^)));
inc(count);
end;
{ TableCount,InitCount }
unitinits.insert(new(pai_const,init_32bit(0)));
unitinits.insert(new(pai_const,init_32bit(count)));
@ -1444,6 +1452,23 @@ unit pmodules;
codegen_doneprocedure;
{ finalize? }
if token=_FINALIZATION then
begin
{ set module options }
current_module^.flags:=current_module^.flags or uf_finalize;
{ Compile the finalize }
codegen_newprocedure;
gen_main_procsym(current_module^.modulename^+'_finalize',potype_unitfinalize,st);
names.init;
names.insert('FINALIZE$$'+current_module^.modulename^);
names.insert(target_os.cprefix+current_module^.modulename^+'_finalize');
compile_proc_body(names,true,false);
names.done;
codegen_doneprocedure;
end;
{ consume the last point }
consume(_POINT);
@ -1526,7 +1551,11 @@ unit pmodules;
end.
{
$Log$
Revision 1.168 1999-11-18 23:35:40 pierre
Revision 1.169 1999-11-20 01:19:10 pierre
* DLL index used for win32 target with DEF file
+ DLL initialization/finalization support
Revision 1.168 1999/11/18 23:35:40 pierre
* avoid double warnings
Revision 1.167 1999/11/18 15:34:47 pierre

View File

@ -1220,35 +1220,40 @@ unit pstatmnt;
end;
{Unit initialization?.}
if (lexlevel=unit_init_level) and (current_module^.is_unit) then
if (token=_END) then
begin
consume(_END);
block:=nil;
end
else
begin
if token=_INITIALIZATION then
begin
current_module^.flags:=current_module^.flags or uf_init;
block:=statement_block(_INITIALIZATION);
end
else if (token=_FINALIZATION) then
begin
if (current_module^.flags and uf_finalize)<>0 then
block:=statement_block(_FINALIZATION)
else
begin
block:=nil;
exit;
end;
end
else
begin
current_module^.flags:=current_module^.flags or uf_init;
block:=statement_block(_BEGIN);
end;
end
if (lexlevel=unit_init_level) and (current_module^.is_unit)
or islibrary then
begin
if (token=_END) then
begin
consume(_END);
block:=nil;
end
else
begin
if token=_INITIALIZATION then
begin
current_module^.flags:=current_module^.flags or uf_init;
block:=statement_block(_INITIALIZATION);
end
else if (token=_FINALIZATION) then
begin
if (current_module^.flags and uf_finalize)<>0 then
block:=statement_block(_FINALIZATION)
else
begin
{ can we allow no INITIALIZATION for DLL ??
I think it should work PM }
block:=nil;
exit;
end;
end
else
begin
current_module^.flags:=current_module^.flags or uf_init;
block:=statement_block(_BEGIN);
end;
end;
end
else
block:=statement_block(_BEGIN);
end;
@ -1318,7 +1323,11 @@ unit pstatmnt;
end.
{
$Log$
Revision 1.111 1999-11-18 15:34:48 pierre
Revision 1.112 1999-11-20 01:19:10 pierre
* DLL index used for win32 target with DEF file
+ DLL initialization/finalization support
Revision 1.111 1999/11/18 15:34:48 pierre
* Notes/Hints for local syms changed to
Set_varstate function