| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 1 | //===--- ModuleBuilder.cpp - Emit LLVM Code from ASTs ---------------------===// | 
 | 2 | // | 
 | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
| Chris Lattner | 0bc735f | 2007-12-29 19:59:25 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 7 | // | 
 | 8 | //===----------------------------------------------------------------------===// | 
 | 9 | // | 
 | 10 | // This builds an AST and converts it to LLVM Code. | 
 | 11 | // | 
 | 12 | //===----------------------------------------------------------------------===// | 
 | 13 |  | 
 | 14 | #include "clang/CodeGen/ModuleBuilder.h" | 
 | 15 | #include "CodeGenModule.h" | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 16 | #include "clang/AST/ASTContext.h" | 
| Daniel Dunbar | e91593e | 2008-08-11 04:54:23 +0000 | [diff] [blame] | 17 | #include "clang/AST/DeclObjC.h" | 
 | 18 | #include "clang/AST/Expr.h" | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 19 | using namespace clang; | 
 | 20 |  | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 21 | //===----------------------------------------------------------------------===// | 
 | 22 | // LLVM Emitter | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 23 |  | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 24 | #include "clang/Basic/Diagnostic.h" | 
 | 25 | #include "clang/Basic/TargetInfo.h" | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 26 | #include "llvm/Module.h" | 
 | 27 | #include "llvm/Target/TargetData.h" | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 28 | #include "llvm/Support/Compiler.h" | 
 | 29 | #include "llvm/ADT/OwningPtr.h" | 
 | 30 |  | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 31 |  | 
 | 32 | namespace { | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 33 |   class VISIBILITY_HIDDEN CodeGeneratorImpl : public CodeGenerator { | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 34 |     Diagnostic &Diags; | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 35 |     llvm::OwningPtr<const llvm::TargetData> TD; | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 36 |     ASTContext *Ctx; | 
 | 37 |     const LangOptions &Features; | 
| Sanjiv Gupta | e8b9f5b | 2008-05-08 08:54:20 +0000 | [diff] [blame] | 38 |     bool GenerateDebugInfo; | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 39 |   protected: | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 40 |     llvm::OwningPtr<llvm::Module> M; | 
 | 41 |     llvm::OwningPtr<CodeGen::CodeGenModule> Builder; | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 42 |   public: | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 43 |     CodeGeneratorImpl(Diagnostic &diags, const LangOptions &LO, | 
 | 44 |                       const std::string& ModuleName, | 
 | 45 |                       bool DebugInfoFlag) | 
| Sanjiv Gupta | e8b9f5b | 2008-05-08 08:54:20 +0000 | [diff] [blame] | 46 |     : Diags(diags), Features(LO), GenerateDebugInfo(DebugInfoFlag), | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 47 |       M(new llvm::Module(ModuleName)) {} | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 48 |      | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 49 |     virtual ~CodeGeneratorImpl() {} | 
 | 50 |      | 
| Daniel Dunbar | d8c0ea1 | 2008-10-21 19:55:09 +0000 | [diff] [blame] | 51 |     virtual llvm::Module* GetModule() { | 
 | 52 |       return M.get(); | 
 | 53 |     } | 
 | 54 |      | 
| Ted Kremenek | 159346a | 2008-08-07 19:47:41 +0000 | [diff] [blame] | 55 |     virtual llvm::Module* ReleaseModule() { | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 56 |       return M.take(); | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 57 |     } | 
 | 58 |      | 
 | 59 |     virtual void Initialize(ASTContext &Context) { | 
 | 60 |       Ctx = &Context; | 
 | 61 |        | 
 | 62 |       M->setTargetTriple(Ctx->Target.getTargetTriple()); | 
 | 63 |       M->setDataLayout(Ctx->Target.getTargetDescription()); | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 64 |       TD.reset(new llvm::TargetData(Ctx->Target.getTargetDescription())); | 
 | 65 |       Builder.reset(new CodeGen::CodeGenModule(Context, Features, *M, *TD, | 
| Daniel Dunbar | f77ac86 | 2008-08-11 21:35:06 +0000 | [diff] [blame] | 66 |                                                Diags, GenerateDebugInfo)); | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 67 |     } | 
 | 68 |      | 
 | 69 |     virtual void HandleTopLevelDecl(Decl *D) { | 
| Daniel Dunbar | 41071de | 2008-08-15 23:26:23 +0000 | [diff] [blame] | 70 |       // Make sure to emit all elements of a ScopedDecl. | 
| Daniel Dunbar | 58a7a26 | 2008-07-29 17:47:36 +0000 | [diff] [blame] | 71 |       if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) { | 
| Daniel Dunbar | 41071de | 2008-08-15 23:26:23 +0000 | [diff] [blame] | 72 |         for (; SD; SD = SD->getNextDeclarator()) | 
 | 73 |           Builder->EmitTopLevelDecl(SD); | 
 | 74 |       } else { | 
 | 75 |         Builder->EmitTopLevelDecl(D); | 
| Daniel Dunbar | 58a7a26 | 2008-07-29 17:47:36 +0000 | [diff] [blame] | 76 |       } | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 77 |     } | 
| Daniel Dunbar | 41071de | 2008-08-15 23:26:23 +0000 | [diff] [blame] | 78 |  | 
| Chris Lattner | 9eee0f8 | 2008-02-06 04:51:19 +0000 | [diff] [blame] | 79 |     /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl | 
| Nico Weber | d7549e7 | 2008-08-09 23:08:17 +0000 | [diff] [blame] | 80 |     /// (e.g. struct, union, enum, class) is completed. This allows the client to | 
| Chris Lattner | 9eee0f8 | 2008-02-06 04:51:19 +0000 | [diff] [blame] | 81 |     /// hack on the type, which can occur at any point in the file (because these | 
 | 82 |     /// can be defined in declspecs). | 
 | 83 |     virtual void HandleTagDeclDefinition(TagDecl *D) { | 
| Chris Lattner | c5b8806 | 2008-02-06 05:08:19 +0000 | [diff] [blame] | 84 |       Builder->UpdateCompletedType(D); | 
| Chris Lattner | 9eee0f8 | 2008-02-06 04:51:19 +0000 | [diff] [blame] | 85 |     } | 
| Ted Kremenek | 159346a | 2008-08-07 19:47:41 +0000 | [diff] [blame] | 86 |  | 
 | 87 |     virtual void HandleTranslationUnit(TranslationUnit& TU) { | 
 | 88 |       if (Diags.hasErrorOccurred()) { | 
 | 89 |         M.reset(); | 
 | 90 |         return; | 
 | 91 |       } | 
 | 92 |  | 
 | 93 |       if (Builder) | 
 | 94 |         Builder->Release(); | 
 | 95 |     }; | 
| Chris Lattner | 8ee3c03 | 2008-02-06 02:01:47 +0000 | [diff] [blame] | 96 |   }; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 97 | } | 
 | 98 |  | 
| Ted Kremenek | 815c78f | 2008-08-05 18:50:11 +0000 | [diff] [blame] | 99 | CodeGenerator *clang::CreateLLVMCodeGen(Diagnostic &Diags,  | 
 | 100 |                                         const LangOptions &Features, | 
 | 101 |                                         const std::string& ModuleName, | 
 | 102 |                                         bool GenerateDebugInfo) { | 
 | 103 |   return new CodeGeneratorImpl(Diags, Features, ModuleName, GenerateDebugInfo); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 104 | } |