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