summaryrefslogtreecommitdiff
path: root/Backend.h
diff options
context:
space:
mode:
authorAndrew Hsieh <andrewhsieh@google.com>2012-07-31 15:54:16 -0700
committerAndrew Hsieh <andrewhsieh@google.com>2012-07-31 15:54:16 -0700
commit42552ec6168d994991696a04c1626ac91218a720 (patch)
tree33fb886ae12c33dc1d0d32130a2c7d0b60572fed /Backend.h
parent8ad720504e84a65fc3d01947a2effed67ad47346 (diff)
downloadllvm-ndk-cc-42552ec6168d994991696a04c1626ac91218a720.tar.gz
llvm-ndk-cc: driver of NDK llvm ABI
Change-Id: I6b230d089fd7f3b944504b0a1f9a980cc3524aec
Diffstat (limited to 'Backend.h')
-rw-r--r--Backend.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/Backend.h b/Backend.h
new file mode 100644
index 0000000..a6bb7f3
--- /dev/null
+++ b/Backend.h
@@ -0,0 +1,100 @@
+#ifndef _LLVM_NDK_CC_BACKEND_H
+#define _LLVM_NDK_CC_BACKEND_H
+
+#include "clang/AST/ASTConsumer.h"
+
+#include "llvm/PassManager.h"
+
+#include "llvm/Support/FormattedStream.h"
+#include "llvm/Transforms/IPO/PassManagerBuilder.h"
+
+#include "Compiler.h"
+
+namespace llvm {
+ class formatted_raw_ostream;
+ class LLVMContext;
+ class NamedMDNode;
+ class Module;
+ class PassManager;
+ class FunctionPassManager;
+}
+
+namespace clang {
+ class CodeGenOptions;
+ class CodeGenerator;
+ class DeclGroupRef;
+ class TagDecl;
+ class VarDecl;
+}
+
+namespace ndkpc {
+
+class Backend : public clang::ASTConsumer {
+public:
+ Backend(const clang::CodeGenOptions &CodeGenOpts,
+ const clang::TargetOptions &TargetOpts,
+ clang::DiagnosticsEngine *Diags,
+ llvm::raw_ostream *OS,
+ Compiler::OutputType OT);
+
+ virtual ~Backend();
+
+ // Initialize - This is called to initialize the consumer, providing the
+ // ASTContext.
+ virtual void Initialize(clang::ASTContext &Ctx);
+
+ // HandleTopLevelDecl - Handle the specified top-level declaration. This is
+ // called by the parser to process every top-level Decl*. Note that D can be
+ // the head of a chain of Decls (e.g. for `int a, b` the chain will have two
+ // elements). Use Decl::getNextDeclarator() to walk the chain.
+ virtual bool HandleTopLevelDecl(clang::DeclGroupRef D);
+
+ // HandleTranslationUnit - This method is called when the ASTs for entire
+ // translation unit have been parsed.
+ virtual void HandleTranslationUnit(clang::ASTContext &Ctx);
+
+ // HandleTagDeclDefinition - This callback is invoked each time a TagDecl
+ // (e.g. struct, union, enum, class) is completed. This allows the client to
+ // hack on the type, which can occur at any point in the file (because these
+ // can be defined in declspecs).
+ virtual void HandleTagDeclDefinition(clang::TagDecl *D);
+
+ // CompleteTentativeDefinition - Callback invoked at the end of a translation
+ // unit to notify the consumer that the given tentative definition should be
+ // completed.
+ virtual void CompleteTentativeDefinition(clang::VarDecl *D);
+
+private:
+ const clang::CodeGenOptions &mCodeGenOpts;
+ const clang::TargetOptions &mTargetOpts;
+
+ llvm::LLVMContext &mLLVMContext;
+ clang::DiagnosticsEngine &mDiags;
+
+ llvm::Module *mpModule;
+
+ // Output stream
+ llvm::raw_ostream *mpOS;
+ Compiler::OutputType mOT;
+
+ // This helps us translate Clang AST using into LLVM IR
+ clang::CodeGenerator *mpGen;
+
+ // Passes apply on function scope in a translation unit
+ llvm::FunctionPassManager *mpPerFunctionPasses;
+ void CreateFunctionPasses();
+
+ // Passes apply on module scope
+ llvm::PassManager *mpPerModulePasses;
+ void CreateModulePasses();
+
+ // Passes for code emission
+ llvm::FunctionPassManager *mpCodeGenPasses;
+ bool CreateCodeGenPasses();
+
+ llvm::formatted_raw_ostream FormattedOutStream;
+};
+
+}
+
+#endif // _LLVM_NDK_CC_BACKEND_H