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..42203581c9f43d6b877787dcad27f536cf718c52 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, |
@@ -1058,6 +1059,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 +1109,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 +1187,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; |
} |