rocr: Fix supported_isas transient memory issue

An ASAN run of the release build revealed some elements of
the supported_isas static map were still using stack data. This
change makes it use heap data so it will persist.

Change-Id: Ie51887e88b9e2dec27acfc97ea45a6219fea971c


[ROCm/ROCR-Runtime commit: c7521a5f2a]
Cette révision appartient à :
Chris Freehill
2024-10-30 19:27:58 -05:00
révisé par David Yat Sin
Parent dd33820b23
révision 4005fd9b9d
2 fichiers modifiés avec 33 ajouts et 39 suppressions
+2 -2
Voir le fichier
@@ -189,12 +189,12 @@ class Isa final: public amd::hsa::common::Signed<0xB13594F2BD8F212D> {
hsa_fp_type_t fp_type,
hsa_flush_mode_t flush_mode) const;
private:
/// @brief Default constructor.
Isa()
: version_(Version(-1, -1, -1)),
sramecc_(IsaFeature::Unsupported),
xnack_(IsaFeature::Unsupported) {}
private:
// @brief Isa's target ID name.
std::string targetid_;
@@ -233,7 +233,7 @@ class IsaRegistry final {
GetSupportedGenericVersions();
private:
/// @brief IsaRegistry's map type.
typedef std::unordered_map<std::string, std::reference_wrapper<const Isa>> IsaMap;
typedef std::unordered_map<std::string, Isa> IsaMap;
/// @brief Default constructor
IsaRegistry() = delete;
+31 -37
Voir le fichier
@@ -227,21 +227,21 @@ hsa_round_method_t Isa::GetRoundMethod(
const Isa *IsaRegistry::GetIsa(const std::string &full_name) {
auto isareg_iter = GetSupportedIsas().find(full_name);
return isareg_iter == GetSupportedIsas().end() ?
nullptr : &isareg_iter->second.get();
nullptr : &isareg_iter->second;
}
const Isa *IsaRegistry::GetIsa(const Isa::Version &version, IsaFeature sramecc, IsaFeature xnack) {
auto isareg_iter = std::find_if(GetSupportedIsas().begin(),
GetSupportedIsas().end(),
[&](const IsaMap::value_type& isareg) {
return isareg.second.get().GetVersion() == version &&
(isareg.second.get().GetSramecc() == IsaFeature::Unsupported ||
isareg.second.get().GetSramecc() == sramecc) &&
(isareg.second.get().GetXnack() == IsaFeature::Unsupported ||
isareg.second.get().GetXnack() == xnack);
return isareg.second.GetVersion() == version &&
(isareg.second.GetSramecc() == IsaFeature::Unsupported ||
isareg.second.GetSramecc() == sramecc) &&
(isareg.second.GetXnack() == IsaFeature::Unsupported ||
isareg.second.GetXnack() == xnack);
});
return isareg_iter == GetSupportedIsas().end() ?
nullptr : &isareg_iter->second.get();
nullptr : &isareg_iter->second;
}
@@ -277,11 +277,11 @@ const IsaRegistry::IsaMap& IsaRegistry::GetSupportedIsas() {
return supported_isas;
}
auto parse_out_minor_ver = [&](const std::string& genericname) -> int32_t {
size_t dot_pos = genericname.find('.');
auto parse_out_minor_ver = [&](const std::string& generic_name) -> int32_t {
size_t dot_pos = generic_name.find('.');
int32_t min;
if (dot_pos != std::string::npos) {
std::string minor_version_str = genericname.substr(dot_pos + 1);
std::string minor_version_str = generic_name.substr(dot_pos + 1);
size_t dash_pos = minor_version_str.find('-');
if (dash_pos != std::string::npos) {
minor_version_str = minor_version_str.substr(0, dash_pos);
@@ -294,33 +294,27 @@ const IsaRegistry::IsaMap& IsaRegistry::GetSupportedIsas() {
};
// FIXME: Use static_assert when C++17 used.
#define ISAREG_ENTRY_GEN(name, maj, min, stp, sramecc, xnack, wavefrontsize, gen_name) \
{ \
assert(std::char_traits<char>::length(name) <= hsa_name_size); \
static Isa isa_val; \
isa_val.targetid_ = name; \
isa_val.version_ = Isa::Version(maj, min, stp); \
isa_val.sramecc_ = sramecc; \
isa_val.xnack_ = xnack; \
isa_val.wavefront_.num_threads_ = wavefrontsize; \
std::string genericname(gen_name); \
if (genericname.size() != 0) { \
isa_val.generic_ = prepend_isa_prefix(genericname); \
if (supported_isas.find(genericname) == supported_isas.end()) { \
Isa isa_generic_val; \
isa_generic_val.targetid_ = genericname; \
isa_generic_val.version_ = Isa::Version(maj, parse_out_minor_ver(genericname), 0xFF); \
isa_generic_val.sramecc_ = sramecc; \
isa_generic_val.xnack_ = xnack; \
isa_generic_val.wavefront_.num_threads_ = wavefrontsize; \
supported_isas.insert(std::make_pair( \
isa_generic_val.GetIsaName(), \
isa_generic_val)); \
} \
} \
supported_isas.insert(std::make_pair( \
isa_val.GetIsaName(), \
std::ref(isa_val))); \
#define ISAREG_ENTRY_GEN(name, maj, min, stp, sramecc, xnack, wavefrontsize, gen_name) \
{ \
assert(std::char_traits<char>::length(name) <= hsa_name_size); \
std::string isa_name = prepend_isa_prefix(name); \
supported_isas[isa_name].targetid_ = name; \
supported_isas[isa_name].version_ = Isa::Version(maj, min, stp); \
supported_isas[isa_name].sramecc_ = sramecc; \
supported_isas[isa_name].xnack_ = xnack; \
supported_isas[isa_name].wavefront_.num_threads_ = wavefrontsize; \
std::string genericname(gen_name); \
if (genericname.size() != 0) { \
std::string gen_isa_name = prepend_isa_prefix(genericname); \
supported_isas[isa_name].generic_ = gen_isa_name; \
if (supported_isas.find(gen_isa_name) == supported_isas.end()) { \
supported_isas[gen_isa_name].targetid_ = genericname; \
supported_isas[gen_isa_name].version_ = Isa::Version(maj, parse_out_minor_ver(genericname), 0xFF); \
supported_isas[gen_isa_name].sramecc_ = sramecc; \
supported_isas[gen_isa_name].xnack_ = xnack; \
supported_isas[gen_isa_name].wavefront_.num_threads_ = wavefrontsize; \
} \
} \
}
const IsaFeature unsupported = IsaFeature::Unsupported;