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