This is an archive of the discontinued LLVM Phabricator instance.

Enable 2 warnings on MSVC, turn on StringPooling & intrinsic functions
ClosedPublic

Authored by ariccio on Dec 26 2015, 11:39 PM.

Details

Summary

This patch passes four additional options to MSVC when building LLVM.
These four options do not generate any new warnings, and slightly improves codegen.

The four options:

The first three are straightforward, and I don't expect any controversy.

Generating intrinsic functions may be problematic if LLVM itself needs ANSI floating point conformance (I have no idea)

Diff Detail

Event Timeline

ariccio updated this revision to Diff 43648.Dec 26 2015, 11:39 PM
ariccio retitled this revision from to Enable 2 warnings on MSVC, turn on StringPooling & intrinsic functions.
ariccio updated this object.
ariccio added reviewers: chandlerc, rafael.
ariccio added a subscriber: llvm-commits.
chandlerc edited reviewers, added: rnk; removed: chandlerc.Dec 27 2015, 12:34 AM
chandlerc added a subscriber: chandlerc.

I'm certainly the wrong person to review this. I've added Reid who can probably add some of the appropriate folks that care about Windows builds of LLVM. =]

aaron.ballman edited edge metadata.Dec 27 2015, 6:38 AM

The /Zc options are good to enable -- more conformance is better. I have no opinions on /Oi, and some questions about /GF.

cmake/modules/HandleLLVMOptions.cmake
372

I think this one is reasonable, but I worry about it requiring use of /bigobj. What are the size differences for our executables with this option disabled vs enabled?

378

Should this be specified for CMAKE_C_FLAGS as well? I know MSVC doesn't really distinguish between the C and C++ compiler, but it seems a bit strange (though likely harmless).

ariccio updated this revision to Diff 43668.Dec 27 2015, 3:08 PM
ariccio edited edge metadata.

Removed /Zc:rvalueCast flag for CMAKE_C_FLAGS.

ariccio marked 2 inline comments as done.Dec 27 2015, 3:17 PM

I'm certainly the wrong person to review this

Ooops. I just saw CMake, and assumed so. Sorry!

Otherwise: comments addressed? I think I need to submit this so that my replies are submitted?

cmake/modules/HandleLLVMOptions.cmake
372

I think this one is reasonable, but I worry about it requiring use of /bigobj.

MSVC didn't complain about it in the debug build, so my guess is that this isn't a problem, but I'll compile a release build - optimizations might somehow pack more strings into a single image? - and see if it causes problems there. Can you think of any situation that might actually include more than 65,536 strings?

What are the size differences for our executables with this option disabled vs enabled?

Ok, I'm embarrassed to say it, but I don't have any data for this. LLVM just takes too long to compile for me to check the executable size for such a small patch. Is that reasonable, or should I actually compare them?

378

Whoops - I think you're right. I'm still quite new to CMake, and I instinctively copied the other "append" statements. MSDN doesn't mention any issues when passing rvalueCast while compiling as C, but it's probably safer to only pass while compiling C++.

Sidenote: the same should apply to /Zc:sizedDealloc- (which I didn't add)? MSDN doesn't actually document it, so I can't say much about it.

ariccio marked an inline comment as done.Dec 27 2015, 6:24 PM

Hmm... not entirely sure what clicking/checking "Done" does.

Did I do the right thing there?

aaron.ballman added inline comments.Dec 28 2015, 8:04 AM
cmake/modules/HandleLLVMOptions.cmake
372

I think this one is reasonable, but I worry about it requiring use of /bigobj.

MSVC didn't complain about it in the debug build, so my guess is that this isn't a problem, but I'll compile a release build - optimizations might somehow pack more strings into a single image? - and see if it causes problems there. Can you think of any situation that might actually include more than 65,536 strings?

From MSDN:

The /GF compiler option creates an addressable section for each unique string. And by default, an object file can contain up to 65,536 addressable sections. If your program contains more than 65,536 strings, use the /bigobj compiler option to create more sections.

The compiler has a lot of unique strings, which means that this option will create a lot of addressable sections. My gut feeling (not based on any research) is that our duplicate string literals are generally going to be short strings, and not repeated overly often. I would guess that our unique string literals dwarf the duplicates, and this is unlikely to have a huge size savings, but may push us over the bigobj limit.

What are the size differences for our executables with this option disabled vs enabled?

Ok, I'm embarrassed to say it, but I don't have any data for this. LLVM just takes too long to compile for me to check the executable size for such a small patch. Is that reasonable, or should I actually compare them?

You should actually compare them. When changing the compiler switches like this, you want to make sure that (1) the projects all still compile (perhaps there are code changes required to enable these flags), and (2) that check-all still runs cleanly (code could have been unintentionally relying on a particular optimization strategy, there are optimizer bugs, etc). This also lets you get the size statistics as well.

Do I have to submit a comment to "submit" an inline comment??

cmake/modules/HandleLLVMOptions.cmake
372

Before anything: (1), and (2) still pass - on my machine, two check-all tests fail before and after, because Python.exe is in a path that contains spaces.

This also lets you get the size statistics as well.

Any tips on how to get the size stats? Surely, there's a better way to do it than manually?

aaron.ballman added inline comments.Dec 29 2015, 6:19 AM
cmake/modules/HandleLLVMOptions.cmake
372

While an automated tool may exist, I am unaware of one. I would just do it manually, but I'm on Windows where the libraries are static instead of dynamic, so I would only have to look at the resulting .exe files. On other platforms, a quick and dirty script might be easiest.

1/2 stats posted...

cmake/modules/HandleLLVMOptions.cmake
372

Here's the first batch of stats. It's mostly for my own reference at the moment:

`Release build with patch:

 Directory of C:\LLVM\build\Release\bin

12/27/2015  10:24 PM    <DIR>          ..
12/27/2015  10:24 PM    <DIR>          .
12/27/2015  10:24 PM        23,004,160 LTO.dll
12/27/2015  10:21 PM        27,575,296 libclang.dll
12/27/2015  10:23 PM            11,776 c-arcmt-test.exe
12/27/2015  10:23 PM            74,240 c-index-test.exe
12/27/2015  10:24 PM        34,473,984 clang++.exe
12/27/2015  10:22 PM        28,597,248 clang-check.exe
12/27/2015  10:24 PM        34,473,984 clang-cl.exe
12/27/2015  10:23 PM         1,206,272 clang-format.exe
12/27/2015  09:26 PM           636,416 clang-tblgen.exe
12/27/2015  10:24 PM        34,473,984 clang.exe
12/27/2015  09:49 PM            10,752 count.exe
12/27/2015  10:21 PM         2,692,096 diagtool.exe
12/27/2015  09:49 PM           199,168 FileCheck.exe
12/27/2015  09:49 PM           144,384 KillTheDoctor.exe
12/27/2015  10:23 PM         5,304,832 bugpoint.exe
12/27/2015  10:21 PM        19,832,320 llc.exe
12/27/2015  09:49 PM            25,088 lli-child-target.exe
12/27/2015  10:21 PM         9,769,472 lli.exe
12/27/2015  10:21 PM        10,468,864 llvm-ar.exe
12/27/2015  10:21 PM         1,691,648 llvm-as.exe
12/27/2015  10:21 PM           165,888 llvm-bcanalyzer.exe
12/27/2015  10:21 PM        18,173,952 llvm-c-test.exe
12/27/2015  09:49 PM           103,936 llvm-config.exe
12/27/2015  10:21 PM         1,687,040 llvm-cov.exe
12/27/2015  10:23 PM         8,776,704 arcmt-test.exe
12/27/2015  10:21 PM         1,570,304 llvm-diff.exe
12/27/2015  10:22 PM         1,326,080 llvm-dis.exe
12/27/2015  10:22 PM        16,863,232 llvm-dsymutil.exe
12/27/2015  10:22 PM         1,675,264 llvm-dwarfdump.exe
12/27/2015  10:22 PM        16,630,784 llvm-dwp.exe
12/27/2015  10:22 PM         2,025,472 llvm-extract.exe
12/27/2015  10:22 PM        10,468,864 llvm-lib.exe
12/27/2015  10:22 PM         1,961,472 llvm-link.exe
12/27/2015  09:49 PM           173,568 yaml-bench.exe
12/27/2015  10:22 PM        21,027,840 llvm-lto.exe
12/27/2015  10:22 PM        11,923,968 llvm-mc.exe
12/27/2015  09:49 PM           144,384 llvm-mcmarkup.exe
12/27/2015  10:22 PM        10,464,256 llvm-nm.exe
12/27/2015  10:22 PM         9,658,880 llvm-objdump.exe
12/27/2015  10:22 PM           215,040 llvm-pdbdump.exe
12/27/2015  09:49 PM            18,432 llvm-PerfectShuffle.exe
12/27/2015  10:22 PM           325,632 llvm-profdata.exe
12/27/2015  10:22 PM        10,468,864 llvm-ranlib.exe
12/27/2015  10:22 PM         1,805,824 llvm-readobj.exe
12/27/2015  10:23 PM         8,293,888 llvm-rtdyld.exe
12/27/2015  10:23 PM         1,575,936 llvm-size.exe
12/27/2015  10:23 PM         1,929,728 llvm-split.exe
12/27/2015  10:23 PM         1,341,440 llvm-stress.exe
12/27/2015  10:23 PM         1,714,176 llvm-symbolizer.exe
12/27/2015  09:26 PM         1,300,992 llvm-tblgen.exe
12/27/2015  10:21 PM         1,580,544 llvm-cxxdump.exe
12/27/2015  09:49 PM            52,224 not.exe
12/27/2015  10:23 PM         1,660,928 obj2yaml.exe
12/27/2015  10:23 PM        19,069,952 opt.exe
12/27/2015  10:23 PM         9,402,368 sancov.exe
12/27/2015  10:23 PM         1,809,920 verify-uselistorder.exe
12/27/2015  10:23 PM           352,256 yaml2obj.exe
              58 File(s)    432,407,697 bytes
               2 Dir(s)  37,355,769,856 bytes free






Debug build with patch:

 Directory of C:\LLVM\build\Debug\bin

12/28/2015  06:56 PM    <DIR>          ..
12/28/2015  06:56 PM    <DIR>          .
12/27/2015  04:08 AM        87,031,808 libclang.dll
12/27/2015  04:17 AM        57,349,120 LTO.dll
12/27/2015  04:14 AM         1,549,824 yaml2obj.exe
12/27/2015  04:14 AM         1,019,392 yaml-bench.exe
12/27/2015  04:04 AM        23,538,688 bugpoint.exe
12/27/2015  04:11 AM         7,152,128 verify-uselistorder.exe
12/27/2015  04:10 AM        19,379,712 sancov.exe
12/27/2015  04:10 AM            39,424 c-arcmt-test.exe
12/27/2015  04:11 AM        52,358,144 opt.exe
12/27/2015  04:10 AM         7,360,512 obj2yaml.exe
12/27/2015  04:10 AM           159,232 c-index-test.exe
12/27/2015  04:10 AM           783,360 not.exe
12/27/2015  04:16 AM        35,772,416 arcmt-test.exe
12/27/2015  04:15 AM       102,623,232 clang++.exe
12/27/2015  04:14 AM        82,458,624 clang-check.exe
12/27/2015  02:39 AM         6,316,032 llvm-tblgen.exe
12/27/2015  04:10 AM         7,760,384 llvm-symbolizer.exe
12/27/2015  04:15 AM       102,623,232 clang-cl.exe
12/27/2015  04:14 AM         4,243,456 clang-format.exe
12/28/2015  01:15 AM            77,312 a.exe
12/27/2015  04:10 AM         9,785,344 llvm-split.exe
12/27/2015  02:39 AM         2,542,080 clang-tblgen.exe
12/27/2015  04:09 AM         6,902,272 llvm-size.exe
12/27/2015  04:09 AM        19,422,208 llvm-rtdyld.exe
12/27/2015  04:14 AM       102,623,232 clang.exe
12/27/2015  04:09 AM         7,448,064 llvm-readobj.exe
12/27/2015  04:09 AM        25,309,184 llvm-ranlib.exe
12/27/2015  04:17 AM            37,888 count.exe
12/27/2015  04:09 AM         5,266,432 llvm-profdata.exe
12/24/2015  04:17 PM            86,016 llvm-PerfectShuffle.exe
12/27/2015  04:18 AM        28,745,728 diagtool.exe
12/27/2015  04:07 AM         1,226,752 llvm-pdbdump.exe
12/27/2015  04:25 AM        19,498,496 llvm-objdump.exe
12/27/2015  04:09 AM         1,027,584 FileCheck.exe
12/27/2015  04:24 AM        25,182,720 llvm-nm.exe
12/27/2015  04:24 AM           848,384 llvm-mcmarkup.exe
12/24/2015  05:42 PM           837,120 KillTheDoctor.exe
12/27/2015  04:23 AM        28,077,056 llvm-mc.exe
12/27/2015  04:24 AM        54,491,136 llvm-lto.exe
12/24/2015  05:41 PM         5,568,512 llvm-stress.exe
12/27/2015  04:23 AM         8,723,456 llvm-link.exe
12/27/2015  04:22 AM        25,309,184 llvm-lib.exe
12/27/2015  04:19 AM        50,145,792 llc.exe
12/27/2015  04:23 AM         9,079,808 llvm-extract.exe
12/27/2015  04:22 AM        44,934,144 llvm-dwp.exe
12/27/2015  04:19 AM           796,160 lli-child-target.exe
12/27/2015  04:21 AM         7,410,688 llvm-dwarfdump.exe
12/27/2015  04:22 AM        45,424,128 llvm-dsymutil.exe
12/27/2015  04:19 AM        30,037,504 lli.exe
12/27/2015  04:21 AM         5,511,168 llvm-dis.exe
12/27/2015  04:21 AM         6,457,344 llvm-diff.exe
12/27/2015  04:06 AM        25,309,184 llvm-ar.exe
12/27/2015  04:20 AM         7,239,680 llvm-cxxdump.exe
12/27/2015  04:20 AM         7,549,440 llvm-cov.exe
12/27/2015  04:19 AM         6,613,504 llvm-as.exe
12/27/2015  04:20 AM           906,752 llvm-config.exe
12/27/2015  04:20 AM        45,832,704 llvm-c-test.exe
12/27/2015  04:19 AM           954,880 llvm-bcanalyzer.exe
             165 File(s)  9,042,836,639 bytes
               2 Dir(s)  37,355,757,568 bytes free





MinSizeRel build with patch:

 Directory of C:\LLVM\build\MinSizeRel\bin

12/29/2015  06:13 PM    <DIR>          ..
12/29/2015  06:13 PM    <DIR>          .
12/29/2015  06:13 PM        20,252,672 LTO.dll
12/29/2015  06:09 PM        23,375,872 libclang.dll
12/29/2015  06:13 PM            11,776 c-arcmt-test.exe
12/29/2015  06:13 PM            66,048 c-index-test.exe
12/29/2015  06:13 PM        28,572,160 clang++.exe
12/29/2015  06:12 PM        24,158,720 clang-check.exe
12/29/2015  06:13 PM        28,572,160 clang-cl.exe
12/29/2015  06:13 PM         1,018,880 clang-format.exe
12/29/2015  05:49 PM           407,552 clang-tblgen.exe
12/29/2015  06:13 PM        28,572,160 clang.exe
12/29/2015  06:11 PM            10,752 count.exe
12/29/2015  06:11 PM         2,249,216 diagtool.exe
12/29/2015  06:11 PM           156,672 FileCheck.exe
12/29/2015  06:13 PM           116,736 KillTheDoctor.exe
12/29/2015  06:13 PM         4,231,680 bugpoint.exe
12/29/2015  06:11 PM        17,424,384 llc.exe
12/29/2015  06:11 PM            24,064 lli-child-target.exe
12/29/2015  06:11 PM         8,465,920 lli.exe
12/29/2015  06:10 PM        10,067,968 llvm-ar.exe
12/29/2015  06:11 PM         1,654,272 llvm-as.exe
12/29/2015  06:11 PM           133,120 llvm-bcanalyzer.exe
12/29/2015  06:11 PM        16,116,736 llvm-c-test.exe
12/29/2015  06:11 PM            88,576 llvm-config.exe
12/29/2015  06:11 PM         1,691,648 llvm-cov.exe
12/29/2015  06:13 PM         6,784,512 arcmt-test.exe
12/29/2015  06:11 PM         1,574,400 llvm-diff.exe
12/29/2015  06:12 PM         1,410,560 llvm-dis.exe
12/29/2015  06:12 PM        14,686,208 llvm-dsymutil.exe
12/29/2015  06:12 PM         1,689,088 llvm-dwarfdump.exe
12/29/2015  06:12 PM        14,516,224 llvm-dwp.exe
12/29/2015  06:12 PM         1,918,976 llvm-extract.exe
12/29/2015  06:12 PM        10,067,968 llvm-lib.exe
12/29/2015  06:12 PM         1,867,264 llvm-link.exe
12/29/2015  06:13 PM           131,584 yaml-bench.exe
12/29/2015  06:12 PM        18,317,312 llvm-lto.exe
12/29/2015  06:12 PM        11,548,160 llvm-mc.exe
12/29/2015  06:12 PM           113,664 llvm-mcmarkup.exe
12/29/2015  06:12 PM        10,068,992 llvm-nm.exe
12/29/2015  06:12 PM         9,342,976 llvm-objdump.exe
12/29/2015  06:12 PM           173,568 llvm-pdbdump.exe
12/29/2015  06:11 PM            17,408 llvm-PerfectShuffle.exe
12/29/2015  06:12 PM           258,048 llvm-profdata.exe
12/29/2015  06:12 PM        10,067,968 llvm-ranlib.exe
12/29/2015  06:12 PM         1,780,736 llvm-readobj.exe
12/29/2015  06:12 PM         7,938,048 llvm-rtdyld.exe
12/29/2015  06:12 PM         1,612,288 llvm-size.exe
12/29/2015  06:13 PM         1,857,024 llvm-split.exe
12/29/2015  06:13 PM         1,407,488 llvm-stress.exe
12/29/2015  06:13 PM         1,716,736 llvm-symbolizer.exe
12/29/2015  05:49 PM           880,128 llvm-tblgen.exe
12/29/2015  06:11 PM         1,616,896 llvm-cxxdump.exe
12/29/2015  06:13 PM            45,568 not.exe
12/29/2015  06:13 PM         1,669,120 obj2yaml.exe
12/29/2015  06:13 PM        16,232,960 opt.exe
12/29/2015  06:13 PM         9,174,016 sancov.exe
12/29/2015  06:13 PM         1,743,360 verify-uselistorder.exe
12/29/2015  06:13 PM           267,264 yaml2obj.exe
              58 File(s)    379,937,940 bytes
               2 Dir(s)  57,060,495,360 bytes free




RelWithDebInfo build:

 Directory of C:\LLVM\build\RelWithDebInfo\bin

12/29/2015  07:11 PM    <DIR>          ..
12/29/2015  07:11 PM    <DIR>          .
12/29/2015  07:01 PM        42,237,952 libclang.dll
12/29/2015  07:11 PM        31,601,664 LTO.dll
12/29/2015  07:05 PM            46,592 llvm-PerfectShuffle.exe
12/29/2015  07:09 PM         9,820,672 bugpoint.exe
12/29/2015  07:07 PM        15,648,768 llvm-nm.exe
12/29/2015  07:11 PM           669,184 yaml2obj.exe
12/29/2015  07:09 PM            26,624 c-arcmt-test.exe
12/29/2015  07:07 PM           385,024 llvm-mcmarkup.exe
12/29/2015  07:08 PM         3,061,760 llvm-profdata.exe
12/29/2015  07:09 PM           101,888 c-index-test.exe
12/29/2015  07:07 PM        18,080,768 llvm-mc.exe
12/29/2015  07:10 PM           457,216 yaml-bench.exe
12/29/2015  07:11 PM        48,616,960 clang++.exe
12/29/2015  07:06 PM        41,145,856 clang-check.exe
12/29/2015  07:07 PM        29,203,456 llvm-lto.exe
12/29/2015  07:08 PM        15,673,856 llvm-ranlib.exe
12/29/2015  07:11 PM        48,616,960 clang-cl.exe
12/29/2015  07:10 PM         1,971,200 clang-format.exe
12/29/2015  07:08 PM         3,998,720 llvm-readobj.exe
12/29/2015  07:10 PM         3,820,544 verify-uselistorder.exe
12/29/2015  06:28 PM         1,062,912 clang-tblgen.exe
12/29/2015  07:07 PM         4,417,024 llvm-link.exe
12/29/2015  07:07 PM        15,673,856 llvm-lib.exe
12/29/2015  07:10 PM        48,616,960 clang.exe
12/29/2015  07:08 PM        13,509,632 llvm-objdump.exe
12/29/2015  07:10 PM        13,246,976 sancov.exe
12/29/2015  07:03 PM            25,088 count.exe
12/29/2015  07:08 PM        13,311,488 llvm-rtdyld.exe
12/29/2015  07:07 PM        23,793,664 llvm-dwp.exe
12/29/2015  07:03 PM        12,695,552 diagtool.exe
12/29/2015  07:06 PM         3,796,480 llvm-dwarfdump.exe
12/29/2015  07:09 PM        26,816,000 opt.exe
12/29/2015  07:06 PM           455,168 FileCheck.exe
12/29/2015  07:08 PM         3,678,208 llvm-size.exe
12/29/2015  07:06 PM        23,938,560 llvm-dsymutil.exe
12/29/2015  07:08 PM           381,952 KillTheDoctor.exe
12/29/2015  07:06 PM         3,122,176 llvm-dis.exe
12/29/2015  07:09 PM         3,852,288 obj2yaml.exe
12/29/2015  07:09 PM        14,534,144 arcmt-test.exe
12/29/2015  07:08 PM         4,709,376 llvm-split.exe
12/29/2015  07:05 PM         3,510,272 llvm-diff.exe
12/29/2015  07:04 PM        27,583,488 llc.exe
12/29/2015  07:05 PM         3,719,168 llvm-cxxdump.exe
12/29/2015  07:08 PM           230,912 not.exe
12/29/2015  07:05 PM           235,520 lli-child-target.exe
12/29/2015  07:08 PM         3,215,872 llvm-stress.exe
12/29/2015  07:05 PM         3,860,480 llvm-cov.exe
12/29/2015  07:04 PM        14,628,352 lli.exe
12/29/2015  07:05 PM           340,480 llvm-config.exe
12/29/2015  07:07 PM         4,435,456 llvm-extract.exe
12/29/2015  07:02 PM        15,673,856 llvm-ar.exe
12/29/2015  07:08 PM         3,876,864 llvm-symbolizer.exe
12/29/2015  07:05 PM        25,534,464 llvm-c-test.exe
12/29/2015  07:05 PM         3,653,632 llvm-as.exe
12/29/2015  07:08 PM           500,736 llvm-pdbdump.exe
12/29/2015  06:28 PM         2,048,512 llvm-tblgen.exe
12/29/2015  07:05 PM           412,672 llvm-bcanalyzer.exe
             164 File(s)  4,263,025,004 bytes
               2 Dir(s)  50,662,363,136 bytes free
``

Added stats. See inline comments.

cmake/modules/HandleLLVMOptions.cmake
372

Here's the second batch of stats, also mostly for my own reference. This is **WITHOUT** the patch:

RelWithDebInfo build:

 Directory of C:\LLVM\build\RelWithDebInfo\bin

12/29/2015  08:43 PM    <DIR>          ..
12/29/2015  08:43 PM    <DIR>          .
12/29/2015  08:34 PM        42,237,952 libclang.dll
12/29/2015  08:42 PM        31,601,664 LTO.dll
12/29/2015  08:37 PM            46,592 llvm-PerfectShuffle.exe
12/29/2015  08:41 PM         9,820,672 bugpoint.exe
12/29/2015  08:39 PM        15,648,768 llvm-nm.exe
12/29/2015  08:41 PM           669,184 yaml2obj.exe
12/29/2015  08:41 PM            26,624 c-arcmt-test.exe
12/29/2015  08:39 PM           385,024 llvm-mcmarkup.exe
12/29/2015  08:40 PM         3,061,760 llvm-profdata.exe
12/29/2015  08:41 PM           101,888 c-index-test.exe
12/29/2015  08:39 PM        18,080,768 llvm-mc.exe
12/29/2015  08:41 PM           457,216 yaml-bench.exe
12/29/2015  08:43 PM        48,616,960 clang++.exe
12/29/2015  08:38 PM        41,145,856 clang-check.exe
12/29/2015  08:39 PM        29,203,456 llvm-lto.exe
12/29/2015  08:40 PM        15,673,856 llvm-ranlib.exe
12/29/2015  08:43 PM        48,616,960 clang-cl.exe
12/29/2015  08:41 PM         1,971,200 clang-format.exe
12/29/2015  08:40 PM         3,998,720 llvm-readobj.exe
12/29/2015  08:41 PM         3,820,544 verify-uselistorder.exe
12/29/2015  08:02 PM         1,062,912 clang-tblgen.exe
12/29/2015  08:39 PM         4,417,024 llvm-link.exe
12/29/2015  08:39 PM        15,673,856 llvm-lib.exe
12/29/2015  08:43 PM        48,616,960 clang.exe
12/29/2015  08:40 PM        13,509,632 llvm-objdump.exe
12/29/2015  08:41 PM        13,246,976 sancov.exe
12/29/2015  08:36 PM            25,088 count.exe
12/29/2015  08:40 PM        13,311,488 llvm-rtdyld.exe
12/29/2015  08:38 PM        23,793,664 llvm-dwp.exe
12/29/2015  08:36 PM        12,695,552 diagtool.exe
12/29/2015  08:38 PM         3,796,480 llvm-dwarfdump.exe
12/29/2015  08:41 PM        26,816,000 opt.exe
12/29/2015  08:36 PM           455,168 FileCheck.exe
12/29/2015  08:40 PM         3,678,208 llvm-size.exe
12/29/2015  08:38 PM        23,938,560 llvm-dsymutil.exe
12/29/2015  08:40 PM           381,952 KillTheDoctor.exe
12/29/2015  08:37 PM         3,122,176 llvm-dis.exe
12/29/2015  08:40 PM         3,852,288 obj2yaml.exe
12/29/2015  08:41 PM        14,534,144 arcmt-test.exe
12/29/2015  08:40 PM         4,709,376 llvm-split.exe
12/29/2015  08:37 PM         3,510,272 llvm-diff.exe
12/29/2015  08:37 PM        27,583,488 llc.exe
12/29/2015  08:37 PM         3,719,168 llvm-cxxdump.exe
12/29/2015  08:40 PM           230,912 not.exe
12/29/2015  08:37 PM           235,520 lli-child-target.exe
12/29/2015  08:40 PM         3,215,872 llvm-stress.exe
12/29/2015  08:37 PM         3,860,480 llvm-cov.exe
12/29/2015  08:37 PM        14,628,352 lli.exe
12/29/2015  08:37 PM           340,480 llvm-config.exe
12/29/2015  08:38 PM         4,435,456 llvm-extract.exe
12/29/2015  08:32 PM        15,673,856 llvm-ar.exe
12/29/2015  08:40 PM         3,876,864 llvm-symbolizer.exe
12/29/2015  08:37 PM        25,534,464 llvm-c-test.exe
12/29/2015  08:37 PM         3,653,632 llvm-as.exe
12/29/2015  08:40 PM           500,736 llvm-pdbdump.exe
12/29/2015  08:02 PM         2,048,512 llvm-tblgen.exe
12/29/2015  08:37 PM           412,672 llvm-bcanalyzer.exe
             164 File(s)  4,263,172,460 bytes
               2 Dir(s)  50,375,655,424 bytes free




Release build:

 Directory of C:\LLVM\build\Release\bin

12/30/2015  02:29 AM    <DIR>          ..
12/30/2015  02:29 AM    <DIR>          .
12/30/2015  02:29 AM        23,004,160 LTO.dll
12/30/2015  02:27 AM        27,575,296 libclang.dll
12/30/2015  02:29 AM            11,776 c-arcmt-test.exe
12/30/2015  02:29 AM            74,240 c-index-test.exe
12/30/2015  02:29 AM        34,474,496 clang++.exe
12/30/2015  02:28 AM        28,597,248 clang-check.exe
12/30/2015  02:29 AM        34,474,496 clang-cl.exe
12/30/2015  02:29 AM         1,206,272 clang-format.exe
12/30/2015  01:41 AM           636,416 clang-tblgen.exe
12/30/2015  02:29 AM        34,474,496 clang.exe
12/30/2015  02:02 AM            10,752 count.exe
12/30/2015  02:27 AM         2,692,096 diagtool.exe
12/30/2015  02:02 AM           199,168 FileCheck.exe
12/30/2015  02:02 AM           144,384 KillTheDoctor.exe
12/30/2015  02:29 AM         5,304,320 bugpoint.exe
12/30/2015  02:27 AM        19,832,320 llc.exe
12/30/2015  02:02 AM            25,088 lli-child-target.exe
12/30/2015  02:27 AM         9,769,472 lli.exe
12/30/2015  02:27 AM        10,468,864 llvm-ar.exe
12/30/2015  02:27 AM         1,691,648 llvm-as.exe
12/30/2015  02:28 AM           165,888 llvm-bcanalyzer.exe
12/30/2015  02:28 AM        18,173,952 llvm-c-test.exe
12/30/2015  02:02 AM           103,936 llvm-config.exe
12/30/2015  02:28 AM         1,687,040 llvm-cov.exe
12/30/2015  02:29 AM         8,776,704 arcmt-test.exe
12/30/2015  02:28 AM         1,570,304 llvm-diff.exe
12/30/2015  02:28 AM         1,326,080 llvm-dis.exe
12/30/2015  02:28 AM        16,863,232 llvm-dsymutil.exe
12/30/2015  02:28 AM         1,675,264 llvm-dwarfdump.exe
12/30/2015  02:28 AM        16,630,784 llvm-dwp.exe
12/30/2015  02:28 AM         2,025,472 llvm-extract.exe
12/30/2015  02:28 AM        10,468,864 llvm-lib.exe
12/30/2015  02:28 AM         1,961,472 llvm-link.exe
12/30/2015  02:02 AM           173,568 yaml-bench.exe
12/30/2015  02:28 AM        21,027,840 llvm-lto.exe
12/30/2015  02:28 AM        11,923,968 llvm-mc.exe
12/30/2015  02:02 AM           144,384 llvm-mcmarkup.exe
12/30/2015  02:28 AM        10,464,256 llvm-nm.exe
12/30/2015  02:28 AM         9,658,880 llvm-objdump.exe
12/30/2015  02:28 AM           215,040 llvm-pdbdump.exe
12/30/2015  02:02 AM            18,432 llvm-PerfectShuffle.exe
12/30/2015  02:29 AM           325,632 llvm-profdata.exe
12/30/2015  02:28 AM        10,468,864 llvm-ranlib.exe
12/30/2015  02:29 AM         1,805,824 llvm-readobj.exe
12/30/2015  02:29 AM         8,293,888 llvm-rtdyld.exe
12/30/2015  02:29 AM         1,575,936 llvm-size.exe
12/30/2015  02:29 AM         1,929,728 llvm-split.exe
12/30/2015  02:29 AM         1,341,440 llvm-stress.exe
12/30/2015  02:29 AM         1,714,176 llvm-symbolizer.exe
12/30/2015  01:41 AM         1,300,992 llvm-tblgen.exe
12/30/2015  02:28 AM         1,580,544 llvm-cxxdump.exe
12/30/2015  02:02 AM            52,224 not.exe
12/30/2015  02:29 AM         1,660,928 obj2yaml.exe
12/30/2015  02:29 AM        19,069,952 opt.exe
12/30/2015  02:29 AM         9,402,368 sancov.exe
12/30/2015  02:29 AM         1,809,920 verify-uselistorder.exe
12/30/2015  02:29 AM           352,256 yaml2obj.exe
              58 File(s)    432,408,721 bytes
               2 Dir(s)  56,124,084,224 bytes free




MinSizeRel build:

 Directory of C:\LLVM\build\MinSizeRel\bin

12/31/2015  11:02 PM    <DIR>          ..
12/31/2015  11:02 PM    <DIR>          .
12/31/2015  11:01 PM        20,337,664 LTO.dll
12/31/2015  10:58 PM        23,514,624 libclang.dll
12/31/2015  11:01 PM            11,776 c-arcmt-test.exe
12/31/2015  11:01 PM            66,048 c-index-test.exe
12/31/2015  11:02 PM        28,683,264 clang++.exe
12/31/2015  11:00 PM        24,313,856 clang-check.exe
12/31/2015  11:02 PM        28,683,264 clang-cl.exe
12/31/2015  11:01 PM         1,030,144 clang-format.exe
12/31/2015  10:41 PM           427,008 clang-tblgen.exe
12/31/2015  11:01 PM        28,683,264 clang.exe
12/31/2015  10:59 PM            10,752 count.exe
12/31/2015  10:59 PM         2,280,960 diagtool.exe
12/31/2015  10:59 PM           160,768 FileCheck.exe
12/31/2015  11:01 PM           120,832 KillTheDoctor.exe
12/31/2015  11:01 PM         4,200,960 bugpoint.exe
12/31/2015  10:59 PM        17,507,328 llc.exe
12/31/2015  10:59 PM            24,064 lli-child-target.exe
12/31/2015  10:59 PM         8,457,728 lli.exe
12/31/2015  10:57 PM        10,115,072 llvm-ar.exe
12/31/2015  11:00 PM         1,603,584 llvm-as.exe
12/31/2015  11:00 PM           137,728 llvm-bcanalyzer.exe
12/31/2015  11:00 PM        16,118,272 llvm-c-test.exe
12/31/2015  11:00 PM            93,184 llvm-config.exe
12/31/2015  11:00 PM         1,645,568 llvm-cov.exe
12/31/2015  11:01 PM         6,843,904 arcmt-test.exe
12/31/2015  11:00 PM         1,523,712 llvm-diff.exe
12/31/2015  11:00 PM         1,359,872 llvm-dis.exe
12/31/2015  11:00 PM        14,695,424 llvm-dsymutil.exe
12/31/2015  11:00 PM         1,641,984 llvm-dwarfdump.exe
12/31/2015  11:00 PM        14,522,368 llvm-dwp.exe
12/31/2015  11:00 PM         1,870,336 llvm-extract.exe
12/31/2015  11:00 PM        10,115,072 llvm-lib.exe
12/31/2015  11:00 PM         1,819,136 llvm-link.exe
12/31/2015  11:01 PM           136,192 yaml-bench.exe
12/31/2015  11:00 PM        18,402,816 llvm-lto.exe
12/31/2015  11:00 PM        11,592,704 llvm-mc.exe
12/31/2015  11:00 PM           117,760 llvm-mcmarkup.exe
12/31/2015  11:00 PM        10,116,096 llvm-nm.exe
12/31/2015  11:00 PM         9,341,440 llvm-objdump.exe
12/31/2015  11:00 PM           177,664 llvm-pdbdump.exe
12/31/2015  10:59 PM            17,920 llvm-PerfectShuffle.exe
12/31/2015  11:01 PM           264,192 llvm-profdata.exe
12/31/2015  11:01 PM        10,115,072 llvm-ranlib.exe
12/31/2015  11:01 PM         1,775,104 llvm-readobj.exe
12/31/2015  11:01 PM         7,966,720 llvm-rtdyld.exe
12/31/2015  11:01 PM         1,566,208 llvm-size.exe
12/31/2015  11:01 PM         1,805,312 llvm-split.exe
12/31/2015  11:01 PM         1,354,752 llvm-stress.exe
12/31/2015  11:01 PM         1,670,144 llvm-symbolizer.exe
12/31/2015  10:41 PM           922,624 llvm-tblgen.exe
12/31/2015  11:00 PM         1,568,768 llvm-cxxdump.exe
12/31/2015  11:01 PM            45,568 not.exe
12/31/2015  11:01 PM         1,622,528 obj2yaml.exe
12/31/2015  11:01 PM        16,254,464 opt.exe
12/31/2015  11:01 PM         9,148,416 sancov.exe
12/31/2015  11:01 PM         1,693,184 verify-uselistorder.exe
12/31/2015  11:01 PM           274,432 yaml2obj.exe
              58 File(s)    380,571,284 bytes
               2 Dir(s)  56,083,685,376 bytes free




Debug build:

 Directory of C:\LLVM\build\Debug\bin

01/01/2016  03:24 AM    <DIR>          ..
01/01/2016  03:24 AM    <DIR>          .
01/01/2016  03:11 AM        90,830,336 libclang.dll
01/01/2016  03:22 AM        59,970,560 LTO.dll
01/01/2016  03:22 AM         1,582,592 yaml2obj.exe
01/01/2016  03:21 AM         1,041,920 yaml-bench.exe
01/01/2016  03:21 AM        24,452,608 bugpoint.exe
01/01/2016  03:21 AM         7,279,104 verify-uselistorder.exe
01/01/2016  03:20 AM        20,070,912 sancov.exe
01/01/2016  03:21 AM            39,936 c-arcmt-test.exe
01/01/2016  03:20 AM        55,005,184 opt.exe
01/01/2016  03:19 AM         7,520,768 obj2yaml.exe
01/01/2016  03:21 AM           157,184 c-index-test.exe
01/01/2016  03:19 AM           804,352 not.exe
01/01/2016  03:21 AM        37,114,880 arcmt-test.exe
01/01/2016  03:24 AM       107,311,104 clang++.exe
01/01/2016  03:16 AM        86,434,304 clang-check.exe
01/01/2016  02:04 AM         6,412,800 llvm-tblgen.exe
01/01/2016  03:19 AM         7,889,408 llvm-symbolizer.exe
01/01/2016  03:24 AM       107,311,104 clang-cl.exe
01/01/2016  03:22 AM         4,373,504 clang-format.exe
12/28/2015  01:15 AM            77,312 a.exe
01/01/2016  03:19 AM        10,030,080 llvm-split.exe
01/01/2016  02:04 AM         2,584,064 clang-tblgen.exe
01/01/2016  03:19 AM         7,030,784 llvm-size.exe
01/01/2016  03:19 AM        20,128,256 llvm-rtdyld.exe
01/01/2016  03:23 AM       107,311,104 clang.exe
01/01/2016  03:19 AM         7,612,928 llvm-readobj.exe
01/01/2016  03:19 AM        26,210,816 llvm-ranlib.exe
01/01/2016  03:12 AM            37,888 count.exe
01/01/2016  03:19 AM         5,340,672 llvm-profdata.exe
01/01/2016  03:13 AM            86,528 llvm-PerfectShuffle.exe
01/01/2016  03:12 AM        30,198,784 diagtool.exe
01/01/2016  03:19 AM         1,248,768 llvm-pdbdump.exe
01/01/2016  03:18 AM        20,229,120 llvm-objdump.exe
01/01/2016  03:12 AM         1,050,112 FileCheck.exe
01/01/2016  03:18 AM        26,081,792 llvm-nm.exe
01/01/2016  03:18 AM           869,888 llvm-mcmarkup.exe
01/01/2016  03:19 AM           858,112 KillTheDoctor.exe
01/01/2016  03:18 AM        29,020,672 llvm-mc.exe
01/01/2016  03:18 AM        57,073,152 llvm-lto.exe
01/01/2016  03:19 AM         5,646,336 llvm-stress.exe
01/01/2016  03:17 AM         8,892,928 llvm-link.exe
01/01/2016  03:17 AM        26,210,816 llvm-lib.exe
01/01/2016  03:13 AM        52,477,440 llc.exe
01/01/2016  03:17 AM         9,280,512 llvm-extract.exe
01/01/2016  03:17 AM        47,185,920 llvm-dwp.exe
01/01/2016  03:13 AM           819,712 lli-child-target.exe
01/01/2016  03:16 AM         7,541,248 llvm-dwarfdump.exe
01/01/2016  03:17 AM        47,682,560 llvm-dsymutil.exe
01/01/2016  03:13 AM        31,242,240 lli.exe
01/01/2016  03:15 AM         5,601,280 llvm-dis.exe
01/01/2016  03:15 AM         6,572,032 llvm-diff.exe
01/01/2016  03:08 AM        26,210,816 llvm-ar.exe
01/01/2016  03:14 AM         7,368,192 llvm-cxxdump.exe
01/01/2016  03:14 AM         7,678,976 llvm-cov.exe
01/01/2016  03:13 AM         6,724,608 llvm-as.exe
01/01/2016  03:14 AM           934,912 llvm-config.exe
01/01/2016  03:14 AM        48,035,840 llvm-c-test.exe
01/01/2016  03:14 AM           978,432 llvm-bcanalyzer.exe
             165 File(s)  8,743,874,399 bytes
               2 Dir(s)  40,522,027,008 bytes free
372

It looks like improvements across the board - I haven't checked every single one of the binaries - as in no regressions, and many size reductions. For example:

libclang.dll Patch:
Debug build          87,031,808 libclang.dll
Release build        27,575,296 libclang.dll
MinSizeRel build     23,375,872 libclang.dll
RelWithDebInfo build 42,237,952 libclang.dll

libclang.dll No patch:
Debug build          90,830,336 libclang.dll
Release build        27,575,296 libclang.dll
MinSizeRel build     23,514,624 libclang.dll
RelWithDebInfo build 42,237,952 libclang.dll



LTO.dll Patch:
Debug build          57,349,120 LTO.dll
Release build        23,004,160 LTO.dll
MinSizeRel build     20,252,672 LTO.dll
RelWithDebInfo build 31,601,664 LTO.dll

LTO.dll No patch:
Debug build          59,970,560 LTO.dll
Release build        23,004,160 LTO.dll
MinSizeRel build     20,337,664 LTO.dll
RelWithDebInfo build 31,601,664 LTO.dll



llvm-PerfectShuffle.exe Patch:
Debug build          86,016 llvm-PerfectShuffle.exe
Release build        18,432 llvm-PerfectShuffle.exe
MinSizeRel build     17,408 llvm-PerfectShuffle.exe
RelWithDebInfo build 46,592 llvm-PerfectShuffle.exe

llvm-PerfectShuffle.exe No patch:
Debug build          86,528 llvm-PerfectShuffle.exe
Release build        18,432 llvm-PerfectShuffle.exe
MinSizeRel build     17,920 llvm-PerfectShuffle.exe
RelWithDebInfo build 46,592 llvm-PerfectShuffle.exe



clang++.exe Patch:
Debug build          102,623,232 clang++.exe
Release build        34,473,984  clang++.exe
MinSizeRel build     28,572,160  clang++.exe
RelWithDebInfo build 48,616,960  clang++.exe

clang++.exe No patch:
Debug build          107,311,104 clang++.exe
Release build        34,474,496  clang++.exe
MinSizeRel build     28,683,264  clang++.exe
RelWithDebInfo build 48,616,960  clang++.exe

Added stats. See inline comments.

Thank you for doing the analysis, this is very helpful information! From looking at the results, it appears that this is only a win for debug builds; with the other builds, the changes are negligible.

Release

FileWithout PatchWith PatchChange
clang.exe34,474,49634,473,984512b
libclang.dll27,575,29627,575,2960
LTO.dll23,004,16023,004,1600
llc.exe19,832,32019,832,3200
opt.exe19,069,95219,069,9520

Debug

FileWithout PatchWith PatchChange
clang.exe107,311,104102,623,2324.4mb
libclang.dll90,830,33687,031,8083.6mb
LTO.dll59,970,56057,349,1202.5mb
llc.exe52,477,44050,145,7922.2mb
opt.exe55,005,18452,358,1442.5mb

I'm not certain that the /GF flag is worth turning on, given that this flag can increase the number of addressable sections, and we've had to work to stay under the /bigobj limit in the past. If it didn't affect /bigobj, I would have no problem turning it on.

Out of curiosity, why do bigobj files cause trouble and need to be avoided?

Out of curiosity, why do bigobj files cause trouble and need to be avoided?

I suppose that it is less of a real concern these days (it used to be a compatibility issue with older versions of MSVC that we no longer care about) and more of a code smell concern. Having to enable a special linker flag because of the number of addressable sections you are creating can identify a design problem when you run over that limit. We've had this come up with template instantiations that went wild, and getting warned about the section limits helped us notice that issue in the first place and come up with a better design.

Thank you for doing the analysis, this is very helpful information! From looking at the results, it appears that this is only a win for debug builds; with the other builds, the changes are negligible.

[...]

I'm not certain that the /GF flag is worth turning on, given that this flag can increase the number of addressable sections, and we've had to work to stay under the /bigobj limit in the past. If it didn't affect /bigobj, I would have no problem turning it on.

Ahh, well, I can always dump it and leave the /Zc: options on, which are nice for detecting silly mistakes.

Ahh, well, I can always dump it and leave the /Zc: options on, which are nice for detecting silly mistakes.

That's my recommendation; with just /Zc: and /Oi, I think it would be ready to go. We can debate /GF by itself if we want to.

Out of curiosity, why do bigobj files cause trouble and need to be avoided?

I suppose that it is less of a real concern these days (it used to be a compatibility issue with older versions of MSVC that we no longer care about) and more of a code smell concern. Having to enable a special linker flag because of the number of addressable sections you are creating can identify a design problem when you run over that limit. We've had this come up with template instantiations that went wild, and getting warned about the section limits helped us notice that issue in the first place and come up with a better design.

Bigobj does not require a special linker flag. For the record, clang-cl transparently transitions into bigobj mode and always uses COMDATs for string literals.

Out of curiosity, why do bigobj files cause trouble and need to be avoided?

I suppose that it is less of a real concern these days (it used to be a compatibility issue with older versions of MSVC that we no longer care about) and more of a code smell concern. Having to enable a special linker flag because of the number of addressable sections you are creating can identify a design problem when you run over that limit. We've had this come up with template instantiations that went wild, and getting warned about the section limits helped us notice that issue in the first place and come up with a better design.

Bigobj does not require a special linker flag. For the record, clang-cl transparently transitions into bigobj mode and always uses COMDATs for string literals.

s/linker/compiler

The question, at least for me, becomes whether there's a better way to track when we have template instantation explosions like we did with the AST matchers a while back. If there's a more assertive way to know when that happens (preferably something that diagnoses), then I wouldn't really care at all about the state of the /GF flag.

ariccio updated this revision to Diff 43851.Jan 2 2016, 7:16 PM

Killed /GF.

Bigobj does not require a special linker flag. For the record, clang-cl transparently transitions into bigobj mode and always uses COMDATs for string literals.

Well, yeah, Clang-cl is smarter about a few things, which doesn't surprise me.

aaron.ballman accepted this revision.Jan 3 2016, 6:57 AM
aaron.ballman edited edge metadata.

LGTM, thank you for this! Do you need me to commit on your behalf?

This revision is now accepted and ready to land.Jan 3 2016, 6:57 AM
aaron.ballman closed this revision.Jan 5 2016, 6:27 AM

Thanks for the patch! I've commit in r256836

I had to revert this commit because it was causing a build bot failure for MSVC (2013 I think):

http://lab.llvm.org:8011/builders/lldb-x86-win7-msvc/builds/14050/steps/build/logs/stdio

[...] it was causing a build bot failure for MSVC (2013 I think):

...Clang still builds with Visual Studio 2013? There's a bug right there!

MSVC 2013's debug-mode headers are not const-correct, which is why the build was failing. Must I add a check for MSVC in the Makefile? I'm not exactly sure how to do that.

[...] it was causing a build bot failure for MSVC (2013 I think):

...Clang still builds with Visual Studio 2013? There's a bug right there!

By design. We support the last two major releases (not Updates) to MSVC, so that's 2015 and 2013 these days.

MSVC 2013's debug-mode headers are not const-correct, which is why the build was failing. Must I add a check for MSVC in the Makefile? I'm not exactly sure how to do that.

Yes, you will have to check that. I'm no CMake expert, but I think you can use if (MSVC14) to test for this; but you'll have to check if (1) that's supported in CMake at all, and (2) if that's supported in the oldest CMake we support. I *think* that's 2.8.8 (at least, that's what our public documentation states).

ariccio updated this revision to Diff 45091.Jan 16 2016, 11:36 PM
ariccio edited edge metadata.

Wrapped /zc:strictStrings in a check for MSVC14.

By design. We support the last two major releases (not Updates) to MSVC, so that's 2015 and 2013 these days.

Fair enough. Fixed.

aaron.ballman added inline comments.Jan 19 2016, 5:55 AM
C:/LLVM/llvm/cmake/modules/HandleLLVMOptions.cmake
366 ↗(On Diff #45091)

Is this supported in CMake 2.8.8 (that's our min required version of CMake currently)? Also, is this forwards compatible, or will it only enable strictStrings on MSVC 14 and not later versions? (I don't know CMake well enough to answer either of those questions.)

ariccio updated this revision to Diff 45606.Jan 21 2016, 3:23 PM
ariccio marked an inline comment as done.Jan 21 2016, 3:26 PM

This updated diff should be compatible with old versions of CMake, if they don't know about Visual Studio 2015, they'll just define MSVC_VERSION to be a smaller number.

Testing this diff (to generate a solution) as we speak.

C:/LLVM/llvm/cmake/modules/HandleLLVMOptions.cmake
366 ↗(On Diff #45091)

I don't know, and that's a nice catch on your part.

I presume it is not forward compatible. I'm also not sure how I'd enable strictStrings in a forwards compatible way.

Ideally, future versions of MSVC wouldn't need strictStrings for standards compliance, but I'm not sure if I'd be reasonable to make an assumption about MSVC.

LGTM again, so I have commit as r258687.

C:/LLVM/llvm/cmake/modules/HandleLLVMOptions.cmake
366 ↗(On Diff #45606)

I presume it is not forward compatible. I'm also not sure how I'd enable strictStrings in a forwards compatible way.

I think that the way you've done it here is the best we can do.

ariccio marked 2 inline comments as done.Jan 27 2016, 11:19 PM

Huh: this comment didn't seem to go through?

Testing this diff (to generate a solution) as we speak.

Everything built fine. Running testsuite as we speak.

ariccio marked an inline comment as done.Feb 3 2016, 10:19 AM

Whoops, forgot to mark a comment as Done.

I think this looks good to recommit. Do you need me to do that, or do you have commit privileges?