|  | //===- subzero/src/IceTranslator.h - ICE to machine code --------*- C++ -*-===// | 
|  | // | 
|  | //                        The Subzero Code Generator | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | /// | 
|  | /// \file | 
|  | /// \brief Declares the general driver class for translating ICE to machine | 
|  | /// code. | 
|  | /// | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef SUBZERO_SRC_ICETRANSLATOR_H | 
|  | #define SUBZERO_SRC_ICETRANSLATOR_H | 
|  |  | 
|  | #include "IceDefs.h" | 
|  | #include "IceGlobalContext.h" | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | namespace llvm { | 
|  | class Module; | 
|  | } // end of namespace llvm | 
|  |  | 
|  | namespace Ice { | 
|  |  | 
|  | class ClFlags; | 
|  | class Cfg; | 
|  | class VariableDeclaration; | 
|  | class GlobalContext; | 
|  |  | 
|  | /// Base class for translating ICE to machine code. Derived classes convert | 
|  | /// other intermediate representations down to ICE, and then call the | 
|  | /// appropriate (inherited) methods to convert ICE into machine instructions. | 
|  | class Translator { | 
|  | Translator() = delete; | 
|  | Translator(const Translator &) = delete; | 
|  | Translator &operator=(const Translator &) = delete; | 
|  |  | 
|  | public: | 
|  | explicit Translator(GlobalContext *Ctx); | 
|  |  | 
|  | virtual ~Translator() = default; | 
|  | const ErrorCode &getErrorStatus() const { return ErrorStatus; } | 
|  |  | 
|  | GlobalContext *getContext() const { return Ctx; } | 
|  |  | 
|  | /// Translates the constructed ICE function Func to machine code. | 
|  | void translateFcn(std::unique_ptr<Cfg> Func); | 
|  |  | 
|  | /// Lowers the given list of global addresses to target. Generates list of | 
|  | /// corresponding variable declarations. | 
|  | void | 
|  | lowerGlobals(std::unique_ptr<VariableDeclarationList> VariableDeclarations); | 
|  |  | 
|  | /// Creates a name using the given prefix and corresponding index. | 
|  | std::string createUnnamedName(const std::string &Prefix, SizeT Index); | 
|  |  | 
|  | /// Reports if there is a (potential) conflict between Name, and using Prefix | 
|  | /// to name unnamed names. Errors are put on Ostream. Returns true if there | 
|  | /// isn't a potential conflict. | 
|  | bool checkIfUnnamedNameSafe(const std::string &Name, const char *Kind, | 
|  | const std::string &Prefix); | 
|  |  | 
|  | uint32_t getNextSequenceNumber() { return NextSequenceNumber++; } | 
|  |  | 
|  | protected: | 
|  | GlobalContext *Ctx; | 
|  | uint32_t NextSequenceNumber; | 
|  | /// ErrorCode of the translation. | 
|  | ErrorCode ErrorStatus; | 
|  | }; | 
|  |  | 
|  | class CfgOptWorkItem final : public OptWorkItem { | 
|  | CfgOptWorkItem() = delete; | 
|  | CfgOptWorkItem(const CfgOptWorkItem &) = delete; | 
|  | CfgOptWorkItem &operator=(const CfgOptWorkItem &) = delete; | 
|  |  | 
|  | public: | 
|  | CfgOptWorkItem(std::unique_ptr<Cfg> Func) : Func(std::move(Func)) {} | 
|  | std::unique_ptr<Cfg> getParsedCfg() override { return std::move(Func); } | 
|  | ~CfgOptWorkItem() override = default; | 
|  |  | 
|  | private: | 
|  | std::unique_ptr<Ice::Cfg> Func; | 
|  | }; | 
|  |  | 
|  | } // end of namespace Ice | 
|  |  | 
|  | #endif // SUBZERO_SRC_ICETRANSLATOR_H |