www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 2254] New: Size of executable almost triples

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254

           Summary: Size of executable almost triples
           Product: D
           Version: 1.032
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: StefanLiebig web.de


I recently had to fix a little bug in an D application (win32). I thought that
it would also be a good idea to upgrade to the most current version of the D
compiler.
When upgrading to 1.033 from 1.025 the executable size almost tripled from 227
kb to 603 kb! After building with all version from 1.025 up I found that this
phenomenon occurs when switching from 1.031 to 1.032. I did not change the
compiler options (-release, -o) when building with several dmd versions.
I saw the many changes/bugfixes from 1.031 to 1.032. However, can that explain
this behaviour?


-- 
Jul 29 2008
next sibling parent "Koroskin Denis" <2korden gmail.com> writes:
On Wed, 30 Jul 2008 10:21:57 +0400, <d-bugmail puremagic.com> wrote:

 I saw the many changes/bugfixes from 1.031 to 1.032. However, can that  
 explain
 this behaviour?
Yes, every fixed bug increases your executable size by 5% <g>
Jul 30 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


torhu yahoo.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |torhu yahoo.com





1.032 is the first version where phobos.lib is built using the new -lib switch.
 That seems the likely culprit.

http://www.dsource.org/projects/phobos/changeset/811

I tried building hello world tests with dmd 1.031 and 1.032 to see the size
differences:

Hello world with writefln (import std.stdio):
1.031: 114.4 k
1.032: 269.5 k

Hello world with printf (no imports):
1.031: 78.0 k
1.032: 121.5 k


So something bad definitely happened between 1.031 and 1.032.  Now, if someone
could be bothered to try building phobos 1.032 without the -lib switch and
compare, that would be great.


-- 
Aug 05 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254






Comparing the two map files shows the difference comes from the first line:
 0002:00000000 000193FBH  _TEXT                  CODE 32-bit
vs
 0002:00000000 0000CC9BH  _TEXT                  CODE 32-bit


-- 
Aug 06 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254







 So something bad definitely happened between 1.031 and 1.032.  Now, if someone
 could be bothered to try building phobos 1.032 without the -lib switch and
 compare, that would be great.
Yep, that did the trick. I've used the v1.031 makefile to build phobos from v1.032, using v1.032. Both phobos.lib and the built .exe file have the size from v1.031. It's definately the -lib switch that's causing the bloat. --
Aug 06 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254






I rebuilt my application with DMD 1.034 (where it should have been fixed) and
it has the same effect as before. It still triples. Can someone (maybe
torhu yahoo.com) check that.


-- 
Aug 13 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254






i can confirm that it even grew again from 2.017 to 2.018


-- 
Aug 13 2008
prev sibling next sibling parent reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


bugzilla digitalmars.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED





Fixed dmd 1.034 and 2.018


-- 
Aug 14 2008
parent Aarti_pl <aarti interia.pl> writes:
d-bugmail puremagic.com pisze:
 http://d.puremagic.com/issues/show_bug.cgi?id=2254
 
 
 bugzilla digitalmars.com changed:
 
            What    |Removed                     |Added
 ----------------------------------------------------------------------------
              Status|NEW                         |RESOLVED
          Resolution|                            |FIXED
 
 
 
 

 Fixed dmd 1.034 and 2.018
 
 
In which way is that fixed while there are reports in this ticked, after release of 2.018, that it's not fixed? Probably you missed these comments... BR Marcin Kuszczak (aarti_pl)
Aug 14 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


torhu yahoo.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
         Resolution|FIXED                       |






are the same or slightly larger.

I'm not sure what fix Walter has made, but the original issue is still there.


-- 
Aug 14 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254






I just want to comment: The more symbols, the more exports you have...the more
file size you get. What i hate the most is that when you execute your program
it takes even more memory.

I did a simple Direct3D program that initialize device and shows absolutely no
stuff, just a blank screen. This program uses 9.5 MB in memory, and it does
nothing!


-- 
Feb 16 2009
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Heinz Traub <malagana15 yahoo.es> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |malagana15 yahoo.es



---
This issue still persist even in the latest versions (it gets more serious with
every new version, file size grows even more).

I think this is THE bug that prevents newer versions to become the most stable
ones in the download page (1.030 has been for a long time) and this bug has
been reported a long time ago.

I've been thinking in dropping development for now. We are developing a
commercial game engine, we use newer versions of DMD1 because it solves many
issues that were bothering us, we are fine coding and very happy using D
templates but running the engine...it's counter productive, it's using excesive
system memory and we're gonna need a huge distribution media if it keeps like
this.

Walter, i hope you read this, you're the most adecuate person to solve this.
This issue must be addresed now before it compromises the DMD development
achieved so far.

I found out one more thing, one more symptom:
Create the most basic hello world program and compile it. Check how large the
file is.
Now, import as many phobos modules as you can. Don't use any module! just
import them. Do this with about 8 modules. Compile and recheck file size...it
grews in an extreme manner and not even using new symbols.

That's it. All i can do is report and i hope this post change something. Thanxs
in advance.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Sep 12 2009
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




Since I assume this is a long-term bug now that wrapping up D 2 has the main
focus, I'll post some tips and tricks.

If you are using D 1, you'll probably have better luck with Tango.  A hello
world program built with Tango is about half the size.  If you really want to


I wonder what platform you're on if saving a few hundred kB of disk space is
important, though.

When that's said, if you use other libraries written in D, make sure you build
in one of two ways:

A) Build everything in one go, don't use .lib files.  Except for tango/phobos
and C libs.  This means using a build tool or script that hands all files to
dmd at once.  Very fast and simple build process.  Supported by
xfbuild/bud/dsss build tools.

B) Build .lib files of your library dependencies first, by handing one file at
a time to dmd, then running lib.exe to create a .lib file.  Supported by DSSS,
and possibly xfbuild.  Or you could use a makefile or whatever you prefer.

The *WRONG* way to build is as follows:

C) Build .lib files by handing all files to dmd at once.  Then build your app
(any way you like) and link to those .lib files.  Unless your exe uses
absolutely everyting defined in those libs, this causes a bloated executable. 
You end up getting more then a wanted, because this way of building causes fake
dependencies between modules.


If you want try A, I suggest having a look at xfbuild, it's very fast and
flexible.  Ask in the newsgroup D.learn if you need help with setting it all
up.
http://bitbucket.org/h3r3tic/xfbuild/wiki/Home

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 22 2009
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug yahoo.com.au
           Severity|major                       |regression


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 23 2009
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




PST ---
The D app is used in production, so rebuilding with tango and/or D2 is simply
too risky. And yes, in our scenario size matters because the application gets
deployed and updated via the internet.
For DSL that wouldn´t be a problem but there are a lot of users that have
slower connecions e.g. GPRS mobile connections.

However, thanks for the advice of building the app without the lib - plan A
I will give it a try.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 28 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




This problem has just worsened in the last two releases of D2.
Executable size of writefln("Hello world"); by version is:
1.00->1.031: 100K-113K.
1.032: 276K
1.034 and later: 324K-340K.

2.00-2.025: 114K-130K
2.027: 189K
2.030-2.047: 217K - 230K
2.048: 264K
2.049: 305K

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Sep 19 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




---
Please vote for this issue. It may give a higher priority and Walter might take
a look at this long term bug.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 04 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


nfxjfg gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |nfxjfg gmail.com



Those who are affected by this, be sure to check bug 4767.
Can pull in unrelated and unused modules from the standard library.
There's also bug 3214 which can double the size of debug executables.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 04 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Steven Schveighoffer <schveiguy yahoo.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |schveiguy yahoo.com



06:22:02 PST ---
I just discovered some interesting results when compiling with -lib and
unittests.

See bug 5660.

-lib definitely needs some work.  I hope this is something easy to fix, because
the perception is not good for outsiders.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 11 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




13:30:20 PST ---

...
 See bug 5660.
Since bug 5660 doesn't exist (yet), I assume you mean bug 5560. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 11 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




14:40:13 PST ---


 ...
 See bug 5660.
Since bug 5660 doesn't exist (yet), I assume you mean bug 5560.
Yes, thank you (wishes for comment editing...) -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 11 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Kuan Hsu <nagahiro.kyo gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |nagahiro.kyo gmail.com



---



 ...
 See bug 5660.
Since bug 5660 doesn't exist (yet), I assume you mean bug 5560.
Yes, thank you (wishes for comment editing...)

 So something bad definitely happened between 1.031 and 1.032.  Now, if someone
 could be bothered to try building phobos 1.032 without the -lib switch and
 compare, that would be great.
Yep, that did the trick. I've used the v1.031 makefile to build phobos from v1.032, using v1.032. Both phobos.lib and the built .exe file have the size from v1.031. It's definately the -lib switch that's causing the bloat.
Using V1.030's phobos.lib instead of V1.066, the "hello world" exe size is 116KB, so the issue is all about phobos.lib Using V1.068, the original size of phobos.lib is 1545KB, trying rewrite win32.mak(using lib.exe to make phobos.lib) to get new phobos.lib is 951KB, the "hello world" exe size is 123KB -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 14 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Heywood Floyd <soul8o8 gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |soul8o8 gmail.com



---
Hello world on Darwin with writefln(), -release:
1.068:  272 kb
2.053:  954 kb (!)

Hello world on Darwin with writefln(), -release, strip:
1.068:  252 kb
2.053:  894 kb (!)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




04:12:57 PDT ---
Created an attachment (id=981)
Size of phobos.lib across D1 versions

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




05:51:19 PDT ---
Created an attachment (id=982)
Size of "Hello, world" .exe across D1 versions

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


bearophile_hugs eml.cc changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bearophile_hugs eml.cc




 Created an attachment (id=982) [details]
 Size of "Hello, world" .exe across D1 versions
What's happened in DMD 1.032 and 1.035 to cause that size increase? Is something similar happened to DMD2 too? -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Jacob Carlborg <doob me.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |doob me.com





 Created an attachment (id=982) [details] [details]
 Size of "Hello, world" .exe across D1 versions
What's happened in DMD 1.032 and 1.035 to cause that size increase? Is something similar happened to DMD2 too?
As Walter always has said, compile something and look at the map file to see what's pulled into the executable. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




14:23:23 PDT ---
Created an attachment (id=983)
Treemap of map file of D 2.053 "Hello, world"


 As Walter always has said, compile something and look at the map file to see
 what's pulled into the executable.
Map files are useless. Look at this treemap. Most functions in the large rectangles contain very little code. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




14:27:26 PDT ---
Created an attachment (id=984)
D 2.053 "Hello, world" executable opened in a file viewer

Look at this instead. There are many large areas in the executable filled with
zero bytes. If you compress the executables produced by a DMD version before
and after this regression, the compressed sizes will differ by very little.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




I suggest to compile a hello world with 1.031 and 1.032 and then compare in
some way their map files, and show the differences...

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




14:46:57 PDT ---

 I suggest to compile a hello world with 1.031 and 1.032 and then compare in
 some way their map files, and show the differences...
What do you hope to achieve by doing that? As I already said, this will not answer any questions. This is not a dependency bloat problem! How would you do this, anyway? Those old DMD versions don't even have a -map switch - the map file generated by OPTLINK by default is useless, it only lists segments. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




15:00:45 PDT ---
Created an attachment (id=985)
Side-by-side comparison of cv2pdb+dumpbin-generated map files of DMD 1.031 and
1.032 "Hello, world"

This is interesting, but for unexpected reasons: the 5K blocks of fluff have no
debugging names. Could be a cv2pdb issue, or something else.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




15:33:16 PDT ---
The problem is caused by DMD's -lib option, used since 1.032 to build Phobos.
Previous versions used the Digital Mars librarian (lib.exe).

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254






 the 5K blocks of fluff have no
 debugging names. Could be a cv2pdb issue, or something else.
Thank you for your work. From the comparison it seems those 5K blocks of fluff are the main cause of binary size increase. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




15:39:29 PDT ---
Actually, I should add that the problem might not be with DMD's -lib option.
While it certainly is a completely different method of generating phobos.lib, I
should note that:
1) The 5K-ish blocks of zeroes are not present in phobos.lib (although we do
see a size increase in the chart I attached earlier)
2) UniLink will happily link D's .obj files + phobos.lib and create an
executable without these blocks of zeroes (and much smaller size).

Thus, the problem could very well be in OPTLINK.

So, here's your workaround for the time being: use UniLink.
Someone posted the config on the NG, I'll repost it here for convenience
(ulink.cfg):

-zsnn.lib
-LC:\dmd\windows\lib
-LC:\dm\lib
-Go

Adjust paths as necessary.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




Is this only a problem on Windows?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|REOPENED                    |RESOLVED
         Resolution|                            |WORKSFORME



17:13:25 PST ---
For D1 1.073, 

  import std.stdio; void main() { writefln("hello world"); }

generates an executable sized 117,276.

For D2 2.058,

  import std.stdio; void main() { writeln("hello world"); }

generates an executable sized 146,972.

All on Windows compiled with -O -release -inline.

I think these sizes are reasonable, especially considering all that the runtime
library is expected to do (threads, gc, static construction, etc.).

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 31 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Vladimir Panteleev <thecybershadow gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|WORKSFORME                  |FIXED



05:50:31 PST ---
There are several things at play here, such as Andrei's recent efforts at
reducing cross-module dependencies in the case of "Hello, world" programs.

However, I'm not seeing the 5K-ish blocks of zero bytes that were present in
2.057. I assume that the underlying DMD -lib bug (or wherever it was) has been
fixed.


 For D2 2.058,
 
   import std.stdio; void main() { writeln("hello world"); }
 
 generates an executable sized 146,972.
For the record, UniLink generates an executable sized 134,752. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 01 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254


Denis <verylonglogin.reg gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |verylonglogin.reg gmail.com



MSD ---

 However, I'm not seeing the 5K-ish blocks of zero bytes that were present in
 2.057. I assume that the underlying DMD -lib bug (or wherever it was) has been
 fixed.
 
Looks like these blocks are related to Issue 7921. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Apr 16 2012
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2254




14:25:20 PDT ---
If you're seeing large blocks of zero bytes, make sure first that it is not
this issue:

http://dlang.org/faq.html#bss

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 16 2012