llvm-rs-cc.cpp revision ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cf
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" 41ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines#include "llvm/Support/raw_ostream.h" 42be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/system_error.h" 43e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 44e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang.h" 456e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 46e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs.h" 47e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_rs_reflect_utils.h" 48b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 49b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// Class under clang::driver used are enumerated here. 50e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesusing clang::driver::arg_iterator; 51e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesusing clang::driver::options::DriverOption; 52b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::Arg; 53b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::ArgList; 54b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::InputArgList; 55b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::Option; 56b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaousing clang::driver::OptTable; 57b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 58b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// SaveStringInSet, ExpandArgsFromBuf and ExpandArgv are all copied from 59b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// $(CLANG_ROOT)/tools/driver/driver.cpp for processing argc/argv passed in 60b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// main(). 61b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic inline const char *SaveStringInSet(std::set<std::string> &SavedStrings, 62b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::StringRef S) { 63b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return SavedStrings.insert(S).first->c_str(); 64b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 65b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ExpandArgsFromBuf(const char *Arg, 66b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &ArgVector, 67b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings); 68b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ExpandArgv(int argc, const char **argv, 69b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &ArgVector, 70b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings); 71b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 72b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaoenum { 73b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OPT_INVALID = 0, // This is not an option ID. 74b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ 75b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao HELPTEXT, METAVAR) OPT_##ID, 76b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "RSCCOptions.inc" 77b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao LastOption 78b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#undef OPTION 79b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao}; 80b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 81b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic const OptTable::Info RSCCInfoTable[] = { 82b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ 83b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao HELPTEXT, METAVAR) \ 84b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao { NAME, HELPTEXT, METAVAR, Option::KIND##Class, FLAGS, PARAM, \ 85b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OPT_##GROUP, OPT_##ALIAS }, 86b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include "RSCCOptions.inc" 87b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao}; 88b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 89b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaoclass RSCCOptTable : public OptTable { 90b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao public: 91b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSCCOptTable() 92b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao : OptTable(RSCCInfoTable, 93b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao sizeof(RSCCInfoTable) / sizeof(RSCCInfoTable[0])) { 94b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 95b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao}; 96b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 97b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei LiaoOptTable *createRSCCOptTable() { 98b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return new RSCCOptTable(); 99b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 100b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 101b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao/////////////////////////////////////////////////////////////////////////////// 102b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 103b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaoclass RSCCOptions { 104b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao public: 105b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The include search paths 106b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::vector<std::string> mIncludePaths; 107b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 108b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The output directory, if any. 109b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mOutputDir; 110b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 111b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The output type 112e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::OutputType mOutputType; 113b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 114b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao unsigned mAllowRSPrefix : 1; 115b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 116b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines // The name of the target triple to compile for. 117b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string mTriple; 118b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 119b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines // 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; 145b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines // Triple/CPU/Features must be hard-coded to our chosen portable ABI. 146b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines mTriple = "armv7-none-linux-gnueabi"; 147b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines mCPU = ""; 148b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines slangAssert(mFeatures.empty()); 149e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines mBitcodeStorage = slang::BCST_APK_RESOURCE; 150b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mOutputDep = 0; 151b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mShowHelp = 0; 152b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao mShowVersion = 0; 1532e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines mTargetAPI = RS_VERSION; 154b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 155b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao}; 156b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 157b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// ParseArguments - 158b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ParseArguments(llvm::SmallVectorImpl<const char*> &ArgVector, 159b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &Inputs, 160b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSCCOptions &Opts, 161b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao clang::Diagnostic &Diags) { 162b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (ArgVector.size() > 1) { 163b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char **ArgBegin = ArgVector.data() + 1; 164b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char **ArgEnd = ArgVector.data() + ArgVector.size(); 165b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao unsigned MissingArgIndex, MissingArgCount; 166b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::OwningPtr<OptTable> OptParser(createRSCCOptTable()); 167b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::OwningPtr<InputArgList> Args( 168b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OptParser->ParseArgs(ArgBegin, ArgEnd, MissingArgIndex, MissingArgCount)); 169b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 170b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Check for missing argument error. 171b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (MissingArgCount) 172b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_missing_argument) 173b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << Args->getArgString(MissingArgIndex) << MissingArgCount; 174b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 175b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Issue errors on unknown arguments. 176b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (arg_iterator it = Args->filtered_begin(OPT_UNKNOWN), 177b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ie = Args->filtered_end(); it != ie; ++it) 178b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_unknown_argument) 179b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << (*it)->getAsString(*Args); 180b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 181b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (ArgList::const_iterator it = Args->begin(), ie = Args->end(); 182b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao it != ie; ++it) { 183b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const Arg *A = *it; 184b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (A->getOption().getKind() == Option::InputClass) 185b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Inputs.push_back(A->getValue(*Args)); 186b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 187b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 188b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mIncludePaths = Args->getAllArgValues(OPT_I); 189b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 190b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mOutputDir = Args->getLastArgValue(OPT_o); 191b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 192b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (const Arg *A = Args->getLastArg(OPT_M_Group)) { 193b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao switch (A->getOption().getID()) { 194b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_M: { 195b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mOutputDep = 1; 196e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Dependency; 197b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 198b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 199b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_MD: { 200b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mOutputDep = 1; 201e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Bitcode; 202190ac89717c8be2e838a7be513566fba6d1467a5Patrick Scott break; 203b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 204b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao default: { 2056e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Invalid option in M group!"); 206b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 207b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 208b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 209b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 210b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (const Arg *A = Args->getLastArg(OPT_Output_Type_Group)) { 211b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao switch (A->getOption().getID()) { 212b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_emit_asm: { 213e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Assembly; 214b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 215b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 216b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_emit_llvm: { 217e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_LLVMAssembly; 218b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 219b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 220b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_emit_bc: { 221e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Bitcode; 222b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 223b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 224b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao case OPT_emit_nothing: { 225e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mOutputType = slang::Slang::OT_Nothing; 226b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 227b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 228b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao default: { 2296e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Invalid option in output type group!"); 230b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 231b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 232b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 233b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 234e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang if (Opts.mOutputDep && 235e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines ((Opts.mOutputType != slang::Slang::OT_Bitcode) && 236e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines (Opts.mOutputType != slang::Slang::OT_Dependency))) 237b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_argument_not_allowed_with) 238b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << Args->getLastArg(OPT_M_Group)->getAsString(*Args) 239b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << Args->getLastArg(OPT_Output_Type_Group)->getAsString(*Args); 240b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 241b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mAllowRSPrefix = Args->hasArg(OPT_allow_rs_prefix); 242b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 243b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mJavaReflectionPathBase = 244b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getLastArgValue(OPT_java_reflection_path_base); 245b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mJavaReflectionPackageName = 246b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getLastArgValue(OPT_java_reflection_package_name); 247b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 248b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::StringRef BitcodeStorageValue = 249b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getLastArgValue(OPT_bitcode_storage); 250b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (BitcodeStorageValue == "ar") 251e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mBitcodeStorage = slang::BCST_APK_RESOURCE; 252b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else if (BitcodeStorageValue == "jc") 253e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Opts.mBitcodeStorage = slang::BCST_JAVA_CODE; 254b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else if (!BitcodeStorageValue.empty()) 255b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_invalid_value) 256b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << OptParser->getOptionName(OPT_bitcode_storage) 257b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao << BitcodeStorageValue; 258b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 259b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mOutputDepDir = 260b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getLastArgValue(OPT_output_dep_dir, Opts.mOutputDir); 261b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mAdditionalDepTargets = 262b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Args->getAllArgValues(OPT_additional_dep_target); 263b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 264b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mShowHelp = Args->hasArg(OPT_help); 265b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Opts.mShowVersion = Args->hasArg(OPT_version); 2662e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 2672e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines Opts.mTargetAPI = Args->getLastArgIntValue(OPT_target_api, 2682e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines RS_VERSION, 2692e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines Diags); 270b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 271b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 272b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return; 273b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 274b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 275b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic const char *DetermineOutputFile(const std::string &OutputDir, 276b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char *InputFile, 277e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::OutputType OutputType, 278b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings) { 279e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (OutputType == slang::Slang::OT_Nothing) 280b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return "/dev/null"; 281b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 282b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string OutputFile(OutputDir); 283b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 284b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Append '/' to Opts.mOutputDir if not presents 285b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!OutputFile.empty() && 2868d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael (OutputFile[OutputFile.size() - 1]) != OS_PATH_SEPARATOR) 2878d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael OutputFile.append(1, OS_PATH_SEPARATOR); 288b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 289e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (OutputType == slang::Slang::OT_Dependency) { 290b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // The build system wants the .d file name stem to be exactly the same as 291b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // the source .rs file, instead of the .bc file. 292e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines OutputFile.append(slang::RSSlangReflectUtils::GetFileNameStem(InputFile)); 293e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines } else { 294e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines OutputFile.append( 295e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::RSSlangReflectUtils::BCFileNameFromRSFileName(InputFile)); 296e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines } 297b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 298e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines switch (OutputType) { 299e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Dependency: { 300b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".d"); 301b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 302b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 303e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Assembly: { 304b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".S"); 305b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 306b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 307e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_LLVMAssembly: { 308b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".ll"); 309b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 310b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 311e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Object: { 312b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".o"); 313b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 314b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 315e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Bitcode: { 316b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OutputFile.append(".bc"); 317b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 318b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 319e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines case slang::Slang::OT_Nothing: 320b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao default: { 3216e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(false && "Invalid output type!"); 322b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 323b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 324b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 325b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return SaveStringInSet(SavedStrings, OutputFile); 326b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 327b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 328ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines#define str(s) #s 329ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines#define wrap_str(s) str(s) 330ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hinesstatic void llvm_rs_cc_VersionPrinter() { 331ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines llvm::raw_ostream &OS = llvm::outs(); 332ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines OS << "llvm-rs-cc: Renderscript compiler\n" 333ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines << " (http://developer.android.com/guide/topics/renderscript)\n" 334ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines << " based on LLVM (http://llvm.org):\n"; 335ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines OS << " Built " << __DATE__ << " (" << __TIME__ ").\n"; 336ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines OS << " Target APIs: " << SLANG_MINIMUM_TARGET_API << " - " 337ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines << SLANG_MAXIMUM_TARGET_API; 338ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines OS << "\n Build type: " << wrap_str(TARGET_BUILD_VARIANT); 339ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines#ifndef __DISABLE_ASSERTS 340ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines OS << " with assertions"; 341ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines#endif 342ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines OS << ".\n"; 343ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines return; 344ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines} 345ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines 346b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaoint main(int argc, const char **argv) { 347b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> SavedStrings; 348b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVector<const char*, 256> ArgVector; 349b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao RSCCOptions Opts; 350b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVector<const char*, 16> Inputs; 351b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string Argv0; 352b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 353b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao atexit(llvm::llvm_shutdown); 354b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 355b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ExpandArgv(argc, argv, ArgVector, SavedStrings); 356b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 357b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Argv0 3586f4e0a9955a53a6f715af7e674e68ed15270a47cLogan Chien Argv0 = llvm::sys::path::stem(ArgVector[0]); 359b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 360b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Setup diagnostic engine 361b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao clang::TextDiagnosticPrinter *DiagClient = 362b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao new clang::TextDiagnosticPrinter(llvm::errs(), clang::DiagnosticOptions()); 363b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao DiagClient->setPrefix(Argv0); 364be27482cdeaf08576bc39b72a15d35d13014a636Logan 365be27482cdeaf08576bc39b72a15d35d13014a636Logan llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagIDs( 366be27482cdeaf08576bc39b72a15d35d13014a636Logan new clang::DiagnosticIDs()); 367be27482cdeaf08576bc39b72a15d35d13014a636Logan 368be27482cdeaf08576bc39b72a15d35d13014a636Logan clang::Diagnostic Diags(DiagIDs, DiagClient, true); 369b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 370e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::GlobalInitialization(); 371b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 372b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ParseArguments(ArgVector, Inputs, Opts, Diags); 373b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 374b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // Exits when there's any error occurred during parsing the arguments 375be27482cdeaf08576bc39b72a15d35d13014a636Logan if (Diags.hasErrorOccurred()) 376b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return 1; 377b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 378b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Opts.mShowHelp) { 379b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::OwningPtr<OptTable> OptTbl(createRSCCOptTable()); 380b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao OptTbl->PrintHelp(llvm::outs(), Argv0.c_str(), 381b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines "Renderscript source compiler"); 382b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return 0; 383b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 384b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 385b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Opts.mShowVersion) { 386ba7c6dc08e1ab8486ccaf842e8ae87dc5c99d8cfStephen Hines llvm_rs_cc_VersionPrinter(); 387b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return 0; 388b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 389b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 390b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao // No input file 391b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Inputs.empty()) { 392b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao Diags.Report(clang::diag::err_drv_no_input_files); 393b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return 1; 394b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 395b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 396cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // Prepare input data for RS compiler. 397cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::list<std::pair<const char*, const char*> > IOFiles; 398cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::list<std::pair<const char*, const char*> > DepFiles; 399cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 400e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines llvm::OwningPtr<slang::SlangRS> Compiler(new slang::SlangRS()); 401641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 402641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang Compiler->init(Opts.mTriple, Opts.mCPU, Opts.mFeatures); 403b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 404b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (int i = 0, e = Inputs.size(); i != e; i++) { 405cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const char *InputFile = Inputs[i]; 406cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const char *OutputFile = 407cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang DetermineOutputFile(Opts.mOutputDir, InputFile, 408cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang Opts.mOutputType, SavedStrings); 409cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 410b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Opts.mOutputDep) { 411cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const char *BCOutputFile, *DepOutputFile; 412e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang 413e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (Opts.mOutputType == slang::Slang::OT_Bitcode) 414e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang BCOutputFile = OutputFile; 415e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang else 416e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines BCOutputFile = DetermineOutputFile(Opts.mOutputDepDir, 417e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines InputFile, 418e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::OT_Bitcode, 419e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines SavedStrings); 420cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 421e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines if (Opts.mOutputType == slang::Slang::OT_Dependency) 422cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang DepOutputFile = OutputFile; 423cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang else 424e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines DepOutputFile = DetermineOutputFile(Opts.mOutputDepDir, 425e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines InputFile, 426e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines slang::Slang::OT_Dependency, 427e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines SavedStrings); 428cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 429cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang DepFiles.push_back(std::make_pair(BCOutputFile, DepOutputFile)); 430b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 431cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 432cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang IOFiles.push_back(std::make_pair(InputFile, OutputFile)); 433cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang } 434cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 435cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // Let's rock! 436d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines int CompileFailed = !Compiler->compile(IOFiles, 437d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines DepFiles, 438d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mIncludePaths, 439d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mAdditionalDepTargets, 440d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mOutputType, 441d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mBitcodeStorage, 442d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mAllowRSPrefix, 443d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mOutputDep, 4442e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines Opts.mTargetAPI, 445d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mJavaReflectionPathBase, 446d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines Opts.mJavaReflectionPackageName); 447d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines llvm::errs() << Compiler->getErrorMessage(); 448d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines 449d7f0ea21058abbdd1edfd3df65762fa3c91cb224Stephen Hines return CompileFailed; 450b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 451b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 452b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao/////////////////////////////////////////////////////////////////////////////// 453b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 454b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// ExpandArgsFromBuf - 455b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ExpandArgsFromBuf(const char *Arg, 456b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &ArgVector, 457b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings) { 458b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char *FName = Arg + 1; 459be27482cdeaf08576bc39b72a15d35d13014a636Logan llvm::OwningPtr<llvm::MemoryBuffer> MemBuf; 460be27482cdeaf08576bc39b72a15d35d13014a636Logan if (llvm::MemoryBuffer::getFile(FName, MemBuf)) { 461be27482cdeaf08576bc39b72a15d35d13014a636Logan // Unable to open the file 462b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ArgVector.push_back(SaveStringInSet(SavedStrings, Arg)); 463b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao return; 464b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 465b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 466b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char *Buf = MemBuf->getBufferStart(); 467b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao char InQuote = ' '; 468b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::string CurArg; 469b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 470b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (const char *P = Buf; ; ++P) { 471b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P == '\0' || (isspace(*P) && InQuote == ' ')) { 472b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (!CurArg.empty()) { 473b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (CurArg[0] != '@') { 474b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ArgVector.push_back(SaveStringInSet(SavedStrings, CurArg)); 475b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } else { 476b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ExpandArgsFromBuf(CurArg.c_str(), ArgVector, SavedStrings); 477b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 478b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 479b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg = ""; 480b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 481b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P == '\0') 482b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao break; 483b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else 484b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 485b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 486b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 487b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (isspace(*P)) { 488b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (InQuote != ' ') 489b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg.push_back(*P); 490b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 491b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 492b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 493b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P == '"' || *P == '\'') { 494b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (InQuote == *P) 495b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao InQuote = ' '; 496b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else if (InQuote == ' ') 497b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao InQuote = *P; 498b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao else 499b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg.push_back(*P); 500b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 501b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 502b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 503b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P == '\\') { 504b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ++P; 505b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (*P != '\0') 506b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg.push_back(*P); 507b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 508b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 509b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao CurArg.push_back(*P); 510b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 511b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 512b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 513b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao// ExpandArgsFromBuf - 514b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaostatic void ExpandArgv(int argc, const char **argv, 515b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao llvm::SmallVectorImpl<const char*> &ArgVector, 516b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao std::set<std::string> &SavedStrings) { 517b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao for (int i = 0; i < argc; ++i) { 518b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao const char *Arg = argv[i]; 519b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao if (Arg[0] != '@') { 520b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ArgVector.push_back(SaveStringInSet(SavedStrings, std::string(Arg))); 521b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao continue; 522b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 523b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao 524b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao ExpandArgsFromBuf(Arg, ArgVector, SavedStrings); 525b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao } 526b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao} 527