slang_backend.h revision 3fd0a94a5cf1656569b1aea07043cc63939dcb46
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_BACKEND_H_ // NOLINT 18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_BACKEND_H_ 19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/ASTConsumer.h" 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/PassManager.h" 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/Support/FormattedStream.h" 25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/StandardPasses.h" 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 273a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang.h" 286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_pragma_recorder.h" 296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm { 313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class formatted_raw_ostream; 326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class LLVMContext; 336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class NamedMDNode; 346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class Module; 353a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class PassManager; 363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class FunctionPassManager; 379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang { 403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class CodeGenOptions; 416315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class CodeGenerator; 426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class DeclGroupRef; 436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class TagDecl; 446315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr class VarDecl; 459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass Backend : public clang::ASTConsumer { 509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private: 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::CodeGenOptions &mCodeGenOpts; 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetOptions &mTargetOpts; 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5468fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang llvm::Module *mpModule; 5568fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Output stream 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::raw_ostream *mpOS; 583a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType mOT; 596b22674f4ef0a6c689c589830f1c44f443520785Kirk Stewart 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // This helps us translate Clang AST using into LLVM IR 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::CodeGenerator *mGen; 62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Passes 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Passes apply on function scope in a translation unit 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::FunctionPassManager *mPerFunctionPasses; 679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Passes apply on module scope 686315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr llvm::PassManager *mPerModulePasses; 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Passes for code emission 709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::FunctionPassManager *mCodeGenPasses; 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::formatted_raw_ostream FormattedOutStream; 73462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 743a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang void CreateFunctionPasses(); 753a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang void CreateModulePasses(); 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao bool CreateCodeGenPasses(); 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao protected: 799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::LLVMContext &mLLVMContext; 809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao clang::Diagnostic &mDiags; 819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 823fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines PragmaList *mPragmas; 839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 848785d056b8912325b7e2c9c6c7adbd13b90964c4Zonr Chang // This handler will be invoked before Clang translates @Ctx to LLVM IR. This 8568fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang // give you an opportunity to modified the IR in AST level (scope information, 8668fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang // unoptimized IR, etc.). After the return from this method, slang will start 8768fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang // translate @Ctx into LLVM IR. One should not operate on @Ctx afterwards 8868fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang // since the changes applied on that never reflects to the LLVM module used 8968fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang // in the final codegen. 9068fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang virtual void HandleTranslationUnitPre(clang::ASTContext &Ctx) { return; } 9168fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang 9268fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang // This handler will be invoked when Clang have converted AST tree to LLVM IR. 9368fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang // The @M contains the resulting LLVM IR tree. After the return from this 9468fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang // method, slang will start doing optimization and code generation for @M. 9568fc02ca4a7235e2981be5eee4ad968a9d3928c0Zonr Chang virtual void HandleTranslationUnitPost(llvm::Module *M) { return; } 969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public: 98e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Backend(clang::Diagnostic *Diags, 999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::CodeGenOptions &CodeGenOpts, 1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao const clang::TargetOptions &TargetOpts, 1013fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines PragmaList *Pragmas, 1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::raw_ostream *OS, 1033a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType OT); 1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // Initialize - This is called to initialize the consumer, providing the 1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // ASTContext. 1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void Initialize(clang::ASTContext &Ctx); 1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // HandleTopLevelDecl - Handle the specified top-level declaration. This is 1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // called by the parser to process every top-level Decl*. Note that D can be 1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // the head of a chain of Decls (e.g. for `int a, b` the chain will have two 1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // elements). Use Decl::getNextDeclarator() to walk the chain. 1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void HandleTopLevelDecl(clang::DeclGroupRef D); 1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // HandleTranslationUnit - This method is called when the ASTs for entire 1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // translation unit have been parsed. 1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void HandleTranslationUnit(clang::ASTContext &Ctx); 1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // HandleTagDeclDefinition - This callback is invoked each time a TagDecl 1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // (e.g. struct, union, enum, class) is completed. This allows the client to 1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // hack on the type, which can occur at any point in the file (because these 1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // can be defined in declspecs). 1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void HandleTagDeclDefinition(clang::TagDecl *D); 1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // CompleteTentativeDefinition - Callback invoked at the end of a translation 1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // unit to notify the consumer that the given tentative definition should be 1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // completed. 1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual void CompleteTentativeDefinition(clang::VarDecl *D); 1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao virtual ~Backend(); 131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao} // namespace slang 134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 135e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_BACKEND_H_ NOLINT 136