diff options
| author | Mikhail Glushenkov <foldr@codedgers.com> | 2008-11-25 21:38:12 +0000 | 
|---|---|---|
| committer | Mikhail Glushenkov <foldr@codedgers.com> | 2008-11-25 21:38:12 +0000 | 
| commit | 98d5ed5cb72e4db9cdacbfa5cdb31626729b7738 (patch) | |
| tree | 45fc6355ae8f9f2f478aa489554d96b34a5fbaef /llvm/tools/llvmc/driver/Action.cpp | |
| parent | 67630080b9022d0a4ef2da0f13986c876efc51ed (diff) | |
| download | bcm5719-llvm-98d5ed5cb72e4db9cdacbfa5cdb31626729b7738.tar.gz bcm5719-llvm-98d5ed5cb72e4db9cdacbfa5cdb31626729b7738.zip | |
Since the old llvmc was removed, rename llvmc2 to llvmc.
llvm-svn: 60048
Diffstat (limited to 'llvm/tools/llvmc/driver/Action.cpp')
| -rw-r--r-- | llvm/tools/llvmc/driver/Action.cpp | 78 | 
1 files changed, 78 insertions, 0 deletions
| diff --git a/llvm/tools/llvmc/driver/Action.cpp b/llvm/tools/llvmc/driver/Action.cpp new file mode 100644 index 00000000000..c0a1b849bcd --- /dev/null +++ b/llvm/tools/llvmc/driver/Action.cpp @@ -0,0 +1,78 @@ +//===--- Action.cpp - The LLVM Compiler Driver ------------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open +// Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +//  Action class - implementation and auxiliary functions. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CompilerDriver/Action.h" + +#include "llvm/Support/CommandLine.h" +#include "llvm/System/Program.h" + +#include <iostream> +#include <stdexcept> + +using namespace llvm; +using namespace llvmc; + +extern cl::opt<bool> DryRun; +extern cl::opt<bool> VerboseMode; + +namespace { +  int ExecuteProgram(const std::string& name, +                     const StrVector& args) { +    sys::Path prog = sys::Program::FindProgramByName(name); + +    if (prog.isEmpty()) +      throw std::runtime_error("Can't find program '" + name + "'"); +    if (!prog.canExecute()) +      throw std::runtime_error("Program '" + name + "' is not executable."); + +    // Build the command line vector and the redirects array. +    const sys::Path* redirects[3] = {0,0,0}; +    sys::Path stdout_redirect; + +    std::vector<const char*> argv; +    argv.reserve((args.size()+2)); +    argv.push_back(name.c_str()); + +    for (StrVector::const_iterator B = args.begin(), E = args.end(); +         B!=E; ++B) { +      if (*B == ">") { +        ++B; +        stdout_redirect.set(*B); +        redirects[1] = &stdout_redirect; +      } +      else { +        argv.push_back((*B).c_str()); +      } +    } +    argv.push_back(0);  // null terminate list. + +    // Invoke the program. +    return sys::Program::ExecuteAndWait(prog, &argv[0], 0, &redirects[0]); +  } + +  void print_string (const std::string& str) { +    std::cerr << str << ' '; +  } +} + +int llvmc::Action::Execute() const { +  if (DryRun || VerboseMode) { +    std::cerr << Command_ << " "; +    std::for_each(Args_.begin(), Args_.end(), print_string); +    std::cerr << '\n'; +  } +  if (DryRun) +    return 0; +  else +    return ExecuteProgram(Command_, Args_); +} | 

