rs_cc_options.cpp revision 21c94c9b4cc3c139c0d2c08f81e773aa3e269cff
18b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines/*
28b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * Copyright 2014, The Android Open Source Project
38b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines *
48b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
58b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * you may not use this file except in compliance with the License.
68b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * You may obtain a copy of the License at
78b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines *
88b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
98b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines *
108b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * Unless required by applicable law or agreed to in writing, software
118b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
128b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * See the License for the specific language governing permissions and
148b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines * limitations under the License.
158b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines */
168b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
178b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "clang/Basic/DiagnosticOptions.h"
188b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "clang/Driver/DriverDiagnostic.h"
198b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "clang/Driver/Options.h"
208b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "clang/Frontend/Utils.h"
218b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
228b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "llvm/Option/Arg.h"
238b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "llvm/Option/ArgList.h"
248b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "llvm/Option/Option.h"
258b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "llvm/Option/OptTable.h"
265309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet#include "llvm/Support/CommandLine.h"
278b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
288b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "rs_cc_options.h"
298b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "slang.h"
308b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "slang_assert.h"
318b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
328b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include <cstdlib>
338b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include <string>
348b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include <utility>
358b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include <vector>
368b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
378b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hinesenum {
388b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines  OPT_INVALID = 0,  // This is not an option ID.
398b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#define PREFIX(NAME, VALUE)
408b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
418b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines               HELPTEXT, METAVAR)                                             \
428b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines  OPT_##ID,
438b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "RSCCOptions.inc"
448b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines  LastOption
458b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#undef OPTION
468b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#undef PREFIX
478b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines};
488b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
498b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE;
508b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
518b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines               HELPTEXT, METAVAR)
528b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "RSCCOptions.inc"
538b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#undef OPTION
548b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#undef PREFIX
558b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
568b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hinesstatic const llvm::opt::OptTable::Info RSCCInfoTable[] = {
578b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#define PREFIX(NAME, VALUE)
588b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,  \
598b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines               HELPTEXT, METAVAR)                                              \
608b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines  {                                                                            \
618b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines    PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, llvm::opt::Option::KIND##Class, \
628b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines        PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS                      \
638b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines  }                                                                            \
648b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines  ,
658b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#include "RSCCOptions.inc"
668b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#undef OPTION
678b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines#undef PREFIX
688b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines};
698b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
708b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hinesnamespace {
718b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
728b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hinesclass RSCCOptTable : public llvm::opt::OptTable {
738b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines public:
748b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines  RSCCOptTable()
758b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines      : OptTable(RSCCInfoTable,
768b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines                 sizeof(RSCCInfoTable) / sizeof(RSCCInfoTable[0])) {}
778b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines};
788b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines}
798b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
805309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouilletnamespace slang {
815309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
825309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouilletllvm::opt::OptTable *createRSCCOptTable() { return new RSCCOptTable(); }
835309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
845309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet// This function is similar to
855309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet// clang/lib/Frontend/CompilerInvocation::CreateFromArgs.
865309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouilletbool ParseArguments(const llvm::ArrayRef<const char *> &ArgsIn,
875309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                    llvm::SmallVectorImpl<const char *> &Inputs,
885309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                    RSCCOptions &Opts, clang::DiagnosticOptions &DiagOpts,
895309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                    llvm::cl::StringSaver &StringSaver) {
905309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // We use a different diagnostic engine for argument parsing from the rest of
915309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // the work.  This mimics what's done in clang.  I believe it is so the
925309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // argument parsing errors are well formatted while the full errors can be
935309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // influenced by command line arguments.
945309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> ArgumentParseDiagOpts(
955309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      new clang::DiagnosticOptions());
965309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagIDs(
975309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      new clang::DiagnosticIDs());
985309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  DiagnosticBuffer DiagsBuffer;
995309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  clang::DiagnosticsEngine DiagEngine(DiagIDs, &*ArgumentParseDiagOpts,
1005309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                                      &DiagsBuffer, false);
1015309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1025309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // Populate a vector with the command line arguments, expanding command files
1035309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // that have been included via the '@' argument.
1045309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  llvm::SmallVector<const char *, 256> ArgVector;
1055309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  ArgVector.append(ArgsIn.begin(), ArgsIn.end());
1065309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  llvm::cl::ExpandResponseFiles(StringSaver, llvm::cl::TokenizeGNUCommandLine,
1075309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                                ArgVector, false);
1085309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1095309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  std::unique_ptr<llvm::opt::OptTable> OptParser(createRSCCOptTable());
1105309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  unsigned MissingArgIndex = 0;
1115309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  unsigned MissingArgCount = 0;
1125309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  std::unique_ptr<llvm::opt::InputArgList> Args(
1135309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      OptParser->ParseArgs(ArgVector.begin() + 1, ArgVector.end(),
1145309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                           MissingArgIndex, MissingArgCount));
1155309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1165309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // Check for missing argument error.
1175309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (MissingArgCount) {
1185309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    DiagEngine.Report(clang::diag::err_drv_missing_argument)
1195309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        << Args->getArgString(MissingArgIndex) << MissingArgCount;
1205309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
1218b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
1225309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // Issue errors on unknown arguments.
1235309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  for (llvm::opt::arg_iterator it = Args->filtered_begin(OPT_UNKNOWN),
1245309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                               ie = Args->filtered_end();
1255309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet       it != ie; ++it) {
1265309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    DiagEngine.Report(clang::diag::err_drv_unknown_argument)
1275309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        << (*it)->getAsString(*Args);
1285309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
1295309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1305309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  DiagOpts.IgnoreWarnings = Args->hasArg(OPT_w);
1315309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  DiagOpts.Warnings = Args->getAllArgValues(OPT_W);
1325309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1335309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  for (llvm::opt::ArgList::const_iterator it = Args->begin(), ie = Args->end();
1345309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet       it != ie; ++it) {
1355309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    const llvm::opt::Arg *A = *it;
1365309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    if (A->getOption().getKind() == llvm::opt::Option::InputClass)
1375309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Inputs.push_back(A->getValue());
1385309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
1395309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1405309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mIncludePaths = Args->getAllArgValues(OPT_I);
1415309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1425309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mBitcodeOutputDir = Args->getLastArgValue(OPT_o);
1435309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1445309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (const llvm::opt::Arg *A = Args->getLastArg(OPT_M_Group)) {
1455309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    switch (A->getOption().getID()) {
1465309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    case OPT_M: {
1475309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mEmitDependency = true;
1485309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mOutputType = Slang::OT_Dependency;
1495309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      break;
1505309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    }
1515309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    case OPT_MD: {
1525309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mEmitDependency = true;
1535309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mOutputType = Slang::OT_Bitcode;
1545309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      break;
1555309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    }
15621c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang    case OPT_MP: {
15721c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang      Opts.mEmitDependency = true;
15821c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang      Opts.mOutputType = Slang::OT_Bitcode;
15921c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang      Opts.mEmitPhonyDependency = true;
16021c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang      break;
16121c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang    }
1625309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    default: { slangAssert(false && "Invalid option in M group!"); }
1638b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines    }
1645309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
1658b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
1665309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (const llvm::opt::Arg *A = Args->getLastArg(OPT_Output_Type_Group)) {
1675309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    switch (A->getOption().getID()) {
1685309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    case OPT_emit_asm: {
1695309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mOutputType = Slang::OT_Assembly;
1705309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      break;
1715309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    }
1725309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    case OPT_emit_llvm: {
1735309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mOutputType = Slang::OT_LLVMAssembly;
1745309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      break;
1758b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines    }
1765309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    case OPT_emit_bc: {
1775309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mOutputType = Slang::OT_Bitcode;
1785309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      break;
1795309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    }
1805309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    case OPT_emit_nothing: {
1815309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mOutputType = Slang::OT_Nothing;
1825309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      break;
1835309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    }
1845309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    default: { slangAssert(false && "Invalid option in output type group!"); }
1855309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    }
1865309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
1878b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
1885309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (Opts.mEmitDependency && ((Opts.mOutputType != Slang::OT_Bitcode) &&
1895309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                               (Opts.mOutputType != Slang::OT_Dependency)))
1905309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    DiagEngine.Report(clang::diag::err_drv_argument_not_allowed_with)
1915309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        << Args->getLastArg(OPT_M_Group)->getAsString(*Args)
1925309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        << Args->getLastArg(OPT_Output_Type_Group)->getAsString(*Args);
1935309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1945309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mAllowRSPrefix = Args->hasArg(OPT_allow_rs_prefix);
1955309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
1965309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mJavaReflectionPathBase =
1975309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Args->getLastArgValue(OPT_java_reflection_path_base);
1985309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mJavaReflectionPackageName =
1995309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Args->getLastArgValue(OPT_java_reflection_package_name);
2005309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
2015309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mRSPackageName = Args->getLastArgValue(OPT_rs_package_name);
2025309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
2035309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  llvm::StringRef BitcodeStorageValue =
2045309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Args->getLastArgValue(OPT_bitcode_storage);
2055309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (BitcodeStorageValue == "ar")
2065309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    Opts.mBitcodeStorage = BCST_APK_RESOURCE;
2075309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  else if (BitcodeStorageValue == "jc")
2085309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    Opts.mBitcodeStorage = BCST_JAVA_CODE;
2095309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  else if (!BitcodeStorageValue.empty())
2105309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    DiagEngine.Report(clang::diag::err_drv_invalid_value)
2115309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        << OptParser->getOptionName(OPT_bitcode_storage) << BitcodeStorageValue;
2125309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
2135309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  llvm::opt::Arg *lastBitwidthArg = Args->getLastArg(OPT_m32, OPT_m64);
2145309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (Args->hasArg(OPT_reflect_cpp)) {
2155309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    Opts.mBitcodeStorage = BCST_CPP_CODE;
2165309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    // mJavaReflectionPathBase can be set for C++ reflected builds.
2175309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    // Set it to the standard mBitcodeOutputDir (via -o) by default.
2185309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    if (Opts.mJavaReflectionPathBase.empty()) {
2195309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Opts.mJavaReflectionPathBase = Opts.mBitcodeOutputDir;
2205309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    }
2215984fc03b6189f19f3721423b92469e4908a49efStephen Hines
2225309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    // Check for bitwidth arguments.
2235309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    if (lastBitwidthArg) {
2245309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      if (lastBitwidthArg->getOption().matches(OPT_m32)) {
2255309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        Opts.mBitWidth = 32;
2265309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      } else {
2275309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        Opts.mBitWidth = 64;
2285984fc03b6189f19f3721423b92469e4908a49efStephen Hines      }
2298b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines    }
2305309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  } else if (lastBitwidthArg) {
2315309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    // -m32/-m64 are forbidden for non-C++ reflection paths.
2325309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    DiagEngine.Report(
2335309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        DiagEngine.getCustomDiagID(clang::DiagnosticsEngine::Error,
2345309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                                   "cannot use -m32/-m64 without specifying "
2355309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                                   "C++ reflection (-reflect-c++)"));
2365309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
2378b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
2385309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mDependencyOutputDir =
2395309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      Args->getLastArgValue(OPT_output_dep_dir, Opts.mBitcodeOutputDir);
2405309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mAdditionalDepTargets = Args->getAllArgValues(OPT_additional_dep_target);
2418b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
2425309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mShowHelp = Args->hasArg(OPT_help);
2435309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mShowVersion = Args->hasArg(OPT_version);
2445309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mDebugEmission = Args->hasArg(OPT_emit_g);
2455309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mVerbose = Args->hasArg(OPT_verbose);
2468b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
2475309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // If we are emitting both 32-bit and 64-bit bitcode, we must embed it.
2489ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines
2495309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  size_t OptLevel =
2505309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      clang::getLastArgIntValue(*Args, OPT_optimization_level, 3, DiagEngine);
2518b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
2525309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mOptimizationLevel =
2535309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      OptLevel == 0 ? llvm::CodeGenOpt::None : llvm::CodeGenOpt::Aggressive;
2548b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines
2555309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mTargetAPI =
2565309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      clang::getLastArgIntValue(*Args, OPT_target_api, RS_VERSION, DiagEngine);
257c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes
2585309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (Opts.mTargetAPI == 0) {
2595309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    Opts.mTargetAPI = UINT_MAX;
2605309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
261dd22d5ca3040cda08cd5702f9d0872c2db8da22fStephen Hines
2625309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  Opts.mEmit3264 =
2635309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      (Opts.mTargetAPI >= 21) && (Opts.mBitcodeStorage != BCST_CPP_CODE);
2645309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (Opts.mEmit3264) {
2655309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    Opts.mBitcodeStorage = BCST_JAVA_CODE;
2668b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines  }
2675309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
2685309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (DiagEngine.hasErrorOccurred()) {
2695309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    llvm::errs() << DiagsBuffer.str();
2705309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    return false;
2715309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
2725309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
2735309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  return true;
2745309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet}
2758b5c5c6566078d49c4dcd8d8c7a6364c33c09037Stephen Hines}
276