• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _LLVM_NDK_CC_COMPILER_H
2 #define _LLVM_NDK_CC_COMPILER_H
3 
4 #include <cstdio>
5 #include <map>
6 #include <string>
7 #include <vector>
8 
9 #include "clang/Basic/DiagnosticIDs.h"
10 #include "clang/Basic/LangOptions.h"
11 #include "clang/Basic/TargetOptions.h"
12 
13 #include "clang/Frontend/CodeGenOptions.h"
14 
15 #include "llvm/ADT/IntrusiveRefCntPtr.h"
16 #include "llvm/ADT/OwningPtr.h"
17 #include "llvm/ADT/StringRef.h"
18 
19 namespace llvm {
20   class tool_output_file;
21   class raw_ostream;
22 }
23 
24 namespace clang {
25   class Diagnostic;
26   class DiagnosticClient;
27   class FileManager;
28   class FileSystemOptions;
29   class SourceManager;
30   class Preprocessor;
31   class TargetOptions;
32   class ASTContext;
33   class ASTConsumer;
34   class Backend;
35   class TargetInfo;
36   class TextDiagnosticPrinter;
37 }
38 
39 namespace ndkpc {
40 
41 #define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi"
42 
43 class Compiler {
44 public:
45   typedef enum {
46     OT_Dependency,
47     OT_Assembly,
48     OT_LLVMAssembly,
49     OT_Bitcode,
50     OT_Nothing,
51     OT_Object,
52 
53     OT_Default = OT_Bitcode
54   } OutputType;
55 
56   Compiler();
57   ~Compiler();
58 
59   void init(const std::string &Triple, const std::string &CPU,
60             const std::vector<std::string> &Features,
61             bool isCXX);
62 
63   bool setInputSource(llvm::StringRef InputFile, const char *Text,
64                       size_t TextLength);
65 
66   bool setInputSource(llvm::StringRef InputFile);
67 
getInputFileName()68   inline const std::string &getInputFileName() const { return mInputFileName; }
69 
setIncludePaths(const std::vector<std::string> & IncludePaths)70   inline void setIncludePaths(const std::vector<std::string> &IncludePaths) {
71     mIncludePaths = IncludePaths;
72   }
73 
setPreDefinedSymbol(const std::map<std::string,std::string> & M)74   inline void setPreDefinedSymbol(const std::map<std::string, std::string>& M) {
75     mPreDefinedSymbolMap = M;
76   }
77 
setOutputType(OutputType OT)78   inline void setOutputType(OutputType OT) { mOT = OT; }
79 
80   bool setOutput(const char *OutputFile);
getOutputFileName()81   inline const std::string &getOutputFileName() const {
82     return mOutputFileName;
83   }
84 
85   int compile();
86 
87   // Reset the slang compiler state such that it can be reused to compile
88   // another file
89   void reset();
90 
91 private:
92   clang::LangOptions mLangOpts;
93   clang::CodeGenOptions mCodeGenOpts;
94 
95   static void LLVMErrorHandler(void *UserData, const std::string &Message);
96 
97   bool mInitialized;
98 
99   // The diagnostics engine instance (for status reporting during compilation)
100   llvm::IntrusiveRefCntPtr<clang::Diagnostic> mDiagnostics;
101   // The diagnostics id
102   llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> mDiagIDs;
103   // The clients of diagnostics engine. The ownership is taken by the
104   // mDiagnostics after creation.
105   clang::DiagnosticClient *mpDiagClient;
106   void createDiagnostic();
107 
108   // The target being compiled for
109   clang::TargetOptions mTargetOpts;
110   llvm::OwningPtr<clang::TargetInfo> mTarget;
111   void createTarget(const std::string &Triple, const std::string &CPU,
112                     const std::vector<std::string> &Features);
113 
114   // Below is for parsing and code generation
115 
116   // The file manager (for prepocessor doing the job such as header file search)
117   llvm::OwningPtr<clang::FileManager> mFileMgr;
118   llvm::OwningPtr<clang::FileSystemOptions> mFileSysOpt;
119   void createFileManager();
120 
121   // The source manager (responsible for the source code handling)
122   llvm::OwningPtr<clang::SourceManager> mSourceMgr;
123   void createSourceManager();
124 
125   // The preprocessor (source code preprocessor)
126   llvm::OwningPtr<clang::Preprocessor> mPP;
127   void createPreprocessor();
128 
129   // The AST context (the context to hold long-lived AST nodes)
130   llvm::OwningPtr<clang::ASTContext> mASTContext;
131   void createASTContext();
132 
133   // The AST consumer, responsible for code generation
134   llvm::OwningPtr<clang::ASTConsumer> mBackend;
135 
136   // Input file name
137   std::string mInputFileName;
138   std::string mOutputFileName;
139 
140   OutputType mOT;
141 
142   // Output stream
143   llvm::OwningPtr<llvm::tool_output_file> mOS;
144 
145   std::vector<std::string> mIncludePaths;
146 
147   std::map<std::string, std::string> mPreDefinedSymbolMap;
148   void injectPreDefined();
149 
initDiagnostic()150   void initDiagnostic() {}
initPreprocessor()151   void initPreprocessor() {}
initASTContext()152   void initASTContext() {}
153 
154   clang::ASTConsumer *createBackend(const clang::CodeGenOptions& CodeGenOpts,
155                                     llvm::raw_ostream *OS,
156                                     OutputType OT);
157 };
158 
159 }
160 
161 #endif // _LLVM_NDK_CC_COMPILER_H
162