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