Line data Source code
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 "llvm/ADT/SmallString.h"
11 : #include "llvm/Config/llvm-config.h"
12 : #include "llvm/Option/Arg.h"
13 : #include "llvm/Option/ArgList.h"
14 : #include "llvm/Option/Option.h"
15 : #include "llvm/Support/Compiler.h"
16 : #include "llvm/Support/Debug.h"
17 : #include "llvm/Support/raw_ostream.h"
18 :
19 : using namespace llvm;
20 : using namespace llvm::opt;
21 :
22 510991 : Arg::Arg(const Option Opt, StringRef S, unsigned Index, const Arg *BaseArg)
23 : : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
24 1021982 : OwnsValues(false) {}
25 :
26 2190676 : Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,
27 2190676 : const Arg *BaseArg)
28 : : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
29 2190676 : OwnsValues(false) {
30 2190676 : Values.push_back(Value0);
31 2190676 : }
32 :
33 27 : Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,
34 27 : const char *Value1, const Arg *BaseArg)
35 : : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
36 27 : OwnsValues(false) {
37 27 : Values.push_back(Value0);
38 27 : Values.push_back(Value1);
39 27 : }
40 :
41 5402883 : Arg::~Arg() {
42 2701442 : if (OwnsValues) {
43 80161 : for (unsigned i = 0, e = Values.size(); i != e; ++i)
44 102814 : delete[] Values[i];
45 : }
46 2701441 : }
47 :
48 0 : void Arg::print(raw_ostream& O) const {
49 0 : O << "<";
50 :
51 0 : O << " Opt:";
52 0 : Opt.print(O);
53 :
54 0 : O << " Index:" << Index;
55 :
56 0 : O << " Values: [";
57 0 : for (unsigned i = 0, e = Values.size(); i != e; ++i) {
58 0 : if (i) O << ", ";
59 0 : O << "'" << Values[i] << "'";
60 : }
61 :
62 0 : O << "]>\n";
63 0 : }
64 :
65 : #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
66 : LLVM_DUMP_METHOD void Arg::dump() const { print(dbgs()); }
67 : #endif
68 :
69 813 : std::string Arg::getAsString(const ArgList &Args) const {
70 : SmallString<256> Res;
71 : raw_svector_ostream OS(Res);
72 :
73 : ArgStringList ASL;
74 813 : render(Args, ASL);
75 851 : for (ArgStringList::iterator
76 1664 : it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
77 851 : if (it != ASL.begin())
78 : OS << ' ';
79 851 : OS << *it;
80 : }
81 :
82 813 : return OS.str();
83 : }
84 :
85 72182 : void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
86 144364 : if (!getOption().hasNoOptAsInput()) {
87 61112 : render(Args, Output);
88 61112 : return;
89 : }
90 :
91 22140 : Output.append(Values.begin(), Values.end());
92 : }
93 :
94 581209 : void Arg::render(const ArgList &Args, ArgStringList &Output) const {
95 508859 : switch (getOption().getRenderStyle()) {
96 200 : case Option::RenderValuesStyle:
97 400 : Output.append(Values.begin(), Values.end());
98 200 : break;
99 :
100 : case Option::RenderCommaJoinedStyle: {
101 : SmallString<256> Res;
102 : raw_svector_ostream OS(Res);
103 130 : OS << getSpelling();
104 261 : for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
105 131 : if (i) OS << ',';
106 131 : OS << getValue(i);
107 : }
108 390 : Output.push_back(Args.MakeArgString(OS.str()));
109 : break;
110 : }
111 :
112 185454 : case Option::RenderJoinedStyle:
113 370908 : Output.push_back(Args.GetOrMakeJoinedArgString(
114 : getIndex(), getSpelling(), getValue(0)));
115 370908 : Output.append(Values.begin() + 1, Values.end());
116 185454 : break;
117 :
118 395425 : case Option::RenderSeparateStyle:
119 790850 : Output.push_back(Args.MakeArgString(getSpelling()));
120 790850 : Output.append(Values.begin(), Values.end());
121 395425 : break;
122 : }
123 581209 : }
|