//===- subzero/src/PNaClTranslator.h - ICE from bitcode ---------*- C++ -*-===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file declares the PNaCl bitcode file to ICE, to machine code
/// translator.
///
//===----------------------------------------------------------------------===//

#ifndef SUBZERO_SRC_PNACLTRANSLATOR_H
#define SUBZERO_SRC_PNACLTRANSLATOR_H

#include "IceTranslator.h"

#include <string>

namespace llvm {
class MemoryBuffer;
class MemoryObject;
} // end of namespace llvm

namespace Ice {

class PNaClTranslator : public Translator {
  PNaClTranslator() = delete;
  PNaClTranslator(const PNaClTranslator &) = delete;
  PNaClTranslator &operator=(const PNaClTranslator &) = delete;

public:
  explicit PNaClTranslator(GlobalContext *Ctx) : Translator(Ctx) {}
  ~PNaClTranslator() override = default;

  /// Reads the PNaCl bitcode file and translates to ICE, which is then
  /// converted to machine code. Sets ErrorStatus to 1 if any errors
  /// occurred. Takes ownership of the MemoryObject.
  void translate(const std::string &IRFilename,
                 std::unique_ptr<llvm::MemoryObject> &&MemoryObject);

  /// Reads MemBuf, assuming it is the PNaCl bitcode contents of IRFilename.
  void translateBuffer(const std::string &IRFilename,
                       llvm::MemoryBuffer *MemBuf);
};

} // end of namespace Ice

#endif // SUBZERO_SRC_PNACLTRANSLATOR_H
