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 109b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar#include "clang/CodeGen/CodeGenAction.h" 11d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar#include "clang/AST/ASTConsumer.h" 12d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar#include "clang/AST/ASTContext.h" 13682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner#include "clang/AST/DeclGroup.h" 1455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/FileManager.h" 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/SourceManager.h" 1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/TargetInfo.h" 179b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar#include "clang/CodeGen/BackendUtil.h" 18d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar#include "clang/CodeGen/ModuleBuilder.h" 194ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar#include "clang/Frontend/CompilerInstance.h" 203be0d19503f8291b1581a39a8f6ca01d74bf5cb1Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/OwningPtr.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/SmallString.h" 2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Bitcode/ReaderWriter.h" 243b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/LLVMContext.h" 253b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Module.h" 269cc935b6993460956d0d46ee268e9858743d5129Chandler Carruth#include "llvm/IRReader/IRReader.h" 2722a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne#include "llvm/Linker.h" 2805a7f3ddce9a88249b05b896e70f66e9ed381743Daniel Dunbar#include "llvm/Pass.h" 296da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner#include "llvm/Support/MemoryBuffer.h" 306da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner#include "llvm/Support/SourceMgr.h" 316f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner#include "llvm/Support/Timer.h" 32d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbarusing namespace clang; 33d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbarusing namespace llvm; 34d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 355aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Webernamespace clang { 36bd21828179a61bd0954b082825cfb8a93345f602Benjamin Kramer class BackendConsumer : public ASTConsumer { 3799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 38d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags; 39d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar BackendAction Action; 403636e1d784aedb37052aa235966e4fdbe7ed9082Daniel Dunbar const CodeGenOptions &CodeGenOpts; 413636e1d784aedb37052aa235966e4fdbe7ed9082Daniel Dunbar const TargetOptions &TargetOpts; 42b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman const LangOptions &LangOpts; 435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream *AsmOutStream; 4449f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner ASTContext *Context; 4590f41303c60195a3c1109c02cf3455d21894e387Daniel Dunbar 466f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner Timer LLVMIRGeneration; 471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 486f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<CodeGenerator> Gen; 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 506f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<llvm::Module> TheModule, LinkModule; 51d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump public: 53d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie BackendConsumer(BackendAction action, DiagnosticsEngine &_Diags, 546b0cf67ae72a9ebb90e94cc9a14e09364a2b3466Daniel Dunbar const CodeGenOptions &compopts, 55b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman const TargetOptions &targetopts, 56b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman const LangOptions &langopts, 57b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman bool TimePasses, 5822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne const std::string &infile, 5922a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne llvm::Module *LinkModule, 6022a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne raw_ostream *OS, 61cabae68037bd3740ac4fb73382e04cd365457c17Chris Lattner LLVMContext &C) : 623be0d19503f8291b1581a39a8f6ca01d74bf5cb1Daniel Dunbar Diags(_Diags), 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Action(action), 642811ccf48d6d898c42cc4cfad37abedb36236d20Chandler Carruth CodeGenOpts(compopts), 65d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar TargetOpts(targetopts), 66b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman LangOpts(langopts), 6703eacc746c90b7cfa8d8cd992c67f5c2659d4822Chris Lattner AsmOutStream(OS), 68c7be10245e78bf38694b26f289880edefb9f16e9Douglas Gregor Context(), 696f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration("LLVM IR Generation Time"), 70e1092dfee2bbcc2243421c553bca488880324280Bill Wendling Gen(CreateLLVMCodeGen(Diags, infile, compopts, targetopts, C)), 71c7be10245e78bf38694b26f289880edefb9f16e9Douglas Gregor LinkModule(LinkModule) 72c7be10245e78bf38694b26f289880edefb9f16e9Douglas Gregor { 73b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar llvm::TimePassesIsEnabled = TimePasses; 74445026698ca8f97ee7320464dedbe0d077b32d16Chris Lattner } 75d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 76b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar llvm::Module *takeModule() { return TheModule.take(); } 7722a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne llvm::Module *takeLinkModule() { return LinkModule.take(); } 78b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar 79025039377d7247620750205dbd61ca1ba336f7e0Rafael Espindola virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 80025039377d7247620750205dbd61ca1ba336f7e0Rafael Espindola Gen->HandleCXXStaticMemberVarInstantiation(VD); 81234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola } 82234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola 837bb0da001fc579410035cec00b6bca499251a318Chris Lattner virtual void Initialize(ASTContext &Ctx) { 847bb0da001fc579410035cec00b6bca499251a318Chris Lattner Context = &Ctx; 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 86b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 876f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration.startTimer(); 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 897bb0da001fc579410035cec00b6bca499251a318Chris Lattner Gen->Initialize(Ctx); 90d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 91b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar TheModule.reset(Gen->GetModule()); 921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 93b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 946f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration.stopTimer(); 95d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar } 961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9788c2596edc8eb475e20f6033de1ea01669695a0cArgyrios Kyrtzidis virtual bool HandleTopLevelDecl(DeclGroupRef D) { 98682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner PrettyStackTraceDecl CrashInfo(*D.begin(), SourceLocation(), 9949f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner Context->getSourceManager(), 10049f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner "LLVM IR generation of declaration"); 1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 102b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 1036f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration.startTimer(); 104682bf92db408a6cbc3d37b5496a99b6ef85041ecChris Lattner 105d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar Gen->HandleTopLevelDecl(D); 1066f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner 107b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 1086f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner LLVMIRGeneration.stopTimer(); 10988c2596edc8eb475e20f6033de1ea01669695a0cArgyrios Kyrtzidis 11088c2596edc8eb475e20f6033de1ea01669695a0cArgyrios Kyrtzidis return true; 111d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar } 1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 113dacbc5d46aaeea817742b8c76c987b87d2490c85Chris Lattner virtual void HandleTranslationUnit(ASTContext &C) { 11449f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner { 11514f234ec1257b36c9d070dfb60aa5df53ec04767Chris Lattner PrettyStackTraceString CrashInfo("Per-file LLVM IR generation"); 116b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 11749f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner LLVMIRGeneration.startTimer(); 1186f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner 119dacbc5d46aaeea817742b8c76c987b87d2490c85Chris Lattner Gen->HandleTranslationUnit(C); 120d68ba0ee188d08e7a10b5f295675e0782ef4f990Daniel Dunbar 121b33fbaa5f14452b6dc2442e89266acb0810616fdDaniel Dunbar if (llvm::TimePassesIsEnabled) 12249f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner LLVMIRGeneration.stopTimer(); 12349f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner } 1246f114eb1d67d9800e2b007a90ff6ad4ba41fd19dChris Lattner 125897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // Silently ignore if we weren't initialized for some reason. 12605a7f3ddce9a88249b05b896e70f66e9ed381743Daniel Dunbar if (!TheModule) 127897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar return; 128897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar 129897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // Make sure IR generation is happy with the module. This is released by 130897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // the module provider. 1311a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor llvm::Module *M = Gen->ReleaseModule(); 132897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar if (!M) { 133897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // The module has been released by IR gen on failures, do not double 134897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // free. 135897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar TheModule.take(); 136897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar return; 137897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar } 1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 139897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar assert(TheModule.get() == M && 140897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar "Unexpected module change during IR generation"); 141897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar 14222a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne // Link LinkModule into this module if present, preserving its validity. 14322a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne if (LinkModule) { 14422a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne std::string ErrorMsg; 14522a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne if (Linker::LinkModules(M, LinkModule.get(), Linker::PreserveSource, 14622a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne &ErrorMsg)) { 14722a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne Diags.Report(diag::err_fe_cannot_link_module) 14822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne << LinkModule->getModuleIdentifier() << ErrorMsg; 14922a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne return; 15022a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne } 15122a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne } 15222a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 153897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // Install an inline asm handler so that diagnostics get printed through 154897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar // our diagnostics hooks. 155897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar LLVMContext &Ctx = TheModule->getContext(); 156063e47667c583433548e3c40a3003bc1aac8cf78Chris Lattner LLVMContext::InlineAsmDiagHandlerTy OldHandler = 157063e47667c583433548e3c40a3003bc1aac8cf78Chris Lattner Ctx.getInlineAsmDiagnosticHandler(); 158897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar void *OldContext = Ctx.getInlineAsmDiagnosticContext(); 159063e47667c583433548e3c40a3003bc1aac8cf78Chris Lattner Ctx.setInlineAsmDiagnosticHandler(InlineAsmDiagHandler, this); 160897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar 161b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman EmitBackendOutput(Diags, CodeGenOpts, TargetOpts, LangOpts, 16205a7f3ddce9a88249b05b896e70f66e9ed381743Daniel Dunbar TheModule.get(), Action, AsmOutStream); 163897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar 164897c6768db8e09c692009280d9f1d71fb17023bfDaniel Dunbar Ctx.setInlineAsmDiagnosticHandler(OldHandler, OldContext); 165d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar } 1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 167d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar virtual void HandleTagDeclDefinition(TagDecl *D) { 16849f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner PrettyStackTraceDecl CrashInfo(D, SourceLocation(), 16949f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner Context->getSourceManager(), 17049f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner "LLVM IR generation of declaration"); 171d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar Gen->HandleTagDeclDefinition(D); 172d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar } 173b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor 174658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie virtual void HandleTagDeclRequiredDefinition(const TagDecl *D) { 175658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie Gen->HandleTagDeclRequiredDefinition(D); 176658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie } 177658cd2c287b1a0b419f51cd18e5a48d4560d1c56David Blaikie 178b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor virtual void CompleteTentativeDefinition(VarDecl *D) { 179b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor Gen->CompleteTentativeDefinition(D); 180b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor } 181f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 1826fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor virtual void HandleVTable(CXXRecordDecl *RD, bool DefinitionRequired) { 1836fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor Gen->HandleVTable(RD, DefinitionRequired); 1846fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 1856fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 1863190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner virtual void HandleLinkerOptionPragma(llvm::StringRef Opts) { 1873190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner Gen->HandleLinkerOptionPragma(Opts); 1883190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner } 1893190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner 190a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman virtual void HandleDetectMismatch(llvm::StringRef Name, 191a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman llvm::StringRef Value) { 192a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman Gen->HandleDetectMismatch(Name, Value); 193a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman } 194a7ff62f9443efa3b13a28a1e566d4625b15b8553Aaron Ballman 1953190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner virtual void HandleDependentLibrary(llvm::StringRef Opts) { 1963190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner Gen->HandleDependentLibrary(Opts); 1973190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner } 1983190ca922d3743137e15fe0c525c04b177b9983bReid Kleckner 1996da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner static void InlineAsmDiagHandler(const llvm::SMDiagnostic &SM,void *Context, 2006da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner unsigned LocCookie) { 2016da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner SourceLocation Loc = SourceLocation::getFromRawEncoding(LocCookie); 2026da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner ((BackendConsumer*)Context)->InlineAsmDiagHandler2(SM, Loc); 2036da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner } 204f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 2056da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner void InlineAsmDiagHandler2(const llvm::SMDiagnostic &, 2066da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner SourceLocation LocCookie); 2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump }; 20899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 20999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie void BackendConsumer::anchor() {} 210d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar} 211d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar 212d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner/// ConvertBackendLocation - Convert a location in a temporary llvm::SourceMgr 213d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner/// buffer to be a valid FullSourceLoc. 214d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattnerstatic FullSourceLoc ConvertBackendLocation(const llvm::SMDiagnostic &D, 215d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner SourceManager &CSM) { 216d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // Get both the clang and llvm source managers. The location is relative to 217d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // a memory buffer that the LLVM Source Manager is handling, we need to add 218f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar // a copy to the Clang source manager. 219d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner const llvm::SourceMgr &LSM = *D.getSourceMgr(); 220f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 221d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // We need to copy the underlying LLVM memory buffer because llvm::SourceMgr 222d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // already owns its one and clang::SourceManager wants to own its one. 223d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner const MemoryBuffer *LBuf = 224d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner LSM.getMemoryBuffer(LSM.FindBufferContainingLoc(D.getLoc())); 225f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 226d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // Create the copy and transfer ownership to clang::SourceManager. 227d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner llvm::MemoryBuffer *CBuf = 228d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner llvm::MemoryBuffer::getMemBufferCopy(LBuf->getBuffer(), 229d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner LBuf->getBufferIdentifier()); 230d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner FileID FID = CSM.createFileIDForMemBuffer(CBuf); 231f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar 232d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner // Translate the offset into the file. 233d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner unsigned Offset = D.getLoc().getPointer() - LBuf->getBufferStart(); 234f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar SourceLocation NewLoc = 235a64ccefdf0ea4e03ec88805d71b0af74950c7472Argyrios Kyrtzidis CSM.getLocForStartOfFile(FID).getLocWithOffset(Offset); 236d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner return FullSourceLoc(NewLoc, CSM); 237d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner} 238d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner 239cabae68037bd3740ac4fb73382e04cd365457c17Chris Lattner 2406da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner/// InlineAsmDiagHandler2 - This function is invoked when the backend hits an 2416da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner/// error parsing inline asm. The SMDiagnostic indicates the error relative to 242f80cb75376f2a814adf37c3afeaba0f6b553ac9dDaniel Dunbar/// the temporary memory buffer that the inline asm parser has set up. 2436da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattnervoid BackendConsumer::InlineAsmDiagHandler2(const llvm::SMDiagnostic &D, 2446da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner SourceLocation LocCookie) { 2456da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner // There are a couple of different kinds of errors we could get here. First, 2466da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner // we re-format the SMDiagnostic in terms of a clang diagnostic. 2475d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis 2485d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis // Strip "error: " off the start of the message string. 2495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Message = D.getMessage(); 2505d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis if (Message.startswith("error: ")) 2515d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis Message = Message.substr(7); 2526da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner 25399e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // If the SMDiagnostic has an inline asm source location, translate it. 2546da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner FullSourceLoc Loc; 255d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner if (D.getLoc() != SMLoc()) 256d6f1906ffaf38285328facd1b6f043eeee991247Chris Lattner Loc = ConvertBackendLocation(D, Context->getSourceManager()); 257ff8f9ec8336c62b5e3504e2a394f4b25c0cb1963Chris Lattner 2585d3a4bb13dfad72c89df09bce70351175ecd19dcArgyrios Kyrtzidis 25999e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // If this problem has clang-level source location information, report the 26099e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // issue as being an error in the source with a note showing the instantiated 26199e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // code. 26299e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner if (LocCookie.isValid()) { 26333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diags.Report(LocCookie, diag::err_fe_inline_asm).AddString(Message); 26499e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner 26596fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer if (D.getLoc().isValid()) { 26696fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer DiagnosticBuilder B = Diags.Report(Loc, diag::note_fe_inline_asm_here); 26796fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer // Convert the SMDiagnostic ranges into SourceRange and attach them 26896fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer // to the diagnostic. 26996fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer for (unsigned i = 0, e = D.getRanges().size(); i != e; ++i) { 27096fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer std::pair<unsigned, unsigned> Range = D.getRanges()[i]; 27196fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer unsigned Column = D.getColumnNo(); 27296fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer B << SourceRange(Loc.getLocWithOffset(Range.first - Column), 27396fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer Loc.getLocWithOffset(Range.second - Column)); 27496fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer } 27596fda0c4a7bb5502d82791f361997471c173b909Benjamin Kramer } 27699e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner return; 27799e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner } 27899e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner 279fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // Otherwise, report the backend error as occurring in the generated .s file. 28099e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // If Loc is invalid, we still need to report the error, it just gets no 28199e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner // location info. 28299e14a04887570b11df90daf2e8a7adf84599b01Chris Lattner Diags.Report(Loc, diag::err_fe_inline_asm).AddString(Message); 2836da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner} 2846da9eb661616ffd702deeb37e6872dd2294c8fefChris Lattner 2854ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar// 2864ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 2874b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneCodeGenAction::CodeGenAction(unsigned _Act, LLVMContext *_VMContext) 28822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne : Act(_Act), LinkModule(0), 28922a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne VMContext(_VMContext ? _VMContext : new LLVMContext), 2904b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne OwnsVMContext(!_VMContext) {} 2914b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 2924b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneCodeGenAction::~CodeGenAction() { 2934b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne TheModule.reset(); 2944b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne if (OwnsVMContext) 2954b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne delete VMContext; 2964b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne} 2979ad1c0205ec478d64b3ed6d3dde5efaa9c9932c5Daniel Dunbar 2984cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbarbool CodeGenAction::hasIRSupport() const { return true; } 2994cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 300b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbarvoid CodeGenAction::EndSourceFileAction() { 301b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar // If the consumer creation failed, do nothing. 302b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar if (!getCompilerInstance().hasASTConsumer()) 303b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar return; 304b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar 30522a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne // If we were given a link module, release consumer's ownership of it. 30622a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne if (LinkModule) 30722a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne BEConsumer->takeLinkModule(); 30822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 309b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar // Steal the module from the consumer. 3105aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber TheModule.reset(BEConsumer->takeModule()); 311b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar} 312b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar 313b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbarllvm::Module *CodeGenAction::takeModule() { 314b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar return TheModule.take(); 315b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar} 316b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar 3174b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbournellvm::LLVMContext *CodeGenAction::takeLLVMContext() { 3184b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne OwnsVMContext = false; 3194b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne return VMContext; 3204b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne} 3214b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 3224cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbarstatic raw_ostream *GetOutputStream(CompilerInstance &CI, 3235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 3244cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar BackendAction Action) { 3254cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar switch (Action) { 3264ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitAssembly: 3274cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return CI.createDefaultOutputFile(false, InFile, "s"); 3284ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitLL: 3294cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return CI.createDefaultOutputFile(false, InFile, "ll"); 3304ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitBC: 3314cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return CI.createDefaultOutputFile(true, InFile, "bc"); 3324ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitNothing: 3334cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return 0; 33432148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar case Backend_EmitMCNull: 3354ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar case Backend_EmitObj: 3364cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return CI.createDefaultOutputFile(true, InFile, "o"); 3374ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar } 3384cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 339b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid action!"); 3404cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar} 3414cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 3424cbbd94d0abeec2d7e7438d098527aa340d82389Daniel DunbarASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI, 3435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile) { 3444cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar BackendAction BA = static_cast<BackendAction>(Act); 3456f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<raw_ostream> OS(GetOutputStream(CI, InFile, BA)); 3464ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar if (BA != Backend_EmitNothing && !OS) 3474ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar return 0; 3484ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 34922a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne llvm::Module *LinkModuleToUse = LinkModule; 35022a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 35122a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne // If we were not given a link module, and the user requested that one be 35222a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne // loaded from bitcode, do so now. 35322a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne const std::string &LinkBCFile = CI.getCodeGenOpts().LinkBitcodeFile; 35422a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne if (!LinkModuleToUse && !LinkBCFile.empty()) { 35522a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne std::string ErrorStr; 35622a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 35722a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne llvm::MemoryBuffer *BCBuf = 35822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne CI.getFileManager().getBufferForFile(LinkBCFile, &ErrorStr); 35922a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne if (!BCBuf) { 36022a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne CI.getDiagnostics().Report(diag::err_cannot_open_file) 36122a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne << LinkBCFile << ErrorStr; 36222a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne return 0; 36322a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne } 36422a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 36522a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne LinkModuleToUse = getLazyBitcodeModule(BCBuf, *VMContext, &ErrorStr); 36622a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne if (!LinkModuleToUse) { 36722a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne CI.getDiagnostics().Report(diag::err_cannot_open_file) 36822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne << LinkBCFile << ErrorStr; 36922a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne return 0; 37022a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne } 37122a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne } 37222a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne 3735aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber BEConsumer = 3745aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber new BackendConsumer(BA, CI.getDiagnostics(), 3755aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber CI.getCodeGenOpts(), CI.getTargetOpts(), 376b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman CI.getLangOpts(), 37722a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne CI.getFrontendOpts().ShowTimers, InFile, 37822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne LinkModuleToUse, OS.take(), *VMContext); 3795aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber return BEConsumer; 380d69bacc3993f045bc78a64505fe0602770615b1fDaniel Dunbar} 3814ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 3824cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbarvoid CodeGenAction::ExecuteAction() { 3834cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar // If this is an IR file, we have to treat it specially. 3844cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (getCurrentFileKind() == IK_LLVM_IR) { 3854cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar BackendAction BA = static_cast<BackendAction>(Act); 3864cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar CompilerInstance &CI = getCompilerInstance(); 3874cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar raw_ostream *OS = GetOutputStream(CI, getCurrentFile(), BA); 3884cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (BA != Backend_EmitNothing && !OS) 3894cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return; 3904cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 3914cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar bool Invalid; 3924cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar SourceManager &SM = CI.getSourceManager(); 3934cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar const llvm::MemoryBuffer *MainFile = SM.getBuffer(SM.getMainFileID(), 3944cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar &Invalid); 3954cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (Invalid) 3964cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return; 3974cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 3984cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar // FIXME: This is stupid, IRReader shouldn't take ownership. 3994cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar llvm::MemoryBuffer *MainFileCopy = 4004cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar llvm::MemoryBuffer::getMemBufferCopy(MainFile->getBuffer(), 4018616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis getCurrentFile()); 4024cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 4034cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar llvm::SMDiagnostic Err; 4044b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne TheModule.reset(ParseIR(MainFileCopy, Err, *VMContext)); 4054cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (!TheModule) { 4064cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar // Translate from the diagnostic info to the SourceManager location. 4075a9ee2082891e04ce793d7a7a111301873c4f854Argyrios Kyrtzidis SourceLocation Loc = SM.translateFileLineCol( 4084cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar SM.getFileEntryForID(SM.getMainFileID()), Err.getLineNo(), 4094cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar Err.getColumnNo() + 1); 4104cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 4114cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar // Get a custom diagnostic for the error. We strip off a leading 4124cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar // diagnostic code if there is one. 4135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Msg = Err.getMessage(); 4144cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar if (Msg.startswith("error: ")) 4154cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar Msg = Msg.substr(7); 416c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer 417c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer // Escape '%', which is interpreted as a format character. 418cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallString<128> EscapedMessage; 419c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer for (unsigned i = 0, e = Msg.size(); i != e; ++i) { 420c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer if (Msg[i] == '%') 421c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer EscapedMessage += '%'; 422c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer EscapedMessage += Msg[i]; 423c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer } 424c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer 425d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie unsigned DiagID = CI.getDiagnostics().getCustomDiagID( 426c9b47f9ba822e69349dffe2b7c1c694a57e279faBenjamin Kramer DiagnosticsEngine::Error, EscapedMessage); 4274cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 42833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis CI.getDiagnostics().Report(Loc, DiagID); 4294cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return; 4304cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar } 4314cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 4324cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar EmitBackendOutput(CI.getDiagnostics(), CI.getCodeGenOpts(), 433b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman CI.getTargetOpts(), CI.getLangOpts(), 434b18b8ad63061c23daf4d95b022764027739691d8Dan Gohman TheModule.get(), 4354cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar BA, OS); 4364cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar return; 4374cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar } 4384cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 4394cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar // Otherwise follow the normal AST path. 4404cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar this->ASTFrontendAction::ExecuteAction(); 4414cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar} 4424cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 4434cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar// 4444cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar 44599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitAssemblyAction::anchor() { } 4464b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitAssemblyAction::EmitAssemblyAction(llvm::LLVMContext *_VMContext) 4474b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitAssembly, _VMContext) {} 4484ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 44999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitBCAction::anchor() { } 4504b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitBCAction::EmitBCAction(llvm::LLVMContext *_VMContext) 4514b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitBC, _VMContext) {} 4524ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 45399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitLLVMAction::anchor() { } 4544b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitLLVMAction::EmitLLVMAction(llvm::LLVMContext *_VMContext) 4554b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitLL, _VMContext) {} 4564ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 45799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitLLVMOnlyAction::anchor() { } 4584b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitLLVMOnlyAction::EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext) 4594b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitNothing, _VMContext) {} 4604ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar 46199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitCodeGenOnlyAction::anchor() { } 4624b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitCodeGenOnlyAction::EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext) 4634b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitMCNull, _VMContext) {} 46432148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar 46599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid EmitObjAction::anchor() { } 4664b93d660c6326ec79b5e369317d1051cf826c2f3Peter CollingbourneEmitObjAction::EmitObjAction(llvm::LLVMContext *_VMContext) 4674b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne : CodeGenAction(Backend_EmitObj, _VMContext) {} 468