Clover Git
OpenCL 1.1 software implementation
|
00001 /* 00002 * Copyright (c) 2011, Denis Steckelmacher <steckdenis@yahoo.fr> 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * * Redistributions of source code must retain the above copyright 00008 * notice, this list of conditions and the following disclaimer. 00009 * * Redistributions in binary form must reproduce the above copyright 00010 * notice, this list of conditions and the following disclaimer in the 00011 * documentation and/or other materials provided with the distribution. 00012 * * Neither the name of the copyright holder nor the 00013 * names of its contributors may be used to endorse or promote products 00014 * derived from this software without specific prior written permission. 00015 * 00016 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 00017 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00018 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00019 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 00020 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00021 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00022 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00023 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00024 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00025 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00026 */ 00027 00033 #ifndef __COMPILER_H__ 00034 #define __COMPILER_H__ 00035 00036 #include <string> 00037 00038 #include <clang/Frontend/CompilerInstance.h> 00039 #include <llvm/Support/raw_ostream.h> 00040 00041 namespace llvm 00042 { 00043 class MemoryBuffer; 00044 class Module; 00045 } 00046 00047 namespace clang 00048 { 00049 class TextDiagnosticPrinter; 00050 } 00051 00052 namespace Coal 00053 { 00054 00055 class DeviceInterface; 00056 00063 class Compiler 00064 { 00065 public: 00070 Compiler(DeviceInterface *device); 00071 ~Compiler(); 00072 00081 bool compile(const std::string &options, llvm::MemoryBuffer *source); 00082 00090 const std::string &log() const; 00091 00096 const std::string &options() const; 00097 00102 bool optimize() const; 00103 00108 llvm::Module *module() const; 00109 00118 void appendLog(const std::string &log); 00119 00120 private: 00121 DeviceInterface *p_device; 00122 clang::CompilerInstance p_compiler; 00123 llvm::Module *p_module; 00124 bool p_optimize; 00125 00126 std::string p_log, p_options; 00127 llvm::raw_string_ostream p_log_stream; 00128 clang::TextDiagnosticPrinter *p_log_printer; 00129 }; 00130 00131 } 00132 00133 #endif