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