summaryrefslogtreecommitdiff
path: root/compiler/export.pas
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-03-24 16:55:05 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-03-24 16:55:05 +0000
commitf01afaceaa6d46b986dd81a528ba9e6120d119cf (patch)
tree882e69d35235c146a5f4ddb42ec658d09e68e526 /compiler/export.pas
parent613c327c6d9f1447bb627544e4c4e07cb7ababf8 (diff)
downloadfpc-f01afaceaa6d46b986dd81a528ba9e6120d119cf.tar.gz
* factored unix exports handling from t_bsd and t_linux into expunix unit
(todo: at least solaris, maybe others) * changed the "exports" section handling: a) make everything private which is not exported (implemented for darwin and linux) b) for the exported symbols: - functions/procedures 1) if no name or index is provided, and if the procedure has aliases defined via the public/export directives, then export the default mangled name and all defined aliases 2) otherwise if no name is specified (but there is an index) then i) if the procedure is defined as cdecl/cppdecl/mwpascal, use the appropriately mangled version of the function name ii) otherwise export the name without any mangling(e.g. "exports proc1" -> proc1 is the exported name) - variables 1) if no name is provided and the variable was specified as cvar, use the mangled name 2) otherwise if no name is provided, export the name without any mangling -> initialization/finalization of shared libraries under Linux works again (mantis #7838) -> sharing symbols between shared library and main program works under Linux (mantis #9089) git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@10551 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/export.pas')
-rw-r--r--compiler/export.pas87
1 files changed, 85 insertions, 2 deletions
diff --git a/compiler/export.pas b/compiler/export.pas
index a585cf9bea..3df578a4f9 100644
--- a/compiler/export.pas
+++ b/compiler/export.pas
@@ -28,8 +28,8 @@ interface
uses
cutils,cclasses,
systems,
- symtype,
- aasmbase;
+ symtype,symdef,symsym,
+ aasmbase,aasmdata;
const
{ export options }
@@ -51,6 +51,8 @@ type
texportlib=class
private
notsupmsg : boolean;
+ finitname,
+ ffininame : string;
procedure NotSupported;
public
constructor Create;virtual;
@@ -59,10 +61,23 @@ type
procedure exportprocedure(hp : texported_item);virtual;
procedure exportvar(hp : texported_item);virtual;
procedure generatelib;virtual;
+ procedure setinitname(list: TAsmList; const s: string); virtual;
+ procedure setfininame(list: TAsmList; const s: string); virtual;
+
+ property initname: string read finitname;
+ property fininame: string read ffininame;
end;
TExportLibClass=class of TExportLib;
+
+ procedure exportprocsym(sym: tsym; const s : string; index: longint; options: word);
+ procedure exportvarsym(sym: tsym; const s : string; index: longint; options: word);
+
+ procedure exportallprocdefnames(sym: tprocsym; pd: tprocdef; options: word);
+ procedure exportallprocsymnames(ps: tprocsym; options: word);
+
+
var
CExportLib : array[tsystem] of TExportLibClass;
ExportLib : TExportLib;
@@ -80,6 +95,63 @@ uses
TExported_procedure
****************************************************************************}
+procedure exportprocsym(sym: tsym; const s : string; index: longint; options: word);
+ var
+ hp : texported_item;
+ begin
+ hp:=texported_item.create;
+ hp.name:=stringdup(s);
+ hp.sym:=sym;
+ hp.options:=options or eo_name;
+ hp.index:=index;
+ exportlib.exportprocedure(hp);
+ end;
+
+
+procedure exportvarsym(sym: tsym; const s : string; index: longint; options: word);
+ var
+ hp : texported_item;
+ begin
+ hp:=texported_item.create;
+ hp.name:=stringdup(s);
+ hp.sym:=sym;
+ hp.is_var:=true;
+ hp.options:=options or eo_name;
+ hp.index:=index;
+ exportlib.exportvar(hp);
+ end;
+
+
+ procedure exportallprocdefnames(sym: tprocsym; pd: tprocdef; options: word);
+ var
+ item: TCmdStrListItem;
+ begin
+ exportprocsym(sym,pd.mangledname,0,options);
+ { walk through all aliases }
+ item:=TCmdStrListItem(pd.aliasnames.first);
+ while assigned(item) do
+ begin
+ { avoid duplicate entries, sometimes aliasnames contains the mangledname }
+ if item.str<>pd.mangledname then
+ exportprocsym(sym,item.str,0,options);
+ item:=TCmdStrListItem(item.next);
+ end;
+ end;
+
+
+ procedure exportallprocsymnames(ps: tprocsym; options: word);
+ var
+ i: longint;
+ begin
+ for i:= 0 to ps.ProcdefList.Count-1 do
+ exportallprocdefnames(ps,tprocdef(ps.ProcdefList[i]),options);
+ end;
+
+
+{****************************************************************************
+ TExported_procedure
+****************************************************************************}
+
constructor texported_item.Create;
begin
inherited Create;
@@ -148,6 +220,17 @@ begin
end;
+procedure texportlib.setinitname(list: TAsmList; const s: string);
+begin
+ finitname:=s;
+end;
+
+
+procedure texportlib.setfininame(list: TAsmList; const s: string);
+begin
+ ffininame:=s;
+end;
+
{*****************************************************************************
Init/Done
*****************************************************************************}