1 //===--- CodeGenAction.cpp - LLVM Code Generation Frontend Action ---------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "clang/CodeGen/CodeGenAction.h" 11 #include "CodeGenModule.h" 12 #include "CoverageMappingGen.h" 13 #include "MacroPPCallbacks.h" 14 #include "clang/AST/ASTConsumer.h" 15 #include "clang/AST/ASTContext.h" 16 #include "clang/AST/DeclCXX.h" 17 #include "clang/AST/DeclGroup.h" 18 #include "clang/Basic/FileManager.h" 19 #include "clang/Basic/SourceManager.h" 20 #include "clang/Basic/TargetInfo.h" 21 #include "clang/CodeGen/BackendUtil.h" 22 #include "clang/CodeGen/ModuleBuilder.h" 23 #include "clang/Frontend/CompilerInstance.h" 24 #include "clang/Frontend/FrontendDiagnostic.h" 25 #include "clang/Lex/Preprocessor.h" 26 #include "llvm/Bitcode/BitcodeReader.h" 27 #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" 28 #include "llvm/IR/DebugInfo.h" 29 #include "llvm/IR/DiagnosticInfo.h" 30 #include "llvm/IR/DiagnosticPrinter.h" 31 #include "llvm/IR/GlobalValue.h" 32 #include "llvm/IR/LLVMContext.h" 33 #include "llvm/IR/Module.h" 34 #include "llvm/IRReader/IRReader.h" 35 #include "llvm/Linker/Linker.h" 36 #include "llvm/Pass.h" 37 #include "llvm/Support/MemoryBuffer.h" 38 #include "llvm/Support/SourceMgr.h" 39 #include "llvm/Support/Timer.h" 40 #include "llvm/Support/ToolOutputFile.h" 41 #include "llvm/Support/YAMLTraits.h" 42 #include "llvm/Transforms/IPO/Internalize.h" 43 44 #include <memory> 45 using namespace clang; 46 using namespace llvm; 47 48 namespace clang { 49 class BackendConsumer; 50 class ClangDiagnosticHandler final : public DiagnosticHandler { 51 public: 52 ClangDiagnosticHandler(const CodeGenOptions &CGOpts, BackendConsumer *BCon) 53 : CodeGenOpts(CGOpts), BackendCon(BCon) {} 54 55 bool handleDiagnostics(const DiagnosticInfo &DI) override; 56 57 bool isAnalysisRemarkEnabled(StringRef PassName) const override { 58 return (CodeGenOpts.OptimizationRemarkAnalysisPattern && 59 CodeGenOpts.OptimizationRemarkAnalysisPattern->match(PassName)); 60 } 61 bool isMissedOptRemarkEnabled(StringRef PassName) const override { 62 return (CodeGenOpts.OptimizationRemarkMissedPattern && 63 CodeGenOpts.OptimizationRemarkMissedPattern->match(PassName)); 64 } 65 bool isPassedOptRemarkEnabled(StringRef PassName) const override { 66 return (CodeGenOpts.OptimizationRemarkPattern && 67 CodeGenOpts.OptimizationRemarkPattern->match(PassName)); 68 } 69 70 bool isAnyRemarkEnabled() const override { 71 return (CodeGenOpts.OptimizationRemarkAnalysisPattern || 72 CodeGenOpts.OptimizationRemarkMissedPattern || 73 CodeGenOpts.OptimizationRemarkPattern); 74 } 75 76 private: 77 const CodeGenOptions &CodeGenOpts; 78 BackendConsumer *BackendCon; 79 }; 80 81 class BackendConsumer : public ASTConsumer { 82 using LinkModule = CodeGenAction::LinkModule; 83 84 virtual void anchor(); 85 DiagnosticsEngine &Diags; 86 BackendAction Action; 87 const HeaderSearchOptions &HeaderSearchOpts; 88 const CodeGenOptions &CodeGenOpts; 89 const TargetOptions &TargetOpts; 90 const LangOptions &LangOpts; 91 std::unique_ptr<raw_pwrite_stream> AsmOutStream; 92 ASTContext *Context; 93 94 Timer LLVMIRGeneration; 95 unsigned LLVMIRGenerationRefCount; 96 97 /// True if we've finished generating IR. This prevents us from generating 98 /// additional LLVM IR after emitting output in HandleTranslationUnit. This 99 /// can happen when Clang plugins trigger additional AST deserialization. 100 bool IRGenFinished = false; 101 102 std::unique_ptr<CodeGenerator> Gen; 103 104 SmallVector<LinkModule, 4> LinkModules; 105 106 // This is here so that the diagnostic printer knows the module a diagnostic 107 // refers to. 108 llvm::Module *CurLinkModule = nullptr; 109 110 public: 111 BackendConsumer(BackendAction Action, DiagnosticsEngine &Diags, 112 const HeaderSearchOptions &HeaderSearchOpts, 113 const PreprocessorOptions &PPOpts, 114 const CodeGenOptions &CodeGenOpts, 115 const TargetOptions &TargetOpts, 116 const LangOptions &LangOpts, bool TimePasses, 117 const std::string &InFile, 118 SmallVector<LinkModule, 4> LinkModules, 119 std::unique_ptr<raw_pwrite_stream> OS, LLVMContext &C, 120 CoverageSourceInfo *CoverageInfo = nullptr) 121 : Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts), 122 CodeGenOpts(CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts), 123 AsmOutStream(std::move(OS)), Context(nullptr), 124 LLVMIRGeneration("irgen", "LLVM IR Generation Time"), 125 LLVMIRGenerationRefCount(0), 126 Gen(CreateLLVMCodeGen(Diags, InFile, HeaderSearchOpts, PPOpts, 127 CodeGenOpts, C, CoverageInfo)), 128 LinkModules(std::move(LinkModules)) { 129 llvm::TimePassesIsEnabled = TimePasses; 130 } 131 llvm::Module *getModule() const { return Gen->GetModule(); } 132 std::unique_ptr<llvm::Module> takeModule() { 133 return std::unique_ptr<llvm::Module>(Gen->ReleaseModule()); 134 } 135 136 CodeGenerator *getCodeGenerator() { return Gen.get(); } 137 138 void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override { 139 Gen->HandleCXXStaticMemberVarInstantiation(VD); 140 } 141 142 void Initialize(ASTContext &Ctx) override { 143 assert(!Context && "initialized multiple times"); 144 145 Context = &Ctx; 146 147 if (llvm::TimePassesIsEnabled) 148 LLVMIRGeneration.startTimer(); 149 150 Gen->Initialize(Ctx); 151 152 if (llvm::TimePassesIsEnabled) 153 LLVMIRGeneration.stopTimer(); 154 } 155 156 bool HandleTopLevelDecl(DeclGroupRef D) override { 157 PrettyStackTraceDecl CrashInfo(*D.begin(), SourceLocation(), 158 Context->getSourceManager(), 159 "LLVM IR generation of declaration"); 160 161 // Recurse. 162 if (llvm::TimePassesIsEnabled) { 163 LLVMIRGenerationRefCount += 1; 164 if (LLVMIRGenerationRefCount == 1) 165 LLVMIRGeneration.startTimer(); 166 } 167 168 Gen->HandleTopLevelDecl(D); 169 170 if (llvm::TimePassesIsEnabled) { 171 LLVMIRGenerationRefCount -= 1; 172 if (LLVMIRGenerationRefCount == 0) 173 LLVMIRGeneration.stopTimer(); 174 } 175 176 return true; 177 } 178 179 void HandleInlineFunctionDefinition(FunctionDecl *D) override { 180 PrettyStackTraceDecl CrashInfo(D, SourceLocation(), 181 Context->getSourceManager(), 182 "LLVM IR generation of inline function"); 183 if (llvm::TimePassesIsEnabled) 184 LLVMIRGeneration.startTimer(); 185 186 Gen->HandleInlineFunctionDefinition(D); 187 188 if (llvm::TimePassesIsEnabled) 189 LLVMIRGeneration.stopTimer(); 190 } 191 192 void HandleInterestingDecl(DeclGroupRef D) override { 193 // Ignore interesting decls from the AST reader after IRGen is finished. 194 if (!IRGenFinished) 195 HandleTopLevelDecl(D); 196 } 197 198 // Links each entry in LinkModules into our module. Returns true on error. 199 bool LinkInModules() { 200 for (auto &LM : LinkModules) { 201 if (LM.PropagateAttrs) 202 for (Function &F : *LM.Module) 203 Gen->CGM().AddDefaultFnAttrs(F); 204 205 CurLinkModule = LM.Module.get(); 206 207 bool Err; 208 if (LM.Internalize) { 209 Err = Linker::linkModules( 210 *getModule(), std::move(LM.Module), LM.LinkFlags, 211 [](llvm::Module &M, const llvm::StringSet<> &GVS) { 212 internalizeModule(M, [&GVS](const llvm::GlobalValue &GV) { 213 return !GV.hasName() || (GVS.count(GV.getName()) == 0); 214 }); 215 }); 216 } else { 217 Err = Linker::linkModules(*getModule(), std::move(LM.Module), 218 LM.LinkFlags); 219 } 220 221 if (Err) 222 return true; 223 } 224 return false; // success 225 } 226 227 void HandleTranslationUnit(ASTContext &C) override { 228 { 229 PrettyStackTraceString CrashInfo("Per-file LLVM IR generation"); 230 if (llvm::TimePassesIsEnabled) { 231 LLVMIRGenerationRefCount += 1; 232 if (LLVMIRGenerationRefCount == 1) 233 LLVMIRGeneration.startTimer(); 234 } 235 236 Gen->HandleTranslationUnit(C); 237 238 if (llvm::TimePassesIsEnabled) { 239 LLVMIRGenerationRefCount -= 1; 240 if (LLVMIRGenerationRefCount == 0) 241 LLVMIRGeneration.stopTimer(); 242 } 243 244 IRGenFinished = true; 245 } 246 247 // Silently ignore if we weren't initialized for some reason. 248 if (!getModule()) 249 return; 250 251 // Install an inline asm handler so that diagnostics get printed through 252 // our diagnostics hooks. 253 LLVMContext &Ctx = getModule()->getContext(); 254 LLVMContext::InlineAsmDiagHandlerTy OldHandler = 255 Ctx.getInlineAsmDiagnosticHandler(); 256 void *OldContext = Ctx.getInlineAsmDiagnosticContext(); 257 Ctx.setInlineAsmDiagnosticHandler(InlineAsmDiagHandler, this); 258 259 std::unique_ptr<DiagnosticHandler> OldDiagnosticHandler = 260 Ctx.getDiagnosticHandler(); 261 Ctx.setDiagnosticHandler(llvm::make_unique<ClangDiagnosticHandler>( 262 CodeGenOpts, this)); 263 Ctx.setDiagnosticsHotnessRequested(CodeGenOpts.DiagnosticsWithHotness); 264 if (CodeGenOpts.DiagnosticsHotnessThreshold != 0) 265 Ctx.setDiagnosticsHotnessThreshold( 266 CodeGenOpts.DiagnosticsHotnessThreshold); 267 268 std::unique_ptr<llvm::ToolOutputFile> OptRecordFile; 269 if (!CodeGenOpts.OptRecordFile.empty()) { 270 std::error_code EC; 271 OptRecordFile = llvm::make_unique<llvm::ToolOutputFile>( 272 CodeGenOpts.OptRecordFile, EC, sys::fs::F_None); 273 if (EC) { 274 Diags.Report(diag::err_cannot_open_file) << 275 CodeGenOpts.OptRecordFile << EC.message(); 276 return; 277 } 278 279 Ctx.setDiagnosticsOutputFile( 280 llvm::make_unique<yaml::Output>(OptRecordFile->os())); 281 282 if (CodeGenOpts.getProfileUse() != CodeGenOptions::ProfileNone) 283 Ctx.setDiagnosticsHotnessRequested(true); 284 } 285 286 // Link each LinkModule into our module. 287 if (LinkInModules()) 288 return; 289 290 EmbedBitcode(getModule(), CodeGenOpts, llvm::MemoryBufferRef()); 291 292 EmitBackendOutput(Diags, HeaderSearchOpts, CodeGenOpts, TargetOpts, 293 LangOpts, C.getTargetInfo().getDataLayout(), 294 getModule(), Action, std::move(AsmOutStream)); 295 296 Ctx.setInlineAsmDiagnosticHandler(OldHandler, OldContext); 297 298 Ctx.setDiagnosticHandler(std::move(OldDiagnosticHandler)); 299 300 if (OptRecordFile) 301 OptRecordFile->keep(); 302 } 303 304 void HandleTagDeclDefinition(TagDecl *D) override { 305 PrettyStackTraceDecl CrashInfo(D, SourceLocation(), 306 Context->getSourceManager(), 307 "LLVM IR generation of declaration"); 308 Gen->HandleTagDeclDefinition(D); 309 } 310 311 void HandleTagDeclRequiredDefinition(const TagDecl *D) override { 312 Gen->HandleTagDeclRequiredDefinition(D); 313 } 314 315 void CompleteTentativeDefinition(VarDecl *D) override { 316 Gen->CompleteTentativeDefinition(D); 317 } 318 319 void AssignInheritanceModel(CXXRecordDecl *RD) override { 320 Gen->AssignInheritanceModel(RD); 321 } 322 323 void HandleVTable(CXXRecordDecl *RD) override { 324 Gen->HandleVTable(RD); 325 } 326 327 static void InlineAsmDiagHandler(const llvm::SMDiagnostic &SM,void *Context, 328 unsigned LocCookie) { 329 SourceLocation Loc = SourceLocation::getFromRawEncoding(LocCookie); 330 ((BackendConsumer*)Context)->InlineAsmDiagHandler2(SM, Loc); 331 } 332 333 /// Get the best possible source location to represent a diagnostic that 334 /// may have associated debug info. 335 const FullSourceLoc 336 getBestLocationFromDebugLoc(const llvm::DiagnosticInfoWithLocationBase &D, 337 bool &BadDebugInfo, StringRef &Filename, 338 unsigned &Line, unsigned &Column) const; 339 340 void InlineAsmDiagHandler2(const llvm::SMDiagnostic &, 341 SourceLocation LocCookie); 342 343 void DiagnosticHandlerImpl(const llvm::DiagnosticInfo &DI); 344 /// \brief Specialized handler for InlineAsm diagnostic. 345 /// \return True if the diagnostic has been successfully reported, false 346 /// otherwise. 347 bool InlineAsmDiagHandler(const llvm::DiagnosticInfoInlineAsm &D); 348 /// \brief Specialized handler for StackSize diagnostic. 349 /// \return True if the diagnostic has been successfully reported, false 350 /// otherwise. 351 bool StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D); 352 /// \brief Specialized handler for unsupported backend feature diagnostic. 353 void UnsupportedDiagHandler(const llvm::DiagnosticInfoUnsupported &D); 354 /// \brief Specialized handlers for optimization remarks. 355 /// Note that these handlers only accept remarks and they always handle 356 /// them. 357 void EmitOptimizationMessage(const llvm::DiagnosticInfoOptimizationBase &D, 358 unsigned DiagID); 359 void 360 OptimizationRemarkHandler(const llvm::DiagnosticInfoOptimizationBase &D); 361 void OptimizationRemarkHandler( 362 const llvm::OptimizationRemarkAnalysisFPCommute &D); 363 void OptimizationRemarkHandler( 364 const llvm::OptimizationRemarkAnalysisAliasing &D); 365 void OptimizationFailureHandler( 366 const llvm::DiagnosticInfoOptimizationFailure &D); 367 }; 368 369 void BackendConsumer::anchor() {} 370 } 371 372 bool ClangDiagnosticHandler::handleDiagnostics(const DiagnosticInfo &DI) { 373 BackendCon->DiagnosticHandlerImpl(DI); 374 return true; 375 } 376 377 /// ConvertBackendLocation - Convert a location in a temporary llvm::SourceMgr 378 /// buffer to be a valid FullSourceLoc. 379 static FullSourceLoc ConvertBackendLocation(const llvm::SMDiagnostic &D, 380 SourceManager &CSM) { 381 // Get both the clang and llvm source managers. The location is relative to 382 // a memory buffer that the LLVM Source Manager is handling, we need to add 383 // a copy to the Clang source manager. 384 const llvm::SourceMgr &LSM = *D.getSourceMgr(); 385 386 // We need to copy the underlying LLVM memory buffer because llvm::SourceMgr 387 // already owns its one and clang::SourceManager wants to own its one. 388 const MemoryBuffer *LBuf = 389 LSM.getMemoryBuffer(LSM.FindBufferContainingLoc(D.getLoc())); 390 391 // Create the copy and transfer ownership to clang::SourceManager. 392 // TODO: Avoid copying files into memory. 393 std::unique_ptr<llvm::MemoryBuffer> CBuf = 394 llvm::MemoryBuffer::getMemBufferCopy(LBuf->getBuffer(), 395 LBuf->getBufferIdentifier()); 396 // FIXME: Keep a file ID map instead of creating new IDs for each location. 397 FileID FID = CSM.createFileID(std::move(CBuf)); 398 399 // Translate the offset into the file. 400 unsigned Offset = D.getLoc().getPointer() - LBuf->getBufferStart(); 401 SourceLocation NewLoc = 402 CSM.getLocForStartOfFile(FID).getLocWithOffset(Offset); 403 return FullSourceLoc(NewLoc, CSM); 404 } 405 406 407 /// InlineAsmDiagHandler2 - This function is invoked when the backend hits an 408 /// error parsing inline asm. The SMDiagnostic indicates the error relative to 409 /// the temporary memory buffer that the inline asm parser has set up. 410 void BackendConsumer::InlineAsmDiagHandler2(const llvm::SMDiagnostic &D, 411 SourceLocation LocCookie) { 412 // There are a couple of different kinds of errors we could get here. First, 413 // we re-format the SMDiagnostic in terms of a clang diagnostic. 414 415 // Strip "error: " off the start of the message string. 416 StringRef Message = D.getMessage(); 417 if (Message.startswith("error: ")) 418 Message = Message.substr(7); 419 420 // If the SMDiagnostic has an inline asm source location, translate it. 421 FullSourceLoc Loc; 422 if (D.getLoc() != SMLoc()) 423 Loc = ConvertBackendLocation(D, Context->getSourceManager()); 424 425 unsigned DiagID; 426 switch (D.getKind()) { 427 case llvm::SourceMgr::DK_Error: 428 DiagID = diag::err_fe_inline_asm; 429 break; 430 case llvm::SourceMgr::DK_Warning: 431 DiagID = diag::warn_fe_inline_asm; 432 break; 433 case llvm::SourceMgr::DK_Note: 434 DiagID = diag::note_fe_inline_asm; 435 break; 436 } 437 // If this problem has clang-level source location information, report the 438 // issue in the source with a note showing the instantiated 439 // code. 440 if (LocCookie.isValid()) { 441 Diags.Report(LocCookie, DiagID).AddString(Message); 442 443 if (D.getLoc().isValid()) { 444 DiagnosticBuilder B = Diags.Report(Loc, diag::note_fe_inline_asm_here); 445 // Convert the SMDiagnostic ranges into SourceRange and attach them 446 // to the diagnostic. 447 for (const std::pair<unsigned, unsigned> &Range : D.getRanges()) { 448 unsigned Column = D.getColumnNo(); 449 B << SourceRange(Loc.getLocWithOffset(Range.first - Column), 450 Loc.getLocWithOffset(Range.second - Column)); 451 } 452 } 453 return; 454 } 455 456 // Otherwise, report the backend issue as occurring in the generated .s file. 457 // If Loc is invalid, we still need to report the issue, it just gets no 458 // location info. 459 Diags.Report(Loc, DiagID).AddString(Message); 460 } 461 462 #define ComputeDiagID(Severity, GroupName, DiagID) \ 463 do { \ 464 switch (Severity) { \ 465 case llvm::DS_Error: \ 466 DiagID = diag::err_fe_##GroupName; \ 467 break; \ 468 case llvm::DS_Warning: \ 469 DiagID = diag::warn_fe_##GroupName; \ 470 break; \ 471 case llvm::DS_Remark: \ 472 llvm_unreachable("'remark' severity not expected"); \ 473 break; \ 474 case llvm::DS_Note: \ 475 DiagID = diag::note_fe_##GroupName; \ 476 break; \ 477 } \ 478 } while (false) 479 480 #define ComputeDiagRemarkID(Severity, GroupName, DiagID) \ 481 do { \ 482 switch (Severity) { \ 483 case llvm::DS_Error: \ 484 DiagID = diag::err_fe_##GroupName; \ 485 break; \ 486 case llvm::DS_Warning: \ 487 DiagID = diag::warn_fe_##GroupName; \ 488 break; \ 489 case llvm::DS_Remark: \ 490 DiagID = diag::remark_fe_##GroupName; \ 491 break; \ 492 case llvm::DS_Note: \ 493 DiagID = diag::note_fe_##GroupName; \ 494 break; \ 495 } \ 496 } while (false) 497 498 bool 499 BackendConsumer::InlineAsmDiagHandler(const llvm::DiagnosticInfoInlineAsm &D) { 500 unsigned DiagID; 501 ComputeDiagID(D.getSeverity(), inline_asm, DiagID); 502 std::string Message = D.getMsgStr().str(); 503 504 // If this problem has clang-level source location information, report the 505 // issue as being a problem in the source with a note showing the instantiated 506 // code. 507 SourceLocation LocCookie = 508 SourceLocation::getFromRawEncoding(D.getLocCookie()); 509 if (LocCookie.isValid()) 510 Diags.Report(LocCookie, DiagID).AddString(Message); 511 else { 512 // Otherwise, report the backend diagnostic as occurring in the generated 513 // .s file. 514 // If Loc is invalid, we still need to report the diagnostic, it just gets 515 // no location info. 516 FullSourceLoc Loc; 517 Diags.Report(Loc, DiagID).AddString(Message); 518 } 519 // We handled all the possible severities. 520 return true; 521 } 522 523 bool 524 BackendConsumer::StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D) { 525 if (D.getSeverity() != llvm::DS_Warning) 526 // For now, the only support we have for StackSize diagnostic is warning. 527 // We do not know how to format other severities. 528 return false; 529 530 if (const Decl *ND = Gen->GetDeclForMangledName(D.getFunction().getName())) { 531 // FIXME: Shouldn't need to truncate to uint32_t 532 Diags.Report(ND->getASTContext().getFullLoc(ND->getLocation()), 533 diag::warn_fe_frame_larger_than) 534 << static_cast<uint32_t>(D.getStackSize()) << Decl::castToDeclContext(ND); 535 return true; 536 } 537 538 return false; 539 } 540 541 const FullSourceLoc BackendConsumer::getBestLocationFromDebugLoc( 542 const llvm::DiagnosticInfoWithLocationBase &D, bool &BadDebugInfo, 543 StringRef &Filename, unsigned &Line, unsigned &Column) const { 544 SourceManager &SourceMgr = Context->getSourceManager(); 545 FileManager &FileMgr = SourceMgr.getFileManager(); 546 SourceLocation DILoc; 547 548 if (D.isLocationAvailable()) { 549 D.getLocation(&Filename, &Line, &Column); 550 const FileEntry *FE = FileMgr.getFile(Filename); 551 if (FE && Line > 0) { 552 // If -gcolumn-info was not used, Column will be 0. This upsets the 553 // source manager, so pass 1 if Column is not set. 554 DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1); 555 } 556 BadDebugInfo = DILoc.isInvalid(); 557 } 558 559 // If a location isn't available, try to approximate it using the associated 560 // function definition. We use the definition's right brace to differentiate 561 // from diagnostics that genuinely relate to the function itself. 562 FullSourceLoc Loc(DILoc, SourceMgr); 563 if (Loc.isInvalid()) 564 if (const Decl *FD = Gen->GetDeclForMangledName(D.getFunction().getName())) 565 Loc = FD->getASTContext().getFullLoc(FD->getLocation()); 566 567 if (DILoc.isInvalid() && D.isLocationAvailable()) 568 // If we were not able to translate the file:line:col information 569 // back to a SourceLocation, at least emit a note stating that 570 // we could not translate this location. This can happen in the 571 // case of #line directives. 572 Diags.Report(Loc, diag::note_fe_backend_invalid_loc) 573 << Filename << Line << Column; 574 575 return Loc; 576 } 577 578 void BackendConsumer::UnsupportedDiagHandler( 579 const llvm::DiagnosticInfoUnsupported &D) { 580 // We only support errors. 581 assert(D.getSeverity() == llvm::DS_Error); 582 583 StringRef Filename; 584 unsigned Line, Column; 585 bool BadDebugInfo = false; 586 FullSourceLoc Loc = 587 getBestLocationFromDebugLoc(D, BadDebugInfo, Filename, Line, Column); 588 589 Diags.Report(Loc, diag::err_fe_backend_unsupported) << D.getMessage().str(); 590 591 if (BadDebugInfo) 592 // If we were not able to translate the file:line:col information 593 // back to a SourceLocation, at least emit a note stating that 594 // we could not translate this location. This can happen in the 595 // case of #line directives. 596 Diags.Report(Loc, diag::note_fe_backend_invalid_loc) 597 << Filename << Line << Column; 598 } 599 600 void BackendConsumer::EmitOptimizationMessage( 601 const llvm::DiagnosticInfoOptimizationBase &D, unsigned DiagID) { 602 // We only support warnings and remarks. 603 assert(D.getSeverity() == llvm::DS_Remark || 604 D.getSeverity() == llvm::DS_Warning); 605 606 StringRef Filename; 607 unsigned Line, Column; 608 bool BadDebugInfo = false; 609 FullSourceLoc Loc = 610 getBestLocationFromDebugLoc(D, BadDebugInfo, Filename, Line, Column); 611 612 std::string Msg; 613 raw_string_ostream MsgStream(Msg); 614 MsgStream << D.getMsg(); 615 616 if (D.getHotness()) 617 MsgStream << " (hotness: " << *D.getHotness() << ")"; 618 619 Diags.Report(Loc, DiagID) 620 << AddFlagValue(D.getPassName()) 621 << MsgStream.str(); 622 623 if (BadDebugInfo) 624 // If we were not able to translate the file:line:col information 625 // back to a SourceLocation, at least emit a note stating that 626 // we could not translate this location. This can happen in the 627 // case of #line directives. 628 Diags.Report(Loc, diag::note_fe_backend_invalid_loc) 629 << Filename << Line << Column; 630 } 631 632 void BackendConsumer::OptimizationRemarkHandler( 633 const llvm::DiagnosticInfoOptimizationBase &D) { 634 if (D.isPassed()) { 635 // Optimization remarks are active only if the -Rpass flag has a regular 636 // expression that matches the name of the pass name in \p D. 637 if (CodeGenOpts.OptimizationRemarkPattern && 638 CodeGenOpts.OptimizationRemarkPattern->match(D.getPassName())) 639 EmitOptimizationMessage(D, diag::remark_fe_backend_optimization_remark); 640 } else if (D.isMissed()) { 641 // Missed optimization remarks are active only if the -Rpass-missed 642 // flag has a regular expression that matches the name of the pass 643 // name in \p D. 644 if (CodeGenOpts.OptimizationRemarkMissedPattern && 645 CodeGenOpts.OptimizationRemarkMissedPattern->match(D.getPassName())) 646 EmitOptimizationMessage( 647 D, diag::remark_fe_backend_optimization_remark_missed); 648 } else { 649 assert(D.isAnalysis() && "Unknown remark type"); 650 651 bool ShouldAlwaysPrint = false; 652 if (auto *ORA = dyn_cast<llvm::OptimizationRemarkAnalysis>(&D)) 653 ShouldAlwaysPrint = ORA->shouldAlwaysPrint(); 654 655 if (ShouldAlwaysPrint || 656 (CodeGenOpts.OptimizationRemarkAnalysisPattern && 657 CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName()))) 658 EmitOptimizationMessage( 659 D, diag::remark_fe_backend_optimization_remark_analysis); 660 } 661 } 662 663 void BackendConsumer::OptimizationRemarkHandler( 664 const llvm::OptimizationRemarkAnalysisFPCommute &D) { 665 // Optimization analysis remarks are active if the pass name is set to 666 // llvm::DiagnosticInfo::AlwasyPrint or if the -Rpass-analysis flag has a 667 // regular expression that matches the name of the pass name in \p D. 668 669 if (D.shouldAlwaysPrint() || 670 (CodeGenOpts.OptimizationRemarkAnalysisPattern && 671 CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName()))) 672 EmitOptimizationMessage( 673 D, diag::remark_fe_backend_optimization_remark_analysis_fpcommute); 674 } 675 676 void BackendConsumer::OptimizationRemarkHandler( 677 const llvm::OptimizationRemarkAnalysisAliasing &D) { 678 // Optimization analysis remarks are active if the pass name is set to 679 // llvm::DiagnosticInfo::AlwasyPrint or if the -Rpass-analysis flag has a 680 // regular expression that matches the name of the pass name in \p D. 681 682 if (D.shouldAlwaysPrint() || 683 (CodeGenOpts.OptimizationRemarkAnalysisPattern && 684 CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName()))) 685 EmitOptimizationMessage( 686 D, diag::remark_fe_backend_optimization_remark_analysis_aliasing); 687 } 688 689 void BackendConsumer::OptimizationFailureHandler( 690 const llvm::DiagnosticInfoOptimizationFailure &D) { 691 EmitOptimizationMessage(D, diag::warn_fe_backend_optimization_failure); 692 } 693 694 /// \brief This function is invoked when the backend needs 695 /// to report something to the user. 696 void BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) { 697 unsigned DiagID = diag::err_fe_inline_asm; 698 llvm::DiagnosticSeverity Severity = DI.getSeverity(); 699 // Get the diagnostic ID based. 700 switch (DI.getKind()) { 701 case llvm::DK_InlineAsm: 702 if (InlineAsmDiagHandler(cast<DiagnosticInfoInlineAsm>(DI))) 703 return; 704 ComputeDiagID(Severity, inline_asm, DiagID); 705 break; 706 case llvm::DK_StackSize: 707 if (StackSizeDiagHandler(cast<DiagnosticInfoStackSize>(DI))) 708 return; 709 ComputeDiagID(Severity, backend_frame_larger_than, DiagID); 710 break; 711 case DK_Linker: 712 assert(CurLinkModule); 713 // FIXME: stop eating the warnings and notes. 714 if (Severity != DS_Error) 715 return; 716 DiagID = diag::err_fe_cannot_link_module; 717 break; 718 case llvm::DK_OptimizationRemark: 719 // Optimization remarks are always handled completely by this 720 // handler. There is no generic way of emitting them. 721 OptimizationRemarkHandler(cast<OptimizationRemark>(DI)); 722 return; 723 case llvm::DK_OptimizationRemarkMissed: 724 // Optimization remarks are always handled completely by this 725 // handler. There is no generic way of emitting them. 726 OptimizationRemarkHandler(cast<OptimizationRemarkMissed>(DI)); 727 return; 728 case llvm::DK_OptimizationRemarkAnalysis: 729 // Optimization remarks are always handled completely by this 730 // handler. There is no generic way of emitting them. 731 OptimizationRemarkHandler(cast<OptimizationRemarkAnalysis>(DI)); 732 return; 733 case llvm::DK_OptimizationRemarkAnalysisFPCommute: 734 // Optimization remarks are always handled completely by this 735 // handler. There is no generic way of emitting them. 736 OptimizationRemarkHandler(cast<OptimizationRemarkAnalysisFPCommute>(DI)); 737 return; 738 case llvm::DK_OptimizationRemarkAnalysisAliasing: 739 // Optimization remarks are always handled completely by this 740 // handler. There is no generic way of emitting them. 741 OptimizationRemarkHandler(cast<OptimizationRemarkAnalysisAliasing>(DI)); 742 return; 743 case llvm::DK_MachineOptimizationRemark: 744 // Optimization remarks are always handled completely by this 745 // handler. There is no generic way of emitting them. 746 OptimizationRemarkHandler(cast<MachineOptimizationRemark>(DI)); 747 return; 748 case llvm::DK_MachineOptimizationRemarkMissed: 749 // Optimization remarks are always handled completely by this 750 // handler. There is no generic way of emitting them. 751 OptimizationRemarkHandler(cast<MachineOptimizationRemarkMissed>(DI)); 752 return; 753 case llvm::DK_MachineOptimizationRemarkAnalysis: 754 // Optimization remarks are always handled completely by this 755 // handler. There is no generic way of emitting them. 756 OptimizationRemarkHandler(cast<MachineOptimizationRemarkAnalysis>(DI)); 757 return; 758 case llvm::DK_OptimizationFailure: 759 // Optimization failures are always handled completely by this 760 // handler. 761 OptimizationFailureHandler(cast<DiagnosticInfoOptimizationFailure>(DI)); 762 return; 763 case llvm::DK_Unsupported: 764 UnsupportedDiagHandler(cast<DiagnosticInfoUnsupported>(DI)); 765 return; 766 default: 767 // Plugin IDs are not bound to any value as they are set dynamically. 768 ComputeDiagRemarkID(Severity, backend_plugin, DiagID); 769 break; 770 } 771 std::string MsgStorage; 772 { 773 raw_string_ostream Stream(MsgStorage); 774 DiagnosticPrinterRawOStream DP(Stream); 775 DI.print(DP); 776 } 777 778 if (DiagID == diag::err_fe_cannot_link_module) { 779 Diags.Report(diag::err_fe_cannot_link_module) 780 << CurLinkModule->getModuleIdentifier() << MsgStorage; 781 return; 782 } 783 784 // Report the backend message using the usual diagnostic mechanism. 785 FullSourceLoc Loc; 786 Diags.Report(Loc, DiagID).AddString(MsgStorage); 787 } 788 #undef ComputeDiagID 789 790 CodeGenAction::CodeGenAction(unsigned _Act, LLVMContext *_VMContext) 791 : Act(_Act), VMContext(_VMContext ? _VMContext : new LLVMContext), 792 OwnsVMContext(!_VMContext) {} 793 794 CodeGenAction::~CodeGenAction() { 795 TheModule.reset(); 796 if (OwnsVMContext) 797 delete VMContext; 798 } 799 800 bool CodeGenAction::hasIRSupport() const { return true; } 801 802 void CodeGenAction::EndSourceFileAction() { 803 // If the consumer creation failed, do nothing. 804 if (!getCompilerInstance().hasASTConsumer()) 805 return; 806 807 // Steal the module from the consumer. 808 TheModule = BEConsumer->takeModule(); 809 } 810 811 std::unique_ptr<llvm::Module> CodeGenAction::takeModule() { 812 return std::move(TheModule); 813 } 814 815 llvm::LLVMContext *CodeGenAction::takeLLVMContext() { 816 OwnsVMContext = false; 817 return VMContext; 818 } 819 820 static std::unique_ptr<raw_pwrite_stream> 821 GetOutputStream(CompilerInstance &CI, StringRef InFile, BackendAction Action) { 822 switch (Action) { 823 case Backend_EmitAssembly: 824 return CI.createDefaultOutputFile(false, InFile, "s"); 825 case Backend_EmitLL: 826 return CI.createDefaultOutputFile(false, InFile, "ll"); 827 case Backend_EmitBC: 828 return CI.createDefaultOutputFile(true, InFile, "bc"); 829 case Backend_EmitNothing: 830 return nullptr; 831 case Backend_EmitMCNull: 832 return CI.createNullOutputFile(); 833 case Backend_EmitObj: 834 return CI.createDefaultOutputFile(true, InFile, "o"); 835 } 836 837 llvm_unreachable("Invalid action!"); 838 } 839 840 std::unique_ptr<ASTConsumer> 841 CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { 842 BackendAction BA = static_cast<BackendAction>(Act); 843 std::unique_ptr<raw_pwrite_stream> OS = GetOutputStream(CI, InFile, BA); 844 if (BA != Backend_EmitNothing && !OS) 845 return nullptr; 846 847 // Load bitcode modules to link with, if we need to. 848 if (LinkModules.empty()) 849 for (const CodeGenOptions::BitcodeFileToLink &F : 850 CI.getCodeGenOpts().LinkBitcodeFiles) { 851 auto BCBuf = CI.getFileManager().getBufferForFile(F.Filename); 852 if (!BCBuf) { 853 CI.getDiagnostics().Report(diag::err_cannot_open_file) 854 << F.Filename << BCBuf.getError().message(); 855 LinkModules.clear(); 856 return nullptr; 857 } 858 859 Expected<std::unique_ptr<llvm::Module>> ModuleOrErr = 860 getOwningLazyBitcodeModule(std::move(*BCBuf), *VMContext); 861 if (!ModuleOrErr) { 862 handleAllErrors(ModuleOrErr.takeError(), [&](ErrorInfoBase &EIB) { 863 CI.getDiagnostics().Report(diag::err_cannot_open_file) 864 << F.Filename << EIB.message(); 865 }); 866 LinkModules.clear(); 867 return nullptr; 868 } 869 LinkModules.push_back({std::move(ModuleOrErr.get()), F.PropagateAttrs, 870 F.Internalize, F.LinkFlags}); 871 } 872 873 CoverageSourceInfo *CoverageInfo = nullptr; 874 // Add the preprocessor callback only when the coverage mapping is generated. 875 if (CI.getCodeGenOpts().CoverageMapping) { 876 CoverageInfo = new CoverageSourceInfo; 877 CI.getPreprocessor().addPPCallbacks( 878 std::unique_ptr<PPCallbacks>(CoverageInfo)); 879 } 880 881 std::unique_ptr<BackendConsumer> Result(new BackendConsumer( 882 BA, CI.getDiagnostics(), CI.getHeaderSearchOpts(), 883 CI.getPreprocessorOpts(), CI.getCodeGenOpts(), CI.getTargetOpts(), 884 CI.getLangOpts(), CI.getFrontendOpts().ShowTimers, InFile, 885 std::move(LinkModules), std::move(OS), *VMContext, CoverageInfo)); 886 BEConsumer = Result.get(); 887 888 // Enable generating macro debug info only when debug info is not disabled and 889 // also macro debug info is enabled. 890 if (CI.getCodeGenOpts().getDebugInfo() != codegenoptions::NoDebugInfo && 891 CI.getCodeGenOpts().MacroDebugInfo) { 892 std::unique_ptr<PPCallbacks> Callbacks = 893 llvm::make_unique<MacroPPCallbacks>(BEConsumer->getCodeGenerator(), 894 CI.getPreprocessor()); 895 CI.getPreprocessor().addPPCallbacks(std::move(Callbacks)); 896 } 897 898 return std::move(Result); 899 } 900 901 static void BitcodeInlineAsmDiagHandler(const llvm::SMDiagnostic &SM, 902 void *Context, 903 unsigned LocCookie) { 904 SM.print(nullptr, llvm::errs()); 905 906 auto Diags = static_cast<DiagnosticsEngine *>(Context); 907 unsigned DiagID; 908 switch (SM.getKind()) { 909 case llvm::SourceMgr::DK_Error: 910 DiagID = diag::err_fe_inline_asm; 911 break; 912 case llvm::SourceMgr::DK_Warning: 913 DiagID = diag::warn_fe_inline_asm; 914 break; 915 case llvm::SourceMgr::DK_Note: 916 DiagID = diag::note_fe_inline_asm; 917 break; 918 } 919 920 Diags->Report(DiagID).AddString("cannot compile inline asm"); 921 } 922 923 std::unique_ptr<llvm::Module> CodeGenAction::loadModule(MemoryBufferRef MBRef) { 924 CompilerInstance &CI = getCompilerInstance(); 925 SourceManager &SM = CI.getSourceManager(); 926 927 // For ThinLTO backend invocations, ensure that the context 928 // merges types based on ODR identifiers. We also need to read 929 // the correct module out of a multi-module bitcode file. 930 if (!CI.getCodeGenOpts().ThinLTOIndexFile.empty()) { 931 VMContext->enableDebugTypeODRUniquing(); 932 933 auto DiagErrors = [&](Error E) -> std::unique_ptr<llvm::Module> { 934 unsigned DiagID = 935 CI.getDiagnostics().getCustomDiagID(DiagnosticsEngine::Error, "%0"); 936 handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { 937 CI.getDiagnostics().Report(DiagID) << EIB.message(); 938 }); 939 return {}; 940 }; 941 942 Expected<llvm::BitcodeModule> BMOrErr = FindThinLTOModule(MBRef); 943 if (!BMOrErr) 944 return DiagErrors(BMOrErr.takeError()); 945 946 Expected<std::unique_ptr<llvm::Module>> MOrErr = 947 BMOrErr->parseModule(*VMContext); 948 if (!MOrErr) 949 return DiagErrors(MOrErr.takeError()); 950 return std::move(*MOrErr); 951 } 952 953 llvm::SMDiagnostic Err; 954 if (std::unique_ptr<llvm::Module> M = parseIR(MBRef, Err, *VMContext)) 955 return M; 956 957 // Translate from the diagnostic info to the SourceManager location if 958 // available. 959 // TODO: Unify this with ConvertBackendLocation() 960 SourceLocation Loc; 961 if (Err.getLineNo() > 0) { 962 assert(Err.getColumnNo() >= 0); 963 Loc = SM.translateFileLineCol(SM.getFileEntryForID(SM.getMainFileID()), 964 Err.getLineNo(), Err.getColumnNo() + 1); 965 } 966 967 // Strip off a leading diagnostic code if there is one. 968 StringRef Msg = Err.getMessage(); 969 if (Msg.startswith("error: ")) 970 Msg = Msg.substr(7); 971 972 unsigned DiagID = 973 CI.getDiagnostics().getCustomDiagID(DiagnosticsEngine::Error, "%0"); 974 975 CI.getDiagnostics().Report(Loc, DiagID) << Msg; 976 return {}; 977 } 978 979 void CodeGenAction::ExecuteAction() { 980 // If this is an IR file, we have to treat it specially. 981 if (getCurrentFileKind().getLanguage() == InputKind::LLVM_IR) { 982 BackendAction BA = static_cast<BackendAction>(Act); 983 CompilerInstance &CI = getCompilerInstance(); 984 std::unique_ptr<raw_pwrite_stream> OS = 985 GetOutputStream(CI, getCurrentFile(), BA); 986 if (BA != Backend_EmitNothing && !OS) 987 return; 988 989 bool Invalid; 990 SourceManager &SM = CI.getSourceManager(); 991 FileID FID = SM.getMainFileID(); 992 llvm::MemoryBuffer *MainFile = SM.getBuffer(FID, &Invalid); 993 if (Invalid) 994 return; 995 996 TheModule = loadModule(*MainFile); 997 if (!TheModule) 998 return; 999 1000 const TargetOptions &TargetOpts = CI.getTargetOpts(); 1001 if (TheModule->getTargetTriple() != TargetOpts.Triple) { 1002 CI.getDiagnostics().Report(SourceLocation(), 1003 diag::warn_fe_override_module) 1004 << TargetOpts.Triple; 1005 TheModule->setTargetTriple(TargetOpts.Triple); 1006 } 1007 1008 EmbedBitcode(TheModule.get(), CI.getCodeGenOpts(), 1009 MainFile->getMemBufferRef()); 1010 1011 LLVMContext &Ctx = TheModule->getContext(); 1012 Ctx.setInlineAsmDiagnosticHandler(BitcodeInlineAsmDiagHandler, 1013 &CI.getDiagnostics()); 1014 1015 EmitBackendOutput(CI.getDiagnostics(), CI.getHeaderSearchOpts(), 1016 CI.getCodeGenOpts(), TargetOpts, CI.getLangOpts(), 1017 CI.getTarget().getDataLayout(), TheModule.get(), BA, 1018 std::move(OS)); 1019 return; 1020 } 1021 1022 // Otherwise follow the normal AST path. 1023 this->ASTFrontendAction::ExecuteAction(); 1024 } 1025 1026 // 1027 1028 void EmitAssemblyAction::anchor() { } 1029 EmitAssemblyAction::EmitAssemblyAction(llvm::LLVMContext *_VMContext) 1030 : CodeGenAction(Backend_EmitAssembly, _VMContext) {} 1031 1032 void EmitBCAction::anchor() { } 1033 EmitBCAction::EmitBCAction(llvm::LLVMContext *_VMContext) 1034 : CodeGenAction(Backend_EmitBC, _VMContext) {} 1035 1036 void EmitLLVMAction::anchor() { } 1037 EmitLLVMAction::EmitLLVMAction(llvm::LLVMContext *_VMContext) 1038 : CodeGenAction(Backend_EmitLL, _VMContext) {} 1039 1040 void EmitLLVMOnlyAction::anchor() { } 1041 EmitLLVMOnlyAction::EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext) 1042 : CodeGenAction(Backend_EmitNothing, _VMContext) {} 1043 1044 void EmitCodeGenOnlyAction::anchor() { } 1045 EmitCodeGenOnlyAction::EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext) 1046 : CodeGenAction(Backend_EmitMCNull, _VMContext) {} 1047 1048 void EmitObjAction::anchor() { } 1049 EmitObjAction::EmitObjAction(llvm::LLVMContext *_VMContext) 1050 : CodeGenAction(Backend_EmitObj, _VMContext) {} 1051