diff options
Diffstat (limited to 'lib/CodeGen/ModuleBuilder.cpp')
| -rw-r--r-- | lib/CodeGen/ModuleBuilder.cpp | 36 | 
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/CodeGen/ModuleBuilder.cpp b/lib/CodeGen/ModuleBuilder.cpp index 69e5b323045c..bc7acbc39cab 100644 --- a/lib/CodeGen/ModuleBuilder.cpp +++ b/lib/CodeGen/ModuleBuilder.cpp @@ -13,6 +13,7 @@  #include "clang/CodeGen/ModuleBuilder.h"  #include "CodeGenModule.h" +#include "CGDebugInfo.h"  #include "clang/AST/ASTContext.h"  #include "clang/AST/DeclObjC.h"  #include "clang/AST/Expr.h" @@ -20,6 +21,7 @@  #include "clang/Basic/TargetInfo.h"  #include "clang/Frontend/CodeGenOptions.h"  #include "llvm/ADT/OwningPtr.h" +#include "llvm/ADT/StringRef.h"  #include "llvm/IR/DataLayout.h"  #include "llvm/IR/LLVMContext.h"  #include "llvm/IR/Module.h" @@ -58,13 +60,22 @@ namespace {        TD.reset(new llvm::DataLayout(Ctx->getTargetInfo().getTargetDescription()));        Builder.reset(new CodeGen::CodeGenModule(Context, CodeGenOpts, *M, *TD,                                                 Diags)); + +      for (size_t i = 0, e = CodeGenOpts.DependentLibraries.size(); i < e; ++i) +        HandleDependentLibrary(CodeGenOpts.DependentLibraries[i]);      }      virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { +      if (Diags.hasErrorOccurred()) +        return; +        Builder->HandleCXXStaticMemberVarInstantiation(VD);      }      virtual bool HandleTopLevelDecl(DeclGroupRef DG) { +      if (Diags.hasErrorOccurred()) +        return true; +        // Make sure to emit all elements of a Decl.        for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)          Builder->EmitTopLevelDecl(*I); @@ -76,6 +87,9 @@ namespace {      /// client hack on the type, which can occur at any point in the file      /// (because these can be defined in declspecs).      virtual void HandleTagDeclDefinition(TagDecl *D) { +      if (Diags.hasErrorOccurred()) +        return; +        Builder->UpdateCompletedType(D);        // In C++, we may have member functions that need to be emitted at this  @@ -92,6 +106,15 @@ namespace {        }      } +    virtual void HandleTagDeclRequiredDefinition(const TagDecl *D) LLVM_OVERRIDE { +      if (Diags.hasErrorOccurred()) +        return; + +      if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo()) +        if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) +          DI->completeRequiredType(RD); +    } +      virtual void HandleTranslationUnit(ASTContext &Ctx) {        if (Diags.hasErrorOccurred()) {          M.reset(); @@ -115,6 +138,19 @@ namespace {        Builder->EmitVTable(RD, DefinitionRequired);      } + +    virtual void HandleLinkerOptionPragma(llvm::StringRef Opts) { +      Builder->AppendLinkerOptions(Opts); +    } + +    virtual void HandleDetectMismatch(llvm::StringRef Name, +                                      llvm::StringRef Value) { +      Builder->AddDetectMismatch(Name, Value); +    } + +    virtual void HandleDependentLibrary(llvm::StringRef Lib) { +      Builder->AddDependentLib(Lib); +    }    };  }  | 
