blob: c9bb5d08f55a88b91cedfee070febdd6352f82c0 [file] [log] [blame]
Daniel Dunbarbe6ef382009-11-19 07:19:04 +00001//===--- CC1Options.cpp - Clang CC1 Options Table -----------------------*-===//
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/CC1Options.h"
Daniel Dunbarf7535122009-11-20 01:46:44 +000011#include "clang/Driver/ArgList.h"
12#include "clang/Driver/Arg.h"
Daniel Dunbarbe6ef382009-11-19 07:19:04 +000013#include "clang/Driver/OptTable.h"
14#include "clang/Driver/Option.h"
Daniel Dunbar84e8a242009-11-19 20:54:59 +000015#include "clang/Frontend/CompilerInvocation.h"
Daniel Dunbarf7535122009-11-20 01:46:44 +000016#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar84e8a242009-11-19 20:54:59 +000017#include "llvm/ADT/SmallVector.h"
Daniel Dunbarf7535122009-11-20 01:46:44 +000018#include "llvm/Support/raw_ostream.h"
19#include "llvm/System/Host.h"
Daniel Dunbarbe6ef382009-11-19 07:19:04 +000020
21using namespace clang::driver;
22using namespace clang::driver::options;
23using namespace clang::driver::cc1options;
24
25static OptTable::Info CC1InfoTable[] = {
Daniel Dunbarbe6ef382009-11-19 07:19:04 +000026#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \
27 HELPTEXT, METAVAR) \
28 { NAME, HELPTEXT, METAVAR, Option::KIND##Class, FLAGS, PARAM, \
29 OPT_##GROUP, OPT_##ALIAS },
30#include "clang/Driver/CC1Options.inc"
31};
32
33namespace {
34
35class CC1OptTable : public OptTable {
36public:
37 CC1OptTable()
38 : OptTable(CC1InfoTable, sizeof(CC1InfoTable) / sizeof(CC1InfoTable[0])) {}
39};
40
41}
42
43OptTable *clang::driver::createCC1OptTable() {
44 return new CC1OptTable();
45}
Daniel Dunbar84e8a242009-11-19 20:54:59 +000046
47//
48
49using namespace clang;
50
Daniel Dunbarf7535122009-11-20 01:46:44 +000051static llvm::StringRef getLastArgValue(ArgList &Args, cc1options::ID ID,
52 llvm::StringRef Default = "") {
53 if (Arg *A = Args.getLastArg(ID))
54 return A->getValue(Args);
55 return Default;
56}
57
58static std::vector<std::string>
59getAllArgValues(ArgList &Args, cc1options::ID ID) {
60 llvm::SmallVector<const char *, 16> Values;
61 Args.AddAllArgValues(Values, ID);
62 return std::vector<std::string>(Values.begin(), Values.end());
63}
64
65static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {
66 Opts.ABI = getLastArgValue(Args, cc1options::OPT_target_abi);
67 Opts.CPU = getLastArgValue(Args, cc1options::OPT_mcpu);
68 Opts.Triple = getLastArgValue(Args, cc1options::OPT_triple);
69 Opts.Features = getAllArgValues(Args, cc1options::OPT_target_feature);
70
71 // Use the host triple if unspecified.
72 if (Opts.Triple.empty())
73 Opts.Triple = llvm::sys::getHostTriple();
74}
75
Daniel Dunbar84e8a242009-11-19 20:54:59 +000076void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
77 const llvm::SmallVectorImpl<llvm::StringRef> &Args) {
Daniel Dunbarf7535122009-11-20 01:46:44 +000078 // This is gratuitous, but until we switch the driver to using StringRe we
79 // need to get C strings.
80 llvm::SmallVector<std::string, 16> StringArgs(Args.begin(), Args.end());
81 llvm::SmallVector<const char *, 16> CStringArgs;
82 for (unsigned i = 0, e = Args.size(); i != e; ++i)
83 CStringArgs.push_back(StringArgs[i].c_str());
84
85 // Parse the arguments.
86 llvm::OwningPtr<OptTable> Opts(createCC1OptTable());
87 unsigned MissingArgIndex, MissingArgCount;
88 llvm::OwningPtr<InputArgList> InputArgs(
89 Opts->ParseArgs(CStringArgs.begin(), CStringArgs.end(),
90 MissingArgIndex, MissingArgCount));
91
92 // Check for missing argument error.
93 if (MissingArgCount) {
94 // FIXME: Use proper diagnostics!
95 llvm::errs() << "error: argument to '"
96 << InputArgs->getArgString(MissingArgIndex)
97 << "' is missing (expected " << MissingArgCount
98 << " value )\n";
99 }
100
101 ParseTargetArgs(Res.getTargetOpts(), *InputArgs);
Daniel Dunbar84e8a242009-11-19 20:54:59 +0000102}