Index: components/nacl/renderer/ppb_nacl_private_impl.cc |
diff --git a/components/nacl/renderer/ppb_nacl_private_impl.cc b/components/nacl/renderer/ppb_nacl_private_impl.cc |
index fb5e6dc9e356f52fef1a591e386cada970e43eaf..063da8e384ac88f46bc6e10b5e15af40de99a567 100644 |
--- a/components/nacl/renderer/ppb_nacl_private_impl.cc |
+++ b/components/nacl/renderer/ppb_nacl_private_impl.cc |
@@ -267,6 +267,7 @@ class ManifestServiceProxy : public ManifestServiceChannel::Delegate { |
PP_PNaClOptions pnacl_options; |
pnacl_options.translate = PP_FALSE; |
pnacl_options.is_debug = PP_FALSE; |
+ pnacl_options.use_subzero = PP_FALSE; |
pnacl_options.opt_level = 2; |
bool is_helper_process = process_type_ == kPNaClTranslatorProcessType; |
if (!ManifestResolveKey(pp_instance_, is_helper_process, key, &url, |
@@ -671,6 +672,7 @@ void GetNexeFd(PP_Instance instance, |
const base::Time& last_modified_time, |
const std::string& etag, |
bool has_no_store_header, |
+ bool use_subzero, |
base::Callback<void(int32_t, bool, PP_FileHandle)> callback) { |
if (!InitializePnaclResourceHost()) { |
ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( |
@@ -691,6 +693,7 @@ void GetNexeFd(PP_Instance instance, |
cache_info.last_modified = last_modified_time; |
cache_info.etag = etag; |
cache_info.has_no_store_header = has_no_store_header; |
+ cache_info.use_subzero = use_subzero; |
cache_info.sandbox_isa = GetSandboxArch(); |
cache_info.extra_flags = GetCpuFeatures(); |
@@ -704,8 +707,11 @@ void GetNexeFd(PP_Instance instance, |
void ReportTranslationFinished(PP_Instance instance, |
PP_Bool success, |
int32_t opt_level, |
+ PP_Bool use_subzero, |
int64_t pexe_size, |
int64_t compile_time_us) { |
+ // TODO(jvoung): Log use_subzero stat in UMA. |
+ (void)use_subzero; |
if (success == PP_TRUE) { |
static const int32_t kUnknownOptLevel = 4; |
if (opt_level < 0 || opt_level > 3) |
@@ -1058,6 +1064,15 @@ PP_Bool ManifestGetProgramURL(PP_Instance instance, |
&error_info)) { |
*pp_full_url = ppapi::StringVar::StringToPPVar(full_url); |
*pp_uses_nonsfi_mode = PP_FromBool(uses_nonsfi_mode); |
+ // Check if we should use Subzero (x86-32 / non-debugging case for now). |
+ if (pnacl_options->opt_level == 0 && !pnacl_options->is_debug && |
+ strcmp(GetSandboxArch(), "x86-32") == 0 && |
+ base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnablePNaClSubzero)) { |
+ pnacl_options->use_subzero = PP_TRUE; |
+ // Subzero -O2 is closer to LLC -O0, so indicate -O2. |
+ pnacl_options->opt_level = 2; |
+ } |
return PP_TRUE; |
} |
@@ -1099,7 +1114,8 @@ bool ManifestResolveKey(PP_Instance instance, |
PP_Bool GetPNaClResourceInfo(PP_Instance instance, |
PP_Var* llc_tool_name, |
- PP_Var* ld_tool_name) { |
+ PP_Var* ld_tool_name, |
+ PP_Var* subzero_tool_name) { |
static const char kFilename[] = "chrome://pnacl-translator/pnacl.json"; |
NexeLoadManager* load_manager = GetNexeLoadManager(instance); |
DCHECK(load_manager); |
@@ -1176,18 +1192,30 @@ PP_Bool GetPNaClResourceInfo(PP_Instance instance, |
if (json_data.isMember("pnacl-llc-name")) { |
Json::Value json_name = json_data["pnacl-llc-name"]; |
if (json_name.isString()) { |
- std::string llc_tool_name_str = json_name.asString(); |
- *llc_tool_name = ppapi::StringVar::StringToPPVar(llc_tool_name_str); |
+ *llc_tool_name = ppapi::StringVar::StringToPPVar(json_name.asString()); |
} |
} |
if (json_data.isMember("pnacl-ld-name")) { |
Json::Value json_name = json_data["pnacl-ld-name"]; |
if (json_name.isString()) { |
- std::string ld_tool_name_str = json_name.asString(); |
- *ld_tool_name = ppapi::StringVar::StringToPPVar(ld_tool_name_str); |
+ *ld_tool_name = ppapi::StringVar::StringToPPVar(json_name.asString()); |
} |
} |
+ |
+ if (json_data.isMember("pnacl-sz-name")) { |
+ Json::Value json_name = json_data["pnacl-sz-name"]; |
+ if (json_name.isString()) { |
+ *subzero_tool_name = |
+ ppapi::StringVar::StringToPPVar(json_name.asString()); |
+ } |
+ } else { |
+ // TODO(jvoung): remove fallback after one chrome release |
+ // or when we bump the kMinPnaclVersion. |
+ // TODO(jvoung): Just use strings instead of PP_Var! |
+ *subzero_tool_name = ppapi::StringVar::StringToPPVar("pnacl-sz.nexe"); |
+ } |
+ |
return PP_TRUE; |
} |
@@ -1491,17 +1519,19 @@ class PexeDownloader : public blink::WebURLLoaderClient { |
scoped_ptr<blink::WebURLLoader> url_loader, |
const std::string& pexe_url, |
int32_t pexe_opt_level, |
+ bool use_subzero, |
const PPP_PexeStreamHandler* stream_handler, |
void* stream_handler_user_data) |
: instance_(instance), |
url_loader_(url_loader.Pass()), |
pexe_url_(pexe_url), |
pexe_opt_level_(pexe_opt_level), |
+ use_subzero_(use_subzero), |
stream_handler_(stream_handler), |
stream_handler_user_data_(stream_handler_user_data), |
success_(false), |
expected_content_length_(-1), |
- weak_factory_(this) { } |
+ weak_factory_(this) {} |
void Load(const blink::WebURLRequest& request) { |
url_loader_->loadAsynchronously(request, this); |
@@ -1539,14 +1569,10 @@ class PexeDownloader : public blink::WebURLLoaderClient { |
has_no_store_header = true; |
} |
- GetNexeFd(instance_, |
- pexe_url_, |
- pexe_opt_level_, |
- last_modified_time, |
- etag, |
- has_no_store_header, |
- base::Bind(&PexeDownloader::didGetNexeFd, |
- weak_factory_.GetWeakPtr())); |
+ GetNexeFd( |
+ instance_, pexe_url_, pexe_opt_level_, last_modified_time, etag, |
+ has_no_store_header, use_subzero_, |
+ base::Bind(&PexeDownloader::didGetNexeFd, weak_factory_.GetWeakPtr())); |
} |
virtual void didGetNexeFd(int32_t pp_error, |
@@ -1606,6 +1632,7 @@ class PexeDownloader : public blink::WebURLLoaderClient { |
scoped_ptr<blink::WebURLLoader> url_loader_; |
std::string pexe_url_; |
int32_t pexe_opt_level_; |
+ bool use_subzero_; |
const PPP_PexeStreamHandler* stream_handler_; |
void* stream_handler_user_data_; |
bool success_; |
@@ -1616,6 +1643,7 @@ class PexeDownloader : public blink::WebURLLoaderClient { |
void StreamPexe(PP_Instance instance, |
const char* pexe_url, |
int32_t opt_level, |
+ PP_Bool use_subzero, |
const PPP_PexeStreamHandler* handler, |
void* handler_user_data) { |
content::PepperPluginInstance* plugin_instance = |
@@ -1634,12 +1662,9 @@ void StreamPexe(PP_Instance instance, |
plugin_instance->GetContainer()->element().document(); |
scoped_ptr<blink::WebURLLoader> url_loader( |
CreateWebURLLoader(document, gurl)); |
- PexeDownloader* downloader = new PexeDownloader(instance, |
- url_loader.Pass(), |
- pexe_url, |
- opt_level, |
- handler, |
- handler_user_data); |
+ PexeDownloader* downloader = |
+ new PexeDownloader(instance, url_loader.Pass(), pexe_url, opt_level, |
+ PP_ToBool(use_subzero), handler, handler_user_data); |
blink::WebURLRequest url_request = CreateWebURLRequest(document, gurl); |
// Mark the request as requesting a PNaCl bitcode file, |