Compiler.h revision 2a6dc82a465631f82fc589c6bc68c15ed264f7eb
11f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan/* 21f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * Copyright 2010, The Android Open Source Project 31f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * 41f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * Licensed under the Apache License, Version 2.0 (the "License"); 51f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * you may not use this file except in compliance with the License. 61f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * You may obtain a copy of the License at 71f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * 81f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * http://www.apache.org/licenses/LICENSE-2.0 91f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * 101f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * Unless required by applicable law or agreed to in writing, software 111f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * distributed under the License is distributed on an "AS IS" BASIS, 121f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * See the License for the specific language governing permissions and 141f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * limitations under the License. 151f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan */ 161f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 171f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#ifndef BCC_COMPILER_H 181f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#define BCC_COMPILER_H 191f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 201f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include <bcc/bcc.h> 211f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 22c4395235b212be7a626becb0c03020eab4859739Logan#include "CodeEmitter.h" 23c4395235b212be7a626becb0c03020eab4859739Logan#include "CodeMemoryManager.h" 241f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 251f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include "llvm/ADT/OwningPtr.h" 261f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include "llvm/ADT/StringRef.h" 271f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include "llvm/Target/TargetMachine.h" 281f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 291f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include <stddef.h> 301f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 311f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include <list> 321f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include <string> 331f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include <vector> 341f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#include <utility> 351f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 361f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 371f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logannamespace llvm { 381f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan class LLVMContext; 391f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan class Module; 401f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan} 411f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 421f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 431f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logannamespace bcc { 442a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan class ScriptCompiled; 451f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 461f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan class Compiler { 47de2ca79b82b533bae32176c84378d7082788e9eeLogan private: 481f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan ////////////////////////////////////////////////////////////////////////// 491f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // The variable section below (e.g., Triple, CodeGenOptLevel) 501f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // is initialized in GlobalInitialization() 511f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // 521f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static bool GlobalInitialized; 531f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 541f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // If given, this will be the name of the target triple to compile for. 551f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // If not given, the initial values defined in this file will be used. 561f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static std::string Triple; 571f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 581f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static llvm::CodeGenOpt::Level CodeGenOptLevel; 591f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 601f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // End of section of GlobalInitializing variables 611f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan ///////////////////////////////////////////////////////////////////////// 621f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // If given, the name of the target CPU to generate code for. 631f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static std::string CPU; 641f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 651f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // The list of target specific features to enable or disable -- this should 661f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // be a list of strings starting with '+' (enable) or '-' (disable). 671f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static std::vector<std::string> Features; 681f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 691f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static void GlobalInitialization(); 701f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 711f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static void LLVMErrorHandler(void *UserData, const std::string &Message); 721f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 731f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static const llvm::StringRef PragmaMetadataName; 741f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static const llvm::StringRef ExportVarMetadataName; 751f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan static const llvm::StringRef ExportFuncMetadataName; 761f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 771f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan friend class CodeEmitter; 781f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan friend class CodeMemoryManager; 791f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 80de2ca79b82b533bae32176c84378d7082788e9eeLogan 811f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan private: 822a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan ScriptCompiled *mpResult; 832a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan 841f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan std::string mError; 851f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 861f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan bool mUseCache; // Set by readBC() 871f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan bool mCacheNew; // Set by readBC() 881f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan int mCacheFd; // Set by readBC() 891f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan char *mCacheMapAddr; // Set by loadCacheFile() if mCacheNew is false 901f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan oBCCHeader *mCacheHdr; // Set by loadCacheFile() 911f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan size_t mCacheSize; // Set by loadCacheFile() 921f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan ptrdiff_t mCacheDiff; // Set by loadCacheFile() 93839134991f6ecd2fb2aed73b8cc93722a4323f88Logan bool mCacheLoadFailed; // Set by loadCacheFile() used by readBC() 941f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan char *mCodeDataAddr; // Set by CodeMemoryManager if mCacheNew is true. 95de2ca79b82b533bae32176c84378d7082788e9eeLogan // Used by genCacheFile() for dumping 961f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 978b77a77e785f0e25b13016ed60770e521dc60e0bLogan unsigned char mSourceSHA1[20]; // Set by readBC() 988b77a77e785f0e25b13016ed60770e521dc60e0bLogan 991f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // The memory manager for code emitter 1001f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan llvm::OwningPtr<CodeMemoryManager> mCodeMemMgr; 1011f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1021f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // The CodeEmitter 1031f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan llvm::OwningPtr<CodeEmitter> mCodeEmitter; 1041f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1051f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCSymbolLookupFn mpSymbolLookupFn; 1061f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void *mpSymbolLookupContext; 1071f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1081f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan llvm::LLVMContext *mContext; 1091f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan llvm::Module *mModule; 1101f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1111f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan bool mHasLinked; 1121f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1131f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan public: 1142a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan Compiler(ScriptCompiled *result); 1151f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1161f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // interface for BCCscript::registerSymbolCallback() 1171f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) { 1181f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan mpSymbolLookupFn = pFn; 1191f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan mpSymbolLookupContext = pContext; 1201f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan } 1211f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 122de2ca79b82b533bae32176c84378d7082788e9eeLogan CodeMemoryManager *createCodeMemoryManager(); 123de2ca79b82b533bae32176c84378d7082788e9eeLogan 124de2ca79b82b533bae32176c84378d7082788e9eeLogan CodeEmitter *createCodeEmitter(); 125de2ca79b82b533bae32176c84378d7082788e9eeLogan 1261f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan int readModule(llvm::Module *module) { 1271f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan GlobalInitialization(); 1281f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan mModule = module; 1291f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan return hasError(); 1301f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan } 1311f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 132e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao int readBC(const char *bitcode, 133e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao size_t bitcodeSize, 134b9b04161de73d43e4f94de26a7211761267ed71aLogan long bitcodeFileModTime, 135b9b04161de73d43e4f94de26a7211761267ed71aLogan long bitcodeFileCRC32, 136e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao const BCCchar *resName, 137e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao const BCCchar *cacheDir); 1381f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1391f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan int linkBC(const char *bitcode, size_t bitcodeSize); 1401f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1411f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // interface for bccLoadBinary() 1421f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan int loadCacheFile(); 1431f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1441f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // interace for bccCompileBC() 1451f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan int compile(); 1461f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1471f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // interface for bccGetScriptInfoLog() 14838d0607284fc6fdc52b4a3337b2bf9c1f1b0aaa1Logan char const *getErrorMessage() { 14938d0607284fc6fdc52b4a3337b2bf9c1f1b0aaa1Logan return mError.c_str(); 1501f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan } 1511f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1521f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // interface for bccGetScriptLabel() 1531f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void *lookup(const char *name); 1541f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1551f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Interface for bccGetExportVars() 1561f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void getExportVars(BCCsizei *actualVarCount, 1571f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCsizei maxVarCount, 1581f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCvoid **vars); 1591f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1601f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Interface for bccGetExportFuncs() 1611f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void getExportFuncs(BCCsizei *actualFuncCount, 1621f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCsizei maxFuncCount, 1631f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCvoid **funcs); 1641f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1651f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Interface for bccGetPragmas() 1661f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void getPragmas(BCCsizei *actualStringCount, 1671f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCsizei maxStringCount, 1681f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCchar **strings); 1691f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1701f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Interface for bccGetFunctions() 1711f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void getFunctions(BCCsizei *actualFunctionCount, 1721f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCsizei maxFunctionCount, 1731f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCchar **functions); 1741f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1751f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Interface for bccGetFunctionBinary() 1761f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void getFunctionBinary(BCCchar *function, 1771f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCvoid **base, 1781f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan BCCsizei *length); 1791f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1801f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan const llvm::Module *getModule() const { 1811f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan return mModule; 1821f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan } 1831f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1841f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan ~Compiler(); 1851f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1861f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan private: 1878b77a77e785f0e25b13016ed60770e521dc60e0bLogan void computeSourceSHA1(char const *bitcode, size_t size); 1888b77a77e785f0e25b13016ed60770e521dc60e0bLogan 1891f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Note: loadCacheFile() and genCacheFile() go hand in hand 1901f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan void genCacheFile(); 1911f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 1921f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // OpenCacheFile() returns fd of the cache file. 1931f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Input: 1941f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // BCCchar *resName: Used to genCacheFileName() 1951f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // bool createIfMissing: If false, turn off caching 1961f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Output: 1971f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // returns fd: If -1: Failed 1981f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // mCacheNew: If true, the returned fd is new. Otherwise, the fd is the 1991f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // cache file's file descriptor 2001f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // Note: openCacheFile() will check the cache file's validity, 2011f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan // such as Magic number, sourceWhen... dependencies. 202e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao int openCacheFile(const BCCchar *resName, 203e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao const BCCchar *cacheDir, 204e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao bool createIfMissing); 2051f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 206e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao char *genCacheFileName(const char *cacheDir, 207e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao const char *fileName, 208e6a1851734f11fcc194e746f42da09daad3f60e7Shih-wei Liao const char *subFileName); 2091f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 2101f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan /* 2111f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * Read the oBCC header, verify it, then read the dependent section 2121f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * and verify that data as well. 2131f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * 2141f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * On successful return, the file will be seeked immediately past the 2151f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan * oBCC header. 2161f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan */ 2171f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan bool checkHeaderAndDependencies(int fd, 218b9b04161de73d43e4f94de26a7211761267ed71aLogan long sourceWhen, 2191f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan uint32_t rslibWhen, 2201f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan uint32_t libRSWhen, 2211f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan uint32_t libbccWhen); 2221f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 2232417cef58cd051c0b43ce9f9cdc01a17d83ef95aShih-wei Liao 2242417cef58cd051c0b43ce9f9cdc01a17d83ef95aShih-wei Liao struct { 2252417cef58cd051c0b43ce9f9cdc01a17d83ef95aShih-wei Liao bool mNoCache; 2262417cef58cd051c0b43ce9f9cdc01a17d83ef95aShih-wei Liao } props; 2272417cef58cd051c0b43ce9f9cdc01a17d83ef95aShih-wei Liao 2282417cef58cd051c0b43ce9f9cdc01a17d83ef95aShih-wei Liao 229de2ca79b82b533bae32176c84378d7082788e9eeLogan private: 230de2ca79b82b533bae32176c84378d7082788e9eeLogan 231de2ca79b82b533bae32176c84378d7082788e9eeLogan bool hasError() const { 232de2ca79b82b533bae32176c84378d7082788e9eeLogan return !mError.empty(); 233de2ca79b82b533bae32176c84378d7082788e9eeLogan } 234de2ca79b82b533bae32176c84378d7082788e9eeLogan 235de2ca79b82b533bae32176c84378d7082788e9eeLogan void setError(const char *Error) { 236de2ca79b82b533bae32176c84378d7082788e9eeLogan mError.assign(Error); // Copying 237de2ca79b82b533bae32176c84378d7082788e9eeLogan } 238de2ca79b82b533bae32176c84378d7082788e9eeLogan 239de2ca79b82b533bae32176c84378d7082788e9eeLogan void setError(const std::string &Error) { 240de2ca79b82b533bae32176c84378d7082788e9eeLogan mError = Error; 241de2ca79b82b533bae32176c84378d7082788e9eeLogan } 242de2ca79b82b533bae32176c84378d7082788e9eeLogan 2432417cef58cd051c0b43ce9f9cdc01a17d83ef95aShih-wei Liao }; // End of class Compiler 2441f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 2459b504ebbab0ed81121fdba22617ea4f6cf4a467fLogan} // namespace bcc 2461f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan 2471f028c027b1df7fde0cd1a1eef9730856e8e5ae9Logan#endif // BCC_COMPILER_H 248