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