Would it be acceptable to just use:<br><br>#ifndef __func__<br># define __func__ ""<br>#endif<br><br>?<br><br>Code compiled by MSVC would not have the function name but would have both __FILE__ and __LINE__ so it's already something.<br>
<br>-- Matthieu<br><br><div class="gmail_quote">On Fri, Jan 11, 2013 at 12:09 AM, NAKAMURA Takumi <span dir="ltr"><<a href="mailto:geek4civic@gmail.com" target="_blank">geek4civic@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
It seems msvc doesn't define __func__ ...<br>
<br>
2013/1/11 Argyrios Kyrtzidis <<a href="mailto:akyrtzi@gmail.com">akyrtzi@gmail.com</a>>:<br>
<div class="HOEnZb"><div class="h5">> Author: akirtzidis<br>
> Date: Thu Jan 10 12:54:52 2013<br>
> New Revision: 172089<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=172089&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=172089&view=rev</a><br>
> Log:<br>
> [libclang] Enhance logging capabilities of libclang.<br>
><br>
> -provide a "raw_ostream'ish" class to make it convenient to output logging info.<br>
> -use macros to automate a bit the logging functionality inside libclang functions<br>
> -when logging, print a stack trace if "LIBCLANG_LOGGING=2" environment is set.<br>
> -add logging to more functions.<br>
><br>
> Modified:<br>
> cfe/trunk/tools/libclang/CIndex.cpp<br>
> cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp<br>
> cfe/trunk/tools/libclang/CIndexHigh.cpp<br>
> cfe/trunk/tools/libclang/CXSourceLocation.cpp<br>
> cfe/trunk/tools/libclang/Indexing.cpp<br>
><br>
> Modified: cfe/trunk/tools/libclang/CIndex.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=172089&r1=172088&r2=172089&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=172089&r1=172088&r2=172089&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)<br>
> +++ cfe/trunk/tools/libclang/CIndex.cpp Thu Jan 10 12:54:52 2013<br>
> @@ -21,6 +21,7 @@<br>
> #include "CXTranslationUnit.h"<br>
> #include "CXType.h"<br>
> #include "CursorVisitor.h"<br>
> +#include "CLog.h"<br>
> #include "SimpleFormatContext.h"<br>
> #include "clang/AST/StmtVisitor.h"<br>
> #include "clang/Basic/Diagnostic.h"<br>
> @@ -46,6 +47,12 @@<br>
> #include "llvm/Support/Threading.h"<br>
> #include "llvm/Support/Timer.h"<br>
> #include "llvm/Support/raw_ostream.h"<br>
> +#include "llvm/Support/Format.h"<br>
> +#include "llvm/Config/config.h"<br>
> +<br>
> +#if HAVE_PTHREAD_H<br>
> +#include <pthread.h><br>
> +#endif<br>
><br>
> using namespace clang;<br>
> using namespace clang::cxcursor;<br>
> @@ -2681,6 +2688,12 @@<br>
> struct CXUnsavedFile *unsaved_files,<br>
> unsigned num_unsaved_files,<br>
> unsigned options) {<br>
> + LOG_FUNC_SECTION {<br>
> + *Log << source_filename << ": ";<br>
> + for (int i = 0; i != num_command_line_args; ++i)<br>
> + *Log << command_line_args[i] << " ";<br>
> + }<br>
> +<br>
> ParseTranslationUnitInfo PTUI = { CIdx, source_filename, command_line_args,<br>
> num_command_line_args, unsaved_files,<br>
> num_unsaved_files, options, 0 };<br>
> @@ -2744,6 +2757,10 @@<br>
><br>
> int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,<br>
> unsigned options) {<br>
> + LOG_FUNC_SECTION {<br>
> + *Log << TU << ' ' << FileName;<br>
> + }<br>
> +<br>
> if (!TU)<br>
> return CXSaveError_InvalidTU;<br>
><br>
> @@ -2861,6 +2878,10 @@<br>
> unsigned num_unsaved_files,<br>
> struct CXUnsavedFile *unsaved_files,<br>
> unsigned options) {<br>
> + LOG_FUNC_SECTION {<br>
> + *Log << TU;<br>
> + }<br>
> +<br>
> ReparseTranslationUnitInfo RTUI = { TU, num_unsaved_files, unsaved_files,<br>
> options, 0 };<br>
><br>
> @@ -3808,8 +3829,7 @@<br>
> SourceLocation SLoc = cxloc::translateSourceLocation(Loc);<br>
> CXCursor Result = cxcursor::getCursor(TU, SLoc);<br>
><br>
> - bool Logging = getenv("LIBCLANG_LOGGING");<br>
> - if (Logging) {<br>
> + LOG_FUNC_SECTION {<br>
> CXFile SearchFile;<br>
> unsigned SearchLine, SearchColumn;<br>
> CXFile ResultFile;<br>
> @@ -3818,18 +3838,19 @@<br>
> const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : "";<br>
> CXSourceLocation ResultLoc = clang_getCursorLocation(Result);<br>
><br>
> - clang_getExpansionLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 0);<br>
> - clang_getExpansionLocation(ResultLoc, &ResultFile, &ResultLine,<br>
> + clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 0);<br>
> + clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine,<br>
> &ResultColumn, 0);<br>
> SearchFileName = clang_getFileName(SearchFile);<br>
> ResultFileName = clang_getFileName(ResultFile);<br>
> KindSpelling = clang_getCursorKindSpelling(Result.kind);<br>
> USR = clang_getCursorUSR(Result);<br>
> - fprintf(stderr, "clang_getCursor(%s:%d:%d) = %s(%s:%d:%d):%s%s\n",<br>
> - clang_getCString(SearchFileName), SearchLine, SearchColumn,<br>
> - clang_getCString(KindSpelling),<br>
> - clang_getCString(ResultFileName), ResultLine, ResultColumn,<br>
> - clang_getCString(USR), IsDef);<br>
> + *Log << llvm::format("(%s:%d:%d) = %s",<br>
> + clang_getCString(SearchFileName), SearchLine, SearchColumn,<br>
> + clang_getCString(KindSpelling))<br>
> + << llvm::format("(%s:%d:%d):%s%s",<br>
> + clang_getCString(ResultFileName), ResultLine, ResultColumn,<br>
> + clang_getCString(USR), IsDef);<br>
> clang_disposeString(SearchFileName);<br>
> clang_disposeString(ResultFileName);<br>
> clang_disposeString(KindSpelling);<br>
> @@ -3842,13 +3863,13 @@<br>
> = clang_getCursorKindSpelling(Definition.kind);<br>
> CXFile DefinitionFile;<br>
> unsigned DefinitionLine, DefinitionColumn;<br>
> - clang_getExpansionLocation(DefinitionLoc, &DefinitionFile,<br>
> + clang_getFileLocation(DefinitionLoc, &DefinitionFile,<br>
> &DefinitionLine, &DefinitionColumn, 0);<br>
> CXString DefinitionFileName = clang_getFileName(DefinitionFile);<br>
> - fprintf(stderr, " -> %s(%s:%d:%d)\n",<br>
> - clang_getCString(DefinitionKindSpelling),<br>
> - clang_getCString(DefinitionFileName),<br>
> - DefinitionLine, DefinitionColumn);<br>
> + *Log << llvm::format(" -> %s(%s:%d:%d)",<br>
> + clang_getCString(DefinitionKindSpelling),<br>
> + clang_getCString(DefinitionFileName),<br>
> + DefinitionLine, DefinitionColumn);<br>
> clang_disposeString(DefinitionFileName);<br>
> clang_disposeString(DefinitionKindSpelling);<br>
> }<br>
> @@ -4850,6 +4871,10 @@<br>
><br>
> void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,<br>
> CXToken **Tokens, unsigned *NumTokens) {<br>
> + LOG_FUNC_SECTION {<br>
> + *Log << TU << ' ' << Range;<br>
> + }<br>
> +<br>
> if (Tokens)<br>
> *Tokens = 0;<br>
> if (NumTokens)<br>
> @@ -5522,9 +5547,17 @@<br>
> void clang_annotateTokens(CXTranslationUnit TU,<br>
> CXToken *Tokens, unsigned NumTokens,<br>
> CXCursor *Cursors) {<br>
> -<br>
> - if (NumTokens == 0 || !Tokens || !Cursors)<br>
> + if (NumTokens == 0 || !Tokens || !Cursors) {<br>
> + LOG_FUNC_SECTION { *Log << "<null input>"; }<br>
> return;<br>
> + }<br>
> +<br>
> + LOG_FUNC_SECTION {<br>
> + *Log << TU << ' ';<br>
> + CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]);<br>
> + CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens-1]);<br>
> + *Log << clang_getRange(bloc, eloc);<br>
> + }<br>
><br>
> // Any token we don't specifically annotate will have a NULL cursor.<br>
> CXCursor C = clang_getNullCursor();<br>
> @@ -6290,3 +6323,88 @@<br>
><br>
> } // end: extern "C"<br>
><br>
> +Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) {<br>
> + if (TU) {<br>
> + if (ASTUnit *Unit = static_cast<ASTUnit *>(TU->TUData)) {<br>
> + LogOS << '<' << Unit->getMainFileName() << '>';<br>
> + return *this;<br>
> + }<br>
> + }<br>
> +<br>
> + LogOS << "<NULL TU>";<br>
> + return *this;<br>
> +}<br>
> +<br>
> +Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) {<br>
> + CXFile File;<br>
> + unsigned Line, Column;<br>
> + clang_getFileLocation(Loc, &File, &Line, &Column, 0);<br>
> + CXString FileName = clang_getFileName(File);<br>
> + *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column);<br>
> + clang_disposeString(FileName);<br>
> + return *this;<br>
> +}<br>
> +<br>
> +Logger &cxindex::Logger::operator<<(CXSourceRange range) {<br>
> + CXSourceLocation BLoc = clang_getRangeStart(range);<br>
> + CXSourceLocation ELoc = clang_getRangeEnd(range);<br>
> +<br>
> + CXFile BFile;<br>
> + unsigned BLine, BColumn;<br>
> + clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, 0);<br>
> +<br>
> + CXFile EFile;<br>
> + unsigned ELine, EColumn;<br>
> + clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, 0);<br>
> +<br>
> + CXString BFileName = clang_getFileName(BFile);<br>
> + if (BFile == EFile) {<br>
> + *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName),<br>
> + BLine, BColumn, ELine, EColumn);<br>
> + } else {<br>
> + CXString EFileName = clang_getFileName(EFile);<br>
> + *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName),<br>
> + BLine, BColumn)<br>
> + << llvm::format("%s:%d:%d]", clang_getCString(EFileName),<br>
> + ELine, EColumn);<br>
> + clang_disposeString(EFileName);<br>
> + }<br>
> + clang_disposeString(BFileName);<br>
> + return *this;<br>
> +}<br>
> +<br>
> +Logger &cxindex::Logger::operator<<(CXString Str) {<br>
> + *this << clang_getCString(Str);<br>
> + return *this;<br>
> +}<br>
> +<br>
> +Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) {<br>
> + LogOS << Fmt;<br>
> + return *this;<br>
> +}<br>
> +<br>
> +cxindex::Logger::~Logger() {<br>
> + LogOS.flush();<br>
> +<br>
> + llvm::sys::ScopedLock L(EnableMultithreadingMutex);<br>
> +<br>
> + static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime();<br>
> +<br>
> + llvm::raw_ostream &OS = llvm::errs();<br>
> + OS << "[libclang:" << Name << ':';<br>
> +<br>
> + // FIXME: Portability.<br>
> +#if HAVE_PTHREAD_H && __APPLE__<br>
> + mach_port_t tid = pthread_mach_thread_np(pthread_self());<br>
> + OS << tid << ':';<br>
> +#endif<br>
> +<br>
> + llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime();<br>
> + OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime());<br>
> + OS << Msg.str() << '\n';<br>
> +<br>
> + if (Trace) {<br>
> + llvm::sys::PrintStackTrace(stderr);<br>
> + OS << "--------------------------------------------------\n";<br>
> + }<br>
> +}<br>
><br>
> Modified: cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp?rev=172089&r1=172088&r2=172089&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp?rev=172089&r1=172088&r2=172089&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp (original)<br>
> +++ cfe/trunk/tools/libclang/CIndexCodeCompletion.cpp Thu Jan 10 12:54:52 2013<br>
> @@ -17,6 +17,7 @@<br>
> #include "CXCursor.h"<br>
> #include "CXString.h"<br>
> #include "CXTranslationUnit.h"<br>
> +#include "CLog.h"<br>
> #include "clang/AST/Decl.h"<br>
> #include "clang/AST/DeclObjC.h"<br>
> #include "clang/AST/Type.h"<br>
> @@ -48,6 +49,7 @@<br>
><br>
> using namespace clang;<br>
> using namespace clang::cxstring;<br>
> +using namespace clang::cxindex;<br>
><br>
> extern "C" {<br>
><br>
> @@ -821,6 +823,11 @@<br>
> struct CXUnsavedFile *unsaved_files,<br>
> unsigned num_unsaved_files,<br>
> unsigned options) {<br>
> + LOG_FUNC_SECTION {<br>
> + *Log << TU << ' '<br>
> + << complete_filename << ':' << complete_line << ':' << complete_column;<br>
> + }<br>
> +<br>
> CodeCompleteAtInfo CCAI = { TU, complete_filename, complete_line,<br>
> complete_column, unsaved_files, num_unsaved_files,<br>
> options, 0 };<br>
><br>
> Modified: cfe/trunk/tools/libclang/CIndexHigh.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexHigh.cpp?rev=172089&r1=172088&r2=172089&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexHigh.cpp?rev=172089&r1=172088&r2=172089&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/tools/libclang/CIndexHigh.cpp (original)<br>
> +++ cfe/trunk/tools/libclang/CIndexHigh.cpp Thu Jan 10 12:54:52 2013<br>
> @@ -11,11 +11,13 @@<br>
> #include "CXCursor.h"<br>
> #include "CXSourceLocation.h"<br>
> #include "CXTranslationUnit.h"<br>
> +#include "CLog.h"<br>
> #include "clang/AST/DeclObjC.h"<br>
> #include "clang/Frontend/ASTUnit.h"<br>
><br>
> using namespace clang;<br>
> using namespace cxcursor;<br>
> +using namespace cxindex;<br>
><br>
> static void getTopOverriddenMethods(CXTranslationUnit TU,<br>
> Decl *D,<br>
> @@ -341,26 +343,26 @@<br>
><br>
> void clang_findReferencesInFile(CXCursor cursor, CXFile file,<br>
> CXCursorAndRangeVisitor visitor) {<br>
> - bool Logging = ::getenv("LIBCLANG_LOGGING");<br>
> + LogRef Log = Logger::make(__func__);<br>
><br>
> if (clang_Cursor_isNull(cursor)) {<br>
> - if (Logging)<br>
> - llvm::errs() << "clang_findReferencesInFile: Null cursor\n";<br>
> + if (Log)<br>
> + *Log << "Null cursor";<br>
> return;<br>
> }<br>
> if (cursor.kind == CXCursor_NoDeclFound) {<br>
> - if (Logging)<br>
> - llvm::errs() << "clang_findReferencesInFile: Got CXCursor_NoDeclFound\n";<br>
> + if (Log)<br>
> + *Log << "Got CXCursor_NoDeclFound";<br>
> return;<br>
> }<br>
> if (!file) {<br>
> - if (Logging)<br>
> - llvm::errs() << "clang_findReferencesInFile: Null file\n";<br>
> + if (Log)<br>
> + *Log << "Null file";<br>
> return;<br>
> }<br>
> if (!visitor.visit) {<br>
> - if (Logging)<br>
> - llvm::errs() << "clang_findReferencesInFile: Null visitor\n";<br>
> + if (Log)<br>
> + *Log << "Null visitor";<br>
> return;<br>
> }<br>
><br>
> @@ -391,9 +393,8 @@<br>
> CXCursor refCursor = clang_getCursorReferenced(cursor);<br>
><br>
> if (!clang_isDeclaration(refCursor.kind)) {<br>
> - if (Logging)<br>
> - llvm::errs() << "clang_findReferencesInFile: cursor is not referencing a "<br>
> - "declaration\n";<br>
> + if (Log)<br>
> + *Log << "cursor is not referencing a declaration";<br>
> return;<br>
> }<br>
><br>
><br>
> Modified: cfe/trunk/tools/libclang/CXSourceLocation.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXSourceLocation.cpp?rev=172089&r1=172088&r2=172089&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXSourceLocation.cpp?rev=172089&r1=172088&r2=172089&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/tools/libclang/CXSourceLocation.cpp (original)<br>
> +++ cfe/trunk/tools/libclang/CXSourceLocation.cpp Thu Jan 10 12:54:52 2013<br>
> @@ -17,9 +17,12 @@<br>
> #include "CXSourceLocation.h"<br>
> #include "CXString.h"<br>
> #include "CXTranslationUnit.h"<br>
> +#include "CLog.h"<br>
> +#include "llvm/Support/Format.h"<br>
><br>
> using namespace clang;<br>
> using namespace clang::cxstring;<br>
> +using namespace clang::cxindex;<br>
><br>
> //===----------------------------------------------------------------------===//<br>
> // Internal predicates on CXSourceLocations.<br>
> @@ -122,24 +125,25 @@<br>
> if (!tu || !file)<br>
> return clang_getNullLocation();<br>
><br>
> - bool Logging = ::getenv("LIBCLANG_LOGGING");<br>
> + LogRef Log = Logger::make(__func__);<br>
> ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu->TUData);<br>
> ASTUnit::ConcurrencyCheck Check(*CXXUnit);<br>
> const FileEntry *File = static_cast<const FileEntry *>(file);<br>
> SourceLocation SLoc = CXXUnit->getLocation(File, line, column);<br>
> if (SLoc.isInvalid()) {<br>
> - if (Logging)<br>
> - llvm::errs() << "clang_getLocation(\"" << File->getName()<br>
> - << "\", " << line << ", " << column << ") = invalid\n";<br>
> + if (Log)<br>
> + *Log << llvm::format("(\"%s\", %d, %d) = invalid",<br>
> + File->getName(), line, column);<br>
> return clang_getNullLocation();<br>
> }<br>
><br>
> - if (Logging)<br>
> - llvm::errs() << "clang_getLocation(\"" << File->getName()<br>
> - << "\", " << line << ", " << column << ") = "<br>
> - << SLoc.getRawEncoding() << "\n";<br>
> + CXSourceLocation CXLoc =<br>
> + cxloc::translateSourceLocation(CXXUnit->getASTContext(), SLoc);<br>
> + if (Log)<br>
> + *Log << llvm::format("(\"%s\", %d, %d) = ", File->getName(), line, column)<br>
> + << CXLoc;<br>
><br>
> - return cxloc::translateSourceLocation(CXXUnit->getASTContext(), SLoc);<br>
> + return CXLoc;<br>
> }<br>
><br>
> CXSourceLocation clang_getLocationForOffset(CXTranslationUnit tu,<br>
><br>
> Modified: cfe/trunk/tools/libclang/Indexing.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=172089&r1=172088&r2=172089&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=172089&r1=172088&r2=172089&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/tools/libclang/Indexing.cpp (original)<br>
> +++ cfe/trunk/tools/libclang/Indexing.cpp Thu Jan 10 12:54:52 2013<br>
> @@ -14,6 +14,7 @@<br>
> #include "CXSourceLocation.h"<br>
> #include "CXString.h"<br>
> #include "CXTranslationUnit.h"<br>
> +#include "CLog.h"<br>
> #include "clang/AST/ASTConsumer.h"<br>
> #include "clang/AST/DeclVisitor.h"<br>
> #include "clang/Frontend/ASTUnit.h"<br>
> @@ -968,6 +969,11 @@<br>
> unsigned num_unsaved_files,<br>
> CXTranslationUnit *out_TU,<br>
> unsigned TU_options) {<br>
> + LOG_FUNC_SECTION {<br>
> + *Log << source_filename << ": ";<br>
> + for (int i = 0; i != num_command_line_args; ++i)<br>
> + *Log << command_line_args[i] << " ";<br>
> + }<br>
><br>
> IndexSourceFileInfo ITUI = { idxAction, client_data, index_callbacks,<br>
> index_callbacks_size, index_options,<br>
> @@ -1018,6 +1024,9 @@<br>
> unsigned index_callbacks_size,<br>
> unsigned index_options,<br>
> CXTranslationUnit TU) {<br>
> + LOG_FUNC_SECTION {<br>
> + *Log << TU;<br>
> + }<br>
><br>
> IndexTranslationUnitInfo ITUI = { idxAction, client_data, index_callbacks,<br>
> index_callbacks_size, index_options, TU,<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br>