| //===- 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 |