[cfe-commits] r162810 - in /cfe/trunk: include/clang/Lex/MacroInfo.h include/clang/Lex/Preprocessor.h lib/Frontend/PrintPreprocessedOutput.cpp lib/Lex/MacroInfo.cpp lib/Lex/PPDirectives.cpp lib/Lex/PPMacroExpansion.cpp lib/Lex/Pragma.cpp lib/Sema
Eli Friedman
eli.friedman at gmail.com
Wed Aug 29 15:41:53 PDT 2012
On Tue, Aug 28, 2012 at 5:20 PM, Alexander Kornienko <alexfh at google.com> wrote:
> Author: alexfh
> Date: Tue Aug 28 19:20:03 2012
> New Revision: 162810
>
> URL: http://llvm.org/viewvc/llvm-project?rev=162810&view=rev
> Log:
> Keep history of macro definitions and #undefs
>
> Summary:
> Summary: Keep history of macro definitions and #undefs with corresponding source locations, so that we can later find out all macros active in a specified source location. We don't save the history in PCH (no need currently). Memory overhead is about sizeof(void*)*3*<number of macro definitions and #undefs>+<in-memory size of all #undef'd macros>
>
> I've run a test on a file composed of 109 .h files from boost 1.49 on x86-64 linux.
> Stats before this patch:
> *** Preprocessor Stats:
> 73222 directives found:
> 19171 #define.
> 4345 #undef.
> #include/#include_next/#import:
> 5233 source files entered.
> 27 max include stack depth
> 19210 #if/#ifndef/#ifdef.
> 2384 #else/#elif.
> 6891 #endif.
> 408 #pragma.
> 14466 #if/#ifndef#ifdef regions skipped
> 80023/451669/1270 obj/fn/builtin macros expanded, 85724 on the fast path.
> 127145 token paste (##) operations performed, 11008 on the fast path.
>
> Preprocessor Memory: 5874615B total
> BumpPtr: 4399104
> Macro Expanded Tokens: 417768
> Predefines Buffer: 8135
> Macros: 1048576
> #pragma push_macro Info: 0
> Poison Reasons: 1024
> Comment Handlers: 8
>
> Stats with this patch:
> ...
> Preprocessor Memory: 7541687B total
> BumpPtr: 6066176
> Macro Expanded Tokens: 417768
> Predefines Buffer: 8135
> Macros: 1048576
> #pragma push_macro Info: 0
> Poison Reasons: 1024
> Comment Handlers: 8
>
> In my test increase in memory usage is about 1.7Mb, which is ~28% of initial preprocessor's memory usage and about 0.8% of clang's total VMM allocation.
>
> As for CPU overhead, it should only be noticeable when iterating over all macros, and should mostly consist of couple extra dereferences and one comparison per macro + skipping of #undef'd macros. It's less trivial to measure, though, as the preprocessor consumes a very small fraction of compilation time.
This patch causes clang's behavior to change on
http://llvm.org/viewvc/llvm-project/clang-tests/trunk/gcc-4_2-testsuite/src/gcc.dg/cpp/mac-dir-1.c?view=markup
; is this intentional?
-Eli
More information about the cfe-commits
mailing list