[NFC] Separate getLastArgIntValue to Basic
getLastArgIntValue is a useful utility function to get command line argument as an integer. Currently it is in Frontend so that it can only be used by clang -cc1. Move it to basic so that it can also be used by clang driver. Differential Revision: https://reviews.llvm.org/D71080
This commit is contained in:
58
clang/include/clang/Basic/OptionUtils.h
Normal file
58
clang/include/clang/Basic/OptionUtils.h
Normal file
@@ -0,0 +1,58 @@
|
||||
//===- OptionUtils.h - Utilities for command line arguments -----*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This header contains utilities for command line arguments.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_BASIC_OPTIONUTILS_H
|
||||
#define LLVM_CLANG_BASIC_OPTIONUTILS_H
|
||||
|
||||
#include "clang/Basic/Diagnostic.h"
|
||||
#include "clang/Basic/LLVM.h"
|
||||
#include "llvm/Option/OptSpecifier.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
namespace opt {
|
||||
|
||||
class ArgList;
|
||||
|
||||
} // namespace opt
|
||||
|
||||
} // namespace llvm
|
||||
|
||||
namespace clang {
|
||||
/// Return the value of the last argument as an integer, or a default. If Diags
|
||||
/// is non-null, emits an error if the argument is given, but non-integral.
|
||||
int getLastArgIntValue(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::OptSpecifier Id, int Default,
|
||||
DiagnosticsEngine *Diags = nullptr, unsigned Base = 0);
|
||||
|
||||
inline int getLastArgIntValue(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::OptSpecifier Id, int Default,
|
||||
DiagnosticsEngine &Diags, unsigned Base = 0) {
|
||||
return getLastArgIntValue(Args, Id, Default, &Diags, Base);
|
||||
}
|
||||
|
||||
uint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::OptSpecifier Id, uint64_t Default,
|
||||
DiagnosticsEngine *Diags = nullptr,
|
||||
unsigned Base = 0);
|
||||
|
||||
inline uint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::OptSpecifier Id,
|
||||
uint64_t Default,
|
||||
DiagnosticsEngine &Diags,
|
||||
unsigned Base = 0) {
|
||||
return getLastArgUInt64Value(Args, Id, Default, &Diags, Base);
|
||||
}
|
||||
|
||||
} // namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_BASIC_OPTIONUTILS_H
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "clang/Basic/Diagnostic.h"
|
||||
#include "clang/Basic/LLVM.h"
|
||||
#include "clang/Basic/OptionUtils.h"
|
||||
#include "clang/Frontend/DependencyOutputOptions.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/IntrusiveRefCntPtr.h"
|
||||
@@ -34,12 +35,6 @@ namespace llvm {
|
||||
|
||||
class Triple;
|
||||
|
||||
namespace opt {
|
||||
|
||||
class ArgList;
|
||||
|
||||
} // namespace opt
|
||||
|
||||
} // namespace llvm
|
||||
|
||||
namespace clang {
|
||||
@@ -230,29 +225,6 @@ std::unique_ptr<CompilerInvocation> createInvocationFromCommandLine(
|
||||
bool ShouldRecoverOnErrors = false,
|
||||
std::vector<std::string> *CC1Args = nullptr);
|
||||
|
||||
/// Return the value of the last argument as an integer, or a default. If Diags
|
||||
/// is non-null, emits an error if the argument is given, but non-integral.
|
||||
int getLastArgIntValue(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::OptSpecifier Id, int Default,
|
||||
DiagnosticsEngine *Diags = nullptr);
|
||||
|
||||
inline int getLastArgIntValue(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::OptSpecifier Id, int Default,
|
||||
DiagnosticsEngine &Diags) {
|
||||
return getLastArgIntValue(Args, Id, Default, &Diags);
|
||||
}
|
||||
|
||||
uint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::OptSpecifier Id, uint64_t Default,
|
||||
DiagnosticsEngine *Diags = nullptr);
|
||||
|
||||
inline uint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::OptSpecifier Id,
|
||||
uint64_t Default,
|
||||
DiagnosticsEngine &Diags) {
|
||||
return getLastArgUInt64Value(Args, Id, Default, &Diags);
|
||||
}
|
||||
|
||||
// Frontend timing utils
|
||||
|
||||
/// If the user specifies the -ftime-report argument on an Clang command line
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
set(LLVM_LINK_COMPONENTS
|
||||
Core
|
||||
MC
|
||||
Option
|
||||
Support
|
||||
)
|
||||
|
||||
@@ -55,6 +56,7 @@ add_clang_library(clangBasic
|
||||
ObjCRuntime.cpp
|
||||
OpenMPKinds.cpp
|
||||
OperatorPrecedence.cpp
|
||||
OptionUtils.cpp
|
||||
SanitizerBlacklist.cpp
|
||||
SanitizerSpecialCaseList.cpp
|
||||
Sanitizers.cpp
|
||||
|
||||
47
clang/lib/Basic/OptionUtils.cpp
Normal file
47
clang/lib/Basic/OptionUtils.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
//===--- OptionUtils.cpp - Utilities for command line arguments -----------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/Basic/OptionUtils.h"
|
||||
#include "clang/Basic/Diagnostic.h"
|
||||
#include "clang/Basic/DiagnosticDriver.h"
|
||||
#include "llvm/Option/ArgList.h"
|
||||
|
||||
using namespace clang;
|
||||
using namespace llvm::opt;
|
||||
|
||||
namespace {
|
||||
template <typename IntTy>
|
||||
IntTy getLastArgIntValueImpl(const ArgList &Args, OptSpecifier Id,
|
||||
IntTy Default, DiagnosticsEngine *Diags,
|
||||
unsigned Base) {
|
||||
IntTy Res = Default;
|
||||
if (Arg *A = Args.getLastArg(Id)) {
|
||||
if (StringRef(A->getValue()).getAsInteger(Base, Res)) {
|
||||
if (Diags)
|
||||
Diags->Report(diag::err_drv_invalid_int_value)
|
||||
<< A->getAsString(Args) << A->getValue();
|
||||
}
|
||||
}
|
||||
return Res;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
namespace clang {
|
||||
|
||||
int getLastArgIntValue(const ArgList &Args, OptSpecifier Id, int Default,
|
||||
DiagnosticsEngine *Diags, unsigned Base) {
|
||||
return getLastArgIntValueImpl<int>(Args, Id, Default, Diags, Base);
|
||||
}
|
||||
|
||||
uint64_t getLastArgUInt64Value(const ArgList &Args, OptSpecifier Id,
|
||||
uint64_t Default, DiagnosticsEngine *Diags,
|
||||
unsigned Base) {
|
||||
return getLastArgIntValueImpl<uint64_t>(Args, Id, Default, Diags, Base);
|
||||
}
|
||||
|
||||
} // namespace clang
|
||||
@@ -3716,35 +3716,8 @@ std::string CompilerInvocation::getModuleHash() const {
|
||||
return llvm::APInt(64, code).toString(36, /*Signed=*/false);
|
||||
}
|
||||
|
||||
template<typename IntTy>
|
||||
static IntTy getLastArgIntValueImpl(const ArgList &Args, OptSpecifier Id,
|
||||
IntTy Default,
|
||||
DiagnosticsEngine *Diags) {
|
||||
IntTy Res = Default;
|
||||
if (Arg *A = Args.getLastArg(Id)) {
|
||||
if (StringRef(A->getValue()).getAsInteger(10, Res)) {
|
||||
if (Diags)
|
||||
Diags->Report(diag::err_drv_invalid_int_value) << A->getAsString(Args)
|
||||
<< A->getValue();
|
||||
}
|
||||
}
|
||||
return Res;
|
||||
}
|
||||
|
||||
namespace clang {
|
||||
|
||||
// Declared in clang/Frontend/Utils.h.
|
||||
int getLastArgIntValue(const ArgList &Args, OptSpecifier Id, int Default,
|
||||
DiagnosticsEngine *Diags) {
|
||||
return getLastArgIntValueImpl<int>(Args, Id, Default, Diags);
|
||||
}
|
||||
|
||||
uint64_t getLastArgUInt64Value(const ArgList &Args, OptSpecifier Id,
|
||||
uint64_t Default,
|
||||
DiagnosticsEngine *Diags) {
|
||||
return getLastArgIntValueImpl<uint64_t>(Args, Id, Default, Diags);
|
||||
}
|
||||
|
||||
IntrusiveRefCntPtr<llvm::vfs::FileSystem>
|
||||
createVFSFromCompilerInvocation(const CompilerInvocation &CI,
|
||||
DiagnosticsEngine &Diags) {
|
||||
|
||||
Reference in New Issue
Block a user