15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- ModuleBuilder.cpp - Emit LLVM Code from ASTs ---------------------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This builds an AST and converts it to LLVM Code. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/CodeGen/ModuleBuilder.h" 15658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie#include "CGDebugInfo.h" 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "CodeGenModule.h" 178ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner#include "clang/AST/ASTContext.h" 18e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/DeclObjC.h" 19e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h" 208ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner#include "clang/Basic/Diagnostic.h" 218ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner#include "clang/Basic/TargetInfo.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/CodeGenOptions.h" 233190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner#include "llvm/ADT/StringRef.h" 243b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/DataLayout.h" 253b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/LLVMContext.h" 263b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Module.h" 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory> 28bd3606426d389370616126af969904ec493cb105Chris Lattnerusing namespace clang; 29815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek 308ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattnernamespace { 3185b4521e34dcd4a0a4a1f0819e1123128e5a3125Benjamin Kramer class CodeGeneratorImpl : public CodeGenerator { 32d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags; 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<const llvm::DataLayout> TD; 348ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner ASTContext *Ctx; 352811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth const CodeGenOptions CodeGenOpts; // Intentionally copied in. 368ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner protected: 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<llvm::Module> M; 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<CodeGen::CodeGenModule> Builder; 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 408ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner public: 41d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie CodeGeneratorImpl(DiagnosticsEngine &diags, const std::string& ModuleName, 423abae0995b5d4faa3d8cfb1f06118d71a60c7dabJohn McCall const CodeGenOptions &CGO, llvm::LLVMContext& C) 433abae0995b5d4faa3d8cfb1f06118d71a60c7dabJohn McCall : Diags(diags), CodeGenOpts(CGO), 44e1092dfee2bbcc2243421c553bca488880324280Bill Wendling M(new llvm::Module(ModuleName, C)) {} 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek virtual ~CodeGeneratorImpl() {} 471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::Module* GetModule() override { 49d8c0ea1a80f27045c5371f6f97eadb38e8ca4279Daniel Dunbar return M.get(); 50d8c0ea1a80f27045c5371f6f97eadb38e8ca4279Daniel Dunbar } 511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const Decl *GetDeclForMangledName(StringRef MangledName) override { 53ef8225444452a1486bd721f3285301fe84643b00Stephen Hines GlobalDecl Result; 54ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!Builder->lookupRepresentativeDecl(MangledName, Result)) 55ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return nullptr; 56ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const Decl *D = Result.getCanonicalDecl().getDecl(); 57ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (auto FD = dyn_cast<FunctionDecl>(D)) { 58ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (FD->hasBody(FD)) 59ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return FD; 60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else if (auto TD = dyn_cast<TagDecl>(D)) { 61ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (auto Def = TD->getDefinition()) 62ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return Def; 63ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 64ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return D; 65ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 66ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::Module *ReleaseModule() override { return M.release(); } 681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Initialize(ASTContext &Context) override { 708ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner Ctx = &Context; 711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 72bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor M->setTargetTriple(Ctx->getTargetInfo().getTriple().getTriple()); 73bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor M->setDataLayout(Ctx->getTargetInfo().getTargetDescription()); 7425a6a84cf5067b32c271e3ba078676dee838798dMicah Villmow TD.reset(new llvm::DataLayout(Ctx->getTargetInfo().getTargetDescription())); 753abae0995b5d4faa3d8cfb1f06118d71a60c7dabJohn McCall Builder.reset(new CodeGen::CodeGenModule(Context, CodeGenOpts, *M, *TD, 763abae0995b5d4faa3d8cfb1f06118d71a60c7dabJohn McCall Diags)); 77b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg 78b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg for (size_t i = 0, e = CodeGenOpts.DependentLibraries.size(); i < e; ++i) 79b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg HandleDependentLibrary(CodeGenOpts.DependentLibraries[i]); 808ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner } 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override { 830a1c862914664029e3b6693e134cf3ccbf423844David Blaikie if (Diags.hasErrorOccurred()) 840a1c862914664029e3b6693e134cf3ccbf423844David Blaikie return; 850a1c862914664029e3b6693e134cf3ccbf423844David Blaikie 86025039377d7247620750205dbd61ca1ba336f7e0Rafael Espindola Builder->HandleCXXStaticMemberVarInstantiation(VD); 87234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola } 88234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool HandleTopLevelDecl(DeclGroupRef DG) override { 900a1c862914664029e3b6693e134cf3ccbf423844David Blaikie if (Diags.hasErrorOccurred()) 910a1c862914664029e3b6693e134cf3ccbf423844David Blaikie return true; 920a1c862914664029e3b6693e134cf3ccbf423844David Blaikie 934afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor // Make sure to emit all elements of a Decl. 94682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 95682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner Builder->EmitTopLevelDecl(*I); 96ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 97ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Emit any deferred inline method definitions. 98ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (CXXMethodDecl *MD : DeferredInlineMethodDefinitions) 99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Builder->EmitTopLevelDecl(MD); 100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DeferredInlineMethodDefinitions.clear(); 101ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 10288c2596edc8eb475e20f6033de1ea01669695a0cArgyrios Kyrtzidis return true; 1038ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner } 10441071debe9b8887449c3f2ee0dd7124ed47bdda8Daniel Dunbar 1056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void HandleInlineMethodDefinition(CXXMethodDecl *D) override { 1066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Diags.hasErrorOccurred()) 1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(D->doesThisDeclarationHaveABody()); 1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 111ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // We may want to emit this definition. However, that decision might be 112ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // based on computing the linkage, and we have to defer that in case we 113ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // are inside of something that will change the method's final linkage, 114ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // e.g. 115ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // typedef struct { 116ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // void bar(); 117ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // void foo() { bar(); } 118ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // } A; 119ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DeferredInlineMethodDefinitions.push_back(D); 1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1229eee0f8593fcd2426b043fb0164f87ff36bd213fChris Lattner /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl 123682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner /// to (e.g. struct, union, enum, class) is completed. This allows the 124682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner /// client hack on the type, which can occur at any point in the file 125682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner /// (because these can be defined in declspecs). 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleTagDeclDefinition(TagDecl *D) override { 1270a1c862914664029e3b6693e134cf3ccbf423844David Blaikie if (Diags.hasErrorOccurred()) 1280a1c862914664029e3b6693e134cf3ccbf423844David Blaikie return; 1290a1c862914664029e3b6693e134cf3ccbf423844David Blaikie 130c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner Builder->UpdateCompletedType(D); 1319eee0f8593fcd2426b043fb0164f87ff36bd213fChris Lattner } 132159346a82bfa5063ead81af903a2bc5e5a9e5b36Ted Kremenek 133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleTagDeclRequiredDefinition(const TagDecl *D) override { 1340a1c862914664029e3b6693e134cf3ccbf423844David Blaikie if (Diags.hasErrorOccurred()) 1350a1c862914664029e3b6693e134cf3ccbf423844David Blaikie return; 1360a1c862914664029e3b6693e134cf3ccbf423844David Blaikie 137658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo()) 138658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) 139278048971c8b2e153d305ee8917618c9bf38b1c3David Blaikie DI->completeRequiredType(RD); 140658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie } 141658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie 142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleTranslationUnit(ASTContext &Ctx) override { 143159346a82bfa5063ead81af903a2bc5e5a9e5b36Ted Kremenek if (Diags.hasErrorOccurred()) { 144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Builder) 145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Builder->clear(); 146159346a82bfa5063ead81af903a2bc5e5a9e5b36Ted Kremenek M.reset(); 147159346a82bfa5063ead81af903a2bc5e5a9e5b36Ted Kremenek return; 148159346a82bfa5063ead81af903a2bc5e5a9e5b36Ted Kremenek } 149159346a82bfa5063ead81af903a2bc5e5a9e5b36Ted Kremenek 150159346a82bfa5063ead81af903a2bc5e5a9e5b36Ted Kremenek if (Builder) 151159346a82bfa5063ead81af903a2bc5e5a9e5b36Ted Kremenek Builder->Release(); 1527177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar } 153b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void CompleteTentativeDefinition(VarDecl *D) override { 155b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor if (Diags.hasErrorOccurred()) 156b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor return; 157b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor 158b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor Builder->EmitTentativeDefinition(D); 159b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor } 1606fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleVTable(CXXRecordDecl *RD, bool DefinitionRequired) override { 1626fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (Diags.hasErrorOccurred()) 1636fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor return; 1646fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 1656fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor Builder->EmitVTable(RD, DefinitionRequired); 1666fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 1673190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner 168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleLinkerOptionPragma(llvm::StringRef Opts) override { 1693190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner Builder->AppendLinkerOptions(Opts); 1703190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner } 1713190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner 172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleDetectMismatch(llvm::StringRef Name, 173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::StringRef Value) override { 174a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman Builder->AddDetectMismatch(Name, Value); 175a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman } 176a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman 177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleDependentLibrary(llvm::StringRef Lib) override { 1783190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner Builder->AddDependentLib(Lib); 1793190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner } 180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines private: 182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::vector<CXXMethodDecl *> DeferredInlineMethodDefinitions; 1838ee3c0340ff10f0d98e2e138813ada3b36239038Chris Lattner }; 18488a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner} 18588a69ad80e1550e9932666e6efa050a5b1223889Chris Lattner 18699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid CodeGenerator::anchor() { } 18799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 188d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikieCodeGenerator *clang::CreateLLVMCodeGen(DiagnosticsEngine &Diags, 189815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889Ted Kremenek const std::string& ModuleName, 1902811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth const CodeGenOptions &CGO, 1913abae0995b5d4faa3d8cfb1f06118d71a60c7dabJohn McCall const TargetOptions &/*TO*/, 1928f1ca78009ca1bdb66903c51b9bbaa81f58ea72aOwen Anderson llvm::LLVMContext& C) { 1933abae0995b5d4faa3d8cfb1f06118d71a60c7dabJohn McCall return new CodeGeneratorImpl(Diags, ModuleName, CGO, C); 194d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner} 195