On Mon Jan 06 2014 at 5:25:57 PM, Adrian Prantl <[email protected]> wrote:
> Author: adrian > Date: Mon Jan 6 19:19:08 2014 > New Revision: 198655 > > URL: http://llvm.org/viewvc/llvm-project?rev=198655&view=rev > Log: > Implement a new -fstandalone-debug option. rdar://problem/15685848 > It controls everything that -flimit-debug-info used to, plus the > vtable type optimization. The old -fno-limit-debug-info option is now an > alias to -fstandalone-debug and vice versa. > > Standalone is the default on Darwin until dtrace is updated to work with > non-standalone debug info (rdar://problem/15758808). > > Note: I kept the LimitedDebugInfo name in CodeGenOptions::DebugInfoKind > because NoStandaloneDebugInfo sounded even more confusing. > > Added: > cfe/trunk/test/CodeGenCXX/debug-info-vtable-optzn.cpp > Modified: > cfe/trunk/docs/tools/clang.pod > cfe/trunk/include/clang/Driver/Options.td > cfe/trunk/include/clang/Frontend/CodeGenOptions.h > cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > cfe/trunk/lib/Driver/Tools.cpp > cfe/trunk/lib/Frontend/CompilerInvocation.cpp > cfe/trunk/test/CodeGenCXX/debug-info-class-limited.cpp > cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp > cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp > cfe/trunk/test/CodeGenCXX/debug-info-method2.cpp > cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp > cfe/trunk/test/CodeGenCXX/debug-info-pubtypes.cpp > cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp > cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp > > Modified: cfe/trunk/docs/tools/clang.pod > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/tools/ > clang.pod?rev=198655&r1=198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/docs/tools/clang.pod (original) > +++ cfe/trunk/docs/tools/clang.pod Mon Jan 6 19:19:08 2014 > @@ -312,12 +312,19 @@ Currently equivalent to B<-O3> > Generate debug information. Note that Clang debug information works best > at > B<-O0>. > > -=item B<-flimit-debug-info> B<-fno-limit-debug-info> > +=item B<-fstandalone-debug> B<-fno-standalone-debug> > > -By default Clang does not emit type definitions for types that are not > -needed by the module and could be replaced with a forward > -declaration. By specifying B<-fno-limit-debug-info> this optimization > -can be turned off. Note that Clang will never emit type information > +Clang supports a number of optimizations to reduce the size of debug > +information in the binary. They work based on the assumption that the > +debug type information can be spread out over multiple compilation > +units. For instance, Clang will not emit type definitions for types > +that are not needed by a module and could be replaced with a forward > +declaration. Further, Clang will only emit type info for a dynamic > +C++ class in the module that contains the vtable for the class. > + > +The B<-fstandalone-debug> option turns off these optimizations. This > +is useful when working with 3rd-party libraries that don't come with > +debug information. Note that Clang will never emit type information > for types that are not referenced at all by the program. > > =item B<-fexceptions> > > Modified: cfe/trunk/include/clang/Driver/Options.td > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Driver/Options.td?rev=198655&r1=198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/include/clang/Driver/Options.td (original) > +++ cfe/trunk/include/clang/Driver/Options.td Mon Jan 6 19:19:08 2014 > @@ -559,8 +559,6 @@ def finstrument_functions : Flag<["-"], > def fkeep_inline_functions : Flag<["-"], "fkeep-inline-functions">, > Group<clang_ignored_f_Group>; > def flat__namespace : Flag<["-"], "flat_namespace">; > def flax_vector_conversions : Flag<["-"], "flax-vector-conversions">, > Group<f_Group>; > -def flimit_debug_info : Flag<["-"], "flimit-debug-info">, Group<f_Group>, > Flags<[CC1Option]>, > - HelpText<"Limit debug information produced to reduce size of debug > binary">; > def flimited_precision_EQ : Joined<["-"], "flimited-precision=">, > Group<f_Group>; > def flto : Flag<["-"], "flto">, Group<f_Group>; > def fno_lto : Flag<["-"], "fno-lto">, Group<f_Group>; > @@ -654,8 +652,6 @@ def fno_inline : Flag<["-"], "fno-inline > def fno_keep_inline_functions : Flag<["-"], "fno-keep-inline-functions">, > Group<clang_ignored_f_Group>; > def fno_lax_vector_conversions : Flag<["-"], > "fno-lax-vector-conversions">, Group<f_Group>, > HelpText<"Disallow implicit conversions between vectors with a > different number of elements or different element types">, > Flags<[CC1Option]>; > -def fno_limit_debug_info : Flag<["-"], "fno-limit-debug-info">, > Group<f_Group>, Flags<[CC1Option]>, > - HelpText<"Do not limit debug information produced to reduce size of > debug binary">; > def fno_merge_all_constants : Flag<["-"], "fno-merge-all-constants">, > Group<f_Group>, > Flags<[CC1Option]>, HelpText<"Disallow merging of constants">; > def fno_modules : Flag <["-"], "fno-modules">, Group<f_Group>, > @@ -783,6 +779,12 @@ def fno_signed_char : Flag<["-"], "fno-s > def fsplit_stack : Flag<["-"], "fsplit-stack">, Group<f_Group>; > def fstack_protector_all : Flag<["-"], "fstack-protector-all">, > Group<f_Group>; > def fstack_protector : Flag<["-"], "fstack-protector">, Group<f_Group>; > +def fstandalone_debug : Flag<["-"], "fstandalone-debug">, Group<f_Group>, > Flags<[CC1Option]>, > + HelpText<"Emit full debug info for all types used by the program">; > +def fno_standalone_debug : Flag<["-"], "fno-standalone-debug">, > Group<f_Group>, Flags<[CC1Option]>, > + HelpText<"Limit debug information produced to reduce size of debug > binary">; > +def flimit_debug_info : Flag<["-"], "flimit-debug-info">, > Alias<fno_standalone_debug>; > +def fno_limit_debug_info : Flag<["-"], "fno-limit-debug-info">, > Alias<fstandalone_debug>; > def fstrict_aliasing : Flag<["-"], "fstrict-aliasing">, Group<f_Group>; > def fstrict_enums : Flag<["-"], "fstrict-enums">, Group<f_Group>, > Flags<[CC1Option]>, > HelpText<"Enable optimizations based on the strict definition of an > enum's " > > Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.h > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Frontend/CodeGenOptions.h?rev=198655&r1=198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/include/clang/Frontend/CodeGenOptions.h (original) > +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.h Mon Jan 6 19:19:08 > 2014 > @@ -50,12 +50,20 @@ public: > }; > > enum DebugInfoKind { > - NoDebugInfo, // Don't generate debug info. > - DebugLineTablesOnly, // Emit only debug info necessary for generating > - // line number tables (-gline-tables-only). > - LimitedDebugInfo, // Limit generated debug info to reduce size > - // (-flimit-debug-info). > - FullDebugInfo // Generate complete debug info. > + NoDebugInfo, /// Don't generate debug info. > + > + DebugLineTablesOnly, /// Emit only debug info necessary for > generating > + /// line number tables (-gline-tables-only). > + > + LimitedDebugInfo, /// Limit generated debug info to reduce size > + /// (-fno-standalone-debug). Probably useful for this comment to describe the principle used here, then, optionally, list the current applications of that principle. (eg: "LimitedDebugInfo": Emit declarations for types known to have their definitions emitted in other translation units.) > This emits > + /// forward decls for types that could be > + /// replaced with forward decls in the source > + /// code. For dynamic C++ classes type info > + /// is only emitted int the module that > + /// contains the classe's vtable. > + > + FullDebugInfo /// Generate complete debug info. > }; > > enum TLSModel { > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ > CGDebugInfo.cpp?rev=198655&r1=198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Jan 6 19:19:08 2014 > @@ -1464,13 +1464,13 @@ llvm::DIType CGDebugInfo::CreateType(con > // declaration. The completeType, completeRequiredType, and > completeClassData > // callbacks will handle promoting the declaration to a definition. > if (T || > + // Under -flimit-debug-info: > (DebugKind <= CodeGenOptions::LimitedDebugInfo && > - // Under -flimit-debug-info, emit only a declaration unless the > type is > - // required to be complete. > - !RD->isCompleteDefinitionRequired() && > CGM.getLangOpts().CPlusPlus) || > - // If the class is dynamic, only emit a declaration. A definition > will be > - // emitted whenever the vtable is emitted. > - (CXXDecl && CXXDecl->hasDefinition() && CXXDecl->isDynamicClass())) > { > + // Emit only a forward declaration unless the type is required. > + ((!RD->isCompleteDefinitionRequired() && > CGM.getLangOpts().CPlusPlus) || > + // If the class is dynamic, only emit a declaration. A definition > will be > + // emitted whenever the vtable is emitted. > + (CXXDecl && CXXDecl->hasDefinition() && > CXXDecl->isDynamicClass())))) { > llvm::DIDescriptor FDContext = > getContextDescriptor(cast<Decl>(RD->getDeclContext())); > if (!T) > > Modified: cfe/trunk/lib/Driver/Tools.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ > Tools.cpp?rev=198655&r1=198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Driver/Tools.cpp (original) > +++ cfe/trunk/lib/Driver/Tools.cpp Mon Jan 6 19:19:08 2014 > @@ -2945,8 +2945,8 @@ void Clang::ConstructJob(Compilation &C, > // Forward -f (flag) options which we can pass directly. > Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); > Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); > - Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info); > - Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info); > + Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug); > + Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug); > Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names); > // AltiVec language extensions aren't relevant for assembling. > if (!isa<PreprocessJobAction>(JA) || > > Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ > Frontend/CompilerInvocation.cpp?rev=198655&r1=198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) > +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Jan 6 19:19:08 2014 > @@ -296,7 +296,8 @@ static void ParseCommentArgs(CommentOpti > } > > static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, > InputKind IK, > - DiagnosticsEngine &Diags) { > + DiagnosticsEngine &Diags, > + const TargetOptions &TargetOpts) { > using namespace options; > bool Success = true; > > @@ -323,10 +324,16 @@ static bool ParseCodeGenArgs(CodeGenOpti > Opts.setDebugInfo(CodeGenOptions::DebugLineTablesOnly); > } else if (Args.hasArg(OPT_g_Flag) || Args.hasArg(OPT_gdwarf_2) || > Args.hasArg(OPT_gdwarf_3) || Args.hasArg(OPT_gdwarf_4)) { > - if (Args.hasFlag(OPT_flimit_debug_info, OPT_fno_limit_debug_info, > true)) > - Opts.setDebugInfo(CodeGenOptions::LimitedDebugInfo); > - else > + bool Default = false; > + // Until dtrace (via CTF) can deal with distributed debug info, > + // Darwin defaults to standalone/full debug info. > + if (llvm::Triple(TargetOpts.Triple).isOSDarwin()) > + Default = true; > + > + if (Args.hasFlag(OPT_fstandalone_debug, OPT_fno_standalone_debug, > Default)) > Opts.setDebugInfo(CodeGenOptions::FullDebugInfo); > + else > + Opts.setDebugInfo(CodeGenOptions::LimitedDebugInfo); > } > Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info); > Opts.SplitDwarfFile = Args.getLastArgValue(OPT_split_dwarf_file); > @@ -1662,8 +1669,9 @@ bool CompilerInvocation::CreateFromArgs( > ParseFileSystemArgs(Res.getFileSystemOpts(), *Args); > // FIXME: We shouldn't have to pass the DashX option around here > InputKind DashX = ParseFrontendArgs(Res.getFrontendOpts(), *Args, > Diags); > - Success = ParseCodeGenArgs(Res.getCodeGenOpts(), *Args, DashX, Diags) > - && Success; > + ParseTargetArgs(Res.getTargetOpts(), *Args); > + Success = ParseCodeGenArgs(Res.getCodeGenOpts(), *Args, DashX, Diags, > + Res.getTargetOpts()) && Success; > ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), *Args); > if (DashX != IK_AST && DashX != IK_LLVM_IR) { > ParseLangArgs(*Res.getLangOpts(), *Args, DashX, Diags); > @@ -1678,8 +1686,6 @@ bool CompilerInvocation::CreateFromArgs( > ParsePreprocessorArgs(Res.getPreprocessorOpts(), *Args, FileMgr, > Diags); > ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args, > Res.getFrontendOpts().ProgramAction); > - ParseTargetArgs(Res.getTargetOpts(), *Args); > - > return Success; > } > > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-class-limited.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-class-limited.cpp?rev=198655&r1= > 198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-class-limited.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-class-limited.cpp Mon Jan 6 > 19:19:08 2014 > @@ -1,4 +1,4 @@ > -// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s > +// RUN: %clang -emit-llvm -fno-standalone-debug -g -S %s -o - | FileCheck > %s > > namespace PR16214_1 { > // CHECK-DAG: [ DW_TAG_structure_type ] [foo] [line [[@LINE+1]], {{.*}} > [def] > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-class-nolimit.cpp?rev=198655&r1= > 198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp Mon Jan 6 > 19:19:08 2014 > @@ -1,4 +1,6 @@ > -// RUN: %clang_cc1 -triple x86_64-unk-unk -fno-limit-debug-info -o - > -emit-llvm -g %s | FileCheck %s > +// RUN: %clang_cc1 -triple x86_64-unk-unk -fstandalone-debug -o - > -emit-llvm -g %s | FileCheck %s > +// On Darwin, this should be the default: > +// RUN: %clang_cc1 -triple x86_64-apple-darwin -o - -emit-llvm -g %s | > FileCheck %s > > namespace rdar14101097_1 { // see also PR16214 > // Check that we emit debug info for the definition of a struct if the > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-dup-fwd-decl.cpp?rev=198655&r1=198654& > r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp Mon Jan 6 > 19:19:08 2014 > @@ -1,4 +1,4 @@ > -// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin > -fno-limit-debug-info %s -o - | FileCheck %s > +// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin > -fstandalone-debug %s -o - | FileCheck %s > > class Test > { > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-method2.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-method2.cpp?rev=198655&r1=198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-method2.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-method2.cpp Mon Jan 6 19:19:08 > 2014 > @@ -1,4 +1,4 @@ > -// RUN: %clang_cc1 -flimit-debug-info -x c++ -g -S -emit-llvm < %s | > FileCheck %s > +// RUN: %clang_cc1 -fno-standalone-debug -x c++ -g -S -emit-llvm < %s | > FileCheck %s > // rdar://10336845 > // Preserve type qualifiers in -flimit-debug-info mode. > > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-namespace.cpp?rev=198655&r1= > 198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp Mon Jan 6 > 19:19:08 2014 > @@ -1,6 +1,6 @@ > -// RUN: %clang -g -S -emit-llvm %s -o - | FileCheck %s > -// RUN: %clang -g -gline-tables-only -S -emit-llvm %s -o - | FileCheck > -check-prefix=CHECK-GMLT %s > -// RUN: %clang -g -fno-limit-debug-info -S -emit-llvm %s -o - | FileCheck > -check-prefix=CHECK-NOLIMIT %s > +// RUN: %clang -g -fno-standalone-debug -S -emit-llvm %s -o - | FileCheck > %s > +// RUN: %clang -g -gline-tables-only -S -emit-llvm %s -o - | FileCheck > -check-prefix=CHECK-GMLT %s > +// RUN: %clang -g -fstandalone-debug -S -emit-llvm %s -o - | FileCheck > -check-prefix=CHECK-NOLIMIT %s > > namespace A { > #line 1 "foo.cpp" > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-pubtypes.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-pubtypes.cpp?rev=198655&r1= > 198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-pubtypes.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-pubtypes.cpp Mon Jan 6 19:19:08 > 2014 > @@ -1,5 +1,5 @@ > // REQUIRES: x86-registered-target > -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -g > -fno-limit-debug-info -S -mllvm -generate-dwarf-pub-sections=Enable %s -o > - | FileCheck %s > +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -g -fstandalone-debug > -S -mllvm -generate-dwarf-pub-sections=Enable %s -o - | FileCheck %s > > // FIXME: This testcase shouldn't rely on assembly emission. > //CHECK: Lpubtypes_begin[[SECNUM:[0-9]:]] > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-template-limit.cpp?rev=198655& > r1=198654&r2=198655&view=diff > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp Mon Jan 6 > 19:19:08 2014 > @@ -1,4 +1,4 @@ > -// RUN: %clang_cc1 -emit-llvm -flimit-debug-info -cxx-abi itanium -g %s > -o - | FileCheck %s > +// RUN: %clang_cc1 -emit-llvm -fno-standalone-debug -cxx-abi itanium -g > %s -o - | FileCheck %s > > // Check that this pointer type is TC<int> > // CHECK: ![[LINE:[0-9]+]] = {{.*}}"TC<int>", {{.*}} metadata > !"_ZTS2TCIiE"} ; [ DW_TAG_class_type ] > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-template-member.cpp?rev=198655&r1=198654&r2=198655& > view=diff > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp Mon Jan 6 > 19:19:08 2014 > @@ -1,4 +1,4 @@ > -// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | > FileCheck %s > +// RUN: %clang_cc1 -emit-llvm -g -fno-standalone-debug -triple > x86_64-apple-darwin %s -o - | FileCheck %s > > struct MyClass { > template <int i> int add(int j) { > > Added: cfe/trunk/test/CodeGenCXX/debug-info-vtable-optzn.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGenCXX/debug-info-vtable-optzn.cpp?rev=198655&view=auto > ============================================================ > ================== > --- cfe/trunk/test/CodeGenCXX/debug-info-vtable-optzn.cpp (added) > +++ cfe/trunk/test/CodeGenCXX/debug-info-vtable-optzn.cpp Mon Jan 6 > 19:19:08 2014 > @@ -0,0 +1,21 @@ > +// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | > FileCheck %s > +// > +// This tests that the "emit debug info for a C++ class only in the > +// module that has its vtable" optimization is disabled by default on > +// Darwin. > +// > +// CHECK: [ DW_TAG_member ] [lost] > +class A > +{ > + virtual bool f() = 0; > + int lost; > +}; > + > +class B : public A > +{ > + B *g(); > +}; > + > +B *B::g() { > + return this; > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
