142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#ifndef _LLVM_NDK_CC_BACKEND_H
242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#define _LLVM_NDK_CC_BACKEND_H
342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "clang/AST/ASTConsumer.h"
542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/PassManager.h"
742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/Support/FormattedStream.h"
942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "llvm/Transforms/IPO/PassManagerBuilder.h"
1042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
1142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#include "Compiler.h"
1242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
1342552ec6168d994991696a04c1626ac91218a720Andrew Hsiehnamespace llvm {
1442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class formatted_raw_ostream;
1542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class LLVMContext;
1642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class NamedMDNode;
1742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class Module;
1842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class PassManager;
1942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class FunctionPassManager;
2042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh}
2142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
2242552ec6168d994991696a04c1626ac91218a720Andrew Hsiehnamespace clang {
2342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class CodeGenOptions;
2442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class CodeGenerator;
2542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class DeclGroupRef;
2642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class TagDecl;
2742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  class VarDecl;
2842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh}
2942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
3042552ec6168d994991696a04c1626ac91218a720Andrew Hsiehnamespace ndkpc {
3142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
3242552ec6168d994991696a04c1626ac91218a720Andrew Hsiehclass Backend : public clang::ASTConsumer {
3342552ec6168d994991696a04c1626ac91218a720Andrew Hsiehpublic:
3442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Backend(const clang::CodeGenOptions &CodeGenOpts,
3542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh          const clang::TargetOptions &TargetOpts,
3642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh          clang::DiagnosticsEngine *Diags,
3742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh          llvm::raw_ostream *OS,
3842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh          Compiler::OutputType OT);
3942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
4042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  virtual ~Backend();
4142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
4242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // Initialize - This is called to initialize the consumer, providing the
4342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // ASTContext.
4442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  virtual void Initialize(clang::ASTContext &Ctx);
4542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
4642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // HandleTopLevelDecl - Handle the specified top-level declaration.  This is
4742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // called by the parser to process every top-level Decl*. Note that D can be
4842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // the head of a chain of Decls (e.g. for `int a, b` the chain will have two
4942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // elements). Use Decl::getNextDeclarator() to walk the chain.
5042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  virtual bool HandleTopLevelDecl(clang::DeclGroupRef D);
5142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
5242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // HandleTranslationUnit - This method is called when the ASTs for entire
5342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // translation unit have been parsed.
5442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  virtual void HandleTranslationUnit(clang::ASTContext &Ctx);
5542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
5642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // HandleTagDeclDefinition - This callback is invoked each time a TagDecl
5742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // (e.g. struct, union, enum, class) is completed.  This allows the client to
5842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // hack on the type, which can occur at any point in the file (because these
5942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // can be defined in declspecs).
6042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  virtual void HandleTagDeclDefinition(clang::TagDecl *D);
6142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
6242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // CompleteTentativeDefinition - Callback invoked at the end of a translation
6342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // unit to notify the consumer that the given tentative definition should be
6442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // completed.
6542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  virtual void CompleteTentativeDefinition(clang::VarDecl *D);
6642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
6742552ec6168d994991696a04c1626ac91218a720Andrew Hsiehprivate:
6842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  const clang::CodeGenOptions &mCodeGenOpts;
6942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  const clang::TargetOptions &mTargetOpts;
7042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
7142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  llvm::LLVMContext &mLLVMContext;
7242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  clang::DiagnosticsEngine &mDiags;
7342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
7442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  llvm::Module *mpModule;
7542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
7642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // Output stream
7742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  llvm::raw_ostream *mpOS;
7842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  Compiler::OutputType mOT;
7942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
8042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // This helps us translate Clang AST using into LLVM IR
8142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  clang::CodeGenerator *mpGen;
8242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
8342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // Passes apply on function scope in a translation unit
8442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  llvm::FunctionPassManager *mpPerFunctionPasses;
8542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  void CreateFunctionPasses();
8642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
8742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // Passes apply on module scope
8842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  llvm::PassManager *mpPerModulePasses;
8942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  void CreateModulePasses();
9042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
9142552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  // Passes for code emission
9242552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  llvm::FunctionPassManager *mpCodeGenPasses;
9342552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  bool CreateCodeGenPasses();
9442552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
9542552ec6168d994991696a04c1626ac91218a720Andrew Hsieh  llvm::formatted_raw_ostream FormattedOutStream;
9642552ec6168d994991696a04c1626ac91218a720Andrew Hsieh};
9742552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
9842552ec6168d994991696a04c1626ac91218a720Andrew Hsieh}
9942552ec6168d994991696a04c1626ac91218a720Andrew Hsieh
10042552ec6168d994991696a04c1626ac91218a720Andrew Hsieh#endif //  _LLVM_NDK_CC_BACKEND_H
101