[cfe-commits] r105583 - in /cfe/trunk: include/clang/Frontend/CodeGenAction.h include/clang/Frontend/FrontendAction.h lib/Frontend/CodeGenAction.cpp test/Frontend/ir-support-codegen.ll test/Frontend/ir-support-errors.ll tools/driver/CMakeLists.tx
Rafael Espindola
espindola at google.com
Tue Jun 8 07:37:10 PDT 2010
Thanks!!!
On 7 June 2010 19:27, Daniel Dunbar <daniel at zuster.org> wrote:
> Author: ddunbar
> Date: Mon Jun 7 18:27:59 2010
> New Revision: 105583
>
> URL: http://llvm.org/viewvc/llvm-project?rev=105583&view=rev
> Log:
> Frontend: Add CodeGenAction support for handling LLVM IR.
> - This magically enables using 'clang -cc1' as a replacement for most of 'llvm-as', 'llvm-dis', 'llc' and 'opt' functionality.
>
> For example, 'llvm-as' is:
> $ clang -cc1 -emit-llvm-bc FOO.ll -o FOO.bc
> and 'llvm-dis' is:
> $ clang -cc1 -emit-llvm FOO.bc -o -
> and 'opt' is, e.g.:
> $ clang -cc1 -emit-llvm -O3 -o FOO.opt.ll FOO.ll
> and 'llc' is, e.g.:
> $ clang -cc1 -S -o - FOO.ll
>
> The nice thing about using the backend tools this way is that they are guaranteed to exactly match how the compiler generates code (for example, setting the same backend options).
>
> Added:
> cfe/trunk/test/Frontend/ir-support-codegen.ll
> cfe/trunk/test/Frontend/ir-support-errors.ll
> Modified:
> cfe/trunk/include/clang/Frontend/CodeGenAction.h
> cfe/trunk/include/clang/Frontend/FrontendAction.h
> cfe/trunk/lib/Frontend/CodeGenAction.cpp
> cfe/trunk/tools/driver/CMakeLists.txt
> cfe/trunk/tools/driver/Makefile
>
> Modified: cfe/trunk/include/clang/Frontend/CodeGenAction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenAction.h?rev=105583&r1=105582&r2=105583&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/CodeGenAction.h (original)
> +++ cfe/trunk/include/clang/Frontend/CodeGenAction.h Mon Jun 7 18:27:59 2010
> @@ -24,9 +24,13 @@
> protected:
> CodeGenAction(unsigned _Act);
>
> + virtual bool hasIRSupport() const;
> +
> virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
> llvm::StringRef InFile);
>
> + virtual void ExecuteAction();
> +
> virtual void EndSourceFileAction();
>
> public:
>
> Modified: cfe/trunk/include/clang/Frontend/FrontendAction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendAction.h?rev=105583&r1=105582&r2=105583&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/FrontendAction.h (original)
> +++ cfe/trunk/include/clang/Frontend/FrontendAction.h Mon Jun 7 18:27:59 2010
> @@ -202,6 +202,7 @@
> /// ASTFrontendAction - Abstract base class to use for AST consumer based
> /// frontend actions.
> class ASTFrontendAction : public FrontendAction {
> +protected:
> /// ExecuteAction - Implement the ExecuteAction interface by running Sema on
> /// the already initialized AST consumer.
> ///
>
> Modified: cfe/trunk/lib/Frontend/CodeGenAction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CodeGenAction.cpp?rev=105583&r1=105582&r2=105583&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CodeGenAction.cpp (original)
> +++ cfe/trunk/lib/Frontend/CodeGenAction.cpp Mon Jun 7 18:27:59 2010
> @@ -22,6 +22,7 @@
> #include "llvm/Module.h"
> #include "llvm/Pass.h"
> #include "llvm/ADT/OwningPtr.h"
> +#include "llvm/Support/IRReader.h"
> #include "llvm/Support/MemoryBuffer.h"
> #include "llvm/Support/SourceMgr.h"
> #include "llvm/Support/Timer.h"
> @@ -220,6 +221,8 @@
>
> CodeGenAction::~CodeGenAction() {}
>
> +bool CodeGenAction::hasIRSupport() const { return true; }
> +
> void CodeGenAction::EndSourceFileAction() {
> // If the consumer creation failed, do nothing.
> if (!getCompilerInstance().hasASTConsumer())
> @@ -236,27 +239,31 @@
> return TheModule.take();
> }
>
> -ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI,
> - llvm::StringRef InFile) {
> - BackendAction BA = static_cast<BackendAction>(Act);
> - llvm::OwningPtr<llvm::raw_ostream> OS;
> - switch (BA) {
> +static raw_ostream *GetOutputStream(CompilerInstance &CI,
> + llvm::StringRef InFile,
> + BackendAction Action) {
> + switch (Action) {
> case Backend_EmitAssembly:
> - OS.reset(CI.createDefaultOutputFile(false, InFile, "s"));
> - break;
> + return CI.createDefaultOutputFile(false, InFile, "s");
> case Backend_EmitLL:
> - OS.reset(CI.createDefaultOutputFile(false, InFile, "ll"));
> - break;
> + return CI.createDefaultOutputFile(false, InFile, "ll");
> case Backend_EmitBC:
> - OS.reset(CI.createDefaultOutputFile(true, InFile, "bc"));
> - break;
> + return CI.createDefaultOutputFile(true, InFile, "bc");
> case Backend_EmitNothing:
> - break;
> + return 0;
> case Backend_EmitMCNull:
> case Backend_EmitObj:
> - OS.reset(CI.createDefaultOutputFile(true, InFile, "o"));
> - break;
> + return CI.createDefaultOutputFile(true, InFile, "o");
> }
> +
> + assert(0 && "Invalid action!");
> + return 0;
> +}
> +
> +ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI,
> + llvm::StringRef InFile) {
> + BackendAction BA = static_cast<BackendAction>(Act);
> + llvm::OwningPtr<llvm::raw_ostream> OS(GetOutputStream(CI, InFile, BA));
> if (BA != Backend_EmitNothing && !OS)
> return 0;
>
> @@ -266,6 +273,59 @@
> CI.getLLVMContext());
> }
>
> +void CodeGenAction::ExecuteAction() {
> + // If this is an IR file, we have to treat it specially.
> + if (getCurrentFileKind() == IK_LLVM_IR) {
> + BackendAction BA = static_cast<BackendAction>(Act);
> + CompilerInstance &CI = getCompilerInstance();
> + raw_ostream *OS = GetOutputStream(CI, getCurrentFile(), BA);
> + if (BA != Backend_EmitNothing && !OS)
> + return;
> +
> + bool Invalid;
> + SourceManager &SM = CI.getSourceManager();
> + const llvm::MemoryBuffer *MainFile = SM.getBuffer(SM.getMainFileID(),
> + &Invalid);
> + if (Invalid)
> + return;
> +
> + // FIXME: This is stupid, IRReader shouldn't take ownership.
> + llvm::MemoryBuffer *MainFileCopy =
> + llvm::MemoryBuffer::getMemBufferCopy(MainFile->getBuffer(),
> + getCurrentFile().c_str());
> +
> + llvm::SMDiagnostic Err;
> + TheModule.reset(ParseIR(MainFileCopy, Err, CI.getLLVMContext()));
> + if (!TheModule) {
> + // Translate from the diagnostic info to the SourceManager location.
> + SourceLocation Loc = SM.getLocation(
> + SM.getFileEntryForID(SM.getMainFileID()), Err.getLineNo(),
> + Err.getColumnNo() + 1);
> +
> + // Get a custom diagnostic for the error. We strip off a leading
> + // diagnostic code if there is one.
> + llvm::StringRef Msg = Err.getMessage();
> + if (Msg.startswith("error: "))
> + Msg = Msg.substr(7);
> + unsigned DiagID = CI.getDiagnostics().getCustomDiagID(Diagnostic::Error,
> + Msg);
> +
> + CI.getDiagnostics().Report(FullSourceLoc(Loc, SM), DiagID);
> + return;
> + }
> +
> + EmitBackendOutput(CI.getDiagnostics(), CI.getCodeGenOpts(),
> + CI.getTargetOpts(), TheModule.get(),
> + BA, OS);
> + return;
> + }
> +
> + // Otherwise follow the normal AST path.
> + this->ASTFrontendAction::ExecuteAction();
> +}
> +
> +//
> +
> EmitAssemblyAction::EmitAssemblyAction()
> : CodeGenAction(Backend_EmitAssembly) {}
>
>
> Added: cfe/trunk/test/Frontend/ir-support-codegen.ll
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/ir-support-codegen.ll?rev=105583&view=auto
> ==============================================================================
> --- cfe/trunk/test/Frontend/ir-support-codegen.ll (added)
> +++ cfe/trunk/test/Frontend/ir-support-codegen.ll Mon Jun 7 18:27:59 2010
> @@ -0,0 +1,8 @@
> +; RUN: %clang_cc1 -S -o - %s | FileCheck %s
> +
> +target triple = "x86_64-apple-darwin10"
> +
> +; CHECK: .globl _f0
> +define i32 @f0() nounwind ssp {
> + ret i32 0
> +}
>
> Added: cfe/trunk/test/Frontend/ir-support-errors.ll
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/ir-support-errors.ll?rev=105583&view=auto
> ==============================================================================
> --- cfe/trunk/test/Frontend/ir-support-errors.ll (added)
> +++ cfe/trunk/test/Frontend/ir-support-errors.ll Mon Jun 7 18:27:59 2010
> @@ -0,0 +1,8 @@
> +; RUN: %clang_cc1 -S -o - %s 2>&1 | FileCheck %s
> +
> +target triple = "x86_64-apple-darwin10"
> +
> +define i32 @f0() nounwind ssp {
> +; CHECK: {{.*}}ir-support-errors.ll:7:16: error: expected value token
> + ret i32 x
> +}
>
> Modified: cfe/trunk/tools/driver/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/CMakeLists.txt?rev=105583&r1=105582&r2=105583&view=diff
> ==============================================================================
> --- cfe/trunk/tools/driver/CMakeLists.txt (original)
> +++ cfe/trunk/tools/driver/CMakeLists.txt Mon Jun 7 18:27:59 2010
> @@ -16,6 +16,7 @@
>
> set( LLVM_LINK_COMPONENTS
> ${LLVM_TARGETS_TO_BUILD}
> + asmparser
> bitreader
> bitwriter
> codegen
>
> Modified: cfe/trunk/tools/driver/Makefile
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/Makefile?rev=105583&r1=105582&r2=105583&view=diff
> ==============================================================================
> --- cfe/trunk/tools/driver/Makefile (original)
> +++ cfe/trunk/tools/driver/Makefile Mon Jun 7 18:27:59 2010
> @@ -26,7 +26,8 @@
> # LINK_COMPONENTS before including Makefile.rules
> include $(LEVEL)/Makefile.config
>
> -LINK_COMPONENTS := $(TARGETS_TO_BUILD) bitreader bitwriter codegen ipo selectiondag
> +LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader bitwriter codegen \
> + ipo selectiondag
> USEDLIBS = clangFrontend.a clangDriver.a clangCodeGen.a clangSema.a \
> clangChecker.a clangAnalysis.a clangRewrite.a clangAST.a \
> clangParse.a clangLex.a clangBasic.a
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
--
Rafael Ávila de Espíndola
More information about the cfe-commits
mailing list