• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <cassert>
2 #include <cstdlib>
3 #include <list>
4 #include <set>
5 #include <string>
6 #include <utility>
7 #include <vector>
8 
9 #include "clang/Driver/Arg.h"
10 #include "clang/Driver/ArgList.h"
11 #include "clang/Driver/DriverDiagnostic.h"
12 #include "clang/Driver/Option.h"
13 #include "clang/Driver/OptTable.h"
14 
15 #include "clang/Frontend/DiagnosticOptions.h"
16 #include "clang/Frontend/TextDiagnosticPrinter.h"
17 
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/ADT/IntrusiveRefCntPtr.h"
21 #include "llvm/ADT/OwningPtr.h"
22 
23 #include "llvm/Support/CommandLine.h"
24 #include "llvm/Support/ManagedStatic.h"
25 #include "llvm/Support/MemoryBuffer.h"
26 #include "llvm/Support/Path.h"
27 #include "llvm/Support/raw_ostream.h"
28 #include "llvm/Support/system_error.h"
29 
30 #include "Compiler.h"
31 
32 // FIXME: Add parameter feature '-D macro=xxx'
33 static llvm::cl::opt<std::string>
34 InputFilename(llvm::cl::Positional, llvm::cl::Required,
35               llvm::cl::desc("<input file>"));
36 
37 static llvm::cl::list<std::string>
38 HeaderSearchDirs("I", llvm::cl::desc("Header search directory"), llvm::cl::Prefix);
39 
40 static llvm::cl::list<std::string>
41 PreDefinedSymbols("D", llvm::cl::desc("Pre-define symbol"));
42 
43 static llvm::cl::opt<std::string>
44 OutputFilename(llvm::cl::Required, "o", llvm::cl::desc("Override output filename"));
45 
46 // split "xxx"     => "xxx" ""
47 // split "xxx=yyy" => "xxx" "yyy"
splitPreDefinedSymbol(const std::string & In,std::string & Key,std::string & Value)48 static void splitPreDefinedSymbol(const std::string& In,
49                              std::string& Key, std::string& Value) {
50   size_t FoundPos = In.find("=");
51   if (FoundPos == std::string::npos) {
52     Key = In;
53     Value = "";
54   } else {
55     Key = In.substr(0, FoundPos);
56     Value = In.substr(FoundPos+1, std::string::npos);
57   }
58 }
59 
60 
main(int argc,char ** argv)61 int main(int argc, char** argv) {
62   llvm::llvm_shutdown_obj _ShutdownObj;
63   llvm::cl::ParseCommandLineOptions(argc, argv, "P-NDK Compile Tool");
64 
65   clang::TextDiagnosticPrinter* DiagClient =
66       new clang::TextDiagnosticPrinter(llvm::errs(), clang::DiagnosticOptions());
67   DiagClient->setPrefix(argv[0]);
68 
69   llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs>
70       DiagIDs(new clang::DiagnosticIDs());
71   clang::Diagnostic Diags(DiagIDs, DiagClient, true);
72 
73   if (Diags.hasErrorOccurred())
74     return 1;
75 
76   std::vector<std::string> IncludePaths;
77   for(unsigned i = 0, e = HeaderSearchDirs.size(); i<e; ++i) {
78     IncludePaths.push_back(HeaderSearchDirs[i]);
79   }
80 
81   std::map<std::string, std::string> PreDefinedSymbolMap;
82   for(unsigned i = 0, e = PreDefinedSymbols.size(); i<e; ++i) {
83     std::string Key;
84     std::string Value;
85     splitPreDefinedSymbol(PreDefinedSymbols[i], Key, Value);
86     PreDefinedSymbolMap.insert(
87         std::pair<std::string, std::string>(Key,Value));
88   }
89 
90   ndkpc::Compiler Compiler;
91   Compiler.init(std::string(),
92                 std::string(),
93                 std::vector<std::string>(),
94                 llvm::StringRef(InputFilename).endswith(".cpp"));
95   Compiler.setInputSource(InputFilename);
96   Compiler.setIncludePaths(IncludePaths);
97   Compiler.setOutput(OutputFilename.c_str());
98   Compiler.setPreDefinedSymbol(PreDefinedSymbolMap);
99 
100   int ret = Compiler.compile();
101   return ret;
102 }
103