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