diff options
Diffstat (limited to 'lib/CodeGen/CodeGenAction.cpp')
| -rw-r--r-- | lib/CodeGen/CodeGenAction.cpp | 74 | 
1 files changed, 43 insertions, 31 deletions
| diff --git a/lib/CodeGen/CodeGenAction.cpp b/lib/CodeGen/CodeGenAction.cpp index a6f6fdef335c..7e82fcc4b22a 100644 --- a/lib/CodeGen/CodeGenAction.cpp +++ b/lib/CodeGen/CodeGenAction.cpp @@ -46,7 +46,7 @@ namespace clang {      const CodeGenOptions &CodeGenOpts;      const TargetOptions &TargetOpts;      const LangOptions &LangOpts; -    raw_ostream *AsmOutStream; +    raw_pwrite_stream *AsmOutStream;      ASTContext *Context;      Timer LLVMIRGeneration; @@ -56,18 +56,17 @@ namespace clang {      std::unique_ptr<llvm::Module> TheModule, LinkModule;    public: -    BackendConsumer(BackendAction action, DiagnosticsEngine &_Diags, -                    const CodeGenOptions &compopts, -                    const TargetOptions &targetopts, -                    const LangOptions &langopts, bool TimePasses, -                    const std::string &infile, llvm::Module *LinkModule, -                    raw_ostream *OS, LLVMContext &C, +    BackendConsumer(BackendAction Action, DiagnosticsEngine &Diags, +                    const CodeGenOptions &CodeGenOpts, +                    const TargetOptions &TargetOpts, +                    const LangOptions &LangOpts, bool TimePasses, +                    const std::string &InFile, llvm::Module *LinkModule, +                    raw_pwrite_stream *OS, LLVMContext &C,                      CoverageSourceInfo *CoverageInfo = nullptr) -        : Diags(_Diags), Action(action), CodeGenOpts(compopts), -          TargetOpts(targetopts), LangOpts(langopts), AsmOutStream(OS), +        : Diags(Diags), Action(Action), CodeGenOpts(CodeGenOpts), +          TargetOpts(TargetOpts), LangOpts(LangOpts), AsmOutStream(OS),            Context(nullptr), LLVMIRGeneration("LLVM IR Generation Time"), -          Gen(CreateLLVMCodeGen(Diags, infile, compopts, -                                targetopts, C, CoverageInfo)), +          Gen(CreateLLVMCodeGen(Diags, InFile, CodeGenOpts, C, CoverageInfo)),            LinkModule(LinkModule) {        llvm::TimePassesIsEnabled = TimePasses;      } @@ -80,6 +79,11 @@ namespace clang {      }      void Initialize(ASTContext &Ctx) override { +      if (Context) { +        assert(Context == &Ctx); +        return; +      } +                Context = &Ctx;        if (llvm::TimePassesIsEnabled) @@ -196,8 +200,8 @@ namespace clang {        Gen->CompleteTentativeDefinition(D);      } -    void HandleVTable(CXXRecordDecl *RD, bool DefinitionRequired) override { -      Gen->HandleVTable(RD, DefinitionRequired); +    void HandleVTable(CXXRecordDecl *RD) override { +      Gen->HandleVTable(RD);      }      void HandleLinkerOptionPragma(llvm::StringRef Opts) override { @@ -430,13 +434,16 @@ void BackendConsumer::EmitOptimizationMessage(    FileManager &FileMgr = SourceMgr.getFileManager();    StringRef Filename;    unsigned Line, Column; -  D.getLocation(&Filename, &Line, &Column);    SourceLocation DILoc; -  const FileEntry *FE = FileMgr.getFile(Filename); -  if (FE && Line > 0) { -    // If -gcolumn-info was not used, Column will be 0. This upsets the -    // source manager, so pass 1 if Column is not set. -    DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1); + +  if (D.isLocationAvailable()) { +    D.getLocation(&Filename, &Line, &Column); +    const FileEntry *FE = FileMgr.getFile(Filename); +    if (FE && Line > 0) { +      // If -gcolumn-info was not used, Column will be 0. This upsets the +      // source manager, so pass 1 if Column is not set. +      DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1); +    }    }    // If a location isn't available, try to approximate it using the associated @@ -451,7 +458,7 @@ void BackendConsumer::EmitOptimizationMessage(        << AddFlagValue(D.getPassName() ? D.getPassName() : "")        << D.getMsg().str(); -  if (DILoc.isInvalid()) +  if (DILoc.isInvalid() && D.isLocationAvailable())      // If we were not able to translate the file:line:col information      // back to a SourceLocation, at least emit a note stating that      // we could not translate this location. This can happen in the @@ -602,9 +609,8 @@ llvm::LLVMContext *CodeGenAction::takeLLVMContext() {    return VMContext;  } -static raw_ostream *GetOutputStream(CompilerInstance &CI, -                                    StringRef InFile, -                                    BackendAction Action) { +static raw_pwrite_stream * +GetOutputStream(CompilerInstance &CI, StringRef InFile, BackendAction Action) {    switch (Action) {    case Backend_EmitAssembly:      return CI.createDefaultOutputFile(false, InFile, "s"); @@ -626,7 +632,7 @@ static raw_ostream *GetOutputStream(CompilerInstance &CI,  std::unique_ptr<ASTConsumer>  CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {    BackendAction BA = static_cast<BackendAction>(Act); -  std::unique_ptr<raw_ostream> OS(GetOutputStream(CI, InFile, BA)); +  raw_pwrite_stream *OS = GetOutputStream(CI, InFile, BA);    if (BA != Backend_EmitNothing && !OS)      return nullptr; @@ -663,17 +669,23 @@ CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {    std::unique_ptr<BackendConsumer> Result(new BackendConsumer(        BA, CI.getDiagnostics(), CI.getCodeGenOpts(), CI.getTargetOpts(),        CI.getLangOpts(), CI.getFrontendOpts().ShowTimers, InFile, -      LinkModuleToUse, OS.release(), *VMContext, CoverageInfo)); +      LinkModuleToUse, OS, *VMContext, CoverageInfo));    BEConsumer = Result.get();    return std::move(Result);  } +static void BitcodeInlineAsmDiagHandler(const llvm::SMDiagnostic &SM, +                                         void *Context, +                                         unsigned LocCookie) { +  SM.print(nullptr, llvm::errs()); +} +  void CodeGenAction::ExecuteAction() {    // If this is an IR file, we have to treat it specially.    if (getCurrentFileKind() == IK_LLVM_IR) {      BackendAction BA = static_cast<BackendAction>(Act);      CompilerInstance &CI = getCompilerInstance(); -    raw_ostream *OS = GetOutputStream(CI, getCurrentFile(), BA); +    raw_pwrite_stream *OS = GetOutputStream(CI, getCurrentFile(), BA);      if (BA != Backend_EmitNothing && !OS)        return; @@ -710,14 +722,14 @@ void CodeGenAction::ExecuteAction() {      }      const TargetOptions &TargetOpts = CI.getTargetOpts();      if (TheModule->getTargetTriple() != TargetOpts.Triple) { -      unsigned DiagID = CI.getDiagnostics().getCustomDiagID( -          DiagnosticsEngine::Warning, -          "overriding the module target triple with %0"); - -      CI.getDiagnostics().Report(SourceLocation(), DiagID) << TargetOpts.Triple; +      CI.getDiagnostics().Report(SourceLocation(), +                                 diag::warn_fe_override_module) +          << TargetOpts.Triple;        TheModule->setTargetTriple(TargetOpts.Triple);      } +    LLVMContext &Ctx = TheModule->getContext(); +    Ctx.setInlineAsmDiagnosticHandler(BitcodeInlineAsmDiagHandler);      EmitBackendOutput(CI.getDiagnostics(), CI.getCodeGenOpts(), TargetOpts,                        CI.getLangOpts(), CI.getTarget().getTargetDescription(),                        TheModule.get(), BA, OS); | 
