diff --git a/offload/liboffload/src/OffloadImpl.cpp b/offload/liboffload/src/OffloadImpl.cpp index f02497c0a6331..59c84abca8ac9 100644 --- a/offload/liboffload/src/OffloadImpl.cpp +++ b/offload/liboffload/src/OffloadImpl.cpp @@ -245,23 +245,23 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device, ReturnHelper ReturnValue(PropSize, PropValue, PropSizeRet); // Find the info if it exists under any of the given names - auto GetInfo = [&](std::vector Names) { + auto GetInfoString = [&](std::vector Names) { if (Device == OffloadContext::get().HostDevice()) - return std::string("Host"); + return "Host"; if (!Device->Device) - return std::string(""); + return ""; auto Info = Device->Device->obtainInfoImpl(); if (auto Err = Info.takeError()) - return std::string(""); + return ""; for (auto Name : Names) { if (auto Entry = Info->get(Name)) - return (*Entry)->Value; + return std::get((*Entry)->Value).c_str(); } - return std::string(""); + return ""; }; switch (PropName) { @@ -272,12 +272,12 @@ Error olGetDeviceInfoImplDetail(ol_device_handle_t Device, ? ReturnValue(OL_DEVICE_TYPE_HOST) : ReturnValue(OL_DEVICE_TYPE_GPU); case OL_DEVICE_INFO_NAME: - return ReturnValue(GetInfo({"Device Name"}).c_str()); + return ReturnValue(GetInfoString({"Device Name"})); case OL_DEVICE_INFO_VENDOR: - return ReturnValue(GetInfo({"Vendor Name"}).c_str()); + return ReturnValue(GetInfoString({"Vendor Name"})); case OL_DEVICE_INFO_DRIVER_VERSION: return ReturnValue( - GetInfo({"CUDA Driver Version", "HSA Runtime Version"}).c_str()); + GetInfoString({"CUDA Driver Version", "HSA Runtime Version"})); default: return createOffloadError(ErrorCode::INVALID_ENUMERATION, "getDeviceInfo enum '%i' is invalid", PropName); diff --git a/offload/plugins-nextgen/common/include/PluginInterface.h b/offload/plugins-nextgen/common/include/PluginInterface.h index f5d995532b7a5..91df800304378 100644 --- a/offload/plugins-nextgen/common/include/PluginInterface.h +++ b/offload/plugins-nextgen/common/include/PluginInterface.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include "ExclusiveAccess.h" @@ -122,7 +123,8 @@ struct InfoTreeNode { static constexpr uint64_t IndentSize = 4; std::string Key; - std::string Value; + using VariantType = std::variant; + VariantType Value; std::string Units; // Need to specify a default value number of elements here as `InfoTreeNode`'s // size is unknown. This is a vector (rather than a Key->Value map) since: @@ -131,15 +133,15 @@ struct InfoTreeNode { // * The same key can appear multiple times std::unique_ptr> Children; - InfoTreeNode() : InfoTreeNode("", "", "") {} - InfoTreeNode(std::string Key, std::string Value, std::string Units) + InfoTreeNode() : InfoTreeNode("", std::monostate{}, "") {} + InfoTreeNode(std::string Key, VariantType Value, std::string Units) : Key(Key), Value(Value), Units(Units) {} /// Add a new info entry as a child of this node. The entry requires at least /// a key string in \p Key. The value in \p Value is optional and can be any /// type that is representable as a string. The units in \p Units is optional /// and must be a string. - template + template InfoTreeNode *add(std::string Key, T Value = T(), const std::string &Units = std::string()) { assert(!Key.empty() && "Invalid info key"); @@ -147,15 +149,15 @@ struct InfoTreeNode { if (!Children) Children = std::make_unique>(); - std::string ValueStr; - if constexpr (std::is_same_v) - ValueStr = Value ? "Yes" : "No"; + VariantType ValueVariant; + if constexpr (std::is_same_v || std::is_same_v) + ValueVariant = Value; else if constexpr (std::is_arithmetic_v) - ValueStr = std::to_string(Value); + ValueVariant = static_cast(Value); else - ValueStr = Value; + ValueVariant = std::string{Value}; - return &Children->emplace_back(Key, ValueStr, Units); + return &Children->emplace_back(Key, ValueVariant, Units); } std::optional get(StringRef Key) { @@ -184,8 +186,23 @@ struct InfoTreeNode { MaxKeySize - (Key.size() + KeyIndentSize) + IndentSize; llvm::outs() << std::string(KeyIndentSize, ' ') << Key - << std::string(ValIndentSize, ' ') << Value - << (Units.empty() ? "" : " ") << Units << "\n"; + << std::string(ValIndentSize, ' '); + std::visit( + [](auto &&V) { + using T = std::decay_t; + if constexpr (std::is_same_v) + llvm::outs() << V; + else if constexpr (std::is_same_v) + llvm::outs() << (V ? "Yes" : "No"); + else if constexpr (std::is_same_v) + llvm::outs() << V; + else if constexpr (std::is_same_v) { + // Do nothing + } else + static_assert(false, "doPrint visit not exhaustive"); + }, + Value); + llvm::outs() << (Units.empty() ? "" : " ") << Units << "\n"; } // Print children