llvm-rs-cc.cpp revision 2e35b136cc2434080fcd682d2f95e53a87675dd4
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <cstdlib> 18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <list> 19b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include <set> 20b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include <string> 21e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <utility> 22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector> 23b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 24b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Driver/Arg.h" 25b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Driver/ArgList.h" 26b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Driver/DriverDiagnostic.h" 27b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Driver/Option.h" 28b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Driver/OptTable.h" 29b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 30b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Frontend/DiagnosticOptions.h" 31b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "clang/Frontend/TextDiagnosticPrinter.h" 32b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 33e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/ADT/SmallVector.h" 34be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/ADT/IntrusiveRefCntPtr.h" 35be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/ADT/OwningPtr.h" 36b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 37e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/CommandLine.h" 38e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ManagedStatic.h" 39e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/MemoryBuffer.h" 40be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/Path.h" 41be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/system_error.h" 42e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 43e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang.h" 446e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 45e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs.h" 46e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs_reflect_utils.h" 47b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 48b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// Class under clang::driver used are enumerated here. 49e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesusing clang::driver::arg_iterator; 50e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesusing clang::driver::options::DriverOption; 51b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::Arg; 52b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::ArgList; 53b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::InputArgList; 54b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::Option; 55b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::OptTable; 56b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 57b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// SaveStringInSet, ExpandArgsFromBuf and ExpandArgv are all copied from 58b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// $(CLANG_ROOT)/tools/driver/driver.cpp for processing argc/argv passed in 59b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// main(). 60b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic inline const char *SaveStringInSet(std::set<std::string> &SavedStrings, 61b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::StringRef S) { 62b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return SavedStrings.insert(S).first->c_str(); 63b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 64b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ExpandArgsFromBuf(const char *Arg, 65b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &ArgVector, 66b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings); 67b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ExpandArgv(int argc, const char **argv, 68b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &ArgVector, 69b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings); 70b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 71b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaoenum { 72b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OPT_INVALID = 0, // This is not an option ID. 73b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ 74b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao HELPTEXT, METAVAR) OPT_##ID, 75b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "RSCCOptions.inc" 76b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao LastOption 77b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#undef OPTION 78b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao}; 79b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 80b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic const OptTable::Info RSCCInfoTable[] = { 81b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ 82b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao HELPTEXT, METAVAR) \ 83b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao { NAME, HELPTEXT, METAVAR, Option::KIND##Class, FLAGS, PARAM, \ 84b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OPT_##GROUP, OPT_##ALIAS }, 85b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "RSCCOptions.inc" 86b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao}; 87b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 88b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaoclass RSCCOptTable : public OptTable { 89b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao public: 90b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSCCOptTable() 91b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao : OptTable(RSCCInfoTable, 92b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao sizeof(RSCCInfoTable) / sizeof(RSCCInfoTable[0])) { 93b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 94b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao}; 95b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 96b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei LiaoOptTable *createRSCCOptTable() { 97b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return new RSCCOptTable(); 98b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 99b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 100b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao/////////////////////////////////////////////////////////////////////////////// 101b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 102b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaoclass RSCCOptions { 103b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao public: 104b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The include search paths 105b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::vector<std::string> mIncludePaths; 106b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 107b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The output directory, if any. 108b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mOutputDir; 109b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 110b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The output type 111e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::OutputType mOutputType; 112b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 113b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao unsigned mAllowRSPrefix : 1; 114b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 115b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // If given, the name of the target triple to compile for. If not given the 116b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // target will be selected to match the host. 117b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mTriple; 118b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 119b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // If given, the name of the target CPU to generate code for. 120b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mCPU; 121b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 122b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The list of target specific features to enable or disable -- this should 123b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // be a list of strings starting with by '+' or '-'. 124b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::vector<std::string> mFeatures; 125b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 126b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mJavaReflectionPathBase; 127b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 128b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mJavaReflectionPackageName; 129b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 130e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::BitCodeStorageType mBitcodeStorage; 131b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 132b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao unsigned mOutputDep : 1; 133b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 134b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mOutputDepDir; 135b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 136b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::vector<std::string> mAdditionalDepTargets; 137b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 138b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao unsigned mShowHelp : 1; // Show the -help text. 139b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao unsigned mShowVersion : 1; // Show the -version text. 140b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 1412e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines unsigned int mTargetAPI; 1422e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 143b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSCCOptions() { 144e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines mOutputType = slang::Slang::OT_Bitcode; 145e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines mBitcodeStorage = slang::BCST_APK_RESOURCE; 146b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mOutputDep = 0; 147b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mShowHelp = 0; 148b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mShowVersion = 0; 1492e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines mTargetAPI = RS_VERSION; 150b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 151b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao}; 152b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 153b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// ParseArguments - 154b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ParseArguments(llvm::SmallVectorImpl<const char*> &ArgVector, 155b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &Inputs, 156b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSCCOptions &Opts, 157b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao clang::Diagnostic &Diags) { 158b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (ArgVector.size() > 1) { 159b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char **ArgBegin = ArgVector.data() + 1; 160b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char **ArgEnd = ArgVector.data() + ArgVector.size(); 161b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao unsigned MissingArgIndex, MissingArgCount; 162b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::OwningPtr<OptTable> OptParser(createRSCCOptTable()); 163b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::OwningPtr<InputArgList> Args( 164b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OptParser->ParseArgs(ArgBegin, ArgEnd, MissingArgIndex, MissingArgCount)); 165b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 166b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Check for missing argument error. 167b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (MissingArgCount) 168b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_missing_argument) 169b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << Args->getArgString(MissingArgIndex) << MissingArgCount; 170b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 171b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Issue errors on unknown arguments. 172b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (arg_iterator it = Args->filtered_begin(OPT_UNKNOWN), 173b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ie = Args->filtered_end(); it != ie; ++it) 174b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_unknown_argument) 175b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << (*it)->getAsString(*Args); 176b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 177b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (ArgList::const_iterator it = Args->begin(), ie = Args->end(); 178b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao it != ie; ++it) { 179b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const Arg *A = *it; 180b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (A->getOption().getKind() == Option::InputClass) 181b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Inputs.push_back(A->getValue(*Args)); 182b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 183b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 184b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mIncludePaths = Args->getAllArgValues(OPT_I); 185b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 186b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mOutputDir = Args->getLastArgValue(OPT_o); 187b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 188b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (const Arg *A = Args->getLastArg(OPT_M_Group)) { 189b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao switch (A->getOption().getID()) { 190b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_M: { 191b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mOutputDep = 1; 192e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Dependency; 193b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 194b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 195b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_MD: { 196b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mOutputDep = 1; 197e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Bitcode; 198190ac89717c8be2e838a7be513566fba6d1467a5Patrick Scott break; 199b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 200b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao default: { 2016e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Invalid option in M group!"); 202b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 203b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 204b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 205b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 206b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (const Arg *A = Args->getLastArg(OPT_Output_Type_Group)) { 207b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao switch (A->getOption().getID()) { 208b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_emit_asm: { 209e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Assembly; 210b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 211b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 212b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_emit_llvm: { 213e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_LLVMAssembly; 214b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 215b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 216b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_emit_bc: { 217e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Bitcode; 218b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 219b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 220b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_emit_nothing: { 221e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Nothing; 222b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 223b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 224b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao default: { 2256e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Invalid option in output type group!"); 226b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 227b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 228b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 229b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 230e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (Opts.mOutputDep && 231e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines ((Opts.mOutputType != slang::Slang::OT_Bitcode) && 232e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines (Opts.mOutputType != slang::Slang::OT_Dependency))) 233b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_argument_not_allowed_with) 234b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << Args->getLastArg(OPT_M_Group)->getAsString(*Args) 235b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << Args->getLastArg(OPT_Output_Type_Group)->getAsString(*Args); 236b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 237b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mAllowRSPrefix = Args->hasArg(OPT_allow_rs_prefix); 238b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 239603217c72ef310ea385f906662c7d6136d45f464Shih-wei Liao Opts.mTriple = Args->getLastArgValue(OPT_triple, 240603217c72ef310ea385f906662c7d6136d45f464Shih-wei Liao "armv7-none-linux-gnueabi"); 241b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mCPU = Args->getLastArgValue(OPT_target_cpu); 242b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mFeatures = Args->getAllArgValues(OPT_target_feature); 243b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 244b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mJavaReflectionPathBase = 245b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getLastArgValue(OPT_java_reflection_path_base); 246b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mJavaReflectionPackageName = 247b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getLastArgValue(OPT_java_reflection_package_name); 248b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 249b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::StringRef BitcodeStorageValue = 250b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getLastArgValue(OPT_bitcode_storage); 251b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (BitcodeStorageValue == "ar") 252e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mBitcodeStorage = slang::BCST_APK_RESOURCE; 253b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else if (BitcodeStorageValue == "jc") 254e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mBitcodeStorage = slang::BCST_JAVA_CODE; 255b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else if (!BitcodeStorageValue.empty()) 256b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_invalid_value) 257b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << OptParser->getOptionName(OPT_bitcode_storage) 258b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << BitcodeStorageValue; 259b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 260b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mOutputDepDir = 261b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getLastArgValue(OPT_output_dep_dir, Opts.mOutputDir); 262b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mAdditionalDepTargets = 263b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getAllArgValues(OPT_additional_dep_target); 264b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 265b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mShowHelp = Args->hasArg(OPT_help); 266b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mShowVersion = Args->hasArg(OPT_version); 2672e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 2682e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines Opts.mTargetAPI = Args->getLastArgIntValue(OPT_target_api, 2692e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines RS_VERSION, 2702e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines Diags); 271b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 272b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 273b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return; 274b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 275b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 276b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic const char *DetermineOutputFile(const std::string &OutputDir, 277b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char *InputFile, 278e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::OutputType OutputType, 279b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings) { 280e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (OutputType == slang::Slang::OT_Nothing) 281b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return "/dev/null"; 282b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 283b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string OutputFile(OutputDir); 284b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 285b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Append '/' to Opts.mOutputDir if not presents 286b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!OutputFile.empty() && 2878d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael (OutputFile[OutputFile.size() - 1]) != OS_PATH_SEPARATOR) 2888d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael OutputFile.append(1, OS_PATH_SEPARATOR); 289b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 290e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (OutputType == slang::Slang::OT_Dependency) { 291b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The build system wants the .d file name stem to be exactly the same as 292b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // the source .rs file, instead of the .bc file. 293e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines OutputFile.append(slang::RSSlangReflectUtils::GetFileNameStem(InputFile)); 294e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines } else { 295e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines OutputFile.append( 296e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::RSSlangReflectUtils::BCFileNameFromRSFileName(InputFile)); 297e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines } 298b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 299e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines switch (OutputType) { 300e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Dependency: { 301b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".d"); 302b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 303b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 304e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Assembly: { 305b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".S"); 306b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 307b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 308e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_LLVMAssembly: { 309b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".ll"); 310b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 311b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 312e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Object: { 313b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".o"); 314b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 315b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 316e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Bitcode: { 317b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".bc"); 318b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 319b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 320e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Nothing: 321b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao default: { 3226e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Invalid output type!"); 323b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 324b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 325b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 326b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return SaveStringInSet(SavedStrings, OutputFile); 327b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 328b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 329b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaoint main(int argc, const char **argv) { 330b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> SavedStrings; 331b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVector<const char*, 256> ArgVector; 332b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSCCOptions Opts; 333b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVector<const char*, 16> Inputs; 334b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string Argv0; 335b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 336b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao atexit(llvm::llvm_shutdown); 337b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 338b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ExpandArgv(argc, argv, ArgVector, SavedStrings); 339b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 340b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Argv0 3416f4e0a9955a53a6f715af7e674e68ed15270a47cLogan Chien Argv0 = llvm::sys::path::stem(ArgVector[0]); 342b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 343b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Setup diagnostic engine 344b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao clang::TextDiagnosticPrinter *DiagClient = 345b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao new clang::TextDiagnosticPrinter(llvm::errs(), clang::DiagnosticOptions()); 346b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao DiagClient->setPrefix(Argv0); 347be27482cdeaf08576bc39b72a15d35d13014a636Logan 348be27482cdeaf08576bc39b72a15d35d13014a636Logan llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagIDs( 349be27482cdeaf08576bc39b72a15d35d13014a636Logan new clang::DiagnosticIDs()); 350be27482cdeaf08576bc39b72a15d35d13014a636Logan 351be27482cdeaf08576bc39b72a15d35d13014a636Logan clang::Diagnostic Diags(DiagIDs, DiagClient, true); 352b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 353e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::GlobalInitialization(); 354b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 355b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ParseArguments(ArgVector, Inputs, Opts, Diags); 356b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 357b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Exits when there's any error occurred during parsing the arguments 358be27482cdeaf08576bc39b72a15d35d13014a636Logan if (Diags.hasErrorOccurred()) 359b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return 1; 360b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 361b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Opts.mShowHelp) { 362b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::OwningPtr<OptTable> OptTbl(createRSCCOptTable()); 363b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OptTbl->PrintHelp(llvm::outs(), Argv0.c_str(), 364b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao "RenderScript source compiler"); 365b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return 0; 366b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 367b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 368b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Opts.mShowVersion) { 369b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::cl::PrintVersionMessage(); 370b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return 0; 371b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 372b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 373b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // No input file 374b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Inputs.empty()) { 375b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_no_input_files); 376b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return 1; 377b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 378b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 379cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // Prepare input data for RS compiler. 380cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::list<std::pair<const char*, const char*> > IOFiles; 381cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::list<std::pair<const char*, const char*> > DepFiles; 382cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 383e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines llvm::OwningPtr<slang::SlangRS> Compiler(new slang::SlangRS()); 384641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 385641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang Compiler->init(Opts.mTriple, Opts.mCPU, Opts.mFeatures); 386b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 387b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (int i = 0, e = Inputs.size(); i != e; i++) { 388cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const char *InputFile = Inputs[i]; 389cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const char *OutputFile = 390cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang DetermineOutputFile(Opts.mOutputDir, InputFile, 391cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang Opts.mOutputType, SavedStrings); 392cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 393b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Opts.mOutputDep) { 394cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const char *BCOutputFile, *DepOutputFile; 395e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 396e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (Opts.mOutputType == slang::Slang::OT_Bitcode) 397e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang BCOutputFile = OutputFile; 398e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang else 399e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines BCOutputFile = DetermineOutputFile(Opts.mOutputDepDir, 400e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines InputFile, 401e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::OT_Bitcode, 402e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines SavedStrings); 403cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 404e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (Opts.mOutputType == slang::Slang::OT_Dependency) 405cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang DepOutputFile = OutputFile; 406cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang else 407e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines DepOutputFile = DetermineOutputFile(Opts.mOutputDepDir, 408e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines InputFile, 409e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::OT_Dependency, 410e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines SavedStrings); 411cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 412cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang DepFiles.push_back(std::make_pair(BCOutputFile, DepOutputFile)); 413b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 414cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 415cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang IOFiles.push_back(std::make_pair(InputFile, OutputFile)); 416cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang } 417cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 418cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // Let's rock! 419d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines int CompileFailed = !Compiler->compile(IOFiles, 420d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines DepFiles, 421d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mIncludePaths, 422d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mAdditionalDepTargets, 423d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mOutputType, 424d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mBitcodeStorage, 425d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mAllowRSPrefix, 426d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mOutputDep, 4272e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines Opts.mTargetAPI, 428d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mJavaReflectionPathBase, 429d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mJavaReflectionPackageName); 430d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines llvm::errs() << Compiler->getErrorMessage(); 431d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines 432d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines return CompileFailed; 433b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 434b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 435b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao/////////////////////////////////////////////////////////////////////////////// 436b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 437b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// ExpandArgsFromBuf - 438b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ExpandArgsFromBuf(const char *Arg, 439b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &ArgVector, 440b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings) { 441b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char *FName = Arg + 1; 442be27482cdeaf08576bc39b72a15d35d13014a636Logan llvm::OwningPtr<llvm::MemoryBuffer> MemBuf; 443be27482cdeaf08576bc39b72a15d35d13014a636Logan if (llvm::MemoryBuffer::getFile(FName, MemBuf)) { 444be27482cdeaf08576bc39b72a15d35d13014a636Logan // Unable to open the file 445b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ArgVector.push_back(SaveStringInSet(SavedStrings, Arg)); 446b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return; 447b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 448b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 449b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char *Buf = MemBuf->getBufferStart(); 450b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao char InQuote = ' '; 451b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string CurArg; 452b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 453b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (const char *P = Buf; ; ++P) { 454b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P == '\0' || (isspace(*P) && InQuote == ' ')) { 455b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!CurArg.empty()) { 456b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (CurArg[0] != '@') { 457b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ArgVector.push_back(SaveStringInSet(SavedStrings, CurArg)); 458b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } else { 459b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ExpandArgsFromBuf(CurArg.c_str(), ArgVector, SavedStrings); 460b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 461b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 462b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg = ""; 463b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 464b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P == '\0') 465b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 466b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else 467b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 468b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 469b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 470b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (isspace(*P)) { 471b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (InQuote != ' ') 472b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg.push_back(*P); 473b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 474b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 475b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 476b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P == '"' || *P == '\'') { 477b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (InQuote == *P) 478b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao InQuote = ' '; 479b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else if (InQuote == ' ') 480b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao InQuote = *P; 481b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else 482b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg.push_back(*P); 483b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 484b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 485b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 486b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P == '\\') { 487b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ++P; 488b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P != '\0') 489b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg.push_back(*P); 490b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 491b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 492b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg.push_back(*P); 493b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 494b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 495b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 496b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// ExpandArgsFromBuf - 497b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ExpandArgv(int argc, const char **argv, 498b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &ArgVector, 499b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings) { 500b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (int i = 0; i < argc; ++i) { 501b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char *Arg = argv[i]; 502b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Arg[0] != '@') { 503b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ArgVector.push_back(SaveStringInSet(SavedStrings, std::string(Arg))); 504b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 505b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 506b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 507b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ExpandArgsFromBuf(Arg, ArgVector, SavedStrings); 508b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 509b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 510