[cfe-commits] [PATCH][MS][Review request] - Late Microsoft template parsing
Douglas Gregor
dgregor at apple.com
Fri Apr 22 09:41:11 PDT 2011
On Apr 21, 2011, at 4:53 AM, Francois Pichet wrote:
> On Thu, Apr 14, 2011 at 11:23 AM, Douglas Gregor <dgregor at apple.com> wrote:
>>
>> On Apr 14, 2011, at 8:22 AM, Francois Pichet wrote:
>>
>>> On Sat, Apr 9, 2011 at 1:59 PM, Francois Pichet <pichet2000 at gmail.com> wrote:
>>>> Hi here is an updated patch
>>>>
>>>>
>>>> On Sat, Mar 26, 2011 at 7:29 PM, Douglas Gregor <dgregor at apple.com> wrote:
>>>>>
>>>>> Nifty. A bunch of comments below.
>
>
> Hi here is an update patch.
>
> The main difference with this patch is that template parsing is done
> only if an instantiation is actually needed.
>
> The only problem is that my patch doesn't correctly diagnostic
> multiple definition of template code. I put a FIXME and I'll look at
> this problem later (soon).
>
> With this patch all Microsoft C++ headers parse if there is no
> instantiation requested.
> With instantiation requested there are only 3-4 remaining problems.
That's a *huge* improvement. Congrats!
> There is a 4-5% speed improvement when doing a clang self hosting with
> delayed template parsing.
> ./configure --enable-optimized CC=/usr/local/bin/clang
> CXX=/usr/local/bin/clang++
> make CXXFLAGS=-fdelayed-template-parsing.
4-5% is quite good. That gives us a decent upper bound for what we could achieve when using -fdelayed-template-parsing (+ as-yet-unimplemented name lookup tricks) as an optimization rather than as a way to better emulate MSVC.
> On my Mac Mini this is shaving about 90 seconds out of 33 minutes for
> a complete build. The resulting binary passes all the clang test.
Very cool.
@@ -1489,6 +1494,8 @@
Opts.MathErrno = Args.hasArg(OPT_fmath_errno);
Opts.InstantiationDepth = Args.getLastArgIntValue(OPT_ftemplate_depth, 1024,
Diags);
+ Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing) ||
+ Opts.Microsoft;
Opts.NumLargeByValueCopy = Args.getLastArgIntValue(OPT_Wlarge_by_value_copy,
0, Diags);
Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);
This isn't the right place to perform the check for Microsoft mode, since "clang -cc1" shouldn't be making this decision. Rather, the driver should set the default for -fdelayed-template-parsing based on whether the user has requested Microsoft mode, e.g., here:
+ // -fno-delayed-template-parsing is default.
+ if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
+ options::OPT_fno_delayed_template_parsing,
+ false))
+ CmdArgs.push_back("-fdelayed-template-parsing");
That said, I really don't like tying this to -fms-extensions. It's the first place where we've really taken the big step from adding Microsoft-specific extensions to implementing an non-conforming feature specifically for Microsoft compatibility. It's great for users that need to parse Microsoft headers, but it could be harmful to users who want their C++ code relatively clean but also need some of the Microsoft extensions.
Could we instead add some kind of -fms-compatibility flag, and turn on -fdelayed-template-parsing that way?
- Doug
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110422/0745e5b3/attachment.html>
More information about the cfe-commits
mailing list