//===- 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.
//
//===----------------------------------------------------------------------===//
//
// This file 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) {}

  ~Converter() {}

  /// 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;
  typedef std::map<const llvm::GlobalValue *, GlobalDeclaration *>
      GlobalDeclarationMapType;
  GlobalDeclarationMapType GlobalDeclarationMap;

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