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