slang_backend.h revision 3a9ca1f0d6bd8f12c2bb2adea51f95c255996180
16315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#ifndef _SLANG_COMPILER_BACKEND_H 26315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#define _SLANG_COMPILER_BACKEND_H 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 49ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/PassManager.h" 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 69ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/Target/TargetData.h" 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 89ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/Support/StandardPasses.h" 99ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/Support/FormattedStream.h" 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/ASTConsumer.h" 12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 133a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang.h" 146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_pragma_recorder.h" 156315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm { 173a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class formatted_raw_ostream; 186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class LLVMContext; 196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class NamedMDNode; 206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class Module; 213a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class PassManager; 223a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class FunctionPassManager; 239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang { 263a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class CodeGenOptions; 276315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class CodeGenerator; 286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class DeclGroupRef; 296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class TagDecl; 306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class VarDecl; 319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass Backend : public clang::ASTConsumer { 369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::CodeGenOptions &mCodeGenOpts; 389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetOptions &mTargetOpts; 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Output stream 419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::raw_ostream *mpOS; 423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType mOT; 436b22674f4ef0a6c689c589830f1c44f443520785Kirk Stewart 449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::TargetData *mpTargetData; 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // This helps us translate Clang AST using into LLVM IR 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::CodeGenerator *mGen; 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Passes 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Passes apply on function scope in a translation unit 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::FunctionPassManager *mPerFunctionPasses; 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Passes apply on module scope 546315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr llvm::PassManager *mPerModulePasses; 559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Passes for code emission 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::FunctionPassManager *mCodeGenPasses; 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::formatted_raw_ostream FormattedOutStream; 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 603a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang void CreateFunctionPasses(); 613a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang void CreateModulePasses(); 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool CreateCodeGenPasses(); 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao protected: 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::LLVMContext &mLLVMContext; 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Diagnostic &mDiags; 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::Module *mpModule; 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const PragmaList &mPragmas; 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Extra handler for subclass to handle translation unit before emission 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void HandleTranslationUnitEx(clang::ASTContext &Ctx) { return; } 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Backend(clang::Diagnostic &Diags, 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::CodeGenOptions &CodeGenOpts, 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetOptions &TargetOpts, 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const PragmaList &Pragmas, 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::raw_ostream *OS, 813a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType OT); 829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Initialize - This is called to initialize the consumer, providing the 849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // ASTContext. 859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void Initialize(clang::ASTContext &Ctx); 869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // HandleTopLevelDecl - Handle the specified top-level declaration. This is 889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // called by the parser to process every top-level Decl*. Note that D can be 899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // the head of a chain of Decls (e.g. for `int a, b` the chain will have two 909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // elements). Use Decl::getNextDeclarator() to walk the chain. 919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void HandleTopLevelDecl(clang::DeclGroupRef D); 929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // HandleTranslationUnit - This method is called when the ASTs for entire 949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // translation unit have been parsed. 959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void HandleTranslationUnit(clang::ASTContext &Ctx); 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // HandleTagDeclDefinition - This callback is invoked each time a TagDecl 989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // (e.g. struct, union, enum, class) is completed. This allows the client to 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // hack on the type, which can occur at any point in the file (because these 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // can be defined in declspecs). 1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void HandleTagDeclDefinition(clang::TagDecl *D); 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // CompleteTentativeDefinition - Callback invoked at the end of a translation 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // unit to notify the consumer that the given tentative definition should be 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // completed. 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void CompleteTentativeDefinition(clang::VarDecl *D); 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual ~Backend(); 109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace slang 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1136315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#endif // _SLANG_COMPILER_BACKEND_H 114