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