//===- subzero/src/main.cpp - Entry point for bitcode translation ---------===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief Defines the entry point for translating PNaCl bitcode into native
/// code.
///
//===----------------------------------------------------------------------===//

#include "IceBrowserCompileServer.h"
#include "IceBuildDefs.h"
#include "IceCompileServer.h"

#ifdef __pnacl__
#include <malloc.h>
#endif // __pnacl__

/// Depending on whether we are building the compiler for the browser or
/// standalone, we will end up creating a Ice::BrowserCompileServer or
/// Ice::CLCompileServer object. Method
/// Ice::CompileServer::runAndReturnErrorCode is used for the invocation.
/// There are no real commandline arguments in the browser case. They are
/// supplied via IPC so argc, and argv are not used in that case.
/// We can only compile the Ice::BrowserCompileServer object with the PNaCl
/// compiler toolchain, when building Subzero as a sandboxed translator.
int main(int argc, char **argv) {
#ifdef __pnacl__
#define M_GRANULARITY (-2)
  // PNaCl's default malloc implementation grabs small chunks of memory with
  // mmap at a time, hence causing significant slowdowns. This call ensures that
  // mmap is used to allocate 16MB at a time, to amortize the system call cost.
  mallopt(M_GRANULARITY, 16 * 1024 * 1024);
#undef M_GRANULARITY
#endif // __pnacl__

  if (Ice::BuildDefs::browser()) {
    assert(argc == 1);
    return Ice::BrowserCompileServer().runAndReturnErrorCode();
  }
  return Ice::CLCompileServer(argc, argv).runAndReturnErrorCode();
}