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