14ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar//===--- CodeGenAction.cpp - LLVM Code Generation Frontend Action ---------===// 2d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar// 3d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar// The LLVM Compiler Infrastructure 4d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar// 5d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar// This file is distributed under the University of Illinois Open Source 6d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar// License. See LICENSE.TXT for details. 7d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar// 8d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar//===----------------------------------------------------------------------===// 9d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "CoverageMappingGen.h" 11d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar#include "clang/AST/ASTConsumer.h" 12d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar#include "clang/AST/ASTContext.h" 136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/AST/DeclCXX.h" 140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/AST/DeclGroup.h" 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/FileManager.h" 1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/SourceManager.h" 1755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/TargetInfo.h" 189b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar#include "clang/CodeGen/BackendUtil.h" 190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/CodeGen/CodeGenAction.h" 20d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar#include "clang/CodeGen/ModuleBuilder.h" 214ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar#include "clang/Frontend/CompilerInstance.h" 223be0d19503f8291b1581a39a8f6ca01d74bf5cb1Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/Lex/Preprocessor.h" 2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/SmallString.h" 2555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Bitcode/ReaderWriter.h" 266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "llvm/IR/DebugInfo.h" 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/IR/DiagnosticInfo.h" 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/IR/DiagnosticPrinter.h" 29a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#include "llvm/IR/FunctionInfo.h" 303b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/LLVMContext.h" 313b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Module.h" 329cc935b6993460956d0d46ee268e9858743d5129Chandler Carruth#include "llvm/IRReader/IRReader.h" 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Linker/Linker.h" 34a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#include "llvm/Object/FunctionIndexObjectFile.h" 3505a7f3ddce9a88249b05b896e70f66e9ed381743Daniel Dunbar#include "llvm/Pass.h" 366da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner#include "llvm/Support/MemoryBuffer.h" 376da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner#include "llvm/Support/SourceMgr.h" 386f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner#include "llvm/Support/Timer.h" 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory> 40d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbarusing namespace clang; 41d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbarusing namespace llvm; 42d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 435aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Webernamespace clang { 44bd21828179a61bd0954b082825cfb8a93345f602Benjamin Kramer class BackendConsumer : public ASTConsumer { 4599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 46d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags; 47d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar BackendAction Action; 483636e1d784aedb37052aa235966e4fdbe7ed9082Daniel Dunbar const CodeGenOptions &CodeGenOpts; 493636e1d784aedb37052aa235966e4fdbe7ed9082Daniel Dunbar const TargetOptions &TargetOpts; 50b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman const LangOptions &LangOpts; 5158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar raw_pwrite_stream *AsmOutStream; 5249f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner ASTContext *Context; 5390f41303c60195a3c1109c02cf3455d21894e387Daniel Dunbar 546f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner Timer LLVMIRGeneration; 551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<CodeGenerator> Gen; 571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar std::unique_ptr<llvm::Module> TheModule; 59a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar SmallVector<std::pair<unsigned, std::unique_ptr<llvm::Module>>, 4> 60a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar LinkModules; 61a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 62a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // This is here so that the diagnostic printer knows the module a diagnostic 63a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // refers to. 64a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar llvm::Module *CurLinkModule = nullptr; 65d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump public: 67a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar BackendConsumer( 68a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar BackendAction Action, DiagnosticsEngine &Diags, 69a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const HeaderSearchOptions &HeaderSearchOpts, 70a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const PreprocessorOptions &PPOpts, const CodeGenOptions &CodeGenOpts, 71a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const TargetOptions &TargetOpts, const LangOptions &LangOpts, 72a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar bool TimePasses, const std::string &InFile, 73a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const SmallVectorImpl<std::pair<unsigned, llvm::Module *>> &LinkModules, 74a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar raw_pwrite_stream *OS, LLVMContext &C, 75a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CoverageSourceInfo *CoverageInfo = nullptr) 76b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar : Diags(Diags), Action(Action), CodeGenOpts(CodeGenOpts), 77b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar TargetOpts(TargetOpts), LangOpts(LangOpts), AsmOutStream(OS), 780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Context(nullptr), LLVMIRGeneration("LLVM IR Generation Time"), 79a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Gen(CreateLLVMCodeGen(Diags, InFile, HeaderSearchOpts, PPOpts, 80a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CodeGenOpts, C, CoverageInfo)) { 81b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar llvm::TimePassesIsEnabled = TimePasses; 82a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar for (auto &I : LinkModules) 83a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar this->LinkModules.push_back( 84a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar std::make_pair(I.first, std::unique_ptr<llvm::Module>(I.second))); 85445026698ca8f97ee7320464dedbe0d077b32d16Chris Lattner } 86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<llvm::Module> takeModule() { return std::move(TheModule); } 87a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void releaseLinkModules() { 88a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar for (auto &I : LinkModules) 89a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar I.second.release(); 90a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar } 91b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override { 93025039377d7247620750205dbd61ca1ba336f7e0Rafael Espindola Gen->HandleCXXStaticMemberVarInstantiation(VD); 94234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola } 95234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Initialize(ASTContext &Ctx) override { 97a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar assert(!Context && "initialized multiple times"); 98a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 997bb0da001fc579410035cec00b6bca499251a318Chris Lattner Context = &Ctx; 1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 101b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 1026f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration.startTimer(); 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1047bb0da001fc579410035cec00b6bca499251a318Chris Lattner Gen->Initialize(Ctx); 105d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 106b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar TheModule.reset(Gen->GetModule()); 1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 108b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 1096f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration.stopTimer(); 110d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar } 1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool HandleTopLevelDecl(DeclGroupRef D) override { 113682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner PrettyStackTraceDecl CrashInfo(*D.begin(), SourceLocation(), 11449f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner Context->getSourceManager(), 11549f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner "LLVM IR generation of declaration"); 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 117b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 1186f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration.startTimer(); 119682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner 120d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar Gen->HandleTopLevelDecl(D); 1216f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner 122b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 1236f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration.stopTimer(); 12488c2596edc8eb475e20f6033de1ea01669695a0cArgyrios Kyrtzidis 12588c2596edc8eb475e20f6033de1ea01669695a0cArgyrios Kyrtzidis return true; 126d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar } 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void HandleInlineMethodDefinition(CXXMethodDecl *D) override { 1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PrettyStackTraceDecl CrashInfo(D, SourceLocation(), 1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Context->getSourceManager(), 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "LLVM IR generation of inline method"); 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (llvm::TimePassesIsEnabled) 1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LLVMIRGeneration.startTimer(); 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Gen->HandleInlineMethodDefinition(D); 1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (llvm::TimePassesIsEnabled) 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LLVMIRGeneration.stopTimer(); 1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleTranslationUnit(ASTContext &C) override { 14249f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner { 14314f234ec1257b36c9d070dfb60aa5df53ec04767Chris Lattner PrettyStackTraceString CrashInfo("Per-file LLVM IR generation"); 144b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 14549f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner LLVMIRGeneration.startTimer(); 1466f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner 147dacbc5d46aaeea817742b8c76c987b87d2490c85Chris Lattner Gen->HandleTranslationUnit(C); 148d68ba0ee188d08e7a10b5f295675e0782ef4f990Daniel Dunbar 149b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 15049f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner LLVMIRGeneration.stopTimer(); 15149f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner } 1526f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner 153897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // Silently ignore if we weren't initialized for some reason. 15405a7f3ddce9a88249b05b896e70f66e9ed381743Daniel Dunbar if (!TheModule) 155897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar return; 156897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar 157897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // Make sure IR generation is happy with the module. This is released by 158897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // the module provider. 1591a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor llvm::Module *M = Gen->ReleaseModule(); 160897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar if (!M) { 161897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // The module has been released by IR gen on failures, do not double 162897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // free. 163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TheModule.release(); 164897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar return; 165897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar } 1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar assert(TheModule.get() == M && 168897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar "Unexpected module change during IR generation"); 169897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar 170897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // Install an inline asm handler so that diagnostics get printed through 171897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // our diagnostics hooks. 172897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar LLVMContext &Ctx = TheModule->getContext(); 173063e47667c583433548e3c40a3003bc1aac8cf78Chris Lattner LLVMContext::InlineAsmDiagHandlerTy OldHandler = 174063e47667c583433548e3c40a3003bc1aac8cf78Chris Lattner Ctx.getInlineAsmDiagnosticHandler(); 175897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar void *OldContext = Ctx.getInlineAsmDiagnosticContext(); 176063e47667c583433548e3c40a3003bc1aac8cf78Chris Lattner Ctx.setInlineAsmDiagnosticHandler(InlineAsmDiagHandler, this); 177897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar 178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler = 179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx.getDiagnosticHandler(); 180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void *OldDiagnosticContext = Ctx.getDiagnosticContext(); 181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx.setDiagnosticHandler(DiagnosticHandler, this); 182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 183a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Link LinkModule into this module if present, preserving its validity. 184a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar for (auto &I : LinkModules) { 185a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar unsigned LinkFlags = I.first; 186a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CurLinkModule = I.second.get(); 187a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (Linker::linkModules(*M, std::move(I.second), LinkFlags)) 188a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return; 189a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar } 190a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 191b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman EmitBackendOutput(Diags, CodeGenOpts, TargetOpts, LangOpts, 192a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar C.getTargetInfo().getDataLayoutString(), 19305a7f3ddce9a88249b05b896e70f66e9ed381743Daniel Dunbar TheModule.get(), Action, AsmOutStream); 194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 195897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar Ctx.setInlineAsmDiagnosticHandler(OldHandler, OldContext); 196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext); 198d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar } 1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleTagDeclDefinition(TagDecl *D) override { 20149f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner PrettyStackTraceDecl CrashInfo(D, SourceLocation(), 20249f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner Context->getSourceManager(), 20349f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner "LLVM IR generation of declaration"); 204d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar Gen->HandleTagDeclDefinition(D); 205d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar } 206b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor 207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleTagDeclRequiredDefinition(const TagDecl *D) override { 208658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie Gen->HandleTagDeclRequiredDefinition(D); 209658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie } 210658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie 211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void CompleteTentativeDefinition(VarDecl *D) override { 212b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor Gen->CompleteTentativeDefinition(D); 213b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor } 214f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 2150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void HandleVTable(CXXRecordDecl *RD) override { 2160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Gen->HandleVTable(RD); 2176fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 2186fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleLinkerOptionPragma(llvm::StringRef Opts) override { 2203190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner Gen->HandleLinkerOptionPragma(Opts); 2213190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner } 2223190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner 223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleDetectMismatch(llvm::StringRef Name, 224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::StringRef Value) override { 225a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman Gen->HandleDetectMismatch(Name, Value); 226a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman } 227a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman 228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void HandleDependentLibrary(llvm::StringRef Opts) override { 2293190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner Gen->HandleDependentLibrary(Opts); 2303190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner } 2313190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner 2326da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner static void InlineAsmDiagHandler(const llvm::SMDiagnostic &SM,void *Context, 2336da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner unsigned LocCookie) { 2346da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner SourceLocation Loc = SourceLocation::getFromRawEncoding(LocCookie); 2356da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner ((BackendConsumer*)Context)->InlineAsmDiagHandler2(SM, Loc); 2366da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner } 237f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static void DiagnosticHandler(const llvm::DiagnosticInfo &DI, 239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void *Context) { 240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((BackendConsumer *)Context)->DiagnosticHandlerImpl(DI); 241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2436da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner void InlineAsmDiagHandler2(const llvm::SMDiagnostic &, 2446da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner SourceLocation LocCookie); 245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void DiagnosticHandlerImpl(const llvm::DiagnosticInfo &DI); 247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Specialized handler for InlineAsm diagnostic. 248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \return True if the diagnostic has been successfully reported, false 249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// otherwise. 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool InlineAsmDiagHandler(const llvm::DiagnosticInfoInlineAsm &D); 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Specialized handler for StackSize diagnostic. 252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \return True if the diagnostic has been successfully reported, false 253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// otherwise. 254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D); 255c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// \brief Specialized handlers for optimization remarks. 256c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines /// Note that these handlers only accept remarks and they always handle 2576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// them. 258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void EmitOptimizationMessage(const llvm::DiagnosticInfoOptimizationBase &D, 259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned DiagID); 260c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void 2616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OptimizationRemarkHandler(const llvm::DiagnosticInfoOptimizationRemark &D); 262c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void OptimizationRemarkHandler( 263c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const llvm::DiagnosticInfoOptimizationRemarkMissed &D); 264c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void OptimizationRemarkHandler( 265c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const llvm::DiagnosticInfoOptimizationRemarkAnalysis &D); 266a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void OptimizationRemarkHandler( 267a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const llvm::DiagnosticInfoOptimizationRemarkAnalysisFPCommute &D); 268a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void OptimizationRemarkHandler( 269a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const llvm::DiagnosticInfoOptimizationRemarkAnalysisAliasing &D); 270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void OptimizationFailureHandler( 271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const llvm::DiagnosticInfoOptimizationFailure &D); 2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump }; 27399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 27499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie void BackendConsumer::anchor() {} 275d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar} 276d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 277d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner/// ConvertBackendLocation - Convert a location in a temporary llvm::SourceMgr 278d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner/// buffer to be a valid FullSourceLoc. 279d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattnerstatic FullSourceLoc ConvertBackendLocation(const llvm::SMDiagnostic &D, 280d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner SourceManager &CSM) { 281d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // Get both the clang and llvm source managers. The location is relative to 282d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // a memory buffer that the LLVM Source Manager is handling, we need to add 283f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar // a copy to the Clang source manager. 284d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner const llvm::SourceMgr &LSM = *D.getSourceMgr(); 285f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 286d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // We need to copy the underlying LLVM memory buffer because llvm::SourceMgr 287d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // already owns its one and clang::SourceManager wants to own its one. 288d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner const MemoryBuffer *LBuf = 289d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner LSM.getMemoryBuffer(LSM.FindBufferContainingLoc(D.getLoc())); 290f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 291d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // Create the copy and transfer ownership to clang::SourceManager. 292c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // TODO: Avoid copying files into memory. 293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<llvm::MemoryBuffer> CBuf = 294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::MemoryBuffer::getMemBufferCopy(LBuf->getBuffer(), 295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines LBuf->getBufferIdentifier()); 296c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // FIXME: Keep a file ID map instead of creating new IDs for each location. 297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FileID FID = CSM.createFileID(std::move(CBuf)); 298f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 299d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // Translate the offset into the file. 300c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines unsigned Offset = D.getLoc().getPointer() - LBuf->getBufferStart(); 301f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar SourceLocation NewLoc = 302a64ccefdf0ea4e03ec88805d71b0af74950c7472Argyrios Kyrtzidis CSM.getLocForStartOfFile(FID).getLocWithOffset(Offset); 303d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner return FullSourceLoc(NewLoc, CSM); 304d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner} 305d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner 306cabae68037bd3740ac4fb73382e04cd365457c17Chris Lattner 3076da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner/// InlineAsmDiagHandler2 - This function is invoked when the backend hits an 3086da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner/// error parsing inline asm. The SMDiagnostic indicates the error relative to 309f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar/// the temporary memory buffer that the inline asm parser has set up. 3106da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattnervoid BackendConsumer::InlineAsmDiagHandler2(const llvm::SMDiagnostic &D, 3116da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner SourceLocation LocCookie) { 3126da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner // There are a couple of different kinds of errors we could get here. First, 3136da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner // we re-format the SMDiagnostic in terms of a clang diagnostic. 3145d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis 3155d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis // Strip "error: " off the start of the message string. 3165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Message = D.getMessage(); 3175d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis if (Message.startswith("error: ")) 3185d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis Message = Message.substr(7); 3196da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner 32099e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // If the SMDiagnostic has an inline asm source location, translate it. 3216da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner FullSourceLoc Loc; 322d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner if (D.getLoc() != SMLoc()) 323d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner Loc = ConvertBackendLocation(D, Context->getSourceManager()); 3245d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis 325c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines unsigned DiagID; 326c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines switch (D.getKind()) { 327c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines case llvm::SourceMgr::DK_Error: 328c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DiagID = diag::err_fe_inline_asm; 329c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines break; 330c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines case llvm::SourceMgr::DK_Warning: 331c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DiagID = diag::warn_fe_inline_asm; 332c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines break; 333c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines case llvm::SourceMgr::DK_Note: 334c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DiagID = diag::note_fe_inline_asm; 335c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines break; 336c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 33799e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // If this problem has clang-level source location information, report the 338c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // issue in the source with a note showing the instantiated 33999e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // code. 34099e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner if (LocCookie.isValid()) { 341c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(LocCookie, DiagID).AddString(Message); 34299e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner 34396fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer if (D.getLoc().isValid()) { 34496fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer DiagnosticBuilder B = Diags.Report(Loc, diag::note_fe_inline_asm_here); 34596fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer // Convert the SMDiagnostic ranges into SourceRange and attach them 34696fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer // to the diagnostic. 347a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar for (const std::pair<unsigned, unsigned> &Range : D.getRanges()) { 34896fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer unsigned Column = D.getColumnNo(); 34996fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer B << SourceRange(Loc.getLocWithOffset(Range.first - Column), 35096fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer Loc.getLocWithOffset(Range.second - Column)); 35196fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer } 35296fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer } 35399e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner return; 35499e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner } 35599e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner 356c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Otherwise, report the backend issue as occurring in the generated .s file. 357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // If Loc is invalid, we still need to report the issue, it just gets no 35899e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // location info. 359c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(Loc, DiagID).AddString(Message); 3606da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner} 3616da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner 362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define ComputeDiagID(Severity, GroupName, DiagID) \ 363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines do { \ 364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (Severity) { \ 365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DS_Error: \ 366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagID = diag::err_fe_##GroupName; \ 367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; \ 368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DS_Warning: \ 369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagID = diag::warn_fe_##GroupName; \ 370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; \ 371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DS_Remark: \ 372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm_unreachable("'remark' severity not expected"); \ 373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; \ 374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DS_Note: \ 375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagID = diag::note_fe_##GroupName; \ 376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; \ 377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } \ 378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } while (false) 379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define ComputeDiagRemarkID(Severity, GroupName, DiagID) \ 381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines do { \ 382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (Severity) { \ 383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DS_Error: \ 384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagID = diag::err_fe_##GroupName; \ 385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; \ 386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DS_Warning: \ 387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagID = diag::warn_fe_##GroupName; \ 388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; \ 389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DS_Remark: \ 390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagID = diag::remark_fe_##GroupName; \ 391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; \ 392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DS_Note: \ 393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagID = diag::note_fe_##GroupName; \ 394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; \ 395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } \ 396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } while (false) 397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool 399651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesBackendConsumer::InlineAsmDiagHandler(const llvm::DiagnosticInfoInlineAsm &D) { 400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned DiagID; 401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ComputeDiagID(D.getSeverity(), inline_asm, DiagID); 402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string Message = D.getMsgStr().str(); 403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If this problem has clang-level source location information, report the 405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // issue as being a problem in the source with a note showing the instantiated 406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // code. 407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation LocCookie = 408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation::getFromRawEncoding(D.getLocCookie()); 409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (LocCookie.isValid()) 410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diags.Report(LocCookie, DiagID).AddString(Message); 411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else { 412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Otherwise, report the backend diagnostic as occurring in the generated 413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // .s file. 414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If Loc is invalid, we still need to report the diagnostic, it just gets 415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // no location info. 416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FullSourceLoc Loc; 417651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diags.Report(Loc, DiagID).AddString(Message); 418651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We handled all the possible severities. 420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool 424651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesBackendConsumer::StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D) { 425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D.getSeverity() != llvm::DS_Warning) 426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // For now, the only support we have for StackSize diagnostic is warning. 427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We do not know how to format other severities. 428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 429651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 430c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (const Decl *ND = Gen->GetDeclForMangledName(D.getFunction().getName())) { 431c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(ND->getASTContext().getFullLoc(ND->getLocation()), 432c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines diag::warn_fe_frame_larger_than) 433c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << D.getStackSize() << Decl::castToDeclContext(ND); 434c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return true; 435c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 436c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 437c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return false; 438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid BackendConsumer::EmitOptimizationMessage( 441176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const llvm::DiagnosticInfoOptimizationBase &D, unsigned DiagID) { 442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // We only support warnings and remarks. 443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(D.getSeverity() == llvm::DS_Remark || 444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines D.getSeverity() == llvm::DS_Warning); 4456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 446c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceManager &SourceMgr = Context->getSourceManager(); 447c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FileManager &FileMgr = SourceMgr.getFileManager(); 448c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines StringRef Filename; 449c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines unsigned Line, Column; 450c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation DILoc; 451b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 452b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (D.isLocationAvailable()) { 453b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar D.getLocation(&Filename, &Line, &Column); 454b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const FileEntry *FE = FileMgr.getFile(Filename); 455b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FE && Line > 0) { 456b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // If -gcolumn-info was not used, Column will be 0. This upsets the 457b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // source manager, so pass 1 if Column is not set. 458b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1); 459b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 461c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 462c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // If a location isn't available, try to approximate it using the associated 463c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // function definition. We use the definition's right brace to differentiate 464c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // from diagnostics that genuinely relate to the function itself. 465c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FullSourceLoc Loc(DILoc, SourceMgr); 466c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (Loc.isInvalid()) 467c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (const Decl *FD = Gen->GetDeclForMangledName(D.getFunction().getName())) 468c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Loc = FD->getASTContext().getFullLoc(FD->getBodyRBrace()); 469c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 470176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.Report(Loc, DiagID) 471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << AddFlagValue(D.getPassName() ? D.getPassName() : "") 472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << D.getMsg().str(); 473c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 474b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (DILoc.isInvalid() && D.isLocationAvailable()) 475c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // If we were not able to translate the file:line:col information 476c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // back to a SourceLocation, at least emit a note stating that 477c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // we could not translate this location. This can happen in the 478c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // case of #line directives. 479c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(Loc, diag::note_fe_backend_optimization_remark_invalid_loc) 480c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << Filename << Line << Column; 481c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 482c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 483c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid BackendConsumer::OptimizationRemarkHandler( 484c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const llvm::DiagnosticInfoOptimizationRemark &D) { 485c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Optimization remarks are active only if the -Rpass flag has a regular 486c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // expression that matches the name of the pass name in \p D. 487c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (CodeGenOpts.OptimizationRemarkPattern && 488c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CodeGenOpts.OptimizationRemarkPattern->match(D.getPassName())) 489176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EmitOptimizationMessage(D, diag::remark_fe_backend_optimization_remark); 490c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 491c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 492c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid BackendConsumer::OptimizationRemarkHandler( 493c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const llvm::DiagnosticInfoOptimizationRemarkMissed &D) { 494c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Missed optimization remarks are active only if the -Rpass-missed 495c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // flag has a regular expression that matches the name of the pass 496c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // name in \p D. 497c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (CodeGenOpts.OptimizationRemarkMissedPattern && 498c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines CodeGenOpts.OptimizationRemarkMissedPattern->match(D.getPassName())) 499176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EmitOptimizationMessage(D, 500176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diag::remark_fe_backend_optimization_remark_missed); 501c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 502c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 503c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid BackendConsumer::OptimizationRemarkHandler( 504c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const llvm::DiagnosticInfoOptimizationRemarkAnalysis &D) { 505a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Optimization analysis remarks are active if the pass name is set to 506a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // llvm::DiagnosticInfo::AlwasyPrint or if the -Rpass-analysis flag has a 507a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // regular expression that matches the name of the pass name in \p D. 508a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 509a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (D.getPassName() == llvm::DiagnosticInfo::AlwaysPrint || 510a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar (CodeGenOpts.OptimizationRemarkAnalysisPattern && 511a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName()))) 512176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines EmitOptimizationMessage( 513c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines D, diag::remark_fe_backend_optimization_remark_analysis); 5146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 5156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 516a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid BackendConsumer::OptimizationRemarkHandler( 517a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const llvm::DiagnosticInfoOptimizationRemarkAnalysisFPCommute &D) { 518a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Optimization analysis remarks are active if the pass name is set to 519a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // llvm::DiagnosticInfo::AlwasyPrint or if the -Rpass-analysis flag has a 520a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // regular expression that matches the name of the pass name in \p D. 521a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 522a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (D.getPassName() == llvm::DiagnosticInfo::AlwaysPrint || 523a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar (CodeGenOpts.OptimizationRemarkAnalysisPattern && 524a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName()))) 525a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar EmitOptimizationMessage( 526a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar D, diag::remark_fe_backend_optimization_remark_analysis_fpcommute); 527176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 529a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid BackendConsumer::OptimizationRemarkHandler( 530a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const llvm::DiagnosticInfoOptimizationRemarkAnalysisAliasing &D) { 531a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Optimization analysis remarks are active if the pass name is set to 532a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // llvm::DiagnosticInfo::AlwasyPrint or if the -Rpass-analysis flag has a 533a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // regular expression that matches the name of the pass name in \p D. 534a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 535a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (D.getPassName() == llvm::DiagnosticInfo::AlwaysPrint || 536a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar (CodeGenOpts.OptimizationRemarkAnalysisPattern && 537a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CodeGenOpts.OptimizationRemarkAnalysisPattern->match(D.getPassName()))) 538a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar EmitOptimizationMessage( 539a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar D, diag::remark_fe_backend_optimization_remark_analysis_aliasing); 540a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar} 541176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 542a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid BackendConsumer::OptimizationFailureHandler( 543a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const llvm::DiagnosticInfoOptimizationFailure &D) { 544a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar EmitOptimizationMessage(D, diag::warn_fe_backend_optimization_failure); 545176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 546176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief This function is invoked when the backend needs 548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// to report something to the user. 549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid BackendConsumer::DiagnosticHandlerImpl(const DiagnosticInfo &DI) { 550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned DiagID = diag::err_fe_inline_asm; 551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::DiagnosticSeverity Severity = DI.getSeverity(); 552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Get the diagnostic ID based. 553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (DI.getKind()) { 554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DK_InlineAsm: 555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (InlineAsmDiagHandler(cast<DiagnosticInfoInlineAsm>(DI))) 556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ComputeDiagID(Severity, inline_asm, DiagID); 558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::DK_StackSize: 560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (StackSizeDiagHandler(cast<DiagnosticInfoStackSize>(DI))) 561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ComputeDiagID(Severity, backend_frame_larger_than, DiagID); 563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 564a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar case DK_Linker: 565a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar assert(CurLinkModule); 566a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // FIXME: stop eating the warnings and notes. 567a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (Severity != DS_Error) 568a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return; 569a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar DiagID = diag::err_fe_cannot_link_module; 570a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar break; 5716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::DK_OptimizationRemark: 5726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Optimization remarks are always handled completely by this 5736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // handler. There is no generic way of emitting them. 5746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OptimizationRemarkHandler(cast<DiagnosticInfoOptimizationRemark>(DI)); 5756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 576c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines case llvm::DK_OptimizationRemarkMissed: 577c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Optimization remarks are always handled completely by this 578c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // handler. There is no generic way of emitting them. 579c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines OptimizationRemarkHandler(cast<DiagnosticInfoOptimizationRemarkMissed>(DI)); 580c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return; 581c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines case llvm::DK_OptimizationRemarkAnalysis: 582c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Optimization remarks are always handled completely by this 583c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // handler. There is no generic way of emitting them. 584c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines OptimizationRemarkHandler( 585c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines cast<DiagnosticInfoOptimizationRemarkAnalysis>(DI)); 586c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return; 587a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar case llvm::DK_OptimizationRemarkAnalysisFPCommute: 588a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Optimization remarks are always handled completely by this 589a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // handler. There is no generic way of emitting them. 590a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar OptimizationRemarkHandler( 591a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar cast<DiagnosticInfoOptimizationRemarkAnalysisFPCommute>(DI)); 592a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return; 593a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar case llvm::DK_OptimizationRemarkAnalysisAliasing: 594a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Optimization remarks are always handled completely by this 595a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // handler. There is no generic way of emitting them. 596a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar OptimizationRemarkHandler( 597a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar cast<DiagnosticInfoOptimizationRemarkAnalysisAliasing>(DI)); 598a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return; 599176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case llvm::DK_OptimizationFailure: 600176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Optimization failures are always handled completely by this 601176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // handler. 602176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OptimizationFailureHandler(cast<DiagnosticInfoOptimizationFailure>(DI)); 603176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines default: 605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Plugin IDs are not bound to any value as they are set dynamically. 606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ComputeDiagRemarkID(Severity, backend_plugin, DiagID); 607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string MsgStorage; 610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines { 611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines raw_string_ostream Stream(MsgStorage); 612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticPrinterRawOStream DP(Stream); 613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DI.print(DP); 614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 616a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (DiagID == diag::err_fe_cannot_link_module) { 617a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Diags.Report(diag::err_fe_cannot_link_module) 618a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar << CurLinkModule->getModuleIdentifier() << MsgStorage; 619a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return; 620a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar } 621a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Report the backend message using the usual diagnostic mechanism. 623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FullSourceLoc Loc; 624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diags.Report(Loc, DiagID).AddString(MsgStorage); 625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#undef ComputeDiagID 6274ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 6284b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneCodeGenAction::CodeGenAction(unsigned _Act, LLVMContext *_VMContext) 629a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar : Act(_Act), VMContext(_VMContext ? _VMContext : new LLVMContext), 630a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar OwnsVMContext(!_VMContext) {} 6314b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 6324b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneCodeGenAction::~CodeGenAction() { 6334b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne TheModule.reset(); 6344b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne if (OwnsVMContext) 6354b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne delete VMContext; 6364b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne} 6379ad1c0205ec478d64b3ed6d3dde5efaa9c9932c5Daniel Dunbar 6384cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbarbool CodeGenAction::hasIRSupport() const { return true; } 6394cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 640b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbarvoid CodeGenAction::EndSourceFileAction() { 641b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar // If the consumer creation failed, do nothing. 642b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar if (!getCompilerInstance().hasASTConsumer()) 643b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar return; 644b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar 645a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Take back ownership of link modules we passed to consumer. 646a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (!LinkModules.empty()) 647a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar BEConsumer->releaseLinkModules(); 64822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 649b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar // Steal the module from the consumer. 650176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TheModule = BEConsumer->takeModule(); 651b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar} 652b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar 653176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstd::unique_ptr<llvm::Module> CodeGenAction::takeModule() { 654176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return std::move(TheModule); 655176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 656b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar 6574b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbournellvm::LLVMContext *CodeGenAction::takeLLVMContext() { 6584b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne OwnsVMContext = false; 6594b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne return VMContext; 6604b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne} 6614b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 66258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic raw_pwrite_stream * 66358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarGetOutputStream(CompilerInstance &CI, StringRef InFile, BackendAction Action) { 6644cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar switch (Action) { 6654ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitAssembly: 6664cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return CI.createDefaultOutputFile(false, InFile, "s"); 6674ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitLL: 6684cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return CI.createDefaultOutputFile(false, InFile, "ll"); 6694ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitBC: 6704cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return CI.createDefaultOutputFile(true, InFile, "bc"); 6714ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitNothing: 6726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 67332148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar case Backend_EmitMCNull: 674c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return CI.createNullOutputFile(); 6754ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitObj: 6764cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return CI.createDefaultOutputFile(true, InFile, "o"); 6774ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar } 6784cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 679b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid action!"); 6804cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar} 6814cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 682176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstd::unique_ptr<ASTConsumer> 683176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesCodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { 6844cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar BackendAction BA = static_cast<BackendAction>(Act); 685b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar raw_pwrite_stream *OS = GetOutputStream(CI, InFile, BA); 6864ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar if (BA != Backend_EmitNothing && !OS) 6876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 6884ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 689a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Load bitcode modules to link with, if we need to. 690a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (LinkModules.empty()) 691a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar for (auto &I : CI.getCodeGenOpts().LinkBitcodeFiles) { 692a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const std::string &LinkBCFile = I.second; 693a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 694a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar auto BCBuf = CI.getFileManager().getBufferForFile(LinkBCFile); 695a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (!BCBuf) { 696a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CI.getDiagnostics().Report(diag::err_cannot_open_file) 697a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar << LinkBCFile << BCBuf.getError().message(); 698a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar LinkModules.clear(); 699a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return nullptr; 700a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar } 70122a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 702a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar ErrorOr<std::unique_ptr<llvm::Module>> ModuleOrErr = 703a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar getLazyBitcodeModule(std::move(*BCBuf), *VMContext); 704a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (std::error_code EC = ModuleOrErr.getError()) { 705a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CI.getDiagnostics().Report(diag::err_cannot_open_file) << LinkBCFile 706a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar << EC.message(); 707a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar LinkModules.clear(); 708a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return nullptr; 709a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar } 710a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar addLinkModule(ModuleOrErr.get().release(), I.first); 71122a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne } 71222a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CoverageSourceInfo *CoverageInfo = nullptr; 714176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Add the preprocessor callback only when the coverage mapping is generated. 715176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (CI.getCodeGenOpts().CoverageMapping) { 716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CoverageInfo = new CoverageSourceInfo; 717176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CI.getPreprocessor().addPPCallbacks( 718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<PPCallbacks>(CoverageInfo)); 719176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 720a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<BackendConsumer> Result(new BackendConsumer( 722a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar BA, CI.getDiagnostics(), CI.getHeaderSearchOpts(), 723a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CI.getPreprocessorOpts(), CI.getCodeGenOpts(), CI.getTargetOpts(), 724a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CI.getLangOpts(), CI.getFrontendOpts().ShowTimers, InFile, LinkModules, 725a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar OS, *VMContext, CoverageInfo)); 726176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines BEConsumer = Result.get(); 727176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return std::move(Result); 728d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar} 7294ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 7300e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic void BitcodeInlineAsmDiagHandler(const llvm::SMDiagnostic &SM, 7310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void *Context, 7320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines unsigned LocCookie) { 7330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SM.print(nullptr, llvm::errs()); 7340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 7350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7364cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbarvoid CodeGenAction::ExecuteAction() { 7374cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar // If this is an IR file, we have to treat it specially. 7384cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (getCurrentFileKind() == IK_LLVM_IR) { 7394cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar BackendAction BA = static_cast<BackendAction>(Act); 7404cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar CompilerInstance &CI = getCompilerInstance(); 74158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar raw_pwrite_stream *OS = GetOutputStream(CI, getCurrentFile(), BA); 7424cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (BA != Backend_EmitNothing && !OS) 7434cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return; 7444cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 7454cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar bool Invalid; 7464cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar SourceManager &SM = CI.getSourceManager(); 747c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FileID FID = SM.getMainFileID(); 748c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::MemoryBuffer *MainFile = SM.getBuffer(FID, &Invalid); 7494cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (Invalid) 7504cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return; 7514cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 7524cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar llvm::SMDiagnostic Err; 753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TheModule = parseIR(MainFile->getMemBufferRef(), Err, *VMContext); 7544cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (!TheModule) { 755c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Translate from the diagnostic info to the SourceManager location if 756c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // available. 757c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // TODO: Unify this with ConvertBackendLocation() 758c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation Loc; 759c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (Err.getLineNo() > 0) { 760c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines assert(Err.getColumnNo() >= 0); 761c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Loc = SM.translateFileLineCol(SM.getFileEntryForID(FID), 762c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Err.getLineNo(), Err.getColumnNo() + 1); 763c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 7644cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Strip off a leading diagnostic code if there is one. 7665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Msg = Err.getMessage(); 7674cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (Msg.startswith("error: ")) 7684cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar Msg = Msg.substr(7); 769c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer 770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned DiagID = 771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CI.getDiagnostics().getCustomDiagID(DiagnosticsEngine::Error, "%0"); 772c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer 773651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CI.getDiagnostics().Report(Loc, DiagID) << Msg; 774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 775651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 776651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const TargetOptions &TargetOpts = CI.getTargetOpts(); 777651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TheModule->getTargetTriple() != TargetOpts.Triple) { 7780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CI.getDiagnostics().Report(SourceLocation(), 7790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines diag::warn_fe_override_module) 7800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines << TargetOpts.Triple; 781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TheModule->setTargetTriple(TargetOpts.Triple); 7824cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar } 7834cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 784a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar auto DiagHandler = [&](const DiagnosticInfo &DI) { 785a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar TheModule->getContext().diagnose(DI); 786a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar }; 787a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 788a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // If we are performing ThinLTO importing compilation (indicated by 789a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // a non-empty index file option), then we need promote to global scope 790a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // and rename any local values that are potentially exported to other 791a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // modules. Do this early so that the rest of the compilation sees the 792a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // promoted symbols. 793a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar std::unique_ptr<FunctionInfoIndex> Index; 794a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (!CI.getCodeGenOpts().ThinLTOIndexFile.empty()) { 795a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar ErrorOr<std::unique_ptr<FunctionInfoIndex>> IndexOrErr = 796a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar llvm::getFunctionIndexForFile(CI.getCodeGenOpts().ThinLTOIndexFile, 797a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar DiagHandler); 798a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (std::error_code EC = IndexOrErr.getError()) { 799a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar std::string Error = EC.message(); 800a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar errs() << "Error loading index file '" 801a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar << CI.getCodeGenOpts().ThinLTOIndexFile << "': " << Error 802a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar << "\n"; 803a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return; 804a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar } 805a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Index = std::move(IndexOrErr.get()); 806a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar assert(Index); 807a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // Currently this requires creating a new Module object. 808a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar std::unique_ptr<llvm::Module> RenamedModule = 809a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar renameModuleForThinLTO(std::move(TheModule), Index.get()); 810a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar if (!RenamedModule) 811a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar return; 812a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 813a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar TheModule = std::move(RenamedModule); 814a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar } 815a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 8160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines LLVMContext &Ctx = TheModule->getContext(); 8170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Ctx.setInlineAsmDiagnosticHandler(BitcodeInlineAsmDiagHandler); 818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EmitBackendOutput(CI.getDiagnostics(), CI.getCodeGenOpts(), TargetOpts, 819a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar CI.getLangOpts(), CI.getTarget().getDataLayoutString(), 820a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar TheModule.get(), BA, OS, std::move(Index)); 8214cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return; 8224cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar } 8234cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 8244cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar // Otherwise follow the normal AST path. 8254cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar this->ASTFrontendAction::ExecuteAction(); 8264cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar} 8274cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 8284cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar// 8294cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 83099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitAssemblyAction::anchor() { } 8314b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitAssemblyAction::EmitAssemblyAction(llvm::LLVMContext *_VMContext) 8324b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitAssembly, _VMContext) {} 8334ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 83499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitBCAction::anchor() { } 8354b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitBCAction::EmitBCAction(llvm::LLVMContext *_VMContext) 8364b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitBC, _VMContext) {} 8374ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 83899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitLLVMAction::anchor() { } 8394b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitLLVMAction::EmitLLVMAction(llvm::LLVMContext *_VMContext) 8404b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitLL, _VMContext) {} 8414ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 84299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitLLVMOnlyAction::anchor() { } 8434b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitLLVMOnlyAction::EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext) 8444b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitNothing, _VMContext) {} 8454ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 84699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitCodeGenOnlyAction::anchor() { } 8474b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitCodeGenOnlyAction::EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext) 8484b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitMCNull, _VMContext) {} 84932148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar 85099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitObjAction::anchor() { } 8514b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitObjAction::EmitObjAction(llvm::LLVMContext *_VMContext) 8524b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitObj, _VMContext) {} 853