Compiler: Size of generated executable file

Walter Bright newshound1 at digitalmars.com
Mon Jan 11 01:04:15 PST 2010


bearophile wrote:
> Sean Kelly:
>> I guess this is different than --gc-sections or whatever the ld
>> flag is?<
> 
> I don't remember what --gc-sections is, but I guess it's something
> different. The code removed during the LTO is for example unreachable
> functions, or functions/methods, that once inlined are called from
> nowhere else, unused constants, etc. Here you can see an example on C
> code (in D1 it's the same): 
> http://llvm.org/docs/LinkTimeOptimization.html Anyway, currently the
> LDC project is mostly sleeping.

Optlink does this too. It's oooollldd technology, been around since the 
80's. Consider the following program:

========================
int x;
void foo() { x++; }
int main() { return 0; }
========================

Compile it,

     dmd foo -L/map

and let's have a look at the object file (cut down for brevity):

========================
_D3foo3fooFZv   comdat
         assume  CS:_D3foo3fooFZv
                 mov     EAX,FS:__tls_array
                 mov     ECX,[EAX]
                 inc     dword ptr _D3foo1xi[ECX]
                 ret
_D3foo3fooFZv   ends
__Dmain comdat
         assume  CS:__Dmain
                 xor     EAX,EAX
                 ret
__Dmain ends
=========================

Now look at the map file with:

     grep foo foo.map

=========================
  0004:00000090       _D3foo12__ModuleInfoZ      00434090
  0003:00000004       _D3foo1xi                  00433004
  0003:00000004       _D3foo1xi                  00433004
  0004:00000090       _D3foo12__ModuleInfoZ      00434090
=========================

and we see that _D3foo3fooFZv does not appear in it. Optlink does this 
by default, you don't even have to throw a switch.



More information about the Digitalmars-d mailing list