1 //===- Arg.cpp - Argument Implementations ---------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ADT/SmallString.h"
10 #include "llvm/Config/llvm-config.h"
11 #include "llvm/Option/Arg.h"
12 #include "llvm/Option/ArgList.h"
13 #include "llvm/Option/Option.h"
14 #include "llvm/Support/Compiler.h"
15 #include "llvm/Support/Debug.h"
16 #include "llvm/Support/raw_ostream.h"
19 using namespace llvm::opt
;
21 Arg::Arg(const Option Opt
, StringRef S
, unsigned Index
, const Arg
*BaseArg
)
22 : Opt(Opt
), BaseArg(BaseArg
), Spelling(S
), Index(Index
), Claimed(false),
23 IgnoredTargetSpecific(false), OwnsValues(false) {}
25 Arg::Arg(const Option Opt
, StringRef S
, unsigned Index
, const char *Value0
,
27 : Opt(Opt
), BaseArg(BaseArg
), Spelling(S
), Index(Index
), Claimed(false),
28 IgnoredTargetSpecific(false), OwnsValues(false) {
29 Values
.push_back(Value0
);
32 Arg::Arg(const Option Opt
, StringRef S
, unsigned Index
, const char *Value0
,
33 const char *Value1
, const Arg
*BaseArg
)
34 : Opt(Opt
), BaseArg(BaseArg
), Spelling(S
), Index(Index
), Claimed(false),
35 IgnoredTargetSpecific(false), OwnsValues(false) {
36 Values
.push_back(Value0
);
37 Values
.push_back(Value1
);
42 for (unsigned i
= 0, e
= Values
.size(); i
!= e
; ++i
)
47 void Arg::print(raw_ostream
& O
) const {
49 Opt
.print(O
, /*AddNewLine=*/false);
51 O
<< " Index:" << Index
;
54 for (unsigned i
= 0, e
= Values
.size(); i
!= e
; ++i
) {
56 O
<< "'" << Values
[i
] << "'";
62 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
63 LLVM_DUMP_METHOD
void Arg::dump() const { print(dbgs()); }
66 std::string
Arg::getAsString(const ArgList
&Args
) const {
68 return Alias
->getAsString(Args
);
71 raw_svector_ostream
OS(Res
);
75 for (ArgStringList::iterator
76 it
= ASL
.begin(), ie
= ASL
.end(); it
!= ie
; ++it
) {
77 if (it
!= ASL
.begin())
82 return std::string(OS
.str());
85 void Arg::renderAsInput(const ArgList
&Args
, ArgStringList
&Output
) const {
86 if (!getOption().hasNoOptAsInput()) {
91 Output
.append(Values
.begin(), Values
.end());
94 void Arg::render(const ArgList
&Args
, ArgStringList
&Output
) const {
95 switch (getOption().getRenderStyle()) {
96 case Option::RenderValuesStyle
:
97 Output
.append(Values
.begin(), Values
.end());
100 case Option::RenderCommaJoinedStyle
: {
101 SmallString
<256> Res
;
102 raw_svector_ostream
OS(Res
);
104 for (unsigned i
= 0, e
= getNumValues(); i
!= e
; ++i
) {
108 Output
.push_back(Args
.MakeArgString(OS
.str()));
112 case Option::RenderJoinedStyle
:
113 Output
.push_back(Args
.GetOrMakeJoinedArgString(
114 getIndex(), getSpelling(), getValue(0)));
115 Output
.append(Values
.begin() + 1, Values
.end());
118 case Option::RenderSeparateStyle
:
119 Output
.push_back(Args
.MakeArgString(getSpelling()));
120 Output
.append(Values
.begin(), Values
.end());