zcov: / lib/Driver/Arg.cpp


Files: 1 Branches Taken: 46.0% 29 / 63
Generated: 2010-02-10 01:31 Branches Executed: 54.0% 34 / 63
Line Coverage: 73.7% 84 / 114


Programs: 2 Runs 3018


       1                 : //===--- Arg.cpp - Argument Implementations -----------------------------*-===//
       2                 : //
       3                 : //                     The LLVM Compiler Infrastructure
       4                 : //
       5                 : // This file is distributed under the University of Illinois Open Source
       6                 : // License. See LICENSE.TXT for details.
       7                 : //
       8                 : //===----------------------------------------------------------------------===//
       9                 : 
      10                 : #include "clang/Driver/Arg.h"
      11                 : #include "clang/Driver/ArgList.h"
      12                 : #include "clang/Driver/Option.h"
      13                 : #include "llvm/Support/raw_ostream.h"
      14                 : 
      15                 : using namespace clang::driver;
      16                 : 
      17                 : Arg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index,
      18            12663:          const Arg *_BaseArg)
      19            12663:   : Kind(_Kind), Opt(_Opt), BaseArg(_BaseArg), Index(_Index), Claimed(false) {
      20            12663: }
      21                 : 
                    12566: branch 0 taken
                    12566: branch 1 taken
                        0: branch 3 not taken
                        0: branch 4 not taken
                        0: branch 6 not taken
                    12566: branch 7 taken
      22            12566: Arg::~Arg() { }
      23                 : 
      24                0: void Arg::dump() const {
      25                0:   llvm::errs() << "<";
                        0: branch 0 not taken
                        0: branch 1 not taken
                        0: branch 2 not taken
                        0: branch 3 not taken
                        0: branch 4 not taken
                        0: branch 5 not taken
                        0: branch 6 not taken
      26                0:   switch (Kind) {
      27                 :   default:
      28                0:     assert(0 && "Invalid kind");
      29                 : #define P(N) case N: llvm::errs() << #N; break
      30                0:     P(FlagClass);
      31                0:     P(PositionalClass);
      32                0:     P(JoinedClass);
      33                0:     P(SeparateClass);
      34                0:     P(CommaJoinedClass);
      35                0:     P(JoinedAndSeparateClass);
      36                 : #undef P
      37                 :   }
      38                 : 
      39                0:   llvm::errs() << " Opt:";
      40                0:   Opt->dump();
      41                 : 
      42                0:   llvm::errs() << " Index:" << Index;
      43                 : 
                        0: branch 1 not taken
                        0: branch 2 not taken
                        0: branch 4 not taken
                        0: branch 5 not taken
                        0: branch 6 not taken
                        0: branch 7 not taken
      44                0:   if (isa<CommaJoinedArg>(this) || isa<SeparateArg>(this))
      45                0:     llvm::errs() << " NumValues:" << getNumValues();
      46                 : 
      47                0:   llvm::errs() << ">\n";
      48                0: }
      49                 : 
      50               28: std::string Arg::getAsString(const ArgList &Args) const {
      51               28:   std::string Res;
      52               28:   llvm::raw_string_ostream OS(Res);
      53                 : 
      54               28:   ArgStringList ASL;
      55               28:   render(Args, ASL);
                       33: branch 0 taken
                       28: branch 1 taken
      56               61:   for (ArgStringList::iterator
      57               28:          it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
                        5: branch 1 taken
                       28: branch 2 taken
      58               33:     if (it != ASL.begin())
      59                5:       OS << ' ';
      60               33:     OS << *it;
      61                 :   }
      62                 : 
      63               28:   return OS.str();
      64                 : }
      65                 : 
      66                7: void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
                        7: branch 2 taken
                        0: branch 3 not taken
      67                7:   if (!getOption().hasNoOptAsInput()) {
      68                7:     render(Args, Output);
      69                7:     return;
      70                 :   }
      71                 : 
                        0: branch 1 not taken
                        0: branch 2 not taken
      72                0:   for (unsigned i = 0, e = getNumValues(); i != e; ++i)
      73                0:     Output.push_back(getValue(Args, i));
      74                 : }
      75                 : 
      76             6071: FlagArg::FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
      77             6071:   : Arg(FlagClass, Opt, Index, BaseArg) {
      78             6071: }
      79                 : 
      80              160: void FlagArg::render(const ArgList &Args, ArgStringList &Output) const {
      81              160:   Output.push_back(Args.getArgString(getIndex()));
      82              160: }
      83                 : 
      84                0: const char *FlagArg::getValue(const ArgList &Args, unsigned N) const {
      85                0:   assert(0 && "Invalid index.");
      86                 :   return 0;
      87                 : }
      88                 : 
      89                 : PositionalArg::PositionalArg(const Option *Opt, unsigned Index,
      90             2684:                              const Arg *BaseArg)
      91             2684:   : Arg(PositionalClass, Opt, Index, BaseArg) {
      92             2684: }
      93                 : 
      94                5: void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
      95                5:   Output.push_back(Args.getArgString(getIndex()));
      96                5: }
      97                 : 
      98             2915: const char *PositionalArg::getValue(const ArgList &Args, unsigned N) const {
                     2915: branch 1 taken
                        0: branch 2 not taken
      99             2915:   assert(N < getNumValues() && "Invalid index.");
     100             2915:   return Args.getArgString(getIndex());
     101                 : }
     102                 : 
     103              974: JoinedArg::JoinedArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
     104              974:   : Arg(JoinedClass, Opt, Index, BaseArg) {
     105              974: }
     106                 : 
     107               52: void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
                        0: branch 2 not taken
                       52: branch 3 taken
     108               52:   if (getOption().hasForceSeparateRender()) {
     109                0:     Output.push_back(getOption().getName());
     110                0:     Output.push_back(getValue(Args, 0));
     111                 :   } else {
     112               52:     Output.push_back(Args.getArgString(getIndex()));
     113                 :   }
     114               52: }
     115                 : 
     116              965: const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
                      965: branch 1 taken
                        0: branch 2 not taken
     117              965:   assert(N < getNumValues() && "Invalid index.");
     118                 :   // FIXME: Avoid strlen.
     119              965:   return Args.getArgString(getIndex()) + strlen(getOption().getName());
     120                 : }
     121                 : 
     122                 : CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
     123                1:                                const char *Str, const Arg *BaseArg)
     124                1:   : Arg(CommaJoinedClass, Opt, Index, BaseArg) {
     125                1:   const char *Prev = Str;
     126                7:   for (;; ++Str) {
     127                8:     char c = *Str;
     128                 : 
                        1: branch 0 taken
                        7: branch 1 taken
                        7: branch 2 taken
                        7: branch 3 taken
     129                8:     if (!c) {
                        1: branch 0 taken
                        0: branch 1 not taken
                        0: branch 2 not taken
                        0: branch 3 not taken
     130                1:       if (Prev != Str)
     131                1:         Values.push_back(std::string(Prev, Str));
     132                 :       break;
                        1: branch 0 taken
                        6: branch 1 taken
                        6: branch 2 taken
                        6: branch 3 taken
     133                7:     } else if (c == ',') {
                        1: branch 0 taken
                        0: branch 1 not taken
                        0: branch 2 not taken
                        0: branch 3 not taken
     134                1:       if (Prev != Str)
     135                1:         Values.push_back(std::string(Prev, Str));
     136                1:       Prev = Str + 1;
     137                 :     }
     138                 :   }
     139                1: }
     140                 : 
     141                0: void CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
     142                0:   Output.push_back(Args.getArgString(getIndex()));
     143                0: }
     144                 : 
     145                2: const char *CommaJoinedArg::getValue(const ArgList &Args, unsigned N) const {
                        2: branch 1 taken
                        0: branch 2 not taken
     146                2:   assert(N < getNumValues() && "Invalid index.");
     147                2:   return Values[N].c_str();
     148                 : }
     149                 : 
     150                 : SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues,
     151             2927:                          const Arg *BaseArg)
     152             2927:   : Arg(SeparateClass, Opt, Index, BaseArg), NumValues(_NumValues) {
     153             2927: }
     154                 : 
     155               60: void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
                        0: branch 2 not taken
                       60: branch 3 taken
     156               60:   if (getOption().hasForceJoinedRender()) {
                        0: branch 1 not taken
                        0: branch 2 not taken
     157                0:     assert(getNumValues() == 1 && "Cannot force joined render with > 1 args.");
     158                 :     // FIXME: Avoid std::string.
     159                0:     std::string Joined(getOption().getName());
     160                0:     Joined += Args.getArgString(getIndex());
     161                0:     Output.push_back(Args.MakeArgString(Joined.c_str()));
     162                 :   } else {
     163               60:     Output.push_back(Args.getArgString(getIndex()));
                       72: branch 0 taken
                       60: branch 1 taken
     164              132:     for (unsigned i = 0; i < NumValues; ++i)
     165               72:       Output.push_back(Args.getArgString(getIndex() + 1 + i));
     166                 :   }
     167               60: }
     168                 : 
     169             2978: const char *SeparateArg::getValue(const ArgList &Args, unsigned N) const {
                     2978: branch 1 taken
                        0: branch 2 not taken
     170             2978:   assert(N < getNumValues() && "Invalid index.");
     171             2978:   return Args.getArgString(getIndex() + 1 + N);
     172                 : }
     173                 : 
     174                 : JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index,
     175                6:                                            const Arg *BaseArg)
     176                6:   : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg) {
     177                6: }
     178                 : 
     179                 : void JoinedAndSeparateArg::render(const ArgList &Args,
     180                4:                                   ArgStringList &Output) const {
     181                4:   Output.push_back(Args.getArgString(getIndex()));
     182                4:   Output.push_back(Args.getArgString(getIndex() + 1));
     183                4: }
     184                 : 
     185                 : const char *JoinedAndSeparateArg::getValue(const ArgList &Args,
     186                7:                                            unsigned N) const {
                        7: branch 1 taken
                        0: branch 2 not taken
     187                7:   assert(N < getNumValues() && "Invalid index.");
                        6: branch 0 taken
                        1: branch 1 taken
     188                7:   if (N == 0)
     189                6:     return Args.getArgString(getIndex()) + strlen(getOption().getName());
     190                1:   return Args.getArgString(getIndex() + 1);
     191                 : }

Generated: 2010-02-10 01:31 by zcov