blob: baaa39ef8adc0cbf17e2ae0021ff1f073b05a3f4 [file] [log] [blame]
//===- 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();
}