Index: ppapi/native_client/src/trusted/plugin/json_manifest.cc |
diff --git a/ppapi/native_client/src/trusted/plugin/json_manifest.cc b/ppapi/native_client/src/trusted/plugin/json_manifest.cc |
index aeea96d4194526679f9c53d7483fe60d703dda25..730562f1e7337e72849794bd8ef01094f1c7b00c 100644 |
--- a/ppapi/native_client/src/trusted/plugin/json_manifest.cc |
+++ b/ppapi/native_client/src/trusted/plugin/json_manifest.cc |
@@ -16,6 +16,7 @@ |
#include "native_client/src/include/portability.h" |
#include "native_client/src/shared/platform/nacl_check.h" |
#include "native_client/src/trusted/plugin/plugin_error.h" |
+#include "native_client/src/trusted/plugin/pnacl_options.h" |
#include "native_client/src/trusted/plugin/utility.h" |
#include "ppapi/cpp/dev/url_util_dev.h" |
#include "ppapi/cpp/var.h" |
@@ -39,8 +40,10 @@ const char* const kPortableKey = "portable"; |
const char* const kPnaclTranslateKey = "pnacl-translate"; |
const char* const kUrlKey = "url"; |
-// Cache support keys |
+// Pnacl keys |
const char* const kCacheIdentityKey = "sha256"; |
+const char* const kOptLevelKey = "-O"; |
+const char* const kPnaclExperimentalFlags = "experimental_flags"; |
// Sample manifest file: |
// { |
@@ -51,7 +54,8 @@ const char* const kCacheIdentityKey = "sha256"; |
// "portable": { |
// "pnacl-translate": { |
// "url": "myprogram.pexe", |
-// "sha256": "..." |
+// "sha256": "...", |
+// "-O": 0 |
// } |
// } |
// }, |
@@ -254,8 +258,9 @@ bool IsValidISADictionary(const Json::Value& dictionary, |
bool has_portable = dictionary.isMember(kPortableKey); |
if (!has_isa && !has_portable) { |
- error_info->SetReport(ERROR_MANIFEST_PROGRAM_MISSING_ARCH, |
- nacl::string("manifest: no version of ") + parent_key+ |
+ error_info->SetReport( |
+ ERROR_MANIFEST_PROGRAM_MISSING_ARCH, |
+ nacl::string("manifest: no version of ") + parent_key + |
" given for current arch and no portable version found."); |
return false; |
} |
@@ -263,12 +268,23 @@ bool IsValidISADictionary(const Json::Value& dictionary, |
return true; |
} |
-void GrabUrlAndCacheIdentity(const Json::Value& url_spec, |
- nacl::string* url, |
- nacl::string* cache_identity) { |
+void GrabUrlAndPnaclOptions(const Json::Value& url_spec, |
+ nacl::string* url, |
+ PnaclOptions* pnacl_options) { |
*url = url_spec[kUrlKey].asString(); |
if (url_spec.isMember(kCacheIdentityKey)) { |
- *cache_identity = url_spec[kCacheIdentityKey].asString(); |
+ pnacl_options->set_bitcode_hash(url_spec[kCacheIdentityKey].asString()); |
+ } |
+ if (url_spec.isMember(kOptLevelKey)) { |
+ uint32_t opt_raw = url_spec[kOptLevelKey].asUInt(); |
+ // Clamp the opt value to fit into an int8_t. |
+ if (opt_raw > 3) |
+ opt_raw = 3; |
+ pnacl_options->set_opt_level(static_cast<int8_t>(opt_raw)); |
+ } |
+ if (url_spec.isMember(kPnaclExperimentalFlags)) { |
+ pnacl_options->set_experimental_flags( |
+ url_spec[kPnaclExperimentalFlags].asString()); |
} |
} |
@@ -277,19 +293,15 @@ bool GetURLFromISADictionary(const Json::Value& dictionary, |
const nacl::string& sandbox_isa, |
bool prefer_portable, |
nacl::string* url, |
- nacl::string* cache_identity, |
- ErrorInfo* error_info, |
- bool* pnacl_translate) { |
- if (url == NULL || cache_identity == NULL || |
- error_info == NULL || pnacl_translate == NULL) |
+ PnaclOptions* pnacl_options, |
+ ErrorInfo* error_info) { |
+ if (url == NULL || pnacl_options == NULL || error_info == NULL) |
return false; |
if (!IsValidISADictionary(dictionary, parent_key, sandbox_isa, error_info)) |
return false; |
*url = ""; |
- *cache_identity = ""; |
- *pnacl_translate = false; |
// The call to IsValidISADictionary() above guarantees that either |
// sandbox_isa or kPortableKey is present in the dictionary. |
@@ -305,11 +317,11 @@ bool GetURLFromISADictionary(const Json::Value& dictionary, |
// Check if this requires a pnacl-translate, otherwise just grab the URL. |
// We may have pnacl-translate for isa-specific bitcode for CPU tuning. |
if (isa_spec.isMember(kPnaclTranslateKey)) { |
- GrabUrlAndCacheIdentity(isa_spec[kPnaclTranslateKey], url, cache_identity); |
- *pnacl_translate = true; |
+ GrabUrlAndPnaclOptions(isa_spec[kPnaclTranslateKey], url, pnacl_options); |
+ pnacl_options->set_translate(true); |
} else { |
- GrabUrlAndCacheIdentity(isa_spec, url, cache_identity); |
- *pnacl_translate = false; |
+ *url = isa_spec[kUrlKey].asString(); |
+ pnacl_options->set_translate(false); |
} |
return true; |
@@ -321,9 +333,8 @@ bool GetKeyUrl(const Json::Value& dictionary, |
const Manifest* manifest, |
bool prefer_portable, |
nacl::string* full_url, |
- nacl::string* cache_identity, |
- ErrorInfo* error_info, |
- bool* pnacl_translate) { |
+ PnaclOptions* pnacl_options, |
+ ErrorInfo* error_info) { |
CHECK(full_url != NULL && error_info != NULL); |
if (!dictionary.isMember(key)) { |
error_info->SetReport(ERROR_MANIFEST_RESOLVE_URL, |
@@ -333,8 +344,7 @@ bool GetKeyUrl(const Json::Value& dictionary, |
const Json::Value& isa_dict = dictionary[key]; |
nacl::string relative_url; |
if (!GetURLFromISADictionary(isa_dict, key, sandbox_isa, prefer_portable, |
- &relative_url, cache_identity, |
- error_info, pnacl_translate)) { |
+ &relative_url, pnacl_options, error_info)) { |
return false; |
} |
return manifest->ResolveURL(relative_url, full_url, error_info); |
@@ -455,11 +465,9 @@ bool JsonManifest::ResolveURL(const nacl::string& relative_url, |
} |
bool JsonManifest::GetProgramURL(nacl::string* full_url, |
- nacl::string* cache_identity, |
- ErrorInfo* error_info, |
- bool* pnacl_translate) const { |
- if (full_url == NULL || cache_identity == NULL || |
- error_info == NULL || pnacl_translate == NULL) |
+ PnaclOptions* pnacl_options, |
+ ErrorInfo* error_info) const { |
+ if (full_url == NULL || pnacl_options == NULL || error_info == NULL) |
return false; |
Json::Value program = dictionary_[kProgramKey]; |
@@ -472,9 +480,8 @@ bool JsonManifest::GetProgramURL(nacl::string* full_url, |
sandbox_isa_, |
prefer_portable_, |
&nexe_url, |
- cache_identity, |
- error_info, |
- pnacl_translate)) { |
+ pnacl_options, |
+ error_info)) { |
return false; |
} |
@@ -497,19 +504,17 @@ bool JsonManifest::GetFileKeys(std::set<nacl::string>* keys) const { |
bool JsonManifest::ResolveKey(const nacl::string& key, |
nacl::string* full_url, |
- nacl::string* cache_identity, |
- ErrorInfo* error_info, |
- bool* pnacl_translate) const { |
+ PnaclOptions* pnacl_options, |
+ ErrorInfo* error_info) const { |
NaClLog(3, "JsonManifest::ResolveKey(%s)\n", key.c_str()); |
// key must be one of kProgramKey or kFileKey '/' file-section-key |
- if (full_url == NULL || cache_identity == NULL || |
- error_info == NULL || pnacl_translate == NULL) |
+ if (full_url == NULL || pnacl_options == NULL || error_info == NULL) |
return false; |
if (key == kProgramKey) { |
return GetKeyUrl(dictionary_, key, sandbox_isa_, this, prefer_portable_, |
- full_url, cache_identity, error_info, pnacl_translate); |
+ full_url, pnacl_options, error_info); |
} |
nacl::string::const_iterator p = find(key.begin(), key.end(), '/'); |
if (p == key.end()) { |
@@ -544,7 +549,7 @@ bool JsonManifest::ResolveKey(const nacl::string& key, |
return false; |
} |
return GetKeyUrl(files, rest, sandbox_isa_, this, prefer_portable_, |
- full_url, cache_identity, error_info, pnacl_translate); |
+ full_url, pnacl_options, error_info); |
} |
} // namespace plugin |