| //===- 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. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file declares the general driver class for translating ICE to |
| // machine code. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SUBZERO_SRC_ICETRANSLATOR_H |
| #define SUBZERO_SRC_ICETRANSLATOR_H |
| |
| #include <memory> |
| |
| namespace llvm { |
| class Module; |
| } |
| |
| 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(const Translator &) = delete; |
| Translator &operator=(const Translator &) = delete; |
| |
| public: |
| typedef std::vector<VariableDeclaration *> VariableDeclarationListType; |
| |
| Translator(GlobalContext *Ctx, const ClFlags &Flags) |
| : Ctx(Ctx), Flags(Flags), ErrorStatus(0) {} |
| |
| ~Translator(); |
| bool getErrorStatus() const { return ErrorStatus; } |
| |
| GlobalContext *getContext() const { return Ctx; } |
| |
| const ClFlags &getFlags() const { return Flags; } |
| |
| /// Translates the constructed ICE function Fcn to machine code. |
| /// Takes ownership of Fcn. Note: As a side effect, Field Func is |
| /// set to Fcn. |
| void translateFcn(Cfg *Fcn); |
| |
| /// Emits the constant pool. |
| void emitConstants(); |
| |
| /// Lowers the given list of global addresses to target. Generates |
| /// list of corresponding variable declarations. |
| void lowerGlobals(const VariableDeclarationListType &VariableDeclarations); |
| |
| /// Creates a name using the given prefix and corresponding index. |
| std::string createUnnamedName(const IceString &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 IceString &Name, const char *Kind, |
| const IceString &Prefix); |
| |
| protected: |
| GlobalContext *Ctx; |
| const ClFlags &Flags; |
| // The exit status of the translation. False is successful. True |
| // otherwise. |
| bool ErrorStatus; |
| // Ideally, Func would be inside the methods that converts IR to |
| // functions. However, emitting the constant pool requires a valid |
| // Cfg object, so we need to defer deleting the last non-empty Cfg |
| // object to emit the constant pool (via emitConstants). TODO: |
| // Since all constants are globally pooled in the GlobalContext |
| // object, change all Constant related functions to use |
| // GlobalContext instead of Cfg, and then make emitConstantPool use |
| // that. |
| std::unique_ptr<Cfg> Func; |
| }; |
| |
| } // end of namespace Ice |
| |
| #endif // SUBZERO_SRC_ICETRANSLATOR_H |