142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#ifndef _LLVM_NDK_CC_COMPILER_H 242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#define _LLVM_NDK_CC_COMPILER_H 342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <cstdio> 542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <map> 642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <string> 742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include <vector> 842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Basic/DiagnosticIDs.h" 1042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Basic/LangOptions.h" 1142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Basic/TargetOptions.h" 1242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 1342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/Frontend/CodeGenOptions.h" 1442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 1542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/ADT/IntrusiveRefCntPtr.h" 1642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/ADT/OwningPtr.h" 1742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/ADT/StringRef.h" 1842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 1942552ec6168d994991696a04c1626ac91218a720Andrew Hsiehnamespace llvm { 2042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class tool_output_file; 2142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class raw_ostream; 2242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh} 2342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 2442552ec6168d994991696a04c1626ac91218a720Andrew Hsiehnamespace clang { 2542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class Diagnostic; 2642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class DiagnosticClient; 2742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class FileManager; 2842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class FileSystemOptions; 2942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class SourceManager; 3042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class Preprocessor; 3142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class TargetOptions; 3242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class ASTContext; 3342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class ASTConsumer; 3442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class Backend; 3542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class TargetInfo; 3642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh class TextDiagnosticPrinter; 3742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh} 3842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 3942552ec6168d994991696a04c1626ac91218a720Andrew Hsiehnamespace ndkpc { 4042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 4142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi" 4242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 4342552ec6168d994991696a04c1626ac91218a720Andrew Hsiehclass Compiler { 4442552ec6168d994991696a04c1626ac91218a720Andrew Hsiehpublic: 4542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh typedef enum { 4642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OT_Dependency, 4742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OT_Assembly, 4842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OT_LLVMAssembly, 4942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OT_Bitcode, 5042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OT_Nothing, 5142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OT_Object, 5242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 5342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OT_Default = OT_Bitcode 5442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh } OutputType; 5542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 5642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh Compiler(); 5742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh ~Compiler(); 5842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 5942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void init(const std::string &Triple, const std::string &CPU, 6042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh const std::vector<std::string> &Features, 6142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh bool isCXX); 6242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 6342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh bool setInputSource(llvm::StringRef InputFile, const char *Text, 6442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh size_t TextLength); 6542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 6642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh bool setInputSource(llvm::StringRef InputFile); 6742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 6842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh inline const std::string &getInputFileName() const { return mInputFileName; } 6942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 7042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh inline void setIncludePaths(const std::vector<std::string> &IncludePaths) { 7142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh mIncludePaths = IncludePaths; 7242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh } 7342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 7442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh inline void setPreDefinedSymbol(const std::map<std::string, std::string>& M) { 7542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh mPreDefinedSymbolMap = M; 7642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh } 7742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 7842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh inline void setOutputType(OutputType OT) { mOT = OT; } 7942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 8042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh bool setOutput(const char *OutputFile); 8142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh inline const std::string &getOutputFileName() const { 8242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh return mOutputFileName; 8342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh } 8442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 8542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh int compile(); 8642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 8742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // Reset the slang compiler state such that it can be reused to compile 8842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // another file 8942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void reset(); 9042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 9142552ec6168d994991696a04c1626ac91218a720Andrew Hsiehprivate: 9242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh clang::LangOptions mLangOpts; 9342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh clang::CodeGenOptions mCodeGenOpts; 9442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 9542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh static void LLVMErrorHandler(void *UserData, const std::string &Message); 9642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 9742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh bool mInitialized; 9842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 9942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The diagnostics engine instance (for status reporting during compilation) 10042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine> mDiagnostics; 10142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The diagnostics id 10242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> mDiagIDs; 10342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The clients of diagnostics engine. The ownership is taken by the 10442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // mDiagnostics after creation. 10542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh clang::TextDiagnosticPrinter *mpDiagClient; 10642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void createDiagnostic(); 10742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 10842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The target being compiled for 10942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh clang::TargetOptions mTargetOpts; 11042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::OwningPtr<clang::TargetInfo> mTarget; 11142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void createTarget(const std::string &Triple, const std::string &CPU, 11242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh const std::vector<std::string> &Features); 11342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 11442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // Below is for parsing and code generation 11542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 11642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The file manager (for prepocessor doing the job such as header file search) 11742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::OwningPtr<clang::FileManager> mFileMgr; 11842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::OwningPtr<clang::FileSystemOptions> mFileSysOpt; 11942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void createFileManager(); 12042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 12142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The source manager (responsible for the source code handling) 12242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::OwningPtr<clang::SourceManager> mSourceMgr; 12342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void createSourceManager(); 12442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 12542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The preprocessor (source code preprocessor) 12642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::OwningPtr<clang::Preprocessor> mPP; 12742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void createPreprocessor(); 12842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 12942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The AST context (the context to hold long-lived AST nodes) 13042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::OwningPtr<clang::ASTContext> mASTContext; 13142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void createASTContext(); 13242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 13342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // The AST consumer, responsible for code generation 13442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::OwningPtr<clang::ASTConsumer> mBackend; 13542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 13642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // Input file name 13742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::string mInputFileName; 13842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::string mOutputFileName; 13942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 14042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OutputType mOT; 14142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 14242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh // Output stream 14342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::OwningPtr<llvm::tool_output_file> mOS; 14442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 14542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::vector<std::string> mIncludePaths; 14642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 14742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh std::map<std::string, std::string> mPreDefinedSymbolMap; 14842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void injectPreDefined(); 14942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 15042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void initDiagnostic() {} 15142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void initPreprocessor() {} 15242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh void initASTContext() {} 15342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 15442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh clang::ASTConsumer *createBackend(const clang::CodeGenOptions& CodeGenOpts, 15542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh llvm::raw_ostream *OS, 15642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh OutputType OT); 15742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh}; 15842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 15942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh} 16042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh 16142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#endif // _LLVM_NDK_CC_COMPILER_H 162