1*480093f4SDimitry Andric //===--- OptionUtils.cpp - Utilities for command line arguments -----------===// 2*480093f4SDimitry Andric // 3*480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*480093f4SDimitry Andric // 7*480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8*480093f4SDimitry Andric 9*480093f4SDimitry Andric #include "clang/Basic/Diagnostic.h" 10*480093f4SDimitry Andric #include "clang/Basic/DiagnosticDriver.h" 11*480093f4SDimitry Andric #include "clang/Driver/OptionUtils.h" 12*480093f4SDimitry Andric #include "llvm/Option/ArgList.h" 13*480093f4SDimitry Andric 14*480093f4SDimitry Andric using namespace clang; 15*480093f4SDimitry Andric using namespace llvm::opt; 16*480093f4SDimitry Andric 17*480093f4SDimitry Andric namespace { 18*480093f4SDimitry Andric template <typename IntTy> 19*480093f4SDimitry Andric IntTy getLastArgIntValueImpl(const ArgList &Args, OptSpecifier Id, 20*480093f4SDimitry Andric IntTy Default, DiagnosticsEngine *Diags, 21*480093f4SDimitry Andric unsigned Base) { 22*480093f4SDimitry Andric IntTy Res = Default; 23*480093f4SDimitry Andric if (Arg *A = Args.getLastArg(Id)) { 24*480093f4SDimitry Andric if (StringRef(A->getValue()).getAsInteger(Base, Res)) { 25*480093f4SDimitry Andric if (Diags) 26*480093f4SDimitry Andric Diags->Report(diag::err_drv_invalid_int_value) 27*480093f4SDimitry Andric << A->getAsString(Args) << A->getValue(); 28*480093f4SDimitry Andric } 29*480093f4SDimitry Andric } 30*480093f4SDimitry Andric return Res; 31*480093f4SDimitry Andric } 32*480093f4SDimitry Andric } // namespace 33*480093f4SDimitry Andric 34*480093f4SDimitry Andric namespace clang { 35*480093f4SDimitry Andric 36*480093f4SDimitry Andric int getLastArgIntValue(const ArgList &Args, OptSpecifier Id, int Default, 37*480093f4SDimitry Andric DiagnosticsEngine *Diags, unsigned Base) { 38*480093f4SDimitry Andric return getLastArgIntValueImpl<int>(Args, Id, Default, Diags, Base); 39*480093f4SDimitry Andric } 40*480093f4SDimitry Andric 41*480093f4SDimitry Andric uint64_t getLastArgUInt64Value(const ArgList &Args, OptSpecifier Id, 42*480093f4SDimitry Andric uint64_t Default, DiagnosticsEngine *Diags, 43*480093f4SDimitry Andric unsigned Base) { 44*480093f4SDimitry Andric return getLastArgIntValueImpl<uint64_t>(Args, Id, Default, Diags, Base); 45*480093f4SDimitry Andric } 46*480093f4SDimitry Andric 47*480093f4SDimitry Andric } // namespace clang 48