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