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