Hi Daniel, I believe this introduces the following warning:
llvm[4]: Compiling cc1_main.cpp for Debug build llvm[4]: Compiling driver.cpp for Debug build driver.cpp: In function 'int main(int, const char**)': driver.cpp:211: warning: ISO C++ forbids zero-size array 'argv' Cheers, Edward. 2009/11/19 Daniel Dunbar <[email protected]>: > Author: ddunbar > Date: Thu Nov 19 01:37:51 2009 > New Revision: 89333 > > URL: http://llvm.org/viewvc/llvm-project?rev=89333&view=rev > Log: > Sketch some 'clang -cc1' support, for testing parts of CompilerInvocation. > > Added: > cfe/trunk/tools/driver/cc1_main.cpp > Modified: > cfe/trunk/lib/Frontend/CompilerInvocation.cpp > cfe/trunk/tools/driver/CMakeLists.txt > cfe/trunk/tools/driver/Makefile > cfe/trunk/tools/driver/driver.cpp > > Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=89333&r1=89332&r2=89333&view=diff > > ============================================================================== > --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) > +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Nov 19 01:37:51 2009 > @@ -14,7 +14,6 @@ > > void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res, > const llvm::SmallVectorImpl<llvm::StringRef> > &Args) { > - llvm::llvm_report_error("FIXME: Not yet implemented!"); > } > > static const char *getAnalysisName(Analyses Kind) { > > Modified: cfe/trunk/tools/driver/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/CMakeLists.txt?rev=89333&r1=89332&r2=89333&view=diff > > ============================================================================== > --- cfe/trunk/tools/driver/CMakeLists.txt (original) > +++ cfe/trunk/tools/driver/CMakeLists.txt Thu Nov 19 01:37:51 2009 > @@ -3,12 +3,14 @@ > set( LLVM_USED_LIBS > clangDriver > clangBasic > + clangFrontend > ) > > set(LLVM_LINK_COMPONENTS system support bitreader bitwriter) > > add_clang_executable(clang > driver.cpp > + cc1_main.cpp > ) > > add_dependencies(clang clang-cc) > > Modified: cfe/trunk/tools/driver/Makefile > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/Makefile?rev=89333&r1=89332&r2=89333&view=diff > > ============================================================================== > --- cfe/trunk/tools/driver/Makefile (original) > +++ cfe/trunk/tools/driver/Makefile Thu Nov 19 01:37:51 2009 > @@ -19,7 +19,7 @@ > # FIXME: It is unfortunate we need to pull in the bitcode reader and > # writer just to get the serializer stuff used by clangBasic. > LINK_COMPONENTS := system support bitreader bitwriter > -USEDLIBS = clangDriver.a clangBasic.a > +USEDLIBS = clangDriver.a clangBasic.a clangFrontend.a > > include $(LEVEL)/Makefile.common > > > Added: cfe/trunk/tools/driver/cc1_main.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/cc1_main.cpp?rev=89333&view=auto > > ============================================================================== > --- cfe/trunk/tools/driver/cc1_main.cpp (added) > +++ cfe/trunk/tools/driver/cc1_main.cpp Thu Nov 19 01:37:51 2009 > @@ -0,0 +1,88 @@ > +//===-- cc1_main.cpp - Clang CC1 Driver > -----------------------------------===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > +//===----------------------------------------------------------------------===// > +// > +// This is the entry point to the clang -cc1 functionality. > +// > +//===----------------------------------------------------------------------===// > + > +#include "clang/Driver/Arg.h" > +#include "clang/Driver/ArgList.h" > +#include "clang/Driver/CC1Options.h" > +#include "clang/Driver/DriverDiagnostic.h" > +#include "clang/Driver/OptTable.h" > +#include "clang/Driver/Option.h" > +#include "clang/Frontend/CompilerInvocation.h" > +#include "llvm/Support/raw_ostream.h" > +#include <cstdlib> > +#include <vector> > + > +using namespace clang; > +using namespace clang::driver; > + > +int cc1_main(Diagnostic &Diags, const char **ArgBegin, const char **ArgEnd) { > + llvm::errs() << "cc1 argv:"; > + for (const char **i = ArgBegin; i != ArgEnd; ++i) > + llvm::errs() << " \"" << *i << '"'; > + llvm::errs() << "\n"; > + > + // Parse the arguments. > + OptTable *Opts = createCC1OptTable(); > + unsigned MissingArgIndex, MissingArgCount; > + InputArgList *Args = Opts->ParseArgs(ArgBegin, ArgEnd, > + MissingArgIndex, MissingArgCount); > + > + // Check for missing argument error. > + if (MissingArgCount) > + Diags.Report(clang::diag::err_drv_missing_argument) > + << Args->getArgString(MissingArgIndex) << MissingArgCount; > + > + // Dump the parsed arguments. > + llvm::errs() << "cc1 parsed options:\n"; > + for (ArgList::const_iterator it = Args->begin(), ie = Args->end(); > + it != ie; ++it) > + (*it)->dump(); > + > + // Create a compiler invocation. > + llvm::errs() << "cc1 creating invocation.\n"; > + CompilerInvocation Invocation; > + CompilerInvocation::CreateFromArgs(Invocation, > + llvm::SmallVector<llvm::StringRef, 32>(ArgBegin, > ArgEnd)); > + > + // Convert the invocation back to argument strings. > + std::vector<std::string> InvocationArgs; > + Invocation.toArgs(InvocationArgs); > + > + // Dump the converted arguments. > + llvm::SmallVector<llvm::StringRef, 32> Invocation2Args; > + llvm::errs() << "invocation argv:"; > + for (unsigned i = 0, e = InvocationArgs.size(); i != e; ++i) { > + Invocation2Args.push_back(InvocationArgs[i]); > + llvm::errs() << " \"" << InvocationArgs[i] << '"'; > + } > + llvm::errs() << "\n"; > + > + // Convert those arguments to another invocation, and check that we got the > + // same thing. > + CompilerInvocation Invocation2; > + CompilerInvocation::CreateFromArgs(Invocation2, Invocation2Args); > + > + // FIXME: Implement CompilerInvocation comparison. > + if (memcmp(&Invocation, &Invocation2, sizeof(Invocation)) != 0) { > + llvm::errs() << "warning: Invocations differ!\n"; > + > + std::vector<std::string> Invocation2Args; > + Invocation2.toArgs(Invocation2Args); > + llvm::errs() << "invocation argv:"; > + for (unsigned i = 0, e = Invocation2Args.size(); i != e; ++i) > + llvm::errs() << " \"" << Invocation2Args[i] << '"'; > + llvm::errs() << "\n"; > + } > + > + return 0; > +} > > Modified: cfe/trunk/tools/driver/driver.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/driver.cpp?rev=89333&r1=89332&r2=89333&view=diff > > ============================================================================== > --- cfe/trunk/tools/driver/driver.cpp (original) > +++ cfe/trunk/tools/driver/driver.cpp Thu Nov 19 01:37:51 2009 > @@ -178,6 +178,9 @@ > } > } > > +extern int cc1_main(Diagnostic &Diags, > + const char **ArgBegin, const char **ArgEnd); > + > int main(int argc, const char **argv) { > llvm::sys::PrintStackTraceOnErrorSignal(); > llvm::PrettyStackTraceProgram X(argc, argv); > @@ -187,6 +190,10 @@ > > Diagnostic Diags(&DiagClient); > > + // Dispatch to cc1_main if appropriate. > + if (argc > 1 && llvm::StringRef(argv[1]) == "-cc1") > + return cc1_main(Diags, argv+2, argv+argc); > + > #ifdef CLANG_IS_PRODUCTION > bool IsProduction = true; > #else > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > -- -- Edward O'Callaghan http://www.auroraux.org/ eocallaghan at auroraux dot org _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
