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