diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-11-19 07:37:51 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-11-19 07:37:51 +0000 |
commit | 217acbfa3524d5805fda7900b26c1e779443588d (patch) | |
tree | 95278f7547e81fe7c5e80dd97953487d677cfbe0 /tools/driver/cc1_main.cpp | |
parent | c06a8d8f3120ac93a36b77a4e59e5ad7c4fa56c9 (diff) | |
download | clang-217acbfa3524d5805fda7900b26c1e779443588d.tar.gz |
Sketch some 'clang -cc1' support, for testing parts of CompilerInvocation.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89333 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/driver/cc1_main.cpp')
-rw-r--r-- | tools/driver/cc1_main.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/driver/cc1_main.cpp b/tools/driver/cc1_main.cpp new file mode 100644 index 0000000000..c5163592b4 --- /dev/null +++ b/tools/driver/cc1_main.cpp @@ -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; +} |