//===- subzero/src/IceConverter.h - Converts LLVM to ICE --------*- 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 LLVM to ICE converter. /// //===----------------------------------------------------------------------===// #ifndef SUBZERO_SRC_ICECONVERTER_H #define SUBZERO_SRC_ICECONVERTER_H #include "IceDefs.h" #include "IceTranslator.h" namespace llvm { class GlobalValue; class Module; } namespace Ice { class Converter : public Translator { Converter() = delete; Converter(const Converter &) = delete; Converter &operator=(const Converter &) = delete; public: Converter(llvm::Module *Mod, GlobalContext *Ctx) : Translator(Ctx), Mod(Mod), GlobalDeclarationsPool(new VariableDeclarationList()) {} ~Converter() override = default; /// Converts the LLVM Module to ICE. Sets exit status to false if successful, /// true otherwise. void convertToIce(); llvm::Module *getModule() const { return Mod; } /// Returns the global declaration associated with the corresponding global /// value V. If no such global address, generates fatal error. GlobalDeclaration *getGlobalDeclaration(const llvm::GlobalValue *V); private: llvm::Module *Mod; using GlobalDeclarationMapType = std::map<const llvm::GlobalValue *, GlobalDeclaration *>; GlobalDeclarationMapType GlobalDeclarationMap; std::unique_ptr<VariableDeclarationList> GlobalDeclarationsPool; /// Walks module and generates names for unnamed globals using prefix /// getFlags().DefaultGlobalPrefix, if the prefix is non-empty. void nameUnnamedGlobalVariables(llvm::Module *Mod); /// Walks module and generates names for unnamed functions using prefix /// getFlags().DefaultFunctionPrefix, if the prefix is non-empty. void nameUnnamedFunctions(llvm::Module *Mod); /// Converts functions to ICE, and then machine code. void convertFunctions(); /// Converts globals to ICE, and then machine code. void convertGlobals(llvm::Module *Mod); /// Installs global declarations into GlobalDeclarationMap. void installGlobalDeclarations(llvm::Module *Mod); }; } // end of namespace ICE. #endif // SUBZERO_SRC_ICECONVERTER_H