116f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk//===- subzero/src/WasmTranslator.h - WASM to Subzero Translation ---------===//
216f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk//
316f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk//                        The Subzero Code Generator
416f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk//
516f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk// This file is distributed under the University of Illinois Open Source
616f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk// License. See LICENSE.TXT for details.
716f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk//
816f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk//===----------------------------------------------------------------------===//
916f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk///
1016f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk/// \file
1116f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk/// \brief Declares a driver for translating Wasm bitcode into PNaCl bitcode.
1216f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk///
1316f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk//===----------------------------------------------------------------------===//
1416f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
1516f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk#ifndef SUBZERO_SRC_WASMTRANSLATOR_H
1616f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk#define SUBZERO_SRC_WASMTRANSLATOR_H
1716f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
18681f90fe6f4930c11d87a63d1c47cbb95a57f61bJohn Porto#if ALLOW_WASM
19681f90fe6f4930c11d87a63d1c47cbb95a57f61bJohn Porto
2016f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk#include "IceGlobalContext.h"
2116f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk#include "IceTranslator.h"
2216f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
2367c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk#ifdef __clang__
2467c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk#pragma clang diagnostic push
2567c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk#pragma clang diagnostic ignored "-Wunused-parameter"
2667c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk#endif // __clang__
2767c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk
2867c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk#include "llvm/Support/StreamingMemoryObject.h"
2967c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk
3067c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk#ifdef __clang__
3167c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk#pragma clang diagnostic pop
3267c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk#endif // __clang__
3367c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk
3416f8061ca23653172ea4c1a43659bb0501b5b474Eric Holknamespace v8 {
3516f8061ca23653172ea4c1a43659bb0501b5b474Eric Holknamespace internal {
3616f8061ca23653172ea4c1a43659bb0501b5b474Eric Holkclass Zone;
3716f8061ca23653172ea4c1a43659bb0501b5b474Eric Holknamespace wasm {
3867c7c4161ad5bcf234357348a421e313932a8ee3Eric Holkstruct FunctionBody;
3916f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk} // end of namespace wasm
4016f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk} // end of namespace internal
4116f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk} // end of namespace v8
4216f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
4316f8061ca23653172ea4c1a43659bb0501b5b474Eric Holknamespace Ice {
4416f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
4516f8061ca23653172ea4c1a43659bb0501b5b474Eric Holkclass WasmTranslator : public Translator {
4616f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  WasmTranslator() = delete;
4716f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  WasmTranslator(const WasmTranslator &) = delete;
4816f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  WasmTranslator &operator=(const WasmTranslator &) = delete;
4916f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
5016f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  template <typename F = std::function<void(Ostream &)>> void log(F Fn) {
5116f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk    if (BuildDefs::dump() && (getFlags().getVerbose() & IceV_Wasm)) {
5216f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk      Fn(Ctx->getStrDump());
5316f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk      Ctx->getStrDump().flush();
5416f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk    }
5516f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  }
5616f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
5716f8061ca23653172ea4c1a43659bb0501b5b474Eric Holkpublic:
5816f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  explicit WasmTranslator(GlobalContext *Ctx);
5916f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
6016f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  void translate(const std::string &IRFilename,
6116f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk                 std::unique_ptr<llvm::DataStreamer> InputStream);
6216f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
6316f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  /// Translates a single Wasm function.
6416f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  ///
6516f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  /// Parameters:
6616f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk  ///   Zone - an arena for the V8 code to allocate from.
6767c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk  ///   Body - information about the function to translate
6867c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk  std::unique_ptr<Cfg>
6967c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk  translateFunction(v8::internal::Zone *Zone,
7067c7c4161ad5bcf234357348a421e313932a8ee3Eric Holk                    v8::internal::wasm::FunctionBody &Body);
7116f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk
7216f8061ca23653172ea4c1a43659bb0501b5b474Eric Holkprivate:
7387def2c8fa994f2daf87a090763a472335622697Eric Holk  std::vector<uint8_t> Buffer;
7416f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk};
7516f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk}
76681f90fe6f4930c11d87a63d1c47cbb95a57f61bJohn Porto
77681f90fe6f4930c11d87a63d1c47cbb95a57f61bJohn Porto#endif // ALLOW_WASM
78681f90fe6f4930c11d87a63d1c47cbb95a57f61bJohn Porto
7916f8061ca23653172ea4c1a43659bb0501b5b474Eric Holk#endif // SUBZERO_SRC_WASMTRANSLATOR_H
80