142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <cassert> 242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <cstdlib> 342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <list> 442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <set> 542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <string> 642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <utility> 742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <vector> 842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Driver/Arg.h" 1042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Driver/ArgList.h" 1142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Driver/DriverDiagnostic.h" 1242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Driver/Option.h" 1342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Driver/OptTable.h" 1442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 1542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Frontend/DiagnosticOptions.h" 1642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Frontend/TextDiagnosticPrinter.h" 1742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 1842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/ADT/SmallVector.h" 1942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/ADT/StringRef.h" 2042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/ADT/IntrusiveRefCntPtr.h" 2142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/ADT/OwningPtr.h" 2242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 2342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/Support/CommandLine.h" 2442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/Support/ManagedStatic.h" 2542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/Support/MemoryBuffer.h" 2642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/Support/Path.h" 2742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/Support/raw_ostream.h" 2842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/Support/system_error.h" 2942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 3042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "Compiler.h" 3142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 3242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh// FIXME: Add parameter feature '-D macro=xxx' 3342552ec6168d994991696a04c1626ac91218a720Andrew Hsiehstatic llvm::cl::opt<std::string> 3442552ec6168d994991696a04c1626ac91218a720Andrew HsiehInputFilename(llvm::cl::Positional, llvm::cl::Required, 3542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::cl::desc("<input file>")); 3642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 3742552ec6168d994991696a04c1626ac91218a720Andrew Hsiehstatic llvm::cl::list<std::string> 3842552ec6168d994991696a04c1626ac91218a720Andrew HsiehHeaderSearchDirs("I", llvm::cl::desc("Header search directory"), llvm::cl::Prefix); 3942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 4042552ec6168d994991696a04c1626ac91218a720Andrew Hsiehstatic llvm::cl::list<std::string> 4142552ec6168d994991696a04c1626ac91218a720Andrew HsiehPreDefinedSymbols("D", llvm::cl::desc("Pre-define symbol")); 4242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 4342552ec6168d994991696a04c1626ac91218a720Andrew Hsiehstatic llvm::cl::opt<std::string> 4442552ec6168d994991696a04c1626ac91218a720Andrew HsiehOutputFilename(llvm::cl::Required, "o", llvm::cl::desc("Override output filename")); 4542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 4642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh// split "xxx" => "xxx" "" 4742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh// split "xxx=yyy" => "xxx" "yyy" 4842552ec6168d994991696a04c1626ac91218a720Andrew Hsiehstatic void splitPreDefinedSymbol(const std::string& In, 4942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::string& Key, std::string& Value) { 5042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh size_t FoundPos = In.find("="); 5142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh if (FoundPos == std::string::npos) { 5242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Key = In; 5342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Value = ""; 5442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh } else { 5542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Key = In.substr(0, FoundPos); 5642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Value = In.substr(FoundPos+1, std::string::npos); 5742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh } 5842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh} 5942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 6042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 6142552ec6168d994991696a04c1626ac91218a720Andrew Hsiehint main(int argc, char** argv) { 6242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::llvm_shutdown_obj _ShutdownObj; 6342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::cl::ParseCommandLineOptions(argc, argv, "P-NDK Compile Tool"); 6442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 6542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh clang::TextDiagnosticPrinter* DiagClient = 6642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh new clang::TextDiagnosticPrinter(llvm::errs(), clang::DiagnosticOptions()); 6742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh DiagClient->setPrefix(argv[0]); 6842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 6942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> 7042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh DiagIDs(new clang::DiagnosticIDs()); 7142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh clang::DiagnosticsEngine Diags(DiagIDs, DiagClient, true); 7242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 7342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh if (Diags.hasErrorOccurred()) 7442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh return 1; 7542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 7642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::vector<std::string> IncludePaths; 7742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh for(unsigned i = 0, e = HeaderSearchDirs.size(); i<e; ++i) { 7842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh IncludePaths.push_back(HeaderSearchDirs[i]); 7942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh } 8042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 8142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::map<std::string, std::string> PreDefinedSymbolMap; 8242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh for(unsigned i = 0, e = PreDefinedSymbols.size(); i<e; ++i) { 8342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::string Key; 8442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::string Value; 8542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh splitPreDefinedSymbol(PreDefinedSymbols[i], Key, Value); 8642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh PreDefinedSymbolMap.insert( 8742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::pair<std::string, std::string>(Key,Value)); 8842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh } 8942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 9042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh ndkpc::Compiler Compiler; 9142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Compiler.init(std::string(), 9242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::string(), 9342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::vector<std::string>(), 9442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::StringRef(InputFilename).endswith(".cpp")); 9542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Compiler.setInputSource(InputFilename); 9642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Compiler.setIncludePaths(IncludePaths); 9742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Compiler.setOutput(OutputFilename.c_str()); 9842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Compiler.setPreDefinedSymbol(PreDefinedSymbolMap); 9942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 10042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh int ret = Compiler.compile(); 10142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh return ret; 10242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh} 103