[challenge] Linker surgery
Dmitry Olshansky
dmitry.olsh at gmail.com
Tue May 14 07:59:22 PDT 2013
The gist of the matter is I have module with some immutable tables.
Quite some I should say (Unicode stuff). This gives the outline of problem:
imutable Something tableA = ...; //~4-8Kb
...
imutable Something tableZ = ...; //~4-8Kb
Now I have a set of functions that make use of each of these tables:
bool funcA(dchar ch){
//optional ... extra logic
return tableA[ch];
}
...
bool funcZ(dchar ch){ ... }
Now is the challenge is how do I make it NOT link in tables if I don't
call the corresponding functions.
First try fails:
bool funcA(dchar ch){
//this just allocates!
immutable tableA = [ ... ];
//sadly this appears in the map file
static immutable tableA = [ ... ];
}
For the moment this what I found to 'work' :
template funcA(){
immutable tableA = [ ... ];
bool funcA(dchar ch){
...
}
}
Otherwise the table is present regardless of whether or not I make use
of funcA. The above is a neat hack but I think there must be a better
way to avoid pulling globals into executable.
In the test sample below 'fable' is present in the map file, foo itself
is correctly absent.
//module
// should be changed somehow so as not to put fable into exe when foo
// is not referenced, with no templates involved
module mod;
immutable byte[] fable = [1, 2, 3, 4, 5];
public byte foo(int ch){
return fable[ch];
}
//driver
import mod;
immutable byte[] bable = [1, 2, 3, 4, 5];
byte boo(int ch){
return bable[ch];
}
void main(string[] args){
boo(0);
}
--
Dmitry Olshansky
More information about the Digitalmars-d
mailing list