[cfe-commits] [PATCH] Keep history of macro definitions and #undefs

Alexander Kornienko reviews at llvm-reviews.chandlerc.com
Thu Aug 23 22:53:04 PDT 2012


Hi doug.gregor, klimek, rsmith, djasper,

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.


http://llvm-reviews.chandlerc.com/D28

Files:
  tools/clang/include/clang/Lex/Preprocessor.h
  tools/clang/lib/Frontend/PrintPreprocessedOutput.cpp
  tools/clang/lib/Sema/SemaCodeComplete.cpp
  tools/clang/lib/Lex/PPDirectives.cpp
  tools/clang/lib/Lex/Pragma.cpp
  tools/clang/lib/Lex/PPMacroExpansion.cpp
  tools/clang/lib/Serialization/ASTWriter.cpp
  tools/clang/lib/Serialization/ASTReader.cpp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D28.1.patch
Type: text/x-patch
Size: 10814 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120823/6c963848/attachment.bin>


More information about the cfe-commits mailing list