zcov: / lib/Driver/ArgList.cpp


Files: 1 Branches Taken: 64.9% 74 / 114
Generated: 2010-02-10 01:31 Branches Executed: 68.4% 78 / 114
Line Coverage: 88.6% 117 / 132


Programs: 2 Runs 3018


       1                 : //===--- ArgList.cpp - Argument List Management -------------------------*-===//
       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/ArgList.h"
      11                 : #include "clang/Driver/Arg.h"
      12                 : #include "clang/Driver/Option.h"
      13                 : 
      14                 : #include "llvm/ADT/SmallString.h"
      15                 : #include "llvm/ADT/Twine.h"
      16                 : #include "llvm/Support/raw_ostream.h"
      17                 : 
      18                 : using namespace clang::driver;
      19                 : 
      20            97286: void arg_iterator::SkipToNextArg() {
                   219718: branch 1 taken
                    94121: branch 2 taken
      21           313839:   for (; Current != Args.end(); ++Current) {
      22                 :     // Done if there are no filters.
                        0: branch 1 not taken
                   219718: branch 2 taken
      23           219718:     if (!Id0.isValid())
      24                0:       break;
      25                 : 
      26                 :     // Otherwise require a match.
      27           219718:     const Option &O = (*Current)->getOption();
                   216602: branch 1 taken
                     3116: branch 2 taken
                    48220: branch 4 taken
                   168382: branch 5 taken
                    48176: branch 7 taken
                       44: branch 8 taken
                    22399: branch 10 taken
                   194159: branch 11 taken
                        5: branch 13 taken
                    22394: branch 14 taken
                     3165: branch 15 taken
                   216553: branch 16 taken
      28           219718:     if (O.matches(Id0) ||
      29                 :         (Id1.isValid() && O.matches(Id1)) ||
      30                 :         (Id2.isValid() && O.matches(Id2)))
      31             3165:       break;
      32                 :   }
      33            97286: }
      34                 : 
      35                 : //
      36                 : 
      37             2978: ArgList::ArgList(arglist_type &_Args) : Args(_Args) {
      38             2978: }
      39                 : 
      40             2978: ArgList::~ArgList() {
                     2978: branch 0 taken
                     2978: branch 1 taken
                        0: branch 3 not taken
                        0: branch 4 not taken
                        0: branch 6 not taken
                     2978: branch 7 taken
      41             2978: }
      42                 : 
      43            13069: void ArgList::append(Arg *A) {
      44            13069:   Args.push_back(A);
      45            13069: }
      46                 : 
      47           394499: Arg *ArgList::getLastArgNoClaim(OptSpecifier Id) const {
      48                 :   // FIXME: Make search efficient?
                  1774627: branch 4 taken
                   384775: branch 5 taken
      49          2159402:   for (const_reverse_iterator it = rbegin(), ie = rend(); it != ie; ++it)
                     9724: branch 3 taken
                  1764903: branch 4 taken
      50          1774627:     if ((*it)->getOption().matches(Id))
      51             9724:       return *it;
      52           384775:   return 0;
      53                 : }
      54                 : 
      55           374209: Arg *ArgList::getLastArg(OptSpecifier Id) const {
      56           374209:   Arg *A = getLastArgNoClaim(Id);
                     9644: branch 0 taken
                   364565: branch 1 taken
      57           374209:   if (A)
      58             9644:     A->claim();
      59           374209:   return A;
      60                 : }
      61                 : 
      62             9439: Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1) const {
      63             9439:   Arg *Res, *A0 = getLastArgNoClaim(Id0), *A1 = getLastArgNoClaim(Id1);
      64                 : 
                       46: branch 0 taken
                     9393: branch 1 taken
                       16: branch 2 taken
                       30: branch 3 taken
      65             9455:   if (A0 && A1)
                       10: branch 2 taken
                        6: branch 3 taken
      66               16:     Res = A0->getIndex() > A1->getIndex() ? A0 : A1;
      67                 :   else
                       30: branch 0 taken
                     9393: branch 1 taken
      68             9423:     Res = A0 ? A0 : A1;
      69                 : 
                       62: branch 0 taken
                     9377: branch 1 taken
      70             9439:   if (Res)
      71               62:     Res->claim();
      72                 : 
      73             9439:   return Res;
      74                 : }
      75                 : 
      76                 : Arg *ArgList::getLastArg(OptSpecifier Id0, OptSpecifier Id1,
      77              458:                          OptSpecifier Id2) const {
      78              458:   Arg *Res = 0;
      79              458:   Arg *A0 = getLastArgNoClaim(Id0);
      80              458:   Arg *A1 = getLastArgNoClaim(Id1);
      81              458:   Arg *A2 = getLastArgNoClaim(Id2);
      82                 : 
                        1: branch 0 taken
                      457: branch 1 taken
      83              458:   int A0Idx = A0 ? A0->getIndex() : -1;
                        1: branch 0 taken
                      457: branch 1 taken
      84              458:   int A1Idx = A1 ? A1->getIndex() : -1;
                        0: branch 0 not taken
                      458: branch 1 taken
      85              458:   int A2Idx = A2 ? A2->getIndex() : -1;
      86                 : 
                        1: branch 0 taken
                      457: branch 1 taken
      87              458:   if (A0Idx > A1Idx) {
                        1: branch 0 taken
                        0: branch 1 not taken
      88                1:     if (A0Idx > A2Idx)
      89                1:       Res = A0;
                        0: branch 0 not taken
                        0: branch 1 not taken
      90                0:     else if (A2Idx != -1)
      91                0:       Res = A2;
      92                 :   } else {
                        1: branch 0 taken
                      456: branch 1 taken
      93              457:     if (A1Idx > A2Idx)
      94                1:       Res = A1;
                        0: branch 0 not taken
                      456: branch 1 taken
      95              456:     else if (A2Idx != -1)
      96                0:       Res = A2;
      97                 :   }
      98                 : 
                        2: branch 0 taken
                      456: branch 1 taken
      99              458:   if (Res)
     100                2:     Res->claim();
     101                 : 
     102              458:   return Res;
     103                 : }
     104                 : 
     105             7717: bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {
                       31: branch 1 taken
                     7686: branch 2 taken
     106             7717:   if (Arg *A = getLastArg(Pos, Neg))
     107               31:     return A->getOption().matches(Pos);
     108             7686:   return Default;
     109                 : }
     110                 : 
     111             5999: void ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {
                      111: branch 1 taken
                     5888: branch 2 taken
     112             5999:   if (Arg *A = getLastArg(Id)) {
     113              111:     A->claim();
     114              111:     A->render(*this, Output);
     115                 :   }
     116             5999: }
     117                 : 
     118                 : void ArgList::AddAllArgs(ArgStringList &Output, OptSpecifier Id0,
     119             1948:                          OptSpecifier Id1, OptSpecifier Id2) const {
                      116: branch 3 taken
                     1948: branch 4 taken
     120             4012:   for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
     121             1948:          ie = filtered_end(); it != ie; ++it) {
     122              116:     it->claim();
     123              116:     it->render(*this, Output);
     124                 :   }
     125             1948: }
     126                 : 
     127                 : void ArgList::AddAllArgValues(ArgStringList &Output, OptSpecifier Id0,
     128            18234:                               OptSpecifier Id1, OptSpecifier Id2) const {
                     2812: branch 3 taken
                    18234: branch 4 taken
     129            39280:   for (arg_iterator it = filtered_begin(Id0, Id1, Id2),
     130            18234:          ie = filtered_end(); it != ie; ++it) {
     131             2812:     it->claim();
                     2812: branch 2 taken
                     2812: branch 3 taken
     132             5624:     for (unsigned i = 0, e = it->getNumValues(); i != e; ++i)
     133             2812:       Output.push_back(it->getValue(*this, i));
     134                 :   }
     135            18234: }
     136                 : 
     137                 : void ArgList::AddAllArgsTranslated(ArgStringList &Output, OptSpecifier Id0,
     138                 :                                    const char *Translation,
     139              229:                                    bool Joined) const {
                       22: branch 5 taken
                      229: branch 6 taken
     140              480:   for (arg_iterator it = filtered_begin(Id0),
     141              229:          ie = filtered_end(); it != ie; ++it) {
     142               22:     it->claim();
     143                 : 
                        0: branch 0 not taken
                       22: branch 1 taken
     144               22:     if (Joined) {
     145                 :       Output.push_back(MakeArgString(llvm::StringRef(Translation) +
     146                0:                                      it->getValue(*this, 0)));
     147                 :     } else {
     148               22:       Output.push_back(Translation);
     149               22:       Output.push_back(it->getValue(*this, 0));
     150                 :     }
     151                 :   }
     152              229: }
     153                 : 
     154              852: void ArgList::ClaimAllArgs(OptSpecifier Id0) const {
                       19: branch 5 taken
                      852: branch 6 taken
     155             1723:   for (arg_iterator it = filtered_begin(Id0),
     156              852:          ie = filtered_end(); it != ie; ++it)
     157               19:       it->claim();
     158              852: }
     159                 : 
     160              200: const char *ArgList::MakeArgString(const llvm::Twine &T) const {
     161              200:   llvm::SmallString<256> Str;
     162              200:   T.toVector(Str);
     163              200:   return MakeArgString(Str.str());
     164                 : }
     165                 : 
     166                 : //
     167                 : 
     168             2771: InputArgList::InputArgList(const char **ArgBegin, const char **ArgEnd)
     169             2771:   : ArgList(ActualArgs), NumInputArgStrings(ArgEnd - ArgBegin) {
     170             2771:   ArgStrings.append(ArgBegin, ArgEnd);
     171             2771: }
     172                 : 
     173             2771: InputArgList::~InputArgList() {
     174                 :   // An InputArgList always owns its arguments.
                    12566: branch 2 taken
                     2771: branch 3 taken
                        0: branch 6 not taken
                        0: branch 7 not taken
                        0: branch 10 not taken
                        0: branch 11 not taken
     175            15337:   for (iterator it = begin(), ie = end(); it != ie; ++it)
                    12566: branch 0 taken
                        0: branch 1 not taken
                    12566: branch 3 taken
                    12566: branch 4 taken
                        0: branch 6 not taken
                        0: branch 7 not taken
     176            12566:     delete *it;
                     2771: branch 4 taken
                        0: branch 5 not taken
                        0: branch 11 not taken
                        0: branch 12 not taken
                        0: branch 18 not taken
                        0: branch 19 not taken
     177             2771: }
     178                 : 
     179             1093: unsigned InputArgList::MakeIndex(llvm::StringRef String0) const {
     180             1093:   unsigned Index = ArgStrings.size();
     181                 : 
     182                 :   // Tuck away so we have a reliable const char *.
     183             1093:   SynthesizedStrings.push_back(String0);
     184             1093:   ArgStrings.push_back(SynthesizedStrings.back().c_str());
     185                 : 
     186             1093:   return Index;
     187                 : }
     188                 : 
     189                 : unsigned InputArgList::MakeIndex(llvm::StringRef String0,
     190                0:                                  llvm::StringRef String1) const {
     191                0:   unsigned Index0 = MakeIndex(String0);
     192                0:   unsigned Index1 = MakeIndex(String1);
                        0: branch 0 not taken
                        0: branch 1 not taken
     193                0:   assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
     194                 :   (void) Index1;
     195                0:   return Index0;
     196                 : }
     197                 : 
     198              999: const char *InputArgList::MakeArgString(llvm::StringRef Str) const {
     199              999:   return getArgString(MakeIndex(Str));
     200                 : }
     201                 : 
     202                 : //
     203                 : 
     204              207: DerivedArgList::DerivedArgList(InputArgList &_BaseArgs, bool _OnlyProxy)
     205                 :   : ArgList(_OnlyProxy ? _BaseArgs.getArgs() : ActualArgs),
                      155: branch 0 taken
                       52: branch 1 taken
                      207: branch 6 taken
                      207: branch 7 taken
     206              207:     BaseArgs(_BaseArgs), OnlyProxy(_OnlyProxy) {
     207              207: }
     208                 : 
     209              207: DerivedArgList::~DerivedArgList() {
     210                 :   // We only own the arguments we explicitly synthesized.
                        0: branch 2 not taken
                      207: branch 3 taken
                        0: branch 6 not taken
                        0: branch 7 not taken
                        0: branch 10 not taken
                        0: branch 11 not taken
     211              207:   for (iterator it = SynthesizedArgs.begin(), ie = SynthesizedArgs.end();
     212                 :        it != ie; ++it)
                        0: branch 0 not taken
                        0: branch 1 not taken
                        0: branch 3 not taken
                        0: branch 4 not taken
                        0: branch 6 not taken
                        0: branch 7 not taken
     213                0:     delete *it;
                      207: branch 3 taken
                        0: branch 4 not taken
                        0: branch 9 not taken
                        0: branch 10 not taken
                        0: branch 15 not taken
                        0: branch 16 not taken
     214              207: }
     215                 : 
     216              928: const char *DerivedArgList::MakeArgString(llvm::StringRef Str) const {
     217              928:   return BaseArgs.MakeArgString(Str);
     218                 : }
     219                 : 
     220                6: Arg *DerivedArgList::MakeFlagArg(const Arg *BaseArg, const Option *Opt) const {
     221                6:   return new FlagArg(Opt, BaseArgs.MakeIndex(Opt->getName()), BaseArg);
     222                 : }
     223                 : 
     224                 : Arg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt,
     225                0:                                        llvm::StringRef Value) const {
     226                0:   return new PositionalArg(Opt, BaseArgs.MakeIndex(Value), BaseArg);
     227                 : }
     228                 : 
     229                 : Arg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
     230                0:                                      llvm::StringRef Value) const {
     231                 :   return new SeparateArg(Opt, BaseArgs.MakeIndex(Opt->getName(), Value), 1,
     232                0:                          BaseArg);
     233                 : }
     234                 : 
     235                 : Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
     236               88:                                    llvm::StringRef Value) const {
     237               88:   std::string Joined(Opt->getName());
     238               88:   Joined += Value;
     239               88:   return new JoinedArg(Opt, BaseArgs.MakeIndex(Joined.c_str()), BaseArg);
     240                 : }

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